From bd1c82a4454755285cd59d7893cdbe470476a813 Mon Sep 17 00:00:00 2001 From: ertyu Date: Thu, 7 Apr 2016 15:27:10 -0500 Subject: [PATCH 01/32] Update faup1090.c update help to match available operations --- faup1090.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/faup1090.c b/faup1090.c index 4503d08..1ca0a01 100644 --- a/faup1090.c +++ b/faup1090.c @@ -105,10 +105,8 @@ static void showHelp(void) { "-----------------------------------------------------------------------------\n" "| faup1090 ModeS conversion %45s |\n" "-----------------------------------------------------------------------------\n" -"--net-bind-address IP address to bind to (default: Any; Use 127.0.0.1 for private)\n" "--net-bo-ipaddr IP address to connect to for Beast data (default: 127.0.0.1)\n" "--net-bo-port Port to connect for Beast data (default: 30005)\n" -"--net-fatsv-port FlightAware TSV output port (default: 10001)\n" "--lat Reference/receiver latitude for surface posn (opt)\n" "--lon Reference/receiver longitude for surface posn (opt)\n" "--max-range Absolute maximum range for position decoding (in nm, default: 360)\n" From c701b465591e4eec978da09ebd41ee7000d23e86 Mon Sep 17 00:00:00 2001 From: danielmerritt Date: Mon, 16 May 2016 22:47:56 +0930 Subject: [PATCH 02/32] Added a new marker for heavy aircraft --- public_html/markers.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) mode change 100644 => 100755 public_html/markers.js diff --git a/public_html/markers.js b/public_html/markers.js old mode 100644 new mode 100755 index a52b495..3bec816 --- a/public_html/markers.js +++ b/public_html/markers.js @@ -53,6 +53,10 @@ var _rotorcraft_svg = var _beechcraft_svg = "m 31.9375,0.21875 c -0.06777,0.0107988 -0.115451,0.0391469 -0.15625,0.0625 C 31.672725,0.37187346 31.571656,0.508205 31.5,0.625 c -0.03614,0.0602071 -0.06208,0.095702 -0.09375,0.15625 -0.07403,0.15902301 -0.135583,0.3268225 -0.1875,0.5 -0.04551,0.1172902 -0.09299,0.229501 -0.125,0.34375 C 31.061962,1.7428305 31.051772,1.8837099 31.03125,2 31.013723,2.1172825 31.001884,2.2232944 31,2.34375 a 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0,0.03125 c -0.0082,0.022808 -0.04473,0.016331 -0.0625,0.03125 -0.02369,0.019892 -0.05403,0.050775 -0.09375,0.0625 -0.07944,0.02345 -0.16785,0.042313 -0.25,0.0625 -0.142298,0.027931 -0.321549,0.011037 -0.5,0.03125 -0.178451,0.020213 -0.362341,0.079026 -0.5,0.1875 -0.232524,0.2710695 -0.269126,0.6354569 -0.375,0.9375 -0.515728,1.9222735 -0.692683,3.8981369 -0.8125,5.875 -0.0025,0.039801 -0.0291,0.08613 -0.03125,0.125 -5.12e-4,0.00925 5.69e-4,0.022042 0,0.03125 l -3.75,1.59375 -0.03125,0 -0.03125,0 L 1.03125,13.125 1,13.125 a 0.050005,0.050005 0 0 0 -0.03125,0 c -0.0142757,0.0014 -0.0171094,0.02929 -0.03125,0.03125 -0.49350918,0.06826 -0.88359986,0.49922 -0.90625,1 A 0.050005,0.050005 0 0 0 0,14.1875 c -2.5577425e-5,0.01009 -2.9111128e-4,0.02111 0,0.03125 A 0.050005,0.050005 0 0 0 0,14.25 l 0,5.0625 a 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0,0.03125 c 2.7397524e-4,0.0076 0.03048716,-0.0075 0.03125,0 a 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0.03125,0 c 0.02951574,0.118004 0.10643771,0.204628 0.21875,0.25 0.008119,0.0033 -0.008332,0.02849 0,0.03125 a 0.050005,0.050005 0 0 0 0,0.03125 c 0.007096,0.0018 0.0240449,-0.0015 0.03125,0 a 0.050005,0.050005 0 0 0 0.03125,0 L 28.4375,24.3125 c 0.07632,1.73868 0.196986,3.45307 0.375,5.1875 0.345732,3.673262 0.848433,7.32759 1.4375,10.96875 l -6.96875,1.375 -0.0625,0 a 0.050005,0.050005 0 0 0 -0.03125,0 0.050005,0.050005 0 0 0 0,0.03125 c -0.291266,0.06923 -0.590135,0.19983 -0.78125,0.4375 -0.282641,0.328422 -0.401461,0.745626 -0.46875,1.15625 -0.09612,0.640251 -0.04006,1.301405 0.03125,1.9375 0.08652,0.703658 0.205326,1.376189 0.375,2.0625 0.02,0.08426 0.07303,0.168374 0.09375,0.25 a 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0.03125,0 l 0.0625,0 4.59375,0.46875 0,0.1875 0,0.03125 a 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0.03125,0.03125 l 0.03125,0 3.96875,0.375 0.0625,0 a 0.050005,0.050005 0 0 0 0.03125,0 0.050005,0.050005 0 0 0 0,-0.03125 0.050005,0.050005 0 0 0 0,-0.03125 0.050005,0.050005 0 0 0 0,-0.03125 l 0.28125,-1.125 c 0.08761,0.449359 0.164528,0.858018 0.25,1.28125 0.002,0.01 -0.002,0.02127 0,0.03125 0.0054,0.0158 0.0258,0.01691 0.03125,0.03125 0.02181,0.05737 0.03806,0.120629 0.0625,0.15625 0.03055,0.04453 0.07454,0.09409 0.125,0.09375 0.05046,-3.37e-4 0.09462,-0.04919 0.125,-0.09375 0.0243,-0.03565 0.04084,-0.09925 0.0625,-0.15625 0.0054,-0.01425 0.02586,-0.01557 0.03125,-0.03125 a 0.050005,0.050005 0 0 0 0,-0.03125 l 0.25,-1.28125 0.28125,1.125 a 0.050005,0.050005 0 0 0 0,0.03125 l 0,0.03125 a 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0.03125,0 l 0.0625,0 3.96875,-0.375 a 0.050005,0.050005 0 0 0 0.03125,0 0.050005,0.050005 0 0 0 0.03125,-0.03125 0.050005,0.050005 0 0 0 0,-0.03125 l 0,-0.03125 0,-0.21875 4.59375,-0.4375 a 0.050005,0.050005 0 0 0 0.03125,0 0.050005,0.050005 0 0 0 0.03125,0 0.050005,0.050005 0 0 0 0.03125,0 0.050005,0.050005 0 0 0 0,-0.03125 0.050005,0.050005 0 0 0 0,-0.03125 0.050005,0.050005 0 0 0 0,-0.03125 c 0.09927,-0.372978 0.201637,-0.747919 0.28125,-1.125 0.09782,-0.502873 0.206978,-1.018007 0.25,-1.53125 8.56e-4,-0.01021 -8.2e-4,-0.02104 0,-0.03125 0.04501,-0.499379 0.03422,-1.031912 -0.03125,-1.53125 -0.06791,-0.423874 -0.1758,-0.848192 -0.46875,-1.1875 -0.191021,-0.237794 -0.489803,-0.368516 -0.78125,-0.4375 -0.01389,-0.0033 -0.01729,-0.02834 -0.03125,-0.03125 l -0.0625,0 -7,-1.375 c 0.578605,-3.59278 1.088587,-7.220459 1.4375,-10.84375 0.185606,-1.784156 0.327336,-3.55267 0.40625,-5.34375 l 28.09375,-4.5625 a 0.050005,0.050005 0 0 0 0.03125,0 c 0.01603,-0.0032 0.01585,-0.02623 0.03125,-0.03125 a 0.050005,0.050005 0 0 0 0,-0.03125 c 0.113013,-0.04503 0.18958,-0.131349 0.21875,-0.25 0.0077,-0.03145 0.06397,-0.02794 0.0625,-0.0625 a 0.050005,0.050005 0 0 0 0,-0.03125 l 0,-5.0625 0,-0.03125 c 6.4e-4,-0.02413 -0.03014,-0.03866 -0.03125,-0.0625 -0.02337,-0.501664 -0.410965,-0.931701 -0.90625,-1 -0.0096,-0.0013 -0.02158,0.001 -0.03125,0 a 0.050005,0.050005 0 0 0 0,-0.03125 0.050005,0.050005 0 0 0 -0.03125,0 l -0.03125,0 -23.53125,-1.78125 -0.03125,0 -0.03125,0 -3.78125,-1.5625 0,-0.03125 C 35.517489,8.2805897 35.403194,6.8282343 35.15625,5.375 34.999455,4.539239 34.823204,3.7020107 34.5,2.90625 34.396263,2.7291587 34.223707,2.6576159 34.03125,2.625 33.838793,2.5923841 33.615271,2.5934384 33.46875,2.5625 33.373159,2.539039 33.279419,2.5226169 33.1875,2.5 33.095581,2.4773831 33.02499,2.4607373 33,2.375 c 2e-5,-0.010496 1.57e-4,-0.020774 0,-0.03125 -0.0022,-0.1473663 -0.0087,-0.2950936 -0.03125,-0.4375 -0.02326,-0.1199278 -0.06228,-0.2252731 -0.09375,-0.34375 -0.04357,-0.1647004 -0.09116,-0.3418053 -0.15625,-0.5 -0.04566,-0.13569283 -0.124489,-0.25424267 -0.1875,-0.375 -0.04296,-0.0733644 -0.0692,-0.1478646 -0.125,-0.21875 C 32.363928,0.40814747 32.294741,0.35866921 32.25,0.3125 32.21883,0.28842774 32.193993,0.26948756 32.15625,0.25 c -0.02455,-0.0127106 -0.06329,0.007373 -0.09375,0 -0.01015,-0.002458 -0.02048,0.001121 -0.03125,0 a 0.050005,0.050005 0 0 0 0,-0.03125 c -0.01089,-8.0895e-4 -0.01977,-9.7401e-4 -0.03125,0 4.14e-4,-4.837e-5 -0.01894,5.0367e-4 -0.03125,0 -0.01231,-5.0367e-4 -0.01037,-0.0122022 -0.03125,0 z"; +//https://upload.wikimedia.org/wikipedia/commons/9/9b/Silhouette_An-124.svg +var _heavy_svg = + "m28.64874,12.035023l0,8.801421l-4.585627,3.066495c0.126825,-0.257055 0.094102,-0.531839 0.095802,-0.802796l-0.015437,-3.087446l-2.230453,-0.012673l0.019009,3.599141c0.000513,0.577993 0.076338,0.923195 0.589296,1.241956l-5.533809,3.630512c0.166511,-0.256275 0.153699,-0.551367 0.153699,-0.841892l-0.005929,-3.270195l-2.160751,-0.012672l-0.006337,3.637159c0.016349,0.5301 0.096662,1.090947 0.576623,1.419379l-11.976014,7.825597c-2.106287,1.48859 -1.705322,3.044253 -1.56512,4.587637l26.645047,-9.048544l0,13.750239l0.722364,5.062875l-8.681027,6.387208c-1.239945,1.059417 -1.080616,2.171837 -0.842757,3.256969l11.278998,-2.946479c0.130159,3.116897 1.559821,3.171571 1.780561,0.006336l11.278998,2.94648c0.23786,-1.085133 0.397189,-2.197552 -0.842756,-3.256969l-8.681026,-6.387207l0.722362,-5.062875l0,-13.750239l26.645048,9.042207c0.140203,-1.543381 0.541167,-3.092711 -1.56512,-4.581301l-11.976015,-7.825597c0.47996,-0.328434 0.553938,-0.889279 0.570286,-1.419379l0,-3.63716l-2.160751,0.012673l-0.005378,3.328244c-0.002334,0.294243 0.007077,0.545056 0.178191,0.817583l-5.565189,-3.664251c0.512962,-0.318761 0.59512,-0.663963 0.595633,-1.241956l0.019009,-3.599141l-2.230454,0.012673l-0.015793,3.100403c0.001462,0.282341 -0.019949,0.535579 0.124839,0.794638l-4.614307,-3.071294l0,-8.801421c-1.111672,-11.152869 -5.489391,-11.217579 -6.735717,-0.006336z"; + var MarkerIcons = { generic : { scale : 0.4, @@ -75,7 +79,7 @@ var MarkerIcons = { heavy : { scale : 0.5, anchor : new google.maps.Point(32, 32), - path : _generic_plane_svg + path : _heavy_svg }, rotorcraft : { From 7c9320ad97b4d562229cb3df9704b22584b33a7f Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sun, 5 Jun 2016 19:13:55 +0100 Subject: [PATCH 03/32] Update source comment for the new heavy marker --- public_html/markers.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public_html/markers.js b/public_html/markers.js index 3bec816..2d15e82 100755 --- a/public_html/markers.js +++ b/public_html/markers.js @@ -53,7 +53,8 @@ var _rotorcraft_svg = var _beechcraft_svg = "m 31.9375,0.21875 c -0.06777,0.0107988 -0.115451,0.0391469 -0.15625,0.0625 C 31.672725,0.37187346 31.571656,0.508205 31.5,0.625 c -0.03614,0.0602071 -0.06208,0.095702 -0.09375,0.15625 -0.07403,0.15902301 -0.135583,0.3268225 -0.1875,0.5 -0.04551,0.1172902 -0.09299,0.229501 -0.125,0.34375 C 31.061962,1.7428305 31.051772,1.8837099 31.03125,2 31.013723,2.1172825 31.001884,2.2232944 31,2.34375 a 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0,0.03125 c -0.0082,0.022808 -0.04473,0.016331 -0.0625,0.03125 -0.02369,0.019892 -0.05403,0.050775 -0.09375,0.0625 -0.07944,0.02345 -0.16785,0.042313 -0.25,0.0625 -0.142298,0.027931 -0.321549,0.011037 -0.5,0.03125 -0.178451,0.020213 -0.362341,0.079026 -0.5,0.1875 -0.232524,0.2710695 -0.269126,0.6354569 -0.375,0.9375 -0.515728,1.9222735 -0.692683,3.8981369 -0.8125,5.875 -0.0025,0.039801 -0.0291,0.08613 -0.03125,0.125 -5.12e-4,0.00925 5.69e-4,0.022042 0,0.03125 l -3.75,1.59375 -0.03125,0 -0.03125,0 L 1.03125,13.125 1,13.125 a 0.050005,0.050005 0 0 0 -0.03125,0 c -0.0142757,0.0014 -0.0171094,0.02929 -0.03125,0.03125 -0.49350918,0.06826 -0.88359986,0.49922 -0.90625,1 A 0.050005,0.050005 0 0 0 0,14.1875 c -2.5577425e-5,0.01009 -2.9111128e-4,0.02111 0,0.03125 A 0.050005,0.050005 0 0 0 0,14.25 l 0,5.0625 a 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0,0.03125 c 2.7397524e-4,0.0076 0.03048716,-0.0075 0.03125,0 a 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0.03125,0 c 0.02951574,0.118004 0.10643771,0.204628 0.21875,0.25 0.008119,0.0033 -0.008332,0.02849 0,0.03125 a 0.050005,0.050005 0 0 0 0,0.03125 c 0.007096,0.0018 0.0240449,-0.0015 0.03125,0 a 0.050005,0.050005 0 0 0 0.03125,0 L 28.4375,24.3125 c 0.07632,1.73868 0.196986,3.45307 0.375,5.1875 0.345732,3.673262 0.848433,7.32759 1.4375,10.96875 l -6.96875,1.375 -0.0625,0 a 0.050005,0.050005 0 0 0 -0.03125,0 0.050005,0.050005 0 0 0 0,0.03125 c -0.291266,0.06923 -0.590135,0.19983 -0.78125,0.4375 -0.282641,0.328422 -0.401461,0.745626 -0.46875,1.15625 -0.09612,0.640251 -0.04006,1.301405 0.03125,1.9375 0.08652,0.703658 0.205326,1.376189 0.375,2.0625 0.02,0.08426 0.07303,0.168374 0.09375,0.25 a 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0.03125,0 l 0.0625,0 4.59375,0.46875 0,0.1875 0,0.03125 a 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0.03125,0.03125 l 0.03125,0 3.96875,0.375 0.0625,0 a 0.050005,0.050005 0 0 0 0.03125,0 0.050005,0.050005 0 0 0 0,-0.03125 0.050005,0.050005 0 0 0 0,-0.03125 0.050005,0.050005 0 0 0 0,-0.03125 l 0.28125,-1.125 c 0.08761,0.449359 0.164528,0.858018 0.25,1.28125 0.002,0.01 -0.002,0.02127 0,0.03125 0.0054,0.0158 0.0258,0.01691 0.03125,0.03125 0.02181,0.05737 0.03806,0.120629 0.0625,0.15625 0.03055,0.04453 0.07454,0.09409 0.125,0.09375 0.05046,-3.37e-4 0.09462,-0.04919 0.125,-0.09375 0.0243,-0.03565 0.04084,-0.09925 0.0625,-0.15625 0.0054,-0.01425 0.02586,-0.01557 0.03125,-0.03125 a 0.050005,0.050005 0 0 0 0,-0.03125 l 0.25,-1.28125 0.28125,1.125 a 0.050005,0.050005 0 0 0 0,0.03125 l 0,0.03125 a 0.050005,0.050005 0 0 0 0,0.03125 0.050005,0.050005 0 0 0 0.03125,0 l 0.0625,0 3.96875,-0.375 a 0.050005,0.050005 0 0 0 0.03125,0 0.050005,0.050005 0 0 0 0.03125,-0.03125 0.050005,0.050005 0 0 0 0,-0.03125 l 0,-0.03125 0,-0.21875 4.59375,-0.4375 a 0.050005,0.050005 0 0 0 0.03125,0 0.050005,0.050005 0 0 0 0.03125,0 0.050005,0.050005 0 0 0 0.03125,0 0.050005,0.050005 0 0 0 0,-0.03125 0.050005,0.050005 0 0 0 0,-0.03125 0.050005,0.050005 0 0 0 0,-0.03125 c 0.09927,-0.372978 0.201637,-0.747919 0.28125,-1.125 0.09782,-0.502873 0.206978,-1.018007 0.25,-1.53125 8.56e-4,-0.01021 -8.2e-4,-0.02104 0,-0.03125 0.04501,-0.499379 0.03422,-1.031912 -0.03125,-1.53125 -0.06791,-0.423874 -0.1758,-0.848192 -0.46875,-1.1875 -0.191021,-0.237794 -0.489803,-0.368516 -0.78125,-0.4375 -0.01389,-0.0033 -0.01729,-0.02834 -0.03125,-0.03125 l -0.0625,0 -7,-1.375 c 0.578605,-3.59278 1.088587,-7.220459 1.4375,-10.84375 0.185606,-1.784156 0.327336,-3.55267 0.40625,-5.34375 l 28.09375,-4.5625 a 0.050005,0.050005 0 0 0 0.03125,0 c 0.01603,-0.0032 0.01585,-0.02623 0.03125,-0.03125 a 0.050005,0.050005 0 0 0 0,-0.03125 c 0.113013,-0.04503 0.18958,-0.131349 0.21875,-0.25 0.0077,-0.03145 0.06397,-0.02794 0.0625,-0.0625 a 0.050005,0.050005 0 0 0 0,-0.03125 l 0,-5.0625 0,-0.03125 c 6.4e-4,-0.02413 -0.03014,-0.03866 -0.03125,-0.0625 -0.02337,-0.501664 -0.410965,-0.931701 -0.90625,-1 -0.0096,-0.0013 -0.02158,0.001 -0.03125,0 a 0.050005,0.050005 0 0 0 0,-0.03125 0.050005,0.050005 0 0 0 -0.03125,0 l -0.03125,0 -23.53125,-1.78125 -0.03125,0 -0.03125,0 -3.78125,-1.5625 0,-0.03125 C 35.517489,8.2805897 35.403194,6.8282343 35.15625,5.375 34.999455,4.539239 34.823204,3.7020107 34.5,2.90625 34.396263,2.7291587 34.223707,2.6576159 34.03125,2.625 33.838793,2.5923841 33.615271,2.5934384 33.46875,2.5625 33.373159,2.539039 33.279419,2.5226169 33.1875,2.5 33.095581,2.4773831 33.02499,2.4607373 33,2.375 c 2e-5,-0.010496 1.57e-4,-0.020774 0,-0.03125 -0.0022,-0.1473663 -0.0087,-0.2950936 -0.03125,-0.4375 -0.02326,-0.1199278 -0.06228,-0.2252731 -0.09375,-0.34375 -0.04357,-0.1647004 -0.09116,-0.3418053 -0.15625,-0.5 -0.04566,-0.13569283 -0.124489,-0.25424267 -0.1875,-0.375 -0.04296,-0.0733644 -0.0692,-0.1478646 -0.125,-0.21875 C 32.363928,0.40814747 32.294741,0.35866921 32.25,0.3125 32.21883,0.28842774 32.193993,0.26948756 32.15625,0.25 c -0.02455,-0.0127106 -0.06329,0.007373 -0.09375,0 -0.01015,-0.002458 -0.02048,0.001121 -0.03125,0 a 0.050005,0.050005 0 0 0 0,-0.03125 c -0.01089,-8.0895e-4 -0.01977,-9.7401e-4 -0.03125,0 4.14e-4,-4.837e-5 -0.01894,5.0367e-4 -0.03125,0 -0.01231,-5.0367e-4 -0.01037,-0.0122022 -0.03125,0 z"; -//https://upload.wikimedia.org/wikipedia/commons/9/9b/Silhouette_An-124.svg +// From https://commons.wikimedia.org/wiki/File:Silhouette_An-124.svg +// (which puts the original SVG in the public domain) var _heavy_svg = "m28.64874,12.035023l0,8.801421l-4.585627,3.066495c0.126825,-0.257055 0.094102,-0.531839 0.095802,-0.802796l-0.015437,-3.087446l-2.230453,-0.012673l0.019009,3.599141c0.000513,0.577993 0.076338,0.923195 0.589296,1.241956l-5.533809,3.630512c0.166511,-0.256275 0.153699,-0.551367 0.153699,-0.841892l-0.005929,-3.270195l-2.160751,-0.012672l-0.006337,3.637159c0.016349,0.5301 0.096662,1.090947 0.576623,1.419379l-11.976014,7.825597c-2.106287,1.48859 -1.705322,3.044253 -1.56512,4.587637l26.645047,-9.048544l0,13.750239l0.722364,5.062875l-8.681027,6.387208c-1.239945,1.059417 -1.080616,2.171837 -0.842757,3.256969l11.278998,-2.946479c0.130159,3.116897 1.559821,3.171571 1.780561,0.006336l11.278998,2.94648c0.23786,-1.085133 0.397189,-2.197552 -0.842756,-3.256969l-8.681026,-6.387207l0.722362,-5.062875l0,-13.750239l26.645048,9.042207c0.140203,-1.543381 0.541167,-3.092711 -1.56512,-4.581301l-11.976015,-7.825597c0.47996,-0.328434 0.553938,-0.889279 0.570286,-1.419379l0,-3.63716l-2.160751,0.012673l-0.005378,3.328244c-0.002334,0.294243 0.007077,0.545056 0.178191,0.817583l-5.565189,-3.664251c0.512962,-0.318761 0.59512,-0.663963 0.595633,-1.241956l0.019009,-3.599141l-2.230454,0.012673l-0.015793,3.100403c0.001462,0.282341 -0.019949,0.535579 0.124839,0.794638l-4.614307,-3.071294l0,-8.801421c-1.111672,-11.152869 -5.489391,-11.217579 -6.735717,-0.006336z"; From bf042642c35759c9cb72b1c732989dc1ae04c462 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sun, 5 Jun 2016 21:43:28 +0100 Subject: [PATCH 04/32] Increase the size of the heavy icon a little. --- public_html/markers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public_html/markers.js b/public_html/markers.js index 2d15e82..bd4904f 100755 --- a/public_html/markers.js +++ b/public_html/markers.js @@ -78,7 +78,7 @@ var MarkerIcons = { }, heavy : { - scale : 0.5, + scale : 0.6, anchor : new google.maps.Point(32, 32), path : _heavy_svg }, From 75b69452ef18b8e9e9cee4e603a7c77c646cbbff Mon Sep 17 00:00:00 2001 From: rxseger Date: Mon, 6 Jun 2016 22:28:33 -0700 Subject: [PATCH 05/32] Remove unused functions in demod_2400 --- demod_2400.c | 66 ---------------------------------------------------- 1 file changed, 66 deletions(-) diff --git a/demod_2400.c b/demod_2400.c index ffd7ed9..8f5ace7 100644 --- a/demod_2400.c +++ b/demod_2400.c @@ -52,72 +52,6 @@ static inline int slice_phase4(uint16_t *m) { return m[0] + 5 * m[1] - 5 * m[2] - m[3]; } -static inline int correlate_phase0(uint16_t *m) { - return slice_phase0(m) * 26; -} -static inline int correlate_phase1(uint16_t *m) { - return slice_phase1(m) * 38; -} -static inline int correlate_phase2(uint16_t *m) { - return slice_phase2(m) * 38; -} -static inline int correlate_phase3(uint16_t *m) { - return slice_phase3(m) * 26; -} -static inline int correlate_phase4(uint16_t *m) { - return slice_phase4(m) * 19; -} - -// -// These functions work out the correlation quality for the 10 symbols (5 bits) starting at m[0] + given phase offset. -// This is used to find the right phase offset to use for decoding. -// - -static inline int correlate_check_0(uint16_t *m) { - return - abs(correlate_phase0(&m[0])) + - abs(correlate_phase2(&m[2])) + - abs(correlate_phase4(&m[4])) + - abs(correlate_phase1(&m[7])) + - abs(correlate_phase3(&m[9])); -} - -static inline int correlate_check_1(uint16_t *m) { - return - abs(correlate_phase1(&m[0])) + - abs(correlate_phase3(&m[2])) + - abs(correlate_phase0(&m[5])) + - abs(correlate_phase2(&m[7])) + - abs(correlate_phase4(&m[9])); -} - -static inline int correlate_check_2(uint16_t *m) { - return - abs(correlate_phase2(&m[0])) + - abs(correlate_phase4(&m[2])) + - abs(correlate_phase1(&m[5])) + - abs(correlate_phase3(&m[7])) + - abs(correlate_phase0(&m[10])); -} - -static inline int correlate_check_3(uint16_t *m) { - return - abs(correlate_phase3(&m[0])) + - abs(correlate_phase0(&m[3])) + - abs(correlate_phase2(&m[5])) + - abs(correlate_phase4(&m[7])) + - abs(correlate_phase1(&m[10])); -} - -static inline int correlate_check_4(uint16_t *m) { - return - abs(correlate_phase4(&m[0])) + - abs(correlate_phase1(&m[3])) + - abs(correlate_phase3(&m[5])) + - abs(correlate_phase0(&m[8])) + - abs(correlate_phase2(&m[10])); -} - // // Given 'mlen' magnitude samples in 'm', sampled at 2.4MHz, // try to demodulate some Mode S messages. From 5d71b0dae76819bfb80eee4b6fb8198b4d327370 Mon Sep 17 00:00:00 2001 From: rxseger Date: Tue, 7 Jun 2016 18:05:19 -0700 Subject: [PATCH 06/32] Test on latest Xcode for OS X 10.9, 10.10, and 10.11 --- .travis.yml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1b94ac7..da961e2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,17 @@ language: c -os: - - linux - - osx - sudo: required -dist: trusty + +matrix: + include: + - os: linux + dist: trusty + - os: osx + osx_image: xcode7.3 + - os: osx + osx_image: xcode7.1 + - os: osx + osx_image: beta-xcode6.2 before_install: - if [ `uname` = "Linux" ]; then From 22c90415bed9a22c57ef11318d6b7e72d6bd3a0c Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 10:50:55 +0100 Subject: [PATCH 07/32] Check we got a full read when serving local files over HTTP. --- net_io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net_io.c b/net_io.c index 70e9901..6ecedee 100644 --- a/net_io.c +++ b/net_io.c @@ -1391,7 +1391,7 @@ static int handleHTTPRequest(struct client *c, char *p) { if (!strncmp(hrp, rp, strlen(hrp))) { if (stat(getFile, &sbuf) != -1 && (fd = open(getFile, O_RDONLY)) != -1) { content = (char *) realloc(content, sbuf.st_size); - if (read(fd, content, sbuf.st_size) != -1) { + if (read(fd, content, sbuf.st_size) == sbuf.st_size) { clen = sbuf.st_size; statuscode = 200; statusmsg = "OK"; From da437b32958d5d0c275d97a8e4f2bdb2bb404fe9 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 10:51:23 +0100 Subject: [PATCH 08/32] Set the socket buffer to the size of a HTTP response. This gives us a better chance of the response fitting in a single write() call (if it doesn't, it's going to get truncated, because the internal webserver is really simple) --- net_io.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net_io.c b/net_io.c index 6ecedee..d2b0a89 100644 --- a/net_io.c +++ b/net_io.c @@ -1453,6 +1453,9 @@ static int handleHTTPRequest(struct client *c, char *p) { printf("HTTP Reply header:\n%s", hdr); } + /* hack hack hack. try to deal with large content */ + anetSetSendBuffer(Modes.aneterr, c->fd, clen + hdrlen); + // Send header and content. #ifndef _WIN32 if ( (write(c->fd, hdr, hdrlen) != hdrlen) From b1acfcf26abb382cf4e9774c7f39b5ac3ad86e6c Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 10:53:03 +0100 Subject: [PATCH 09/32] Switch to latest stable jquery/jqueryui. Include a local copy. --- debian/copyright | 24 + public_html/gmap.html | 6 +- public_html/jquery/README | 3 + public_html/jquery/jquery-3.0.0.min.js | 4 + .../jquery/jquery-ui-1.11.4-smoothness.css | 1225 +++++++++++++++++ public_html/jquery/jquery-ui-1.11.4.min.js | 13 + 6 files changed, 1272 insertions(+), 3 deletions(-) create mode 100644 public_html/jquery/README create mode 100644 public_html/jquery/jquery-3.0.0.min.js create mode 100644 public_html/jquery/jquery-ui-1.11.4-smoothness.css create mode 100644 public_html/jquery/jquery-ui-1.11.4.min.js diff --git a/debian/copyright b/debian/copyright index 52e07db..b52968e 100644 --- a/debian/copyright +++ b/debian/copyright @@ -41,6 +41,10 @@ License: CC-BY-SA-3.0 and CC-BY-3.0 Comment: _generic_plane_svg was added with https://github.com/mutability/dump1090/commit/5f0e295580c34da34ecef3a37f03e9a9d57485ff https://github.com/DE8MSH +Files: public_html/jquery/* +Copyright: 2015 jQuery Foundation and other contributors +License: MIT + Files: debian/* Copyright: 2014,2015 Oliver Jowett License: BSD-3-Clause @@ -742,3 +746,23 @@ License: CC-BY-3.0 not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. + +License: MIT + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + . + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/public_html/gmap.html b/public_html/gmap.html index b3f6cd4..0b559b5 100644 --- a/public_html/gmap.html +++ b/public_html/gmap.html @@ -3,9 +3,9 @@ - - - + + + diff --git a/public_html/jquery/README b/public_html/jquery/README new file mode 100644 index 0000000..f17efce --- /dev/null +++ b/public_html/jquery/README @@ -0,0 +1,3 @@ +This directory contains local copies of jQuery / jQuery UI; +the original versions are available from jquery.com under +a MIT-style license. diff --git a/public_html/jquery/jquery-3.0.0.min.js b/public_html/jquery/jquery-3.0.0.min.js new file mode 100644 index 0000000..62d410d --- /dev/null +++ b/public_html/jquery/jquery-3.0.0.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.0.0 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.0.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return a&&"[object Object]"===k.call(a)?(b=e(a))?(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n):!0:!1},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;d>f;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;return"string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a)?(d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e):void 0},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"===c||r.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\x00-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\x00"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[0>c?c+b:c]}),even:pa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,e>i&&ya(a.slice(i,e)),f>e&&ya(a=a.slice(e)),f>e&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;d>b;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;d>b;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(f>b)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(1>=b&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){ +return j.call(r(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:X.test(c)?JSON.parse(c):c}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),Z(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=Z(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthf;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ba(d)&&(e[f]=fa(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;g>f;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ga(this,!0)},hide:function(){return ga(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ba(this)?r(this).show():r(this).hide()})}});var ha=/^(?:checkbox|radio)$/i,ia=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ja=/^$|\/(?:java|ecma)script/i,ka={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ka.optgroup=ka.option,ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead,ka.th=ka.td;function la(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function ma(a,b){for(var c=0,d=a.length;d>c;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var na=/<|&#?\w+;/;function oa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;o>n;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(na.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ia.exec(f)||["",""])[1].toLowerCase(),i=ka[h]||ka._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=la(l.appendChild(f),"script"),j&&ma(g),c){k=0;while(f=g[k++])ja.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var pa=d.documentElement,qa=/^key/,ra=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,sa=/^([^.]*)(?:\.(.+)|)/;function ta(){return!0}function ua(){return!1}function va(){try{return d.activeElement}catch(a){}}function wa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)wa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ua;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(pa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;cc;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?r(e,this).index(i)>-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h\x20\t\r\n\f]*)[^>]*)\/>/gi,ya=/\s*$/g;function Ca(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Da(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ea(a){var b=Aa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ga(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ha.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ha(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&za.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(m&&(e=oa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(la(e,"script"),Da),i=h.length;m>l;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,la(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ea),l=0;i>l;l++)j=h[l],ja.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ba,""),k))}return a}function Ia(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(la(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&ma(la(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(xa,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=la(h),f=la(a),d=0,e=f.length;e>d;d++)Ga(f[d],g[d]);if(b)if(c)for(f=f||la(a),g=g||la(h),d=0,e=f.length;e>d;d++)Fa(f[d],g[d]);else Fa(a,h);return g=la(h,"script"),g.length>0&&ma(g,!i&&la(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(la(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ya.test(a)&&!ka[(ia.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(la(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(la(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;f>=g;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ja=/^margin/,Ka=new RegExp("^("+$+")(?!px)[a-z%]+$","i"),La=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",pa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,pa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Ma(a,b,c){var d,e,f,g,h=a.style;return c=c||La(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ka.test(g)&&Ja.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Na(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Oa=/^(none|table(?!-c[ea]).+)/,Pa={position:"absolute",visibility:"hidden",display:"block"},Qa={letterSpacing:"0",fontWeight:"400"},Ra=["Webkit","Moz","ms"],Sa=d.createElement("div").style;function Ta(a){if(a in Sa)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ra.length;while(c--)if(a=Ra[c]+b,a in Sa)return a}function Ua(a,b,c){var d=_.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Va(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=r.css(a,c+aa[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+aa[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+aa[f]+"Width",!0,e))):(g+=r.css(a,"padding"+aa[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+aa[f]+"Width",!0,e)));return g}function Wa(a,b,c){var d,e=!0,f=La(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),0>=d||null==d){if(d=Ma(a,b,f),(0>d||null==d)&&(d=a.style[b]),Ka.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Va(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ma(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=_.exec(c))&&e[1]&&(c=da(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Ma(a,b,d)),"normal"===e&&b in Qa&&(e=Qa[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){return c?!Oa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Wa(a,b,d):ca(a,Pa,function(){return Wa(a,b,d)}):void 0},set:function(a,c,d){var e,f=d&&La(a),g=d&&Va(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=_.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ua(a,c,g)}}}),r.cssHooks.marginLeft=Na(o.reliableMarginLeft,function(a,b){return b?(parseFloat(Ma(a,"marginLeft"))||a.getBoundingClientRect().left-ca(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+aa[d]+b]=f[d]||f[d-2]||f[0];return e}},Ja.test(a)||(r.cssHooks[a+b].set=Ua)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=La(a),e=b.length;e>g;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Xa(a,b,c,d,e){return new Xa.prototype.init(a,b,c,d,e)}r.Tween=Xa,Xa.prototype={constructor:Xa,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Xa.propHooks[this.prop];return a&&a.get?a.get(this):Xa.propHooks._default.get(this)},run:function(a){var b,c=Xa.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Xa.propHooks._default.set(this),this}},Xa.prototype.init.prototype=Xa.prototype,Xa.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Xa.propHooks.scrollTop=Xa.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Xa.prototype.init,r.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=/queueHooks$/;function ab(){Za&&(a.requestAnimationFrame(ab),r.fx.tick())}function bb(){return a.setTimeout(function(){Ya=void 0}),Ya=r.now()}function cb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=aa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function db(a,b,c){for(var d,e=(gb.tweeners[b]||[]).concat(gb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function eb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ba(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],$a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ga([a],!0),j=a.style.display||j,k=r.css(a,"display"),ga([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ga([a],!0),m.done(function(){p||ga([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=db(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function fb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function gb(a,b,c){var d,e,f=0,g=gb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Ya||bb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Ya||bb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(fb(k,j.opts.specialEasing);g>f;f++)if(d=gb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,db,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(gb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return da(c.elem,a,_.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;e>d;d++)c=a[d],gb.tweeners[c]=gb.tweeners[c]||[],gb.tweeners[c].unshift(b)},prefilters:[eb],prefilter:function(a,b){b?gb.prefilters.unshift(a):gb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:e.duration="number"==typeof e.duration?e.duration:e.duration in r.fx.speeds?r.fx.speeds[e.duration]:r.fx.speeds._default,null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ba).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=gb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&_a.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(cb(b,!0),a,d,e)}}),r.each({slideDown:cb("show"),slideUp:cb("hide"),slideToggle:cb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Ya=r.now();b1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?hb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c); +}}),hb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ib[b]||r.find.attr;ib[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ib[g],ib[g]=e,e=null!=c(a,b,d)?g:null,ib[g]=f),e}});var jb=/^(?:input|select|textarea|button)$/i,kb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):jb.test(a.nodeName)||kb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var lb=/[\t\r\n\f]/g;function mb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,mb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,mb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,mb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=mb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(c)+" ").replace(lb," ").indexOf(b)>-1)return!0;return!1}});var nb=/\r/g,ob=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(nb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(ob," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){return r.isArray(b)?a.checked=r.inArray(r(a).val(),b)>-1:void 0}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?r.event.trigger(a,b,c,!0):void 0}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ha.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,""),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",0>b&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;return o.cors||Pb&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" - + + + + diff --git a/public_html/script.js b/public_html/script.js index fbfe72b..761dbf7 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -2,7 +2,10 @@ "use strict"; // Define our global variables -var GoogleMap = null; +var OLMap = null; +var StaticFeatures = new ol.Collection(); +var PlaneIconFeatures = new ol.Collection(); +var PlaneTrailFeatures = new ol.Collection(); var Planes = {}; var PlanesOrdered = []; var SelectedPlane = null; @@ -316,11 +319,11 @@ function initialize_map() { CenterLat = Number(localStorage['CenterLat']) || DefaultCenterLat; CenterLon = Number(localStorage['CenterLon']) || DefaultCenterLon; ZoomLvl = Number(localStorage['ZoomLvl']) || DefaultZoomLvl; - MapType = localStorage['MapType'] || google.maps.MapTypeId.ROADMAP; + //MapType = localStorage['MapType'] || google.maps.MapTypeId.ROADMAP; // Set SitePosition, initialize sorting if (SiteShow && (typeof SiteLat !== 'undefined') && (typeof SiteLon !== 'undefined')) { - SitePosition = new google.maps.LatLng(SiteLat, SiteLon); + SitePosition = [SiteLon, SiteLat]; sortByDistance(); } else { SitePosition = null; @@ -336,154 +339,90 @@ function initialize_map() { document.getElementById("infoblock_country").style.display = 'none'; // hide country row } - // Make a list of all the available map IDs - var mapTypeIds = []; - for(var type in google.maps.MapTypeId) { - mapTypeIds.push(google.maps.MapTypeId[type]); - } + // Initialize OL3 + // TODO map types etc - mapTypeIds.push("dark_map"); + var rasterLayer = new ol.layer.Tile({ + source: new ol.source.OSM() + }); - for (var type in ExtraMapTypes) { - mapTypeIds.push(type); - } + var staticLayer = new ol.layer.Vector({ + source: new ol.source.Vector({features: StaticFeatures}) + }); - // Styled Map to outline airports and highways - var styles = [ - { - "featureType": "administrative", - "stylers": [ - { "visibility": "off" } - ] - },{ - "featureType": "landscape", - "stylers": [ - { "visibility": "off" } - ] - },{ - "featureType": "poi", - "stylers": [ - { "visibility": "off" } - ] - },{ - "featureType": "road", - "stylers": [ - { "visibility": "off" } - ] - },{ - "featureType": "transit", - "stylers": [ - { "visibility": "off" } - ] - },{ - "featureType": "landscape", - "stylers": [ - { "visibility": "on" }, - { "weight": 8 }, - { "color": "#000000" } - ] - },{ - "featureType": "water", - "stylers": [ - { "lightness": -74 } - ] - },{ - "featureType": "transit.station.airport", - "stylers": [ - { "visibility": "on" }, - { "weight": 8 }, - { "invert_lightness": true }, - { "lightness": 27 } - ] - },{ - "featureType": "road.highway", - "stylers": [ - { "visibility": "simplified" }, - { "invert_lightness": true }, - { "gamma": 0.3 } - ] - },{ - "featureType": "road", - "elementType": "labels", - "stylers": [ - { "visibility": "off" } - ] - } - ] + var trailsLayer = new ol.layer.Vector({ + source: new ol.source.Vector({features: PlaneTrailFeatures}) + }); - // Add our styled map - var styledMap = new google.maps.StyledMapType(styles, {name: "Dark Map"}); + var iconsLayer = new ol.layer.Vector({ + source: new ol.source.Vector({features: PlaneIconFeatures}) + }); - // Define the Google Map - var mapOptions = { - center: new google.maps.LatLng(CenterLat, CenterLon), - zoom: ZoomLvl, - mapTypeId: MapType, - mapTypeControl: true, - streetViewControl: false, - zoomControl: true, - scaleControl: true, - mapTypeControlOptions: { - mapTypeIds: mapTypeIds, - position: google.maps.ControlPosition.TOP_LEFT, - style: google.maps.MapTypeControlStyle.DROPDOWN_MENU - } - }; - - GoogleMap = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); - GoogleMap.mapTypes.set("dark_map", styledMap); - - // Define the extra map types - for (var type in ExtraMapTypes) { - GoogleMap.mapTypes.set(type, new google.maps.ImageMapType({ - getTileUrl: generic_gettile.bind(null, ExtraMapTypes[type]), - tileSize: new google.maps.Size(256, 256), - name: type, - maxZoom: 18 - })); - } + OLMap = new ol.Map({ + target: 'map_canvas', + layers: [rasterLayer, staticLayer, trailsLayer, iconsLayer], + view: new ol.View({ + center: ol.proj.fromLonLat([CenterLon, CenterLat]), + zoom: ZoomLvl + }) + }); // Listeners for newly created Map - google.maps.event.addListener(GoogleMap, 'center_changed', function() { - localStorage['CenterLat'] = GoogleMap.getCenter().lat(); - localStorage['CenterLon'] = GoogleMap.getCenter().lng(); + OLMap.getView().on('change:center', function(event) { + var center = ol.proj.toLonLat(OLMap.getView().getCenter(), OLMap.getView().getProjection()); + localStorage['CenterLon'] = center[0] + localStorage['CenterLat'] = center[1] if (FollowSelected) { // On manual navigation, disable follow var selected = Planes[SelectedPlane]; - if (Math.abs(GoogleMap.getCenter().lat() - selected.position.lat()) > 0.0001 && - Math.abs(GoogleMap.getCenter().lng() - selected.position.lng()) > 0.0001) { + if (Math.abs(center[0] - selected.position[0]) > 0.0001 && + Math.abs(center[1] - selected.position[1]) > 0.0001) { FollowSelected = false; refreshSelected(); } } }); - google.maps.event.addListener(GoogleMap, 'zoom_changed', function() { - localStorage['ZoomLvl'] = GoogleMap.getZoom(); - }); - - google.maps.event.addListener(GoogleMap, 'maptypeid_changed', function() { - localStorage['MapType'] = GoogleMap.getMapTypeId(); + OLMap.getView().on('change:resolution', function(event) { + localStorage['ZoomLvl'] = OLMap.getView().getZoom(); }); // Add home marker if requested if (SitePosition) { - var markerImage = new google.maps.MarkerImage( - '//maps.google.com/mapfiles/kml/pal4/icon57.png', - new google.maps.Size(32, 32), // Image size - new google.maps.Point(0, 0), // Origin point of image - new google.maps.Point(16, 16)); // Position where marker should point - var marker = new google.maps.Marker({ - position: SitePosition, - map: GoogleMap, - icon: markerImage, - title: SiteName, - zIndex: -99999 - }); + console.log("setting up site position"); + var markerStyle = new ol.style.Style({ + image: new ol.style.Circle({ + radius: 7, + snapToPixel: false, + fill: new ol.style.Fill({color: 'black'}), + stroke: new ol.style.Stroke({ + color: 'white', width: 2 + }) + }) + }); + + var feature = new ol.Feature(new ol.geom.Point(ol.proj.fromLonLat(SitePosition))); + feature.setStyle(markerStyle); + StaticFeatures.push(feature); if (SiteCircles) { - for (var i=0;i 0) { + for (var j = 0; j < points.length; ++j) { + geom.appendCoordinate([ points[j][1], points[j][0] ]); + } + geom.appendCoordinate([ points[0][1], points[0][0] ]); + geom.transform('EPSG:4326', 'EPSG:3857'); + + var feature = new ol.Feature(geom); + feature.setStyle(ringStyle); + StaticFeatures.push(feature); + } } }); From 8639ab3837bc5459ae348c4a1ffd3b26e0c4a3b7 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 14:44:14 +0100 Subject: [PATCH 11/32] More work on OL3. --- public_html/formatter.js | 4 +- public_html/markers.js | 10 +- public_html/planeObject.js | 248 ++++++++++++++++++++----------------- public_html/script.js | 44 ++----- 4 files changed, 152 insertions(+), 154 deletions(-) diff --git a/public_html/formatter.js b/public_html/formatter.js index 11e151d..d73fd26 100644 --- a/public_html/formatter.js +++ b/public_html/formatter.js @@ -166,7 +166,7 @@ function format_distance_long(dist) { return dist_text; } -// p as a LatLng +// p is a [lon, lat] coordinate function format_latlng(p) { - return p.lat().toFixed(3) + DEGREES + "," + NBSP + p.lng().toFixed(3) + DEGREES; + return p[1].toFixed(3) + DEGREES + "," + NBSP + p[0].toFixed(3) + DEGREES; } diff --git a/public_html/markers.js b/public_html/markers.js index bd4904f..2dae794 100755 --- a/public_html/markers.js +++ b/public_html/markers.js @@ -61,31 +61,31 @@ var _heavy_svg = var MarkerIcons = { generic : { scale : 0.4, - anchor : new google.maps.Point(32, 32), + anchor : [32, 32], path : _generic_plane_svg }, light : { scale : 0.4, - anchor : new google.maps.Point(32, 25), + anchor : [32, 25], path : _beechcraft_svg }, medium : { scale : 0.4, - anchor : new google.maps.Point(32, 32), + anchor : [32, 32], path : _generic_plane_svg }, heavy : { scale : 0.6, - anchor : new google.maps.Point(32, 32), + anchor : [32, 32], path : _heavy_svg }, rotorcraft : { scale : 0.5, - anchor : new google.maps.Point(22, 32), + anchor : [22, 32], path : _rotorcraft_svg } }; diff --git a/public_html/planeObject.js b/public_html/planeObject.js index bc717ee..e1ab6b5 100644 --- a/public_html/planeObject.js +++ b/public_html/planeObject.js @@ -13,6 +13,7 @@ function PlaneObject(icao) { this.altitude = null; this.speed = null; this.track = null; + this.prev_position = null; this.position = null; this.position_from_mlat = false this.sitedist = null; @@ -59,67 +60,75 @@ function PlaneObject(icao) { // Appends data to the running track so we can get a visual tail on the plane // Only useful for a long running browser session. PlaneObject.prototype.updateTrack = function(estimate_time) { - var here = this.position; - if (!here) - return; + if (!this.position) + return false; + if (this.position == this.prev_position) + return false; + + var projHere = ol.proj.fromLonLat(this.position); + var projPrev; + if (this.prev_position === null) { + projPrev = projHere; + } else { + projPrev = ol.proj.fromLonLat(this.prev_position); + } + + this.prev_position = this.position; if (this.track_linesegs.length == 0) { // Brand new track //console.log(this.icao + " new track"); - var newseg = { track : new google.maps.MVCArray([here,here]), - line : null, - head_update : this.last_position_time, - tail_update : this.last_position_time, - estimated : false, - ground : (this.altitude === "ground") + var newseg = { fixed: new ol.geom.LineString([projHere]), + feature: null, + head_update: this.last_position_time, + tail_update: this.last_position_time, + estimated: false, + ground: (this.altitude === "ground") }; this.track_linesegs.push(newseg); - this.history_size += 2; + this.history_size ++; return; } - + var lastseg = this.track_linesegs[this.track_linesegs.length - 1]; - var lastpos = lastseg.track.getAt(lastseg.track.getLength() - 1); var elapsed = (this.last_position_time - lastseg.head_update); - var new_data = (here !== lastpos); var est_track = (elapsed > estimate_time); var ground_track = (this.altitude === "ground"); - if (!new_data) - return false; - if (est_track) { + if (!lastseg.estimated) { // >5s gap in data, create a new estimated segment //console.log(this.icao + " switching to estimated"); - this.track_linesegs.push({ track : new google.maps.MVCArray([lastpos, here]), - line : null, - head_update : this.last_position_time, - estimated : true }); + lastseg.fixed.appendCoordinate(projPrev); + this.track_linesegs.push({ fixed: new ol.geom.LineString([projPrev, projHere]), + feature: null, + head_update: this.last_position_time, + estimated: true }); this.history_size += 2; - return true; + } else { + // Keep appending to the existing dashed line; keep every point + lastseg.fixed.appendCoordinate(projPrev); + lastseg.head_update = this.last_position_time; + this.history_size++; } - - // Append to ongoing estimated line - //console.log(this.icao + " extending estimated (" + lastseg.track.getLength() + ")"); - lastseg.track.push(here); - lastseg.head_update = this.last_position_time; - this.history_size++; + return true; } if (lastseg.estimated) { - // We are back to good data. - //console.log(this.icao + " switching to good track"); - this.track_linesegs.push({ track : new google.maps.MVCArray([lastpos, here]), - line : null, - head_update : this.last_position_time, - tail_update : this.last_position_time, - estimated : false, - ground : (this.altitude === "ground") }); - this.history_size += 2; - return true; + // We are back to good data (we got two points close in time), switch back to + // solid lines. + lastseg = { fixed: new ol.geom.LineString([projPrev]), + feature: null, + head_update: this.last_position_time, + tail_update: this.last_position_time, + estimated: false, + ground: (this.altitude === "ground") }; + this.track_linesegs.push(lastseg); + this.history_size ++; + // continue } if ( (lastseg.ground && this.altitude !== "ground") || @@ -127,15 +136,17 @@ PlaneObject.prototype.updateTrack = function(estimate_time) { //console.log(this.icao + " ground state changed"); // Create a new segment as the ground state changed. // assume the state changed halfway between the two points - var midpoint = google.maps.geometry.spherical.interpolate(lastpos,here,0.5); - lastseg.track.push(midpoint); - this.track_linesegs.push({ track : new google.maps.MVCArray([midpoint,here,here]), - line : null, - head_update : this.last_position_time, - tail_update : this.last_position_time, - estimated : false, - ground : (this.altitude === "ground") }); - this.history_size += 4; + // FIXME needs reimplementing post-google + + lastseg.fixed.appendCoordinate(projPrev); + this.track_linesegs.push({ fixed: new ol.geom.LineString([projPrev, projHere]), + latest: here, + feature: null, + head_update: this.last_position_time, + tail_update: this.last_position_time, + estimated: false, + ground: (this.altitude === "ground") }); + this.history_size += 3; return true; } @@ -145,24 +156,22 @@ PlaneObject.prototype.updateTrack = function(estimate_time) { if (this.last_position_time - lastseg.tail_update >= 5) { // enough time has elapsed; retain the last point and add a new one //console.log(this.icao + " retain last point"); - lastseg.track.push(here); + lastseg.fixed.appendCoordinate(projHere); lastseg.tail_update = lastseg.head_update; this.history_size ++; - } else { - // replace the last point with the current position - lastseg.track.setAt(lastseg.track.getLength()-1, here); } + lastseg.head_update = this.last_position_time; return true; }; // This is to remove the line from the screen if we deselect the plane PlaneObject.prototype.clearLines = function() { - for (var i = 0; i < this.track_linesegs.length; ++i) { + for (var i = this.track_linesegs.length - 1; i >= 0 ; --i) { var seg = this.track_linesegs[i]; - if (seg.line !== null) { - seg.line.setMap(null); - seg.line = null; + if (seg.feature !== null) { + PlaneTrailFeatures.remove(seg.feature); + seg.feature = null; } } }; @@ -262,21 +271,19 @@ PlaneObject.prototype.updateIcon = function() { var weight = this.selected ? 2 : 1; var rotation = (this.track === null ? 0 : this.track); - if (col === this.icon.fillColor && opacity == this.icon.fillOpacity && weight === this.icon.strokeWeight && outline == this.icon.strokeColor && rotation === this.icon.rotation && type == this.icon.type) - return false; // no changes - - this.icon.fillColor = col; - this.icon.fillOpacity = opacity; - this.icon.strokeWeight = weight; - this.icon.strokeColor = outline; - this.icon.rotation = rotation; - this.icon.type = type; - this.icon.path = MarkerIcons[type].path; - this.icon.anchor = MarkerIcons[type].anchor; - this.icon.scale = MarkerIcons[type].scale; - if (this.marker) - this.marker.setIcon(this.icon); + /* TODO use the aircraft icon svgs */ + this.markerStyle = new ol.style.Style({ + image: new ol.style.Circle({ + fill: new ol.style.Fill({ color: col }), + stroke: new ol.style.Stroke({ color: outline, width: weight }), + radius: 5, + }) + }); + if (this.marker !== null) { + this.marker.setStyle(this.markerStyle); + } + return true; }; @@ -296,11 +303,12 @@ PlaneObject.prototype.updateData = function(receiver_timestamp, data) { if (typeof data.track !== "undefined") this.track = data.track; if (typeof data.lat !== "undefined") { - this.position = new google.maps.LatLng(data.lat, data.lon); + this.position = [data.lon, data.lat]; this.last_position_time = receiver_timestamp - data.seen_pos; if (SitePosition !== null) { - this.sitedist = google.maps.geometry.spherical.computeDistanceBetween (SitePosition, this.position); + var WGS84 = new ol.Sphere(6378137); + this.sitedist = WGS84.haversineDistance(SitePosition, this.position); } this.position_from_mlat = false; @@ -352,8 +360,8 @@ PlaneObject.prototype.updateTick = function(receiver_timestamp, last_timestamp) PlaneObject.prototype.clearMarker = function() { if (this.marker) { - this.marker.setMap(null); - google.maps.event.clearListeners(this.marker, 'click'); + PlaneIconFeatures.remove(this.marker); + /* FIXME google.maps.event.clearListeners(this.marker, 'click'); */ this.marker = null; } }; @@ -365,28 +373,30 @@ PlaneObject.prototype.updateMarker = function(moved) { return; } - if (this.marker) { - if (moved) - this.marker.setPosition(this.position); - this.updateIcon(); + if (this.marker) { + if (moved) { + this.marker.setGeometry(new ol.geom.Point(ol.proj.fromLonLat(this.position))); + } } else { + this.marker = new ol.Feature(new ol.geom.Point(ol.proj.fromLonLat(this.position))); this.updateIcon(); - this.marker = new google.maps.Marker({ - position: this.position, - map: GoogleMap, - icon: this.icon, - visible: true - }); + PlaneIconFeatures.push(this.marker); + /* FIXME // Trap clicks for this marker. google.maps.event.addListener(this.marker, 'click', selectPlaneByHex.bind(undefined,this.icao,false)); google.maps.event.addListener(this.marker, 'dblclick', selectPlaneByHex.bind(undefined,this.icao,true)); + */ } - + + this.updateIcon(); + + /* // Setting the marker title var title = (this.flight === null || this.flight.length == 0) ? this.icao : (this.flight+' ('+this.icao+')'); if (title !== this.marker.title) this.marker.setTitle(title); + */ }; // Update our planes tail line, @@ -394,39 +404,55 @@ PlaneObject.prototype.updateLines = function() { if (!this.selected) return; + var estimateStyle = new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#a08080', + width: 1.5, + lineDash: [3, 3] + }) + }); + + var airStyle = new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#000000', + width: 2 + }) + }); + + var groundStyle = new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#408040', + width: 2 + }) + }); + + // create the new latest-position line + var lastseg = this.track_linesegs[this.track_linesegs.length - 1]; + var lastfixed = lastseg.fixed.getCoordinateAt(1.0); + var geom = new ol.geom.LineString([lastfixed, ol.proj.fromLonLat(this.position)]); + var feature = new ol.Feature(geom); + feature.setStyle(this.altitude === 'ground' ? groundStyle : airStyle); + + if (PlaneTrailFeatures.length == 0) { + PlaneTrailFeatures.push(feature); + } else { + PlaneTrailFeatures.setAt(0, feature); + } + + // create any missing fixed line features for (var i = 0; i < this.track_linesegs.length; ++i) { var seg = this.track_linesegs[i]; - if (seg.line === null) { - // console.log("create line for seg " + i + " with " + seg.track.getLength() + " points" + (seg.estimated ? " (estimated)" : "")); - // for (var j = 0; j < seg.track.getLength(); j++) { - // console.log(" point " + j + " at " + seg.track.getAt(j).lat() + "," + seg.track.getAt(j).lng()); - // } - + if (seg.feature === null) { + seg.feature = new ol.Feature(seg.fixed); if (seg.estimated) { - var lineSymbol = { - path: 'M 0,-1 0,1', - strokeOpacity : 1, - strokeColor : '#804040', - strokeWeight : 2, - scale: 2 - }; - - seg.line = new google.maps.Polyline({ - path: seg.track, - strokeOpacity: 0, - icons: [{ - icon: lineSymbol, - offset: '0', - repeat: '10px' }], - map : GoogleMap }); + seg.feature.setStyle(estimateStyle); + } else if (seg.ground) { + seg.feature.setStyle(groundStyle); } else { - seg.line = new google.maps.Polyline({ - path: seg.track, - strokeOpacity: 1.0, - strokeColor: (seg.ground ? '#408040' : '#000000'), - strokeWeight: 3, - map: GoogleMap }); + seg.feature.setStyle(airStyle); } + + PlaneTrailFeatures.push(seg.feature); } } }; diff --git a/public_html/script.js b/public_html/script.js index 761dbf7..a0950a2 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -18,7 +18,7 @@ var SpecialSquawks = { }; // Get current map settings -var CenterLat, CenterLon, ZoomLvl, MapType; +var CenterLat, CenterLon, ZoomLvl; var Dump1090Version = "unknown version"; var RefreshInterval = 1000; @@ -319,7 +319,6 @@ function initialize_map() { CenterLat = Number(localStorage['CenterLat']) || DefaultCenterLat; CenterLon = Number(localStorage['CenterLon']) || DefaultCenterLon; ZoomLvl = Number(localStorage['ZoomLvl']) || DefaultZoomLvl; - //MapType = localStorage['MapType'] || google.maps.MapTypeId.ROADMAP; // Set SitePosition, initialize sorting if (SiteShow && (typeof SiteLat !== 'undefined') && (typeof SiteLon !== 'undefined')) { @@ -635,7 +634,7 @@ function refreshSelected() { $('#selected_follow').removeClass('hidden'); if (FollowSelected) { $('#selected_follow').css('font-weight', 'bold'); - GoogleMap.panTo(selected.position); + OLMap.getView().setCenter(ol.proj.fromLonLat(selected.position)); } else { $('#selected_follow').css('font-weight', 'normal'); } @@ -810,8 +809,8 @@ function selectPlaneByHex(hex,autofollow) { if (SelectedPlane !== null && autofollow) { FollowSelected = true; - if (GoogleMap.getZoom() < 8) - GoogleMap.setZoom(8); + if (OLMap.getView().getZoom() < 8) + OLMap.getView().setZoom(8); } else { FollowSelected = false; } @@ -821,8 +820,8 @@ function selectPlaneByHex(hex,autofollow) { function toggleFollowSelected() { FollowSelected = !FollowSelected; - if (FollowSelected && GoogleMap.getZoom() < 8) - GoogleMap.setZoom(8); + if (FollowSelected && OLMap.getView().getZoom() < 8) + OLMap.getView().setZoom(8); refreshSelected(); } @@ -831,37 +830,10 @@ function resetMap() { localStorage['CenterLat'] = CenterLat = DefaultCenterLat; localStorage['CenterLon'] = CenterLon = DefaultCenterLon; localStorage['ZoomLvl'] = ZoomLvl = DefaultZoomLvl; - localStorage['MapType'] = MapType = google.maps.MapTypeId.ROADMAP; // Set and refresh - GoogleMap.setZoom(ZoomLvl); - GoogleMap.setCenter(new google.maps.LatLng(CenterLat, CenterLon)); + OLMap.getView().setZoom(ZoomLvl); + OLMap.getView().setCenter(ol.proj.fromLonLat([CenterLon, CenterLat])); selectPlaneByHex(null,false); } - -function drawCircle(marker, distance) { - if (typeof distance === 'undefined') { - return false; - } - - distance = parseFloat(distance); - if (isNaN(distance) || !isFinite(distance) || distance < 0) { - return false; - } - - distance *= 1000.0; - if (!Metric) { - distance *= 1.852; - } - - // Add circle overlay and bind to marker - var circle = new google.maps.Circle({ - map: GoogleMap, - radius: distance, // In meters - fillOpacity: 0.0, - strokeWeight: 1, - strokeOpacity: 0.3 - }); - circle.bindTo('center', marker, 'position'); -} From 98564ab6d0384de2d23f6e46543e4a659b7571b5 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 17:09:16 +0100 Subject: [PATCH 12/32] Add a scale. --- public_html/script.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/public_html/script.js b/public_html/script.js index a0950a2..d68a7df 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -363,7 +363,11 @@ function initialize_map() { view: new ol.View({ center: ol.proj.fromLonLat([CenterLon, CenterLat]), zoom: ZoomLvl - }) + }), + controls: [new ol.control.Zoom(), + new ol.control.Rotate(), + new ol.control.Attribution(), + new ol.control.ScaleLine({units: Metric ? "metric" : "nautical"})] }); // Listeners for newly created Map From 18bd8b630dbbe6fbf8cdc43a5733c982f001932b Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 17:10:52 +0100 Subject: [PATCH 13/32] Draw plane icons. --- public_html/markers.js | 26 +++++++++++++++++ public_html/planeObject.js | 58 +++++++++++++++++++++++++++----------- 2 files changed, 67 insertions(+), 17 deletions(-) diff --git a/public_html/markers.js b/public_html/markers.js index 2dae794..508be20 100755 --- a/public_html/markers.js +++ b/public_html/markers.js @@ -61,31 +61,57 @@ var _heavy_svg = var MarkerIcons = { generic : { scale : 0.4, + size : [64, 64], anchor : [32, 32], path : _generic_plane_svg }, light : { scale : 0.4, + size : [64, 64], anchor : [32, 25], path : _beechcraft_svg }, medium : { scale : 0.4, + size : [64, 64], anchor : [32, 32], path : _generic_plane_svg }, heavy : { scale : 0.6, + size : [64, 64], anchor : [32, 32], path : _heavy_svg }, rotorcraft : { scale : 0.5, + size : [64, 64], anchor : [22, 32], path : _rotorcraft_svg } }; + +function svgPathToSvg(path, size, stroke, width, fill) { + var svg = ''; + svg += ' " + svgKey); + + this.markerIcon = new ol.style.Icon({ + anchor: MarkerIcons[type].anchor, + anchorXUnits: 'pixels', + anchorYUnits: 'pixels', + scale: MarkerIcons[type].scale, + imgSize: MarkerIcons[type].size, + src: svgPathToURI(MarkerIcons[type].path, MarkerIcons[type].size, outline, weight, col), + rotation: rotation * Math.PI / 180.0, + opacity: opacity + }); + + this.markerStyleKey = styleKey; + this.markerSvgKey = svgKey; + this.markerStyle = new ol.style.Style({ + image: this.markerIcon + }); + + if (this.marker !== null) { + this.marker.setStyle(this.markerStyle); + } + } + + if (this.markerStyleKey != styleKey) { + console.log(this.icao + " new rotation"); + this.markerIcon.setRotation(rotation * Math.PI / 180.0); + this.markerIcon.setOpacity(opacity); + this.markerStyleKey = styleKey; } return true; @@ -373,13 +397,14 @@ PlaneObject.prototype.updateMarker = function(moved) { return; } + this.updateIcon(); if (this.marker) { if (moved) { this.marker.setGeometry(new ol.geom.Point(ol.proj.fromLonLat(this.position))); } } else { this.marker = new ol.Feature(new ol.geom.Point(ol.proj.fromLonLat(this.position))); - this.updateIcon(); + this.marker.setStyle(this.markerStyle); PlaneIconFeatures.push(this.marker); /* FIXME @@ -389,7 +414,6 @@ PlaneObject.prototype.updateMarker = function(moved) { */ } - this.updateIcon(); /* // Setting the marker title From 90f5a7d4e3216aad6753f64a727a2ee64cb65c31 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 17:11:08 +0100 Subject: [PATCH 14/32] Round the computed colors a bit to reduce flickering. (each color change requires regenerating the svg icon) --- public_html/planeObject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public_html/planeObject.js b/public_html/planeObject.js index 7493ce6..92b0f9b 100644 --- a/public_html/planeObject.js +++ b/public_html/planeObject.js @@ -262,7 +262,7 @@ PlaneObject.prototype.getMarkerColor = function() { if (l < 5) l = 5; else if (l > 95) l = 95; - return 'hsl(' + h.toFixed(0) + ',' + s.toFixed(0) + '%,' + l.toFixed(0) + '%)' + return 'hsl(' + (h/5).toFixed(0)*5 + ',' + (s/5).toFixed(0)*5 + '%,' + (l/5).toFixed(0)*5 + '%)' } PlaneObject.prototype.updateIcon = function() { From fc95719f2e8e6cd45356ac899851c5718b5bd7f8 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 17:11:33 +0100 Subject: [PATCH 15/32] Reinstate selecting aircraft by clicking on their icons. --- public_html/planeObject.js | 1 + public_html/script.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/public_html/planeObject.js b/public_html/planeObject.js index 92b0f9b..9a4d556 100644 --- a/public_html/planeObject.js +++ b/public_html/planeObject.js @@ -404,6 +404,7 @@ PlaneObject.prototype.updateMarker = function(moved) { } } else { this.marker = new ol.Feature(new ol.geom.Point(ol.proj.fromLonLat(this.position))); + this.marker.hex = this.icao; this.marker.setStyle(this.markerStyle); PlaneIconFeatures.push(this.marker); diff --git a/public_html/script.js b/public_html/script.js index d68a7df..ea9de91 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -390,6 +390,25 @@ function initialize_map() { localStorage['ZoomLvl'] = OLMap.getView().getZoom(); }); + OLMap.addInteraction(new ol.interaction.Pointer({ + handleDownEvent: function(evt) { + console.log("down event"); + var hex = evt.map.forEachFeatureAtPixel(evt.pixel, + function(feature, layer) { + return feature.hex; + }, + null, + function(layer) { + return (layer === iconsLayer); + }, + null); + if (hex) { + selectPlaneByHex(hex); + } + return false; + } + })); + // Add home marker if requested if (SitePosition) { console.log("setting up site position"); From b7fc52bcb306f17d477b85dab0f3df24e71908d3 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 17:14:58 +0100 Subject: [PATCH 16/32] Tweak the svg stroke width based on scale. The stroke width is applied before scaling, but we actually want the outline to have the same weight regardless of the scale chosen. --- public_html/planeObject.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public_html/planeObject.js b/public_html/planeObject.js index 9a4d556..a1a8909 100644 --- a/public_html/planeObject.js +++ b/public_html/planeObject.js @@ -270,7 +270,7 @@ PlaneObject.prototype.updateIcon = function() { var opacity = (this.position_from_mlat ? 0.75 : 1.0); var outline = (this.position_from_mlat ? OutlineMlatColor : OutlineADSBColor); var type = this.getMarkerIconType(); - var weight = this.selected ? 4 : 1; + var weight = ((this.selected ? 2 : 1) / MarkerIcons[type].scale).toFixed(1); var rotation = (this.track === null ? 0 : this.track); var svgKey = col + '!' + outline + '!' + type + '!' + weight; From 5cf512cf63a38e0e737c02287314e84b496a706e Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 18:10:15 +0100 Subject: [PATCH 17/32] Clean out some debug, dead code. --- public_html/planeObject.js | 18 ++---------------- public_html/script.js | 1 - 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/public_html/planeObject.js b/public_html/planeObject.js index a1a8909..13be440 100644 --- a/public_html/planeObject.js +++ b/public_html/planeObject.js @@ -277,7 +277,7 @@ PlaneObject.prototype.updateIcon = function() { var styleKey = opacity + '!' + rotation; if (this.markerStyle === null || this.markerIcon === null || this.markerSvgKey != svgKey) { - console.log(this.icao + " new icon and style " + this.markerSvgKey + " -> " + svgKey); + //console.log(this.icao + " new icon and style " + this.markerSvgKey + " -> " + svgKey); this.markerIcon = new ol.style.Icon({ anchor: MarkerIcons[type].anchor, @@ -302,7 +302,7 @@ PlaneObject.prototype.updateIcon = function() { } if (this.markerStyleKey != styleKey) { - console.log(this.icao + " new rotation"); + //console.log(this.icao + " new rotation"); this.markerIcon.setRotation(rotation * Math.PI / 180.0); this.markerIcon.setOpacity(opacity); this.markerStyleKey = styleKey; @@ -407,21 +407,7 @@ PlaneObject.prototype.updateMarker = function(moved) { this.marker.hex = this.icao; this.marker.setStyle(this.markerStyle); PlaneIconFeatures.push(this.marker); - - /* FIXME - // Trap clicks for this marker. - google.maps.event.addListener(this.marker, 'click', selectPlaneByHex.bind(undefined,this.icao,false)); - google.maps.event.addListener(this.marker, 'dblclick', selectPlaneByHex.bind(undefined,this.icao,true)); - */ } - - - /* - // Setting the marker title - var title = (this.flight === null || this.flight.length == 0) ? this.icao : (this.flight+' ('+this.icao+')'); - if (title !== this.marker.title) - this.marker.setTitle(title); - */ }; // Update our planes tail line, diff --git a/public_html/script.js b/public_html/script.js index ea9de91..e0c3f33 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -411,7 +411,6 @@ function initialize_map() { // Add home marker if requested if (SitePosition) { - console.log("setting up site position"); var markerStyle = new ol.style.Style({ image: new ol.style.Circle({ radius: 7, From 54dc91adc5bba41702f3b3c60e66ddde5a6c2ab6 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 18:10:37 +0100 Subject: [PATCH 18/32] Make table selection a little more robust. --- public_html/script.js | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/public_html/script.js b/public_html/script.js index e0c3f33..697fdaf 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -89,8 +89,15 @@ function processReceiverUpdate(data) { $('img', plane.tr.cells[1]).css('display', 'none'); } - plane.tr.addEventListener('click', selectPlaneByHex.bind(undefined,hex,false)); - plane.tr.addEventListener('dblclick', selectPlaneByHex.bind(undefined,hex,true)); + plane.tr.addEventListener('click', function(h, evt) { + selectPlaneByHex(h, false); + evt.preventDefault(); + }.bind(undefined, hex)); + + plane.tr.addEventListener('dblclick', function(h, evt) { + selectPlaneByHex(h, true); + evt.preventDefault(); + }.bind(undefined, hex)); Planes[hex] = plane; PlanesOrdered.push(plane); @@ -813,8 +820,9 @@ function selectPlaneByHex(hex,autofollow) { $(Planes[SelectedPlane].tr).removeClass("selected"); } - // If we are clicking the same plane, we are deselected it. - if (SelectedPlane === hex) { + // If we are clicking the same plane, we are deselecting it. + // (unless it was a doubleclick..) + if (SelectedPlane === hex && !autofollow) { hex = null; } From 986c910a73e3dd2cea5275c87fa5d3e8215aa8a3 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 18:11:05 +0100 Subject: [PATCH 19/32] Turns out we don't need an interaction to catch feature clicks. --- public_html/script.js | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/public_html/script.js b/public_html/script.js index 697fdaf..86bfb5c 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -397,24 +397,21 @@ function initialize_map() { localStorage['ZoomLvl'] = OLMap.getView().getZoom(); }); - OLMap.addInteraction(new ol.interaction.Pointer({ - handleDownEvent: function(evt) { - console.log("down event"); - var hex = evt.map.forEachFeatureAtPixel(evt.pixel, - function(feature, layer) { - return feature.hex; - }, - null, - function(layer) { - return (layer === iconsLayer); - }, - null); - if (hex) { - selectPlaneByHex(hex); - } - return false; + OLMap.on(['click', 'dblclick'], function(evt) { + var hex = evt.map.forEachFeatureAtPixel(evt.pixel, + function(feature, layer) { + return feature.hex; + }, + null, + function(layer) { + return (layer === iconsLayer); + }, + null); + if (hex) { + selectPlaneByHex(hex, (evt.type === 'dblclick')); + evt.stopPropagation(); } - })); + }); // Add home marker if requested if (SitePosition) { From 49cb77ac8f734e05b01608af4cbda7ebd7384756 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 18:45:03 +0100 Subject: [PATCH 20/32] Do stuff while animating/interacting. --- public_html/script.js | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/public_html/script.js b/public_html/script.js index 86bfb5c..9b3a6c6 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -353,15 +353,27 @@ function initialize_map() { }); var staticLayer = new ol.layer.Vector({ - source: new ol.source.Vector({features: StaticFeatures}) + source: new ol.source.Vector({ + features: StaticFeatures, + updateWhileInteracting: true, + updateWhileAnimating: true + }) }); var trailsLayer = new ol.layer.Vector({ - source: new ol.source.Vector({features: PlaneTrailFeatures}) + source: new ol.source.Vector({ + features: PlaneTrailFeatures, + updateWhileInteracting: true, + updateWhileAnimating: true + }) }); var iconsLayer = new ol.layer.Vector({ - source: new ol.source.Vector({features: PlaneIconFeatures}) + source: new ol.source.Vector({ + features: PlaneIconFeatures, + updateWhileInteracting: true, + updateWhileAnimating: true + }) }); OLMap = new ol.Map({ @@ -374,7 +386,9 @@ function initialize_map() { controls: [new ol.control.Zoom(), new ol.control.Rotate(), new ol.control.Attribution(), - new ol.control.ScaleLine({units: Metric ? "metric" : "nautical"})] + new ol.control.ScaleLine({units: Metric ? "metric" : "nautical"})], + loadTilesWhileAnimating: true, + loadTilesWhileInteracting: true }); // Listeners for newly created Map From 2e68341106962c37c73e806acdfbed70b93ac8c4 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 21:12:31 +0100 Subject: [PATCH 21/32] Layer switching support, ChartBundle, Bing maps. --- debian/copyright | 6 + public_html/config.js | 18 +- public_html/gmap.html | 5 +- public_html/ol3/ol3-layerswitcher.css | 92 +++++++++ public_html/ol3/ol3-layerswitcher.js | 283 ++++++++++++++++++++++++++ public_html/script.js | 121 ++++++++++- 6 files changed, 498 insertions(+), 27 deletions(-) create mode 100644 public_html/ol3/ol3-layerswitcher.css create mode 100644 public_html/ol3/ol3-layerswitcher.js diff --git a/debian/copyright b/debian/copyright index b52968e..1ebfe50 100644 --- a/debian/copyright +++ b/debian/copyright @@ -44,6 +44,12 @@ Comment: _generic_plane_svg was added with https://github.com/mutability/dump109 Files: public_html/jquery/* Copyright: 2015 jQuery Foundation and other contributors License: MIT +Source: http://www.jquery.com/ + +Files: public_html/ol3/ol3-layerswitcher.js public_html/ol3/ol3-layerswitcher.css +Copyright: Matt Walker +License: MIT +Source: https://github.com/walkermatt/ol3-layerswitcher Files: debian/* Copyright: 2014,2015 Oliver Jowett diff --git a/public_html/config.js b/public_html/config.js index 10c2bba..b513b26 100644 --- a/public_html/config.js +++ b/public_html/config.js @@ -39,21 +39,6 @@ SiteLat = 45.0; // position of the marker SiteLon = 9.0; SiteName = "My Radar Site"; // tooltip of the marker - -// Extra map types to include. These work for maps with 256x256 tiles where a -// URL can be constructed by simple substition of x/y tile number and zoom level -var ExtraMapTypes = { - 'OpenStreetMap' : 'http://tile.openstreetmap.org/{z}/{x}/{y}.png', - // NB: the following generally only cover the US - 'Sectional Charts' : 'http://wms.chartbundle.com/tms/1.0.0/sec/{z}/{x}/{y}.png?origin=nw', - 'Terminal Charts' : 'http://wms.chartbundle.com/tms/1.0.0/tac/{z}/{x}/{y}.png?origin=nw', - 'World Charts' : 'http://wms.chartbundle.com/tms/1.0.0/wac/{z}/{x}/{y}.png?origin=nw', - 'IFR Low Charts' : 'http://wms.chartbundle.com/tms/1.0.0/enrl/{z}/{x}/{y}.png?origin=nw', - 'IFR Area Charts' : 'http://wms.chartbundle.com/tms/1.0.0/enra/{z}/{x}/{y}.png?origin=nw', - 'IFR High Charts' : 'http://wms.chartbundle.com/tms/1.0.0/enrh/{z}/{x}/{y}.png?origin=nw' -}; - - // -- Marker settings ------------------------------------- // These settings control the coloring of aircraft by altitude. @@ -127,3 +112,6 @@ ShowFlags = true; // Path to country flags (can be a relative or absolute URL; include a trailing /) FlagPath = "flags-tiny/"; + +// Provide a Bing Maps API key here to enable the Bing imagery layer. +BingMapsAPIKey = null; diff --git a/public_html/gmap.html b/public_html/gmap.html index f46b14a..4a053fb 100644 --- a/public_html/gmap.html +++ b/public_html/gmap.html @@ -7,9 +7,12 @@ - + + + + diff --git a/public_html/ol3/ol3-layerswitcher.css b/public_html/ol3/ol3-layerswitcher.css new file mode 100644 index 0000000..088abd9 --- /dev/null +++ b/public_html/ol3/ol3-layerswitcher.css @@ -0,0 +1,92 @@ +.layer-switcher.shown.ol-control { + background-color: transparent; +} + +.layer-switcher.shown.ol-control:hover { + background-color: transparent; +} + +.layer-switcher { + position: absolute; + top: 3.5em; + right: 0.5em; + text-align: left; +} + +.layer-switcher.shown { + bottom: 3em; +} + +.layer-switcher .panel { + padding: 0 1em 0 0; + margin: 0; + border: 4px solid #eee; + border-radius: 4px; + background-color: white; + display: none; + max-height: 100%; + overflow-y: auto; +} + +.layer-switcher.shown .panel { + display: block; +} + +.layer-switcher button { + float: right; + width: 38px; + height: 38px; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACE1BMVEX///8A//8AgICA//8AVVVAQID///8rVVVJtttgv98nTmJ2xNgkW1ttyNsmWWZmzNZYxM4gWGgeU2JmzNNr0N1Rwc0eU2VXxdEhV2JqytQeVmMhVmNoydUfVGUgVGQfVGQfVmVqy9hqy9dWw9AfVWRpydVry9YhVmMgVGNUw9BrytchVWRexdGw294gVWQgVmUhVWPd4N6HoaZsy9cfVmQgVGRrytZsy9cgVWQgVWMgVWRsy9YfVWNsy9YgVWVty9YgVWVry9UgVWRsy9Zsy9UfVWRsy9YgVWVty9YgVWRty9Vsy9aM09sgVWRTws/AzM0gVWRtzNYgVWRuy9Zsy9cgVWRGcHxty9bb5ORbxdEgVWRty9bn6OZTws9mydRfxtLX3Nva5eRix9NFcXxOd4JPeINQeIMiVmVUws9Vws9Vw9BXw9BYxNBaxNBbxNBcxdJexdElWWgmWmhjyNRlx9IqXGtoipNpytVqytVryNNrytZsjZUuX210k5t1y9R2zNR3y9V4lp57zth9zdaAnKOGoaeK0NiNpquV09mesrag1tuitbmj1tuj19uktrqr2d2svcCu2d2xwMO63N+7x8nA3uDC3uDFz9DK4eHL4eLN4eIyYnDX5OM5Z3Tb397e4uDf4uHf5uXi5ePi5+Xj5+Xk5+Xm5+Xm6OY6aHXQ19fT4+NfhI1Ww89gx9Nhx9Nsy9ZWw9Dpj2abAAAAWnRSTlMAAQICAwQEBgcIDQ0ODhQZGiAiIyYpKywvNTs+QklPUlNUWWJjaGt0dnd+hIWFh4mNjZCSm6CpsbW2t7nDzNDT1dje5efr7PHy9PT29/j4+Pn5+vr8/f39/f6DPtKwAAABTklEQVR4Xr3QVWPbMBSAUTVFZmZmhhSXMjNvkhwqMzMzMzPDeD+xASvObKePPa+ffHVl8PlsnE0+qPpBuQjVJjno6pZpSKXYl7/bZyFaQxhf98hHDKEppwdWIW1frFnrxSOWHFfWesSEWC6R/P4zOFrix3TzDFLlXRTR8c0fEEJ1/itpo7SVO9Jdr1DVxZ0USyjZsEY5vZfiiAC0UoTGOrm9PZLuRl8X+Dq1HQtoFbJZbv61i+Poblh/97TC7n0neCcK0ETNUrz1/xPHf+DNAW9Ac6t8O8WH3Vp98f5lCaYKAOFZMLyHL4Y0fe319idMNgMMp+zWVSybUed/+/h7I4wRAG1W6XDy4XmjR9HnzvDRZXUAYDFOhC1S/Hh+fIXxen+eO+AKqbs+wAo30zDTDvDxKoJN88sjUzDFAvBzEUGFsnADoIvAJzoh2BZ8sner+Ke/vwECuQAAAABJRU5ErkJggg==') /*logo.png*/; + background-repeat: no-repeat; + background-position: 2px; + background-color: white; + border: none; +} + +.layer-switcher.shown button { + display: none; +} + +.layer-switcher button:focus, .layer-switcher button:hover { + background-color: white; +} + +.layer-switcher ul { + padding-left: 1em; + list-style: none; +} + +.layer-switcher li.group { + padding-top: 5px; +} + +.layer-switcher li.group > label { + font-weight: bold; +} + +.layer-switcher li.layer { + display: table; +} + +.layer-switcher li.layer label, .layer-switcher li.layer input { + display: table-cell; + vertical-align: sub; +} + +.layer-switcher input { + margin: 4px; +} + +.layer-switcher.touch ::-webkit-scrollbar { + width: 4px; +} + +.layer-switcher.touch ::-webkit-scrollbar-track { + -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); + border-radius: 10px; +} + +.layer-switcher.touch ::-webkit-scrollbar-thumb { + border-radius: 10px; + -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5); +} diff --git a/public_html/ol3/ol3-layerswitcher.js b/public_html/ol3/ol3-layerswitcher.js new file mode 100644 index 0000000..ee44e2f --- /dev/null +++ b/public_html/ol3/ol3-layerswitcher.js @@ -0,0 +1,283 @@ +/** + * OpenLayers 3 Layer Switcher Control. + * See [the examples](./examples) for usage. + * @constructor + * @extends {ol.control.Control} + * @param {Object} opt_options Control options, extends olx.control.ControlOptions adding: + * **`tipLabel`** `String` - the button tooltip. + */ +ol.control.LayerSwitcher = function(opt_options) { + + var options = opt_options || {}; + + var tipLabel = options.tipLabel ? + options.tipLabel : 'Legend'; + + this.mapListeners = []; + + this.hiddenClassName = 'ol-unselectable ol-control layer-switcher'; + if (ol.control.LayerSwitcher.isTouchDevice_()) { + this.hiddenClassName += ' touch'; + } + this.shownClassName = this.hiddenClassName + ' shown'; + + var element = document.createElement('div'); + element.className = this.hiddenClassName; + + var button = document.createElement('button'); + button.setAttribute('title', tipLabel); + element.appendChild(button); + + this.panel = document.createElement('div'); + this.panel.className = 'panel'; + element.appendChild(this.panel); + ol.control.LayerSwitcher.enableTouchScroll_(this.panel); + + var this_ = this; + + button.onmouseover = function(e) { + this_.showPanel(); + }; + + button.onclick = function(e) { + e = e || window.event; + this_.showPanel(); + e.preventDefault(); + }; + + this_.panel.onmouseout = function(e) { + e = e || window.event; + if (!this_.panel.contains(e.toElement || e.relatedTarget)) { + this_.hidePanel(); + } + }; + + ol.control.Control.call(this, { + element: element, + target: options.target + }); + +}; + +ol.inherits(ol.control.LayerSwitcher, ol.control.Control); + +/** + * Show the layer panel. + */ +ol.control.LayerSwitcher.prototype.showPanel = function() { + if (this.element.className != this.shownClassName) { + this.element.className = this.shownClassName; + this.renderPanel(); + } +}; + +/** + * Hide the layer panel. + */ +ol.control.LayerSwitcher.prototype.hidePanel = function() { + if (this.element.className != this.hiddenClassName) { + this.element.className = this.hiddenClassName; + } +}; + +/** + * Re-draw the layer panel to represent the current state of the layers. + */ +ol.control.LayerSwitcher.prototype.renderPanel = function() { + + this.ensureTopVisibleBaseLayerShown_(); + + while(this.panel.firstChild) { + this.panel.removeChild(this.panel.firstChild); + } + + var ul = document.createElement('ul'); + this.panel.appendChild(ul); + this.renderLayers_(this.getMap(), ul); + +}; + +/** + * Set the map instance the control is associated with. + * @param {ol.Map} map The map instance. + */ +ol.control.LayerSwitcher.prototype.setMap = function(map) { + // Clean up listeners associated with the previous map + for (var i = 0, key; i < this.mapListeners.length; i++) { + this.getMap().unByKey(this.mapListeners[i]); + } + this.mapListeners.length = 0; + // Wire up listeners etc. and store reference to new map + ol.control.Control.prototype.setMap.call(this, map); + if (map) { + var this_ = this; + this.mapListeners.push(map.on('pointerdown', function() { + this_.hidePanel(); + })); + this.renderPanel(); + } +}; + +/** + * Ensure only the top-most base layer is visible if more than one is visible. + * @private + */ +ol.control.LayerSwitcher.prototype.ensureTopVisibleBaseLayerShown_ = function() { + var lastVisibleBaseLyr; + ol.control.LayerSwitcher.forEachRecursive(this.getMap(), function(l, idx, a) { + if (l.get('type') === 'base' && l.getVisible()) { + lastVisibleBaseLyr = l; + } + }); + if (lastVisibleBaseLyr) this.setVisible_(lastVisibleBaseLyr, true); +}; + +/** + * Toggle the visible state of a layer. + * Takes care of hiding other layers in the same exclusive group if the layer + * is toggle to visible. + * @private + * @param {ol.layer.Base} The layer whos visibility will be toggled. + */ +ol.control.LayerSwitcher.prototype.setVisible_ = function(lyr, visible) { + var map = this.getMap(); + lyr.setVisible(visible); + if (visible && lyr.get('type') === 'base') { + // Hide all other base layers regardless of grouping + ol.control.LayerSwitcher.forEachRecursive(map, function(l, idx, a) { + if (l != lyr && l.get('type') === 'base') { + l.setVisible(false); + } + }); + } +}; + +/** + * Render all layers that are children of a group. + * @private + * @param {ol.layer.Base} lyr Layer to be rendered (should have a title property). + * @param {Number} idx Position in parent group list. + */ +ol.control.LayerSwitcher.prototype.renderLayer_ = function(lyr, idx) { + + var this_ = this; + + var li = document.createElement('li'); + + var lyrTitle = lyr.get('title'); + var lyrId = ol.control.LayerSwitcher.uuid(); + + var label = document.createElement('label'); + + if (lyr.getLayers && !lyr.get('combine')) { + + li.className = 'group'; + label.innerHTML = lyrTitle; + li.appendChild(label); + var ul = document.createElement('ul'); + li.appendChild(ul); + + this.renderLayers_(lyr, ul); + + } else { + + li.className = 'layer'; + var input = document.createElement('input'); + if (lyr.get('type') === 'base') { + input.type = 'radio'; + input.name = 'base'; + } else { + input.type = 'checkbox'; + } + input.id = lyrId; + input.checked = lyr.get('visible'); + input.onchange = function(e) { + this_.setVisible_(lyr, e.target.checked); + }; + li.appendChild(input); + + label.htmlFor = lyrId; + label.innerHTML = lyrTitle; + li.appendChild(label); + + } + + return li; + +}; + +/** + * Render all layers that are children of a group. + * @private + * @param {ol.layer.Group} lyr Group layer whos children will be rendered. + * @param {Element} elm DOM element that children will be appended to. + */ +ol.control.LayerSwitcher.prototype.renderLayers_ = function(lyr, elm) { + var lyrs = lyr.getLayers().getArray().slice().reverse(); + for (var i = 0, l; i < lyrs.length; i++) { + l = lyrs[i]; + if (l.get('title')) { + elm.appendChild(this.renderLayer_(l, i)); + } + } +}; + +/** + * **Static** Call the supplied function for each layer in the passed layer group + * recursing nested groups. + * @param {ol.layer.Group} lyr The layer group to start iterating from. + * @param {Function} fn Callback which will be called for each `ol.layer.Base` + * found under `lyr`. The signature for `fn` is the same as `ol.Collection#forEach` + */ +ol.control.LayerSwitcher.forEachRecursive = function(lyr, fn) { + lyr.getLayers().forEach(function(lyr, idx, a) { + fn(lyr, idx, a); + if (lyr.getLayers) { + ol.control.LayerSwitcher.forEachRecursive(lyr, fn); + } + }); +}; + +/** + * Generate a UUID + * @returns {String} UUID + * + * Adapted from http://stackoverflow.com/a/2117523/526860 + */ +ol.control.LayerSwitcher.uuid = function() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); + return v.toString(16); + }); +} + +/** +* @private +* @desc Apply workaround to enable scrolling of overflowing content within an +* element. Adapted from https://gist.github.com/chrismbarr/4107472 +*/ +ol.control.LayerSwitcher.enableTouchScroll_ = function(elm) { + if(ol.control.LayerSwitcher.isTouchDevice_()){ + var scrollStartPos = 0; + elm.addEventListener("touchstart", function(event) { + scrollStartPos = this.scrollTop + event.touches[0].pageY; + }, false); + elm.addEventListener("touchmove", function(event) { + this.scrollTop = scrollStartPos - event.touches[0].pageY; + }, false); + } +}; + +/** + * @private + * @desc Determine if the current browser supports touch events. Adapted from + * https://gist.github.com/chrismbarr/4107472 + */ +ol.control.LayerSwitcher.isTouchDevice_ = function() { + try { + document.createEvent("TouchEvent"); + return true; + } catch(e) { + return false; + } +}; diff --git a/public_html/script.js b/public_html/script.js index 9b3a6c6..19618eb 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -18,7 +18,7 @@ var SpecialSquawks = { }; // Get current map settings -var CenterLat, CenterLon, ZoomLvl; +var CenterLat, CenterLon, ZoomLvl, MapType; var Dump1090Version = "unknown version"; var RefreshInterval = 1000; @@ -326,6 +326,7 @@ function initialize_map() { CenterLat = Number(localStorage['CenterLat']) || DefaultCenterLat; CenterLon = Number(localStorage['CenterLon']) || DefaultCenterLon; ZoomLvl = Number(localStorage['ZoomLvl']) || DefaultZoomLvl; + MapType = localStorage['MapType']; // Set SitePosition, initialize sorting if (SiteShow && (typeof SiteLat !== 'undefined') && (typeof SiteLon !== 'undefined')) { @@ -346,27 +347,122 @@ function initialize_map() { } // Initialize OL3 - // TODO map types etc - var rasterLayer = new ol.layer.Tile({ - source: new ol.source.OSM() - }); + var baseLayerGroups = { + 'world': new ol.layer.Group({ + title: 'Worldwide' + }), - var staticLayer = new ol.layer.Vector({ + 'chartbundle': new ol.layer.Group({ + title: 'ChartBundle (US)' + }) + }; + + var baseLayers = [] + + baseLayers.push(new ol.layer.Tile({ + source: new ol.source.OSM(), + name: 'osm', + title: 'OpenStreetMap', + type: 'base', + group: 'world' + })); + + baseLayers.push(new ol.layer.Tile({ + source: new ol.source.MapQuest({layer: 'sat'}), + name: 'mapquest_sat', + title: 'MapQuest satellite', + type: 'base', + group: 'world' + })); + + if (BingMapsAPIKey) { + baseLayers.push(new ol.layer.Tile({ + source: new ol.source.BingMaps({ + key: BingMapsAPIKey, + imagerySet: 'Aerial' + }), + name: 'bing_aerial', + title: 'Bing Aerial', + type: 'base', + group: 'world' + })); + } + + var chartbundleTypes = { + sec: "Sectional Charts", + tac: "Terminal Area Charts", + wac: "World Aeronautical Charts", + enrl: "IFR Enroute Low Charts", + enra: "IFR Area Charts", + enrh: "IFR Enroute High Charts" + }; + + for (var type in chartbundleTypes) { + baseLayers.push(new ol.layer.Tile({ + source: new ol.source.TileWMS({ + url: 'http://wms.chartbundle.com/wms', + params: {LAYERS: type}, + projection: 'EPSG:3857', + attributions: 'Tiles courtesy of ChartBundle' + }), + name: 'chartbundle_' + type, + title: chartbundleTypes[type], + type: 'base', + group: 'chartbundle'})); + } + + var layers = []; + var found = false; + for (var i = 0; i < baseLayers.length; ++i) { + var layer = baseLayers[i]; + if (MapType === layer.get('name')) { + found = true; + layer.setVisible(true); + } else { + layer.setVisible(false); + } + + layer.on('change:visible', function(evt) { + if (evt.target.getVisible()) { + MapType = localStorage['MapType'] = evt.target.get('name'); + } + }); + + // The layer selector displays in reverse order for some reason, unreverse it + if (layer.get('group')) { + // hurf + baseLayerGroups[layer.get('group')].getLayers().insertAt(0, layer); + } else { + layers.unshift(layer); + } + } + + if (!found) { + baseLayers[0].setVisible(true); + } + + for (var key in baseLayerGroups) { + if (baseLayerGroups[key].getLayers().getLength() > 0) { + layers.unshift(baseLayerGroups[key]); + } + } + + layers.push(new ol.layer.Vector({ source: new ol.source.Vector({ features: StaticFeatures, updateWhileInteracting: true, updateWhileAnimating: true }) - }); + })); - var trailsLayer = new ol.layer.Vector({ + layers.push(new ol.layer.Vector({ source: new ol.source.Vector({ features: PlaneTrailFeatures, updateWhileInteracting: true, updateWhileAnimating: true }) - }); + })); var iconsLayer = new ol.layer.Vector({ source: new ol.source.Vector({ @@ -375,10 +471,11 @@ function initialize_map() { updateWhileAnimating: true }) }); + layers.push(iconsLayer); OLMap = new ol.Map({ target: 'map_canvas', - layers: [rasterLayer, staticLayer, trailsLayer, iconsLayer], + layers: layers, view: new ol.View({ center: ol.proj.fromLonLat([CenterLon, CenterLat]), zoom: ZoomLvl @@ -386,7 +483,9 @@ function initialize_map() { controls: [new ol.control.Zoom(), new ol.control.Rotate(), new ol.control.Attribution(), - new ol.control.ScaleLine({units: Metric ? "metric" : "nautical"})], + new ol.control.ScaleLine({units: Metric ? "metric" : "nautical"}), + new ol.control.LayerSwitcher() + ], loadTilesWhileAnimating: true, loadTilesWhileInteracting: true }); From a357b9676de3d0f4a2dadf70dc3b97b343024e13 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 21:13:10 +0100 Subject: [PATCH 22/32] Keyless MapQuest access goes away shortly so remove that layer. --- public_html/script.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/public_html/script.js b/public_html/script.js index 19618eb..734d6d8 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -368,14 +368,6 @@ function initialize_map() { group: 'world' })); - baseLayers.push(new ol.layer.Tile({ - source: new ol.source.MapQuest({layer: 'sat'}), - name: 'mapquest_sat', - title: 'MapQuest satellite', - type: 'base', - group: 'world' - })); - if (BingMapsAPIKey) { baseLayers.push(new ol.layer.Tile({ source: new ol.source.BingMaps({ From 6e8b7cff57581a4e2023a803976a875f70a1b225 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sat, 2 Jul 2016 21:53:07 +0100 Subject: [PATCH 23/32] Expand the attributions control by default. --- public_html/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public_html/script.js b/public_html/script.js index 734d6d8..5819386 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -474,7 +474,7 @@ function initialize_map() { }), controls: [new ol.control.Zoom(), new ol.control.Rotate(), - new ol.control.Attribution(), + new ol.control.Attribution({collapsed: false}), new ol.control.ScaleLine({units: Metric ? "metric" : "nautical"}), new ol.control.LayerSwitcher() ], From 4862010d428caa16eb5eadb055e700a1688f375f Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sun, 3 Jul 2016 13:35:54 +0100 Subject: [PATCH 24/32] Don't gratuitously reverse the layer order in the switcher. --- public_html/ol3/ol3-layerswitcher.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public_html/ol3/ol3-layerswitcher.js b/public_html/ol3/ol3-layerswitcher.js index ee44e2f..0711c4e 100644 --- a/public_html/ol3/ol3-layerswitcher.js +++ b/public_html/ol3/ol3-layerswitcher.js @@ -213,7 +213,7 @@ ol.control.LayerSwitcher.prototype.renderLayer_ = function(lyr, idx) { * @param {Element} elm DOM element that children will be appended to. */ ol.control.LayerSwitcher.prototype.renderLayers_ = function(lyr, elm) { - var lyrs = lyr.getLayers().getArray().slice().reverse(); + var lyrs = lyr.getLayers().getArray().slice(); for (var i = 0, l; i < lyrs.length; i++) { l = lyrs[i]; if (l.get('title')) { From 6676bc817205220d16c197a066b9aac372683f2b Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sun, 3 Jul 2016 13:36:32 +0100 Subject: [PATCH 25/32] Allow forEachRecursive to work on a collection/array. --- public_html/ol3/ol3-layerswitcher.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/public_html/ol3/ol3-layerswitcher.js b/public_html/ol3/ol3-layerswitcher.js index 0711c4e..444c499 100644 --- a/public_html/ol3/ol3-layerswitcher.js +++ b/public_html/ol3/ol3-layerswitcher.js @@ -225,17 +225,23 @@ ol.control.LayerSwitcher.prototype.renderLayers_ = function(lyr, elm) { /** * **Static** Call the supplied function for each layer in the passed layer group * recursing nested groups. - * @param {ol.layer.Group} lyr The layer group to start iterating from. + * @param {ol.layer.Group} lyr The layer group or collection/array to start iterating from. * @param {Function} fn Callback which will be called for each `ol.layer.Base` * found under `lyr`. The signature for `fn` is the same as `ol.Collection#forEach` */ ol.control.LayerSwitcher.forEachRecursive = function(lyr, fn) { - lyr.getLayers().forEach(function(lyr, idx, a) { - fn(lyr, idx, a); + var traverse = function(lyr, idx, a) { + fn(lyr, idx, a); + if (lyr.getLayers) { + ol.control.LayerSwitcher.forEachRecursive(lyr, fn); + } + }; + if (lyr.getLayers) { - ol.control.LayerSwitcher.forEachRecursive(lyr, fn); + lyr.getLayers().forEach(traverse); + } else { + lyr.forEach(traverse); } - }); }; /** From 381ce5f28011c9a9d7da0f9ddf58df021d69e461 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sun, 3 Jul 2016 13:55:14 +0100 Subject: [PATCH 26/32] Lots of layer cleanups. Move layer config into a separate file. Add a Mapzen vector tile layer. Make the overlay layers toggleable. --- public_html/config.js | 6 ++ public_html/gmap.html | 1 + public_html/layers.js | 173 ++++++++++++++++++++++++++++++++++++++++++ public_html/script.js | 138 +++++++++------------------------ 4 files changed, 215 insertions(+), 103 deletions(-) create mode 100644 public_html/layers.js diff --git a/public_html/config.js b/public_html/config.js index b513b26..52b2b13 100644 --- a/public_html/config.js +++ b/public_html/config.js @@ -113,5 +113,11 @@ ShowFlags = true; // Path to country flags (can be a relative or absolute URL; include a trailing /) FlagPath = "flags-tiny/"; +// Set to true to enable the ChartBundle base layers (US coverage only) +ChartBundleLayers = true; + // Provide a Bing Maps API key here to enable the Bing imagery layer. BingMapsAPIKey = null; + +// Provide a Mapzen API key here to enable the Mapzen vector tile layer. +MapzenAPIKey = null; diff --git a/public_html/gmap.html b/public_html/gmap.html index 4a053fb..ffbab32 100644 --- a/public_html/gmap.html +++ b/public_html/gmap.html @@ -19,6 +19,7 @@ + diff --git a/public_html/layers.js b/public_html/layers.js new file mode 100644 index 0000000..329cd6d --- /dev/null +++ b/public_html/layers.js @@ -0,0 +1,173 @@ +// -*- mode: javascript; indent-tabs-mode: nil; c-basic-offset: 8 -*- +"use strict"; + +// Base layers configuration + +function createBaseLayers() { + var layers = []; + + var world = []; + var us = []; + + world.push(new ol.layer.Tile({ + source: new ol.source.OSM(), + name: 'osm', + title: 'OpenStreetMap', + type: 'base', + })); + + if (BingMapsAPIKey) { + world.push(new ol.layer.Tile({ + source: new ol.source.BingMaps({ + key: BingMapsAPIKey, + imagerySet: 'Aerial' + }), + name: 'bing_aerial', + title: 'Bing Aerial', + type: 'base', + })); + } + + if (MapzenAPIKey) { + world.push(createMapzenLayer()); + } + + if (ChartBundleLayers) { + var chartbundleTypes = { + sec: "Sectional Charts", + tac: "Terminal Area Charts", + wac: "World Aeronautical Charts", + enrl: "IFR Enroute Low Charts", + enra: "IFR Area Charts", + enrh: "IFR Enroute High Charts" + }; + + for (var type in chartbundleTypes) { + us.push(new ol.layer.Tile({ + source: new ol.source.TileWMS({ + url: 'http://wms.chartbundle.com/wms', + params: {LAYERS: type}, + projection: 'EPSG:3857', + attributions: 'Tiles courtesy of ChartBundle' + }), + name: 'chartbundle_' + type, + title: chartbundleTypes[type], + type: 'base', + group: 'chartbundle'})); + } + } + + if (world.length > 0) { + layers.push(new ol.layer.Group({ + name: 'world', + title: 'Worldwide', + layers: world + })); + } + + if (us.length > 0) { + layers.push(new ol.layer.Group({ + name: 'us', + title: 'US', + layers: us + })); + } + + return layers; +} + +function createMapzenLayer() { + // draw earth with a fat stroke; + // force water above earth + + var earthStyle = new ol.style.Style({ + fill: new ol.style.Fill({ + color: '#a06000' + }), + stroke: new ol.style.Stroke({ + color: '#a06000', + width: 5.0 + }), + zIndex: 0 + }); + + var waterStyle = new ol.style.Style({ + fill: new ol.style.Fill({ + color: '#0040a0' + }), + stroke: new ol.style.Stroke({ + color: '#0040a0', + width: 1.0 + }), + zIndex: 1 + }); + + var boundaryStyle = new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#804000', + width: 2.0 + }), + zIndex: 2 + }); + + var dashedBoundaryStyle = new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: '#804000', + width: 1.0, + lineDash: [4, 4], + }), + zIndex: 2 + }); + + var styleMap = { + earth: earthStyle, + + water: waterStyle, + basin: waterStyle, + dock: waterStyle, + lake: waterStyle, + ocean: waterStyle, + riverbank: waterStyle, + river: waterStyle, + + country: boundaryStyle, + disputed: dashedBoundaryStyle, + indefinite: dashedBoundaryStyle, + indeterminate: dashedBoundaryStyle, + line_of_control: dashedBoundaryStyle + }; + + return new ol.layer.VectorTile({ + name: 'mapzen_vector', + title: 'Mapzen coastlines and water', + type: 'base', + renderMode: 'image', + renderOrder: function(a,b) { + return a.get('sort_key') - b.get('sort_key'); + }, + source: new ol.source.VectorTile({ + url: '//vector.mapzen.com/osm/earth,water,boundaries/{z}/{x}/{y}.topojson?api_key=' + MapzenAPIKey, + format: new ol.format.TopoJSON(), + attributions: [ + new ol.Attribution({ + html: 'Tiles courtesy of Mapzen' + }), + new ol.Attribution({ + html: '© OpenStreetMap contributors' + }) + ], + + tileGrid: ol.tilegrid.createXYZ({ + preload: 3, + maxZoom: 14, + tileSize: [512, 512] + }), + + wrapX: true + }), + + style: function (feature) { + return (styleMap[feature.get('kind')]); + } + }); +} diff --git a/public_html/script.js b/public_html/script.js index 5819386..2977d7a 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -316,10 +316,6 @@ function end_load_history() { } -function generic_gettile(template, coord, zoom) { - return template.replace('{x}', coord.x).replace('{y}', coord.y).replace('{z}', zoom) -} - // Initalizes the map and starts up our timers to call various functions function initialize_map() { // Load stored map settings if present @@ -348,122 +344,58 @@ function initialize_map() { // Initialize OL3 - var baseLayerGroups = { - 'world': new ol.layer.Group({ - title: 'Worldwide' - }), + var layers = createBaseLayers(); + var foundType = false; - 'chartbundle': new ol.layer.Group({ - title: 'ChartBundle (US)' - }) - }; + ol.control.LayerSwitcher.forEachRecursive(layers, function(lyr) { + if (lyr.get('type') !== 'base') + return; - var baseLayers = [] - - baseLayers.push(new ol.layer.Tile({ - source: new ol.source.OSM(), - name: 'osm', - title: 'OpenStreetMap', - type: 'base', - group: 'world' - })); - - if (BingMapsAPIKey) { - baseLayers.push(new ol.layer.Tile({ - source: new ol.source.BingMaps({ - key: BingMapsAPIKey, - imagerySet: 'Aerial' - }), - name: 'bing_aerial', - title: 'Bing Aerial', - type: 'base', - group: 'world' - })); - } - - var chartbundleTypes = { - sec: "Sectional Charts", - tac: "Terminal Area Charts", - wac: "World Aeronautical Charts", - enrl: "IFR Enroute Low Charts", - enra: "IFR Area Charts", - enrh: "IFR Enroute High Charts" - }; - - for (var type in chartbundleTypes) { - baseLayers.push(new ol.layer.Tile({ - source: new ol.source.TileWMS({ - url: 'http://wms.chartbundle.com/wms', - params: {LAYERS: type}, - projection: 'EPSG:3857', - attributions: 'Tiles courtesy of ChartBundle' - }), - name: 'chartbundle_' + type, - title: chartbundleTypes[type], - type: 'base', - group: 'chartbundle'})); - } - - var layers = []; - var found = false; - for (var i = 0; i < baseLayers.length; ++i) { - var layer = baseLayers[i]; - if (MapType === layer.get('name')) { - found = true; - layer.setVisible(true); + if (MapType === lyr.get('name')) { + foundType = true; + lyr.setVisible(true); } else { - layer.setVisible(false); + lyr.setVisible(false); } - layer.on('change:visible', function(evt) { + lyr.on('change:visible', function(evt) { if (evt.target.getVisible()) { MapType = localStorage['MapType'] = evt.target.get('name'); } }); + }) - // The layer selector displays in reverse order for some reason, unreverse it - if (layer.get('group')) { - // hurf - baseLayerGroups[layer.get('group')].getLayers().insertAt(0, layer); - } else { - layers.unshift(layer); - } + if (!foundType) { + layers[0].setVisible(true); } - if (!found) { - baseLayers[0].setVisible(true); - } - - for (var key in baseLayerGroups) { - if (baseLayerGroups[key].getLayers().getLength() > 0) { - layers.unshift(baseLayerGroups[key]); - } - } - - layers.push(new ol.layer.Vector({ - source: new ol.source.Vector({ - features: StaticFeatures, - updateWhileInteracting: true, - updateWhileAnimating: true - }) - })); - - layers.push(new ol.layer.Vector({ - source: new ol.source.Vector({ - features: PlaneTrailFeatures, - updateWhileInteracting: true, - updateWhileAnimating: true - }) - })); - var iconsLayer = new ol.layer.Vector({ + title: 'Aircraft positions', source: new ol.source.Vector({ features: PlaneIconFeatures, - updateWhileInteracting: true, - updateWhileAnimating: true }) }); - layers.push(iconsLayer); + + layers.push(new ol.layer.Group({ + title: 'Overlays', + layers: [ + iconsLayer, + + new ol.layer.Vector({ + title: 'Site position and range rings', + source: new ol.source.Vector({ + features: StaticFeatures, + }) + }), + + new ol.layer.Vector({ + title: 'Selected aircraft trail', + source: new ol.source.Vector({ + features: PlaneTrailFeatures, + }) + }), + ] + })); OLMap = new ol.Map({ target: 'map_canvas', From 2bbc1175288b9f14b69d498b62e5c8dbf542c8e0 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sun, 3 Jul 2016 14:44:05 +0100 Subject: [PATCH 27/32] Base64-encode the SVG markers, seems to make Firefox happier. --- public_html/markers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public_html/markers.js b/public_html/markers.js index 508be20..b11c6f7 100755 --- a/public_html/markers.js +++ b/public_html/markers.js @@ -113,5 +113,5 @@ function svgPathToSvg(path, size, stroke, width, fill) { function svgPathToURI(path, size, stroke, width, fill) { - return "data:image/svg+xml," + svgPathToSvg(path, size, stroke, width, fill) + return "data:image/svg+xml;base64," + btoa(svgPathToSvg(path, size, stroke, width, fill)); } From abab5f54406404f754cae7a24c44d0417cf5b812 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sun, 3 Jul 2016 14:54:14 +0100 Subject: [PATCH 28/32] Fix initial baselayer selection if no type was stored. --- public_html/script.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/public_html/script.js b/public_html/script.js index 2977d7a..e954e46 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -366,7 +366,14 @@ function initialize_map() { }) if (!foundType) { - layers[0].setVisible(true); + ol.control.LayerSwitcher.forEachRecursive(layers, function(lyr) { + if (foundType) + return; + if (lyr.get('type') === 'base') { + lyr.setVisible(true); + foundType = true; + } + }); } var iconsLayer = new ol.layer.Vector({ From ae6a7acb675d00f58d1d62b3e11c4be51ea94b70 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Sun, 3 Jul 2016 14:54:36 +0100 Subject: [PATCH 29/32] Move aircraft icons above aircraft trails. --- public_html/script.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public_html/script.js b/public_html/script.js index e954e46..dd4e687 100644 --- a/public_html/script.js +++ b/public_html/script.js @@ -386,8 +386,6 @@ function initialize_map() { layers.push(new ol.layer.Group({ title: 'Overlays', layers: [ - iconsLayer, - new ol.layer.Vector({ title: 'Site position and range rings', source: new ol.source.Vector({ @@ -401,6 +399,8 @@ function initialize_map() { features: PlaneTrailFeatures, }) }), + + iconsLayer ] })); From b93ada6196087ff722ce2e6049cc9c0fa424c323 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Tue, 5 Jul 2016 21:54:24 +0100 Subject: [PATCH 30/32] Explain where to get map keys. --- public_html/config.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public_html/config.js b/public_html/config.js index 52b2b13..3764210 100644 --- a/public_html/config.js +++ b/public_html/config.js @@ -117,7 +117,11 @@ FlagPath = "flags-tiny/"; ChartBundleLayers = true; // Provide a Bing Maps API key here to enable the Bing imagery layer. +// You can obtain a free key (with usage limits) at +// https://www.bingmapsportal.com/ (you need a "basic key") BingMapsAPIKey = null; // Provide a Mapzen API key here to enable the Mapzen vector tile layer. +// You can obtain a free key at https://mapzen.com/developers/ +// (you need a "vector tiles" key) MapzenAPIKey = null; From 6e1372708c2290cb748d6b559ae7e41165bbe913 Mon Sep 17 00:00:00 2001 From: Oliver Jowett Date: Tue, 5 Jul 2016 22:06:28 +0100 Subject: [PATCH 31/32] Switch to OL 3.17.1; include a copy locally. --- debian/copyright | 31 ++ public_html/gmap.html | 4 +- public_html/ol3/ol-3.17.1.css | 1 + public_html/ol3/ol-3.17.1.js | 998 ++++++++++++++++++++++++++++++++++ 4 files changed, 1032 insertions(+), 2 deletions(-) create mode 100644 public_html/ol3/ol-3.17.1.css create mode 100644 public_html/ol3/ol-3.17.1.js diff --git a/debian/copyright b/debian/copyright index 1ebfe50..22c6664 100644 --- a/debian/copyright +++ b/debian/copyright @@ -46,6 +46,11 @@ Copyright: 2015 jQuery Foundation and other contributors License: MIT Source: http://www.jquery.com/ +Files: public_html/ol3/ol-3.17.1.css public_html/ol3/ol-3.17.1.js +Copyright: 2005-2016 OpenLayers Contributors +License: BSD-2-Clause-OpenLayers +Source: http://openlayers.org + Files: public_html/ol3/ol3-layerswitcher.js public_html/ol3/ol3-layerswitcher.css Copyright: Matt Walker License: MIT @@ -77,6 +82,32 @@ License: GPL-2+ License version 2 can be found in the file `/usr/share/common-licenses/GPL-2'. +License: BSD-2-Clause-OpenLayers + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + . + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + . + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + . + THIS SOFTWARE IS PROVIDED BY OPENLAYERS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + . + The views and conclusions contained in the software and documentation are those + of the authors and should not be interpreted as representing official policies, + either expressed or implied, of OpenLayers Contributors. + License: BSD-3-Clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/public_html/gmap.html b/public_html/gmap.html index ffbab32..98cbd4a 100644 --- a/public_html/gmap.html +++ b/public_html/gmap.html @@ -7,8 +7,8 @@ - - + + diff --git a/public_html/ol3/ol-3.17.1.css b/public_html/ol3/ol-3.17.1.css new file mode 100644 index 0000000..ea50e7e --- /dev/null +++ b/public_html/ol3/ol-3.17.1.css @@ -0,0 +1 @@ +.ol-control,.ol-scale-line{position:absolute;padding:2px}.ol-box{box-sizing:border-box;border-radius:2px;border:2px solid #00f}.ol-mouse-position{top:8px;right:8px;position:absolute}.ol-scale-line{background:rgba(0,60,136,.3);border-radius:4px;bottom:8px;left:8px}.ol-scale-line-inner{border:1px solid #eee;border-top:none;color:#eee;font-size:10px;text-align:center;margin:1px;will-change:contents,width}.ol-overlay-container{will-change:left,right,top,bottom}.ol-unsupported{display:none}.ol-viewport .ol-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ol-control{background-color:rgba(255,255,255,.4);border-radius:4px}.ol-control:hover{background-color:rgba(255,255,255,.6)}.ol-zoom{top:.5em;left:.5em}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s}.ol-zoom-extent{top:4.643em;left:.5em}.ol-full-screen{right:.5em;top:.5em}@media print{.ol-control{display:none}}.ol-control button{display:block;margin:1px;padding:0;color:#fff;font-size:1.14em;font-weight:700;text-decoration:none;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:rgba(0,60,136,.5);border:none;border-radius:2px}.ol-control button::-moz-focus-inner{border:none;padding:0}.ol-zoom-extent button{line-height:1.4em}.ol-compass{display:block;font-weight:400;font-size:1.2em;will-change:transform}.ol-touch .ol-control button{font-size:1.5em}.ol-touch .ol-zoom-extent{top:5.5em}.ol-control button:focus,.ol-control button:hover{text-decoration:none;background-color:rgba(0,60,136,.7)}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em)}.ol-attribution ul{margin:0;padding:0 .5em;font-size:.7rem;line-height:1.375em;color:#000;text-shadow:0 0 2px #fff}.ol-attribution li{display:inline;list-style:none;line-height:inherit}.ol-attribution li:not(:last-child):after{content:" "}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle}.ol-attribution button,.ol-attribution ul{display:inline-block}.ol-attribution.ol-collapsed ul{display:none}.ol-attribution.ol-logo-only ul{display:block}.ol-attribution:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0;height:1.1em;line-height:1em}.ol-attribution.ol-logo-only{background:0 0;bottom:.4em;height:1.1em;line-height:1em}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.ol-attribution.ol-logo-only button,.ol-attribution.ol-uncollapsible button{display:none}.ol-zoomslider{top:4.5em;left:.5em;height:200px}.ol-zoomslider button{position:relative;height:10px}.ol-touch .ol-zoomslider{top:5.5em}.ol-overviewmap{left:.5em;bottom:.5em}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0}.ol-overviewmap .ol-overviewmap-map,.ol-overviewmap button{display:inline-block}.ol-overviewmap .ol-overviewmap-map{border:1px solid #7b98bc;height:150px;margin:2px;width:150px}.ol-overviewmap:not(.ol-collapsed) button{bottom:1px;left:2px;position:absolute}.ol-overviewmap.ol-collapsed .ol-overviewmap-map,.ol-overviewmap.ol-uncollapsible button{display:none}.ol-overviewmap:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-overviewmap-box{border:2px dotted rgba(0,60,136,.7)} \ No newline at end of file diff --git a/public_html/ol3/ol-3.17.1.js b/public_html/ol3/ol-3.17.1.js new file mode 100644 index 0000000..6cc1289 --- /dev/null +++ b/public_html/ol3/ol-3.17.1.js @@ -0,0 +1,998 @@ +// OpenLayers 3. See http://openlayers.org/ +// License: https://raw.githubusercontent.com/openlayers/ol3/master/LICENSE.md +// Version: v3.17.1 + +(function (root, factory) { + if (typeof exports === "object") { + module.exports = factory(); + } else if (typeof define === "function" && define.amd) { + define([], factory); + } else { + root.ol = factory(); + } +}(this, function () { + var OPENLAYERS = {}; + var k,aa=this;function t(a,b,c){a=a.split(".");c=c||aa;a[0]in c||!c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c[d]?c=c[d]:c=c[d]={}:c[d]=b}function ba(a){a.Zb=function(){return a.Tg?a.Tg:a.Tg=new a}} +function ca(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null"; +else if("function"==b&&"undefined"==typeof a.call)return"object";return b}function da(a){return"string"==typeof a}function ea(a){return"number"==typeof a}function fa(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}function w(a){return a[ga]||(a[ga]=++ha)}var ga="closure_uid_"+(1E9*Math.random()>>>0),ha=0;function ia(a,b,c){return a.call.apply(a.bind,arguments)} +function ja(a,b,c){if(!a)throw Error();if(2b?1:0};function sa(a,b,c){return Math.min(Math.max(a,b),c)}var ta=function(){var a;"cosh"in Math?a=Math.cosh:a=function(a){a=Math.exp(a);return(a+1/a)/2};return a}();function ua(a,b,c,d,e,f){var g=e-c,h=f-d;if(0!==g||0!==h){var l=((a-c)*g+(b-d)*h)/(g*g+h*h);1c*b?c+b:c}function za(a,b,c){return a+c*(b-a)};function Ba(a){return function(b){if(b)return[sa(b[0],a[0],a[2]),sa(b[1],a[1],a[3])]}}function Ca(a){return a};function Da(a,b,c){this.center=a;this.resolution=b;this.rotation=c};var Ea="function"===typeof Object.assign?Object.assign:function(a,b){if(!a||!a)throw new TypeError("Cannot convert undefined or null to object");for(var c=Object(a),d=1,e=arguments.length;db?1:ac)for(c=1;c>>0,d,e=0;ef?1:.5))+e,0),void 0!==c&&(d=Math.min(d,c)),b/Math.pow(a,d)}};function vb(a){if(void 0!==a)return 0}function wb(a,b){if(void 0!==a)return a+b}function xb(a){var b=2*Math.PI/a;return function(a,d){if(void 0!==a)return a=Math.floor((a+d)/b+.5)*b}}function yb(){var a=wa(5);return function(b,c){if(void 0!==b)return Math.abs(b+c)<=a?0:b+c}};function zb(a,b){var c=void 0!==b?a.toFixed(b):""+a,d=c.indexOf("."),d=-1===d?c.length:d;return 2e)return 1;if(e>d)return-1}return 0};function Bb(a,b){a[0]+=b[0];a[1]+=b[1];return a}function Cb(a,b){var c=a[0],d=a[1],e=b[0],f=b[1],g=e[0],e=e[1],h=f[0],f=f[1],l=h-g,m=f-e,c=0===l&&0===m?0:(l*(c-g)+m*(d-e))/(l*l+m*m||0);0>=c||(1<=c?(g=h,e=f):(g+=c*l,e+=c*m));return[g,e]}function Db(a,b,c){a=xa(a+180,360)-180;var d=Math.abs(3600*a);return Math.floor(d/3600)+"\u00b0 "+zb(Math.floor(d/60%60))+"\u2032 "+zb(d%60,c||0)+"\u2033 "+b.charAt(0>a?1:0)} +function Eb(a,b,c){return a?b.replace("{x}",a[0].toFixed(c)).replace("{y}",a[1].toFixed(c)):""}function Fb(a,b){for(var c=!0,d=a.length-1;0<=d;--d)if(a[d]!=b[d]){c=!1;break}return c}function Gb(a,b){var c=Math.cos(b),d=Math.sin(b),e=a[1]*c+a[0]*d;a[0]=a[0]*c-a[1]*d;a[1]=e;return a}function Hb(a,b){var c=a[0]-b[0],d=a[1]-b[1];return c*c+d*d}function Ib(a,b){return Hb(a,Cb(a,b))}function Jb(a,b){return Eb(a,"{x}, {y}",b)};function Kb(a){for(var b=Lb(),c=0,d=a.length;cd&&(h|=4);ge&&(h|=2);0===h&&(h=1);return h}function Lb(){return[Infinity,Infinity,-Infinity,-Infinity]}function Wb(a,b,c,d,e){return e?(e[0]=a,e[1]=b,e[2]=c,e[3]=d,e):[a,b,c,d]}function Xb(a,b){var c=a[0],d=a[1];return Wb(c,d,c,d,b)}function Yb(a,b,c,d,e){e=Wb(Infinity,Infinity,-Infinity,-Infinity,e);return Zb(e,a,b,c,d)} +function $b(a,b){return a[0]==b[0]&&a[2]==b[2]&&a[1]==b[1]&&a[3]==b[3]}function ac(a,b){b[0]a[2]&&(a[2]=b[2]);b[1]a[3]&&(a[3]=b[3]);return a}function Mb(a,b){b[0]a[2]&&(a[2]=b[0]);b[1]a[3]&&(a[3]=b[1])}function Zb(a,b,c,d,e){for(;cb[0]?a[0]:b[0],c[1]=a[1]>b[1]?a[1]:b[1],c[2]=a[2]=b[0]&&a[1]<=b[3]&&a[3]>=b[1]}function hc(a){return a[2]a||0!==this.o&&a<=this.o)return this;var b=a.toString();if(this.l.hasOwnProperty(b))return this.l[b];var c=this.Nc(a);if(c.la().lengthe&&(e=f);f=h;g=l}return e}function pd(a,b,c,d,e){var f,g;f=0;for(g=c.length;fh){for(;br&&(m=n,r=A)}r>e&&(l[(m-b)/d]=1,q+dK&&oaK)&&(0>X&&HX)||(x[g++]=A,x[g++]= +z,v=A,D=z);A=F;z=N}}x[g++]=A;x[g++]=z}}h.push(g);b=n}return g};function zd(a,b){hd.call(this);this.i=this.j=-1;this.pa(a,b)}y(zd,hd);k=zd.prototype;k.clone=function(){var a=new zd(null);Ad(a,this.f,this.B.slice());return a};k.sb=function(a,b,c,d){if(df!=n>f&&e<(m-h)*(f-l)/(n-l)+h&&(g=!g);h=m;l=n}return g}function Dd(a,b,c,d,e,f){if(0===c.length||!Cd(a,b,c[0],d,e,f))return!1;var g;b=1;for(g=c.length;bp&&(m=(m+n)/2,Dd(a,b,c,d,m,q)&&(u=m,p=x));m=n}isNaN(u)&&(u=e[f]);return g?(g.push(u,q),g):[u,q]};function Fd(a,b,c,d,e,f){for(var g=[a[b],a[b+1]],h=[],l;b+d=e[0]&&f[2]<=e[2]||f[1]>=e[1]&&f[3]<=e[3]?!0:Fd(a,b,c,d,function(a,b){var c=!1,d=Vb(e,a),f=Vb(e,b);if(1===d||1===f)c=!0;else{var p=e[0],q=e[1],r=e[2],u=e[3],x=b[0],v=b[1],D=(v-a[1])/(x-a[0]);f&2&&!(d&2)&&(c=x-(v-u)/D,c=c>=p&&c<=r);c||!(f&4)||d&4||(c=v-(x-r)*D,c=c>=q&&c<=u);c||!(f&8)||d&8||(c=x-(v-q)/D,c=c>=p&&c<=r);c||!(f&16)||d&16||(c=v-(x-p)*D,c=c>=q&&c<=u)}return c}):!1} +function Hd(a,b,c,d,e){var f=c[0];if(!(Gd(a,b,f,d,e)||Cd(a,b,f,d,e[0],e[1])||Cd(a,b,f,d,e[0],e[3])||Cd(a,b,f,d,e[2],e[1])||Cd(a,b,f,d,e[2],e[3])))return!1;if(1===c.length)return!0;b=1;for(f=c.length;ba||this.i.length<=a)return null;var b=new zd(null);Ad(b,this.f,this.B.slice(0===a?0:this.i[a-1],this.i[a]));return b};k.Vd=function(){var a=this.f,b=this.B,c=this.i,d=[],e=0,f,g;f=0;for(g=c.length;fthis.c)}return void 0!==a?this.i+a:a}; +k.cf=function(a,b,c){a instanceof hd||(a=Od(a));var d=c||{};c=void 0!==d.padding?d.padding:[0,0,0,0];var e=void 0!==d.constrainResolution?d.constrainResolution:!0,f=void 0!==d.nearest?d.nearest:!1,g;void 0!==d.minResolution?g=d.minResolution:void 0!==d.maxZoom?g=this.constrainResolution(this.a,d.maxZoom-this.i,0):g=0;var h=a.la(),l=this.La(),d=Math.cos(-l),l=Math.sin(-l),m=Infinity,n=Infinity,p=-Infinity,q=-Infinity;a=a.va();for(var r=0,u=h.length;ra?$d(2*a):1-$d(2*(a-.5))};function ce(a){var b=a.source,c=a.start?a.start:Date.now(),d=b[0],e=b[1],f=void 0!==a.duration?a.duration:1E3,g=a.easing?a.easing:$d;return function(a,b){if(b.time=b.ca&&a.fa<=b.ga&&a.ga>=b.fa};function je(a){this.a=a.html;this.b=a.tileRanges?a.tileRanges:null}je.prototype.g=function(){return this.a};function ke(a,b,c){Wa.call(this,a,c);this.element=b}y(ke,Wa);function le(a){eb.call(this);this.a=a?a:[];me(this)}y(le,eb);k=le.prototype;k.clear=function(){for(;0=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};var qe=/^#(?:[0-9a-f]{3}){1,2}$/i,re=/^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i,se=/^(?:rgba)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|1|0\.\d{0,10})\)$/i;function te(a){return Array.isArray(a)?a:ue(a)}function ve(a){if("string"!==typeof a){var b=a[0];b!=(b|0)&&(b=b+.5|0);var c=a[1];c!=(c|0)&&(c=c+.5|0);var d=a[2];d!=(d|0)&&(d=d+.5|0);a="rgba("+b+","+c+","+d+","+(void 0===a[3]?1:a[3])+")"}return a} +var ue=function(){var a={},b=0;return function(c){var d;if(a.hasOwnProperty(c))d=a[c];else{if(1024<=b){d=0;for(var e in a)0===(d++&3)&&(delete a[e],--b)}var f,g;qe.exec(c)?(g=3==c.length-1?1:2,d=parseInt(c.substr(1+0*g,g),16),e=parseInt(c.substr(1+1*g,g),16),f=parseInt(c.substr(1+2*g,g),16),1==g&&(d=(d<<4)+d,e=(e<<4)+e,f=(f<<4)+f),d=[d,e,f,1]):(g=se.exec(c))?(d=Number(g[1]),e=Number(g[2]),f=Number(g[3]),g=Number(g[4]),d=[d,e,f,g],d=we(d,d)):(g=re.exec(c))?(d=Number(g[1]),e=Number(g[2]),f=Number(g[3]), +d=[d,e,f,1],d=we(d,d)):d=void 0;a[c]=d;++b}return d}}();function we(a,b){var c=b||[];c[0]=sa(a[0]+.5|0,0,255);c[1]=sa(a[1]+.5|0,0,255);c[2]=sa(a[2]+.5|0,0,255);c[3]=sa(a[3],0,1);return c};function xe(a){return"string"===typeof a||a instanceof CanvasPattern||a instanceof CanvasGradient?a:ve(a)};var ye;a:{var ze=aa.navigator;if(ze){var Ae=ze.userAgent;if(Ae){ye=Ae;break a}}ye=""}function Be(a){return-1!=ye.indexOf(a)};var Ce=Be("Opera"),Ee=Be("Trident")||Be("MSIE"),Fe=Be("Edge"),Ge=Be("Gecko")&&!(-1!=ye.toLowerCase().indexOf("webkit")&&!Be("Edge"))&&!(Be("Trident")||Be("MSIE"))&&!Be("Edge"),He=-1!=ye.toLowerCase().indexOf("webkit")&&!Be("Edge"),Ie; +a:{var Je="",Ke=function(){var a=ye;if(Ge)return/rv\:([^\);]+)(\)|;)/.exec(a);if(Fe)return/Edge\/([\d\.]+)/.exec(a);if(Ee)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(He)return/WebKit\/(\S+)/.exec(a);if(Ce)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Ke&&(Je=Ke?Ke[1]:"");if(Ee){var Le,Me=aa.document;Le=Me?Me.documentMode:void 0;if(null!=Le&&Le>parseFloat(Je)){Ie=String(Le);break a}}Ie=Je}var Ne={};function Oe(a,b){var c=document.createElement("CANVAS");a&&(c.width=a);b&&(c.height=b);return c.getContext("2d")} +var Pe=function(){var a;return function(){if(void 0===a){var b=document.createElement("P"),c,d={webkitTransform:"-webkit-transform",OTransform:"-o-transform",msTransform:"-ms-transform",MozTransform:"-moz-transform",transform:"transform"};document.body.appendChild(b);for(var e in d)e in b.style&&(b.style[e]="translate(1px,1px)",c=pa.getComputedStyle(b).getPropertyValue(d[e]));document.body.removeChild(b);a=c&&"none"!==c}return a}}(),Qe=function(){var a;return function(){if(void 0===a){var b=document.createElement("P"), +c,d={webkitTransform:"-webkit-transform",OTransform:"-o-transform",msTransform:"-ms-transform",MozTransform:"-moz-transform",transform:"transform"};document.body.appendChild(b);for(var e in d)e in b.style&&(b.style[e]="translate3d(1px,1px,1px)",c=pa.getComputedStyle(b).getPropertyValue(d[e]));document.body.removeChild(b);a=c&&"none"!==c}return a}}(); +function Re(a,b){var c=a.style;c.WebkitTransform=b;c.MozTransform=b;c.b=b;c.msTransform=b;c.transform=b;if((c=Ee)&&!(c=Ne["9.0"])){for(var c=0,d=qa(String(Ie)).split("."),e=qa("9.0").split("."),f=Math.max(d.length,e.length),g=0;0==c&&gc;++c)d[c]=b[c].toFixed(6);Re(a,"matrix3d("+d.join(",")+")")}else if(Pe()){var d=[b[0],b[1],b[4],b[5],b[12],b[13]],e=Array(6);for(c=0;6>c;++c)e[c]=d[c].toFixed(6);Re(a,"matrix("+e.join(",")+")")}else a.style.left=Math.round(b[12])+"px",a.style.top=Math.round(b[13])+"px"}function Te(a,b){var c=b.parentNode;c&&c.replaceChild(a,b)} +function Ue(a){a&&a.parentNode&&a.parentNode.removeChild(a)}function Ve(a){for(;a.lastChild;)a.removeChild(a.lastChild)};function We(a,b,c){Wa.call(this,a);this.map=b;this.frameState=void 0!==c?c:null}y(We,Wa);function Xe(a){eb.call(this);this.element=a.element?a.element:null;this.a=this.S=null;this.s=[];this.render=a.render?a.render:na;a.target&&this.c(a.target)}y(Xe,eb);Xe.prototype.ka=function(){Ue(this.element);eb.prototype.ka.call(this)};Xe.prototype.i=function(){return this.a}; +Xe.prototype.setMap=function(a){this.a&&Ue(this.element);for(var b=0,c=this.s.length;b>=1;return c.join("")};function bf(a){Ye.call(this);this.c=void 0!==a?a:2048}y(bf,Ye);function cf(a){return a.wc()>a.c}bf.prototype.Lc=function(a){for(var b,c;cf(this)&&!(b=this.b.pc,c=b.ma[0].toString(),c in a&&a[c].contains(b.ma));)Ta(this.pop())};function df(a,b){$a.call(this);this.ma=a;this.state=b;this.a=null;this.key=""}y(df,$a);function ef(a){a.b("change")}df.prototype.ib=function(){return w(this).toString()};df.prototype.i=function(){return this.ma};df.prototype.V=function(){return this.state};function ff(a,b,c){void 0===c&&(c=[0,0]);c[0]=a[0]+2*b;c[1]=a[1]+2*b;return c}function gf(a,b,c){void 0===c&&(c=[0,0]);c[0]=a[0]*b+.5|0;c[1]=a[1]*b+.5|0;return c}function hf(a,b){if(Array.isArray(a))return a;void 0===b?b=[a,a]:(b[0]=a,b[1]=a);return b};function jf(a){eb.call(this);this.f=yc(a.projection);this.l=kf(a.attributions);this.R=a.logo;this.za=void 0!==a.state?a.state:"ready";this.D=void 0!==a.wrapX?a.wrapX:!1}y(jf,eb);function kf(a){if("string"===typeof a)return[new je({html:a})];if(a instanceof je)return[a];if(Array.isArray(a)){for(var b=a.length,c=Array(b),d=0;d=a.minZoom;){if(c.call(null,b,pf(a,e,b,d)))return!0;--b}return!1}k.H=function(){return this.s};k.Ig=function(){return this.maxZoom};k.Jg=function(){return this.minZoom};k.Ia=function(a){return this.g?this.g:this.c[a]};k.$=function(a){return this.b[a]}; +k.Kh=function(){return this.b};function rf(a,b,c,d){return b[0]e||e>c.maxZoom)c=!1;else{var f=c.H();c=(c=f?pf(c,f,e):c.a?c.a[e]:null)?ge(c,d,a):!0}return c?b:null}k.sa=function(){this.a.clear();this.u()};k.Yf=na; +function Df(a,b){Wa.call(this,a);this.tile=b}y(Df,Wa);function Ef(a){a=a?a:{};this.R=document.createElement("UL");this.v=document.createElement("LI");this.R.appendChild(this.v);this.v.style.display="none";this.f=void 0!==a.collapsed?a.collapsed:!0;this.o=void 0!==a.collapsible?a.collapsible:!0;this.o||(this.f=!1);var b=void 0!==a.className?a.className:"ol-attribution",c=void 0!==a.tipLabel?a.tipLabel:"Attributions",d=void 0!==a.collapseLabel?a.collapseLabel:"\u00bb";"string"===typeof d?(this.A=document.createElement("span"),this.A.textContent=d):this.A= +d;d=void 0!==a.label?a.label:"i";"string"===typeof d?(this.C=document.createElement("span"),this.C.textContent=d):this.C=d;var e=this.o&&!this.f?this.A:this.C,d=document.createElement("button");d.setAttribute("type","button");d.title=c;d.appendChild(e);B(d,"click",this.am,this);c=document.createElement("div");c.className=b+" ol-unselectable ol-control"+(this.f&&this.o?" ol-collapsed":"")+(this.o?"":" ol-uncollapsible");c.appendChild(this.R);c.appendChild(d);Xe.call(this,{element:c,render:a.render? +a.render:Ff,target:a.target});this.D=!0;this.j={};this.l={};this.T={}}y(Ef,Xe); +function Ff(a){if(a=a.frameState){var b,c,d,e,f,g,h,l,m,n,p,q=a.layerStatesArray,r=Ea({},a.attributions),u={},x=a.viewState.projection;c=0;for(b=q.length;cX.ea)if(ie(K,new fe(xa(F.ca,oa),xa(F.ea,oa),F.fa,F.ga))||F.ea-F.ca+1>oa&&ie(K,X)){p=!0;break a}}}p=!1}else p=!0}}else p=!1;p?(l in u&&delete u[l],r[l]=h):u[l]=h}b=[r,u];c=b[0];b=b[1];for(var H in this.j)H in c?(this.l[H]||(this.j[H].style.display="",this.l[H]=!0),delete c[H]):H in b?(this.l[H]&&(this.j[H].style.display="none",delete this.l[H]),delete b[H]):(Ue(this.j[H]),delete this.j[H],delete this.l[H]);for(H in c)d=document.createElement("LI"),d.innerHTML=c[H].a,this.R.appendChild(d), +this.j[H]=d,this.l[H]=!0;for(H in b)d=document.createElement("LI"),d.innerHTML=b[H].a,d.style.display="none",this.R.appendChild(d),this.j[H]=d;H=!Ha(this.l)||!Ha(a.logos);this.D!=H&&(this.element.style.display=H?"":"none",this.D=H);H&&Ha(this.l)?this.element.classList.add("ol-logo-only"):this.element.classList.remove("ol-logo-only");var ya;a=a.logos;H=this.T;for(ya in H)ya in a||(Ue(H[ya]),delete H[ya]);for(var Ua in a)b=a[Ua],b instanceof HTMLElement&&(this.v.appendChild(b),H[Ua]=b),Ua in H||(ya= +new Image,ya.src=Ua,""===b?c=ya:(c=document.createElement("a"),c.href=b,c.appendChild(ya)),this.v.appendChild(c),H[Ua]=c);this.v.style.display=Ha(a)?"none":""}else this.D&&(this.element.style.display="none",this.D=!1)}k=Ef.prototype;k.am=function(a){a.preventDefault();Gf(this)};function Gf(a){a.element.classList.toggle("ol-collapsed");a.f?Te(a.A,a.C):Te(a.C,a.A);a.f=!a.f}k.$l=function(){return this.o}; +k.cm=function(a){this.o!==a&&(this.o=a,this.element.classList.toggle("ol-uncollapsible"),!a&&this.f&&Gf(this))};k.bm=function(a){this.o&&this.f!==a&&Gf(this)};k.Zl=function(){return this.f};function Hf(a){a=a?a:{};var b=void 0!==a.className?a.className:"ol-rotate",c=void 0!==a.label?a.label:"\u21e7";this.f=null;"string"===typeof c?(this.f=document.createElement("span"),this.f.className="ol-compass",this.f.textContent=c):(this.f=c,this.f.classList.add("ol-compass"));var d=a.tipLabel?a.tipLabel:"Reset rotation",c=document.createElement("button");c.className=b+"-reset";c.setAttribute("type","button");c.title=d;c.appendChild(this.f);B(c,"click",Hf.prototype.A,this);d=document.createElement("div"); +d.className=b+" ol-unselectable ol-control";d.appendChild(c);b=a.render?a.render:If;this.o=a.resetNorth?a.resetNorth:void 0;Xe.call(this,{element:d,render:b,target:a.target});this.j=void 0!==a.duration?a.duration:250;this.l=void 0!==a.autoHide?a.autoHide:!0;this.v=void 0;this.l&&this.element.classList.add("ol-hidden")}y(Hf,Xe); +Hf.prototype.A=function(a){a.preventDefault();if(void 0!==this.o)this.o();else{a=this.a;var b=a.aa();if(b){var c=b.La();void 0!==c&&(0Math.PI&&(c-=2*Math.PI),a.Wa(de({rotation:c,duration:this.j,easing:Zd}))),b.ie(0))}}}; +function If(a){if(a=a.frameState){a=a.viewState.rotation;if(a!=this.v){var b="rotate("+a+"rad)";if(this.l){var c=this.element.classList.contains("ol-hidden");c||0!==a?c&&0!==a&&this.element.classList.remove("ol-hidden"):this.element.classList.add("ol-hidden")}this.f.style.msTransform=b;this.f.style.webkitTransform=b;this.f.style.transform=b}this.v=a}};function Jf(a){a=a?a:{};var b=void 0!==a.className?a.className:"ol-zoom",c=void 0!==a.delta?a.delta:1,d=void 0!==a.zoomInLabel?a.zoomInLabel:"+",e=void 0!==a.zoomOutLabel?a.zoomOutLabel:"\u2212",f=void 0!==a.zoomInTipLabel?a.zoomInTipLabel:"Zoom in",g=void 0!==a.zoomOutTipLabel?a.zoomOutTipLabel:"Zoom out",h=document.createElement("button");h.className=b+"-in";h.setAttribute("type","button");h.title=f;h.appendChild("string"===typeof d?document.createTextNode(d):d);B(h,"click",Jf.prototype.l.bind(this, +c));d=document.createElement("button");d.className=b+"-out";d.setAttribute("type","button");d.title=g;d.appendChild("string"===typeof e?document.createTextNode(e):e);B(d,"click",Jf.prototype.l.bind(this,-c));c=document.createElement("div");c.className=b+" ol-unselectable ol-control";c.appendChild(h);c.appendChild(d);Xe.call(this,{element:c,target:a.target});this.f=void 0!==a.duration?a.duration:250}y(Jf,Xe); +Jf.prototype.l=function(a,b){b.preventDefault();var c=this.a,d=c.aa();if(d){var e=d.$();e&&(0=Math.abs(d-h[0])&&25>=l)return!0}return!1}function vg(a){var b=wg(a,a),c=b.preventDefault;b.preventDefault=function(){a.preventDefault();c()};b.pointerId=1;b.isPrimary=!0;b.pointerType="mouse";return b}k=tg.prototype; +k.rl=function(a){if(!ug(this,a)){if((1).toString()in this.a){var b=vg(a);xg(this.b,yg,b,a);delete this.a[(1).toString()]}b=vg(a);this.a[(1).toString()]=a;xg(this.b,zg,b,a)}};k.sl=function(a){if(!ug(this,a)){var b=vg(a);xg(this.b,Ag,b,a)}};k.vl=function(a){if(!ug(this,a)){var b=this.a[(1).toString()];b&&b.button===a.button&&(b=vg(a),xg(this.b,Bg,b,a),delete this.a[(1).toString()])}};k.ul=function(a){if(!ug(this,a)){var b=vg(a);Cg(this.b,b,a)}}; +k.tl=function(a){if(!ug(this,a)){var b=vg(a);Dg(this.b,b,a)}};function Eg(a){sg.call(this,a,{MSPointerDown:this.Al,MSPointerMove:this.Bl,MSPointerUp:this.El,MSPointerOut:this.Cl,MSPointerOver:this.Dl,MSPointerCancel:this.zl,MSGotPointerCapture:this.xl,MSLostPointerCapture:this.yl});this.a=a.g;this.g=["","unavailable","touch","pen","mouse"]}y(Eg,sg);function Fg(a,b){var c=b;ea(b.pointerType)&&(c=wg(b,b),c.pointerType=a.g[b.pointerType]);return c}k=Eg.prototype;k.Al=function(a){this.a[a.pointerId.toString()]=a;var b=Fg(this,a);xg(this.b,zg,b,a)}; +k.Bl=function(a){var b=Fg(this,a);xg(this.b,Ag,b,a)};k.El=function(a){var b=Fg(this,a);xg(this.b,Bg,b,a);delete this.a[a.pointerId.toString()]};k.Cl=function(a){var b=Fg(this,a);Dg(this.b,b,a)};k.Dl=function(a){var b=Fg(this,a);Cg(this.b,b,a)};k.zl=function(a){var b=Fg(this,a);xg(this.b,yg,b,a);delete this.a[a.pointerId.toString()]};k.yl=function(a){this.b.b(new Wf("lostpointercapture",a,a))};k.xl=function(a){this.b.b(new Wf("gotpointercapture",a,a))};function Gg(a){sg.call(this,a,{pointerdown:this.lo,pointermove:this.mo,pointerup:this.po,pointerout:this.no,pointerover:this.oo,pointercancel:this.ko,gotpointercapture:this.Gk,lostpointercapture:this.ql})}y(Gg,sg);k=Gg.prototype;k.lo=function(a){Hg(this.b,a)};k.mo=function(a){Hg(this.b,a)};k.po=function(a){Hg(this.b,a)};k.no=function(a){Hg(this.b,a)};k.oo=function(a){Hg(this.b,a)};k.ko=function(a){Hg(this.b,a)};k.ql=function(a){Hg(this.b,a)};k.Gk=function(a){Hg(this.b,a)};function Ig(a,b){sg.call(this,a,{touchstart:this.sp,touchmove:this.rp,touchend:this.qp,touchcancel:this.pp});this.a=a.g;this.l=b;this.g=void 0;this.i=0;this.f=void 0}y(Ig,sg);k=Ig.prototype;k.ci=function(){this.i=0;this.f=void 0}; +function Jg(a,b,c){b=wg(b,c);b.pointerId=c.identifier+2;b.bubbles=!0;b.cancelable=!0;b.detail=a.i;b.button=0;b.buttons=1;b.width=c.webkitRadiusX||c.radiusX||0;b.height=c.webkitRadiusY||c.radiusY||0;b.pressure=c.webkitForce||c.force||.5;b.isPrimary=a.g===c.identifier;b.pointerType="touch";b.clientX=c.clientX;b.clientY=c.clientY;b.screenX=c.screenX;b.screenY=c.screenY;return b} +function Kg(a,b,c){function d(){b.preventDefault()}var e=Array.prototype.slice.call(b.changedTouches),f=e.length,g,h;for(g=0;g=b.length){var e=[],f,g,h;for(f=0;f=a.minResolution&&ba.ea&&(a.ea=d.ea),d.faa.ga&&(a.ga=d.ga)):a[b][c]=d:(a[b]={},a[b][c]=d)}function Ah(a,b,c){return[b*(Math.round(a[0]/b)+c[0]%2/2),b*(Math.round(a[1]/b)+c[1]%2/2)]} +function Bh(a,b,c,d,e,f,g,h,l,m){var n=w(b).toString();n in a.wantedTiles||(a.wantedTiles[n]={});var p=a.wantedTiles[n];a=a.tileQueue;var q=c.minZoom,r,u,x,v,D,A;for(A=g;A>=q;--A)for(u=pf(c,f,A,u),x=c.$(A),v=u.ca;v<=u.ea;++v)for(D=u.fa;D<=u.ga;++D)g-A<=h?(r=b.ac(A,v,D,d,e),0==r.V()&&(p[r.ma.toString()]=!0,r.ib()in a.g||a.f([r,n,uf(c,r.ma),x])),void 0!==l&&l.call(m,r)):b.Yf(A,v,D,e)};function Ch(a){this.v=a.opacity;this.U=a.rotateWithView;this.j=a.rotation;this.i=a.scale;this.C=a.snapToPixel}k=Ch.prototype;k.qe=function(){return this.v};k.Xd=function(){return this.U};k.re=function(){return this.j};k.se=function(){return this.i};k.Yd=function(){return this.C};k.te=function(a){this.v=a};k.ue=function(a){this.j=a};k.ve=function(a){this.i=a};function Dh(a){a=a||{};this.c=void 0!==a.anchor?a.anchor:[.5,.5];this.f=null;this.a=void 0!==a.anchorOrigin?a.anchorOrigin:"top-left";this.o=void 0!==a.anchorXUnits?a.anchorXUnits:"fraction";this.s=void 0!==a.anchorYUnits?a.anchorYUnits:"fraction";var b=void 0!==a.crossOrigin?a.crossOrigin:null,c=void 0!==a.img?a.img:null,d=void 0!==a.imgSize?a.imgSize:null,e=a.src;void 0!==e&&0!==e.length||!c||(e=c.src||w(c).toString());var f=void 0!==a.src?0:2,g=void 0!==a.color?te(a.color):null,h=Eh.Zb(),l=h.get(e, +b,g);l||(l=new Fh(c,e,d,b,f,g),h.set(e,b,g,l));this.b=l;this.D=void 0!==a.offset?a.offset:[0,0];this.g=void 0!==a.offsetOrigin?a.offsetOrigin:"top-left";this.l=null;this.A=void 0!==a.size?a.size:null;Ch.call(this,{opacity:void 0!==a.opacity?a.opacity:1,rotation:void 0!==a.rotation?a.rotation:0,scale:void 0!==a.scale?a.scale:1,snapToPixel:void 0!==a.snapToPixel?a.snapToPixel:!0,rotateWithView:void 0!==a.rotateWithView?a.rotateWithView:!1})}y(Dh,Ch);k=Dh.prototype; +k.Yb=function(){if(this.f)return this.f;var a=this.c,b=this.Fb();if("fraction"==this.o||"fraction"==this.s){if(!b)return null;a=this.c.slice();"fraction"==this.o&&(a[0]*=b[0]);"fraction"==this.s&&(a[1]*=b[1])}if("top-left"!=this.a){if(!b)return null;a===this.c&&(a=this.c.slice());if("top-right"==this.a||"bottom-right"==this.a)a[0]=-a[0]+b[0];if("bottom-left"==this.a||"bottom-right"==this.a)a[1]=-a[1]+b[1]}return this.f=a};k.jc=function(){var a=this.b;return a.c?a.c:a.a};k.ld=function(){return this.b.g}; +k.td=function(){return this.b.f};k.pe=function(){var a=this.b;if(!a.o)if(a.s){var b=a.g[0],c=a.g[1],d=Oe(b,c);d.fillRect(0,0,b,c);a.o=d.canvas}else a.o=a.a;return a.o};k.Ia=function(){if(this.l)return this.l;var a=this.D;if("top-left"!=this.g){var b=this.Fb(),c=this.b.g;if(!b||!c)return null;a=a.slice();if("top-right"==this.g||"bottom-right"==this.g)a[0]=c[0]-b[0]-a[0];if("bottom-left"==this.g||"bottom-right"==this.g)a[1]=c[1]-b[1]-a[1]}return this.l=a};k.En=function(){return this.b.j}; +k.Fb=function(){return this.A?this.A:this.b.g};k.pf=function(a,b){return B(this.b,"change",a,b)};k.load=function(){this.b.load()};k.Xf=function(a,b){Qa(this.b,"change",a,b)};function Fh(a,b,c,d,e,f){$a.call(this);this.o=null;this.a=a?a:new Image;null!==d&&(this.a.crossOrigin=d);this.c=f?document.createElement("CANVAS"):null;this.l=f;this.i=null;this.f=e;this.g=c;this.j=b;this.s=!1;2==this.f&&Gh(this)}y(Fh,$a); +function Gh(a){var b=Oe(1,1);try{b.drawImage(a.a,0,0),b.getImageData(0,0,1,1)}catch(c){a.s=!0}}Fh.prototype.v=function(){this.f=3;this.i.forEach(Ka);this.i=null;this.b("change")}; +Fh.prototype.U=function(){this.f=2;this.g&&(this.a.width=this.g[0],this.a.height=this.g[1]);this.g=[this.a.width,this.a.height];this.i.forEach(Ka);this.i=null;Gh(this);if(!this.s&&null!==this.l){this.c.width=this.a.width;this.c.height=this.a.height;var a=this.c.getContext("2d");a.drawImage(this.a,0,0);for(var b=a.getImageData(0,0,this.a.width,this.a.height),c=b.data,d=this.l[0]/255,e=this.l[1]/255,f=this.l[2]/255,g=0,h=c.length;gn[2])l=[q+p*Math.ceil((n[0]-q)/p),a[1]]}n=b.layerStatesArray;for(p=n.length-1;0<=p;--p){var r=n[p],q=r.layer;if(nh(r,m)&&e.call(f,q)&&(r=Kh(this,q),q.ha()&&(h=r.ra(q.ha().D?l:a,b,g,d)),h))return h}}; +k.rh=function(a,b,c,d,e,f){var g,h=b.viewState.resolution,l=b.layerStatesArray,m;for(m=l.length-1;0<=m;--m){g=l[m];var n=g.layer;if(nh(g,h)&&e.call(f,n)&&(g=Kh(this,n).Cc(a,b,c,d)))return g}};k.sh=function(a,b,c,d){return void 0!==this.ra(a,b,qc,this,c,d)};function Kh(a,b){var c=w(b).toString();if(c in a.g)return a.g[c];var d=a.Xe(b);a.g[c]=d;a.s[c]=B(d,"change",a.Rk,a);return d}k.Rk=function(){this.i.render()};k.Ce=na; +k.To=function(a,b){for(var c in this.g)if(!(b&&c in b.layerStates)){var d=c,e=this.g[d];delete this.g[d];Ka(this.s[d]);delete this.s[d];Ta(e)}};function Lh(a,b){for(var c in a.g)if(!(c in b.layerStates)){b.postRenderFunctions.push(a.To.bind(a));break}}function rb(a,b){return a.zIndex-b.zIndex};function Mh(a,b){this.j=a;this.l=b;this.b=[];this.a=[];this.g={}}Mh.prototype.clear=function(){this.b.length=0;this.a.length=0;Fa(this.g)};function Nh(a){var b=a.b,c=a.a,d=b[0];1==b.length?(b.length=0,c.length=0):(b[0]=b.pop(),c[0]=c.pop(),Oh(a,0));b=a.l(d);delete a.g[b];return d}Mh.prototype.f=function(a){var b=this.j(a);return Infinity!=b?(this.b.push(a),this.a.push(b),this.g[this.l(a)]=!0,Ph(this,0,this.b.length-1),!0):!1};Mh.prototype.wc=function(){return this.b.length}; +Mh.prototype.Ya=function(){return 0===this.b.length};function Oh(a,b){for(var c=a.b,d=a.a,e=c.length,f=c[b],g=d[b],h=b;b>1;){var l=2*b+1,m=2*b+2,l=mb;){var g=c-1>>1;if(a[g]>f)d[c]=d[g],a[c]=a[g],c=g;else break}d[c]=e;a[c]=f} +function Qh(a){var b=a.j,c=a.b,d=a.a,e=0,f=c.length,g,h,l;for(h=0;h>1)-1;0<=b;b--)Oh(a,b)};function Rh(a,b){Mh.call(this,function(b){return a.apply(null,b)},function(a){return a[0].ib()});this.s=b;this.i=0;this.c={}}y(Rh,Mh);Rh.prototype.f=function(a){var b=Mh.prototype.f.call(this,a);b&&B(a[0],"change",this.o,this);return b};Rh.prototype.o=function(a){a=a.target;var b=a.V();if(2===b||3===b||4===b||5===b)Qa(a,"change",this.o,this),a=a.ib(),a in this.c&&(delete this.c[a],--this.i),this.s()}; +function Sh(a,b,c){for(var d=0,e,f;a.ic.b.length)c=!1;else{var d=Date.now()-c.i,e=c.b.length-3;if(c.b[e+2]d;)f-=3;var d=c.b[e+2]-c.b[f+2],g=c.b[e]-c.b[f],e=c.b[e+1]-c.b[f+1];c.c=Math.atan2(e,g);c.a=Math.sqrt(g*g+e*e)/d;c=c.a>c.g}}c&&(c=this.a,c=(c.g-c.a)/c.f,e=this.a.c,f=b.ab(),this.j=Uh(this.a,f),a.Wa(this.j),f=a.Ga(f),c=a.Ma([f[0]-c*Math.cos(e),f[1]-c*Math.sin(e)]),c=b.Pd(c),b.mb(c));Xd(b,-1);a.render(); +return!1}this.c=null;return!0}function ni(a){if(0this.D&&(this.a=!0));this.j=c;a=a.map;c=a.a.getBoundingClientRect();d=li(this.o);d[0]-=c.left;d[1]-=c.top;this.c=a.Ma(d);this.a&&(c=a.aa(),d=c.La(),a.render(),Wh(a,c,d+b,this.c))} +function Ni(a){if(2>this.o.length){a=a.map;var b=a.aa();Xd(b,-1);if(this.a){var c=b.La(),d=this.c,e=this.A,c=b.constrainRotation(c,0);Wh(a,b,c,d,e)}return!1}return!0}function Li(a){return 2<=this.o.length?(a=a.map,this.c=null,this.j=void 0,this.a=!1,this.s=0,this.C||Xd(a.aa(),1),a.render(),!0):!1}Ki.prototype.Gc=rc;function Oi(a){ji.call(this,{handleDownEvent:Pi,handleDragEvent:Qi,handleUpEvent:Ri});a=a?a:{};this.c=null;this.s=void 0!==a.duration?a.duration:400;this.a=void 0;this.j=1}y(Oi,ji);function Qi(a){var b=1,c=this.o[0],d=this.o[1],e=c.clientX-d.clientX,c=c.clientY-d.clientY,e=Math.sqrt(e*e+c*c);void 0!==this.a&&(b=this.a/e);this.a=e;1!=b&&(this.j=b);a=a.map;var e=a.aa(),c=e.$(),d=a.a.getBoundingClientRect(),f=li(this.o);f[0]-=d.left;f[1]-=d.top;this.c=a.Ma(f);a.render();Yh(a,e,c*b,this.c)} +function Ri(a){if(2>this.o.length){a=a.map;var b=a.aa();Xd(b,-1);var c=b.$(),d=this.c,e=this.s,c=b.constrainResolution(c,0,this.j-1);Yh(a,b,c,d,e);return!1}return!0}function Pi(a){return 2<=this.o.length?(a=a.map,this.c=null,this.a=void 0,this.j=1,this.C||Xd(a.aa(),1),a.render(),!0):!1}Oi.prototype.Gc=rc;function Si(a){a=a?a:{};var b=new le,c=new Th(-.005,.05,100);(void 0!==a.altShiftDragRotate?a.altShiftDragRotate:1)&&b.push(new qi);(void 0!==a.doubleClickZoom?a.doubleClickZoom:1)&&b.push(new Zh({delta:a.zoomDelta,duration:a.zoomDuration}));(void 0!==a.dragPan?a.dragPan:1)&&b.push(new mi({kinetic:c}));(void 0!==a.pinchRotate?a.pinchRotate:1)&&b.push(new Ki);(void 0!==a.pinchZoom?a.pinchZoom:1)&&b.push(new Oi({duration:a.zoomDuration}));if(void 0!==a.keyboard?a.keyboard:1)b.push(new Ei),b.push(new Gi({delta:a.zoomDelta, +duration:a.zoomDuration}));(void 0!==a.mouseWheelZoom?a.mouseWheelZoom:1)&&b.push(new Ii({duration:a.zoomDuration}));(void 0!==a.shiftDragZoom?a.shiftDragZoom:1)&&b.push(new Di({duration:a.zoomDuration}));return b};function Ti(a){var b=a||{};a=Ea({},b);delete a.layers;b=b.layers;ih.call(this,a);this.f=[];this.a={};B(this,gb("layers"),this.Tk,this);b?Array.isArray(b)&&(b=new le(b.slice())):b=new le;this.oh(b)}y(Ti,ih);k=Ti.prototype;k.ce=function(){this.xb()&&this.u()}; +k.Tk=function(){this.f.forEach(Ka);this.f.length=0;var a=this.Tc();this.f.push(B(a,"add",this.Sk,this),B(a,"remove",this.Uk,this));for(var b in this.a)this.a[b].forEach(Ka);Fa(this.a);var a=a.a,c,d;b=0;for(c=a.length;be;++e)d[e]=b.charCodeAt(c++)|b.charCodeAt(c++)<<8|b.charCodeAt(c++)<<16|b.charCodeAt(c++)<<24;else for(e=0;16>e;++e)d[e]=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24;b=a.b[0];c=a.b[1];var e=a.b[2],f=a.b[3],g;g=b+(f^c&(e^f))+d[0]+3614090360&4294967295;b=c+(g<<7&4294967295|g>>>25);g=f+(e^b&(c^e))+d[1]+3905402710&4294967295;f=b+(g<<12&4294967295|g>>>20);g=e+(c^f&(b^c))+d[2]+606105819&4294967295;e=f+(g<<17&4294967295|g>>>15);g=c+(b^e&(f^b))+ +d[3]+3250441966&4294967295;c=e+(g<<22&4294967295|g>>>10);g=b+(f^c&(e^f))+d[4]+4118548399&4294967295;b=c+(g<<7&4294967295|g>>>25);g=f+(e^b&(c^e))+d[5]+1200080426&4294967295;f=b+(g<<12&4294967295|g>>>20);g=e+(c^f&(b^c))+d[6]+2821735955&4294967295;e=f+(g<<17&4294967295|g>>>15);g=c+(b^e&(f^b))+d[7]+4249261313&4294967295;c=e+(g<<22&4294967295|g>>>10);g=b+(f^c&(e^f))+d[8]+1770035416&4294967295;b=c+(g<<7&4294967295|g>>>25);g=f+(e^b&(c^e))+d[9]+2336552879&4294967295;f=b+(g<<12&4294967295|g>>>20);g=e+(c^f& +(b^c))+d[10]+4294925233&4294967295;e=f+(g<<17&4294967295|g>>>15);g=c+(b^e&(f^b))+d[11]+2304563134&4294967295;c=e+(g<<22&4294967295|g>>>10);g=b+(f^c&(e^f))+d[12]+1804603682&4294967295;b=c+(g<<7&4294967295|g>>>25);g=f+(e^b&(c^e))+d[13]+4254626195&4294967295;f=b+(g<<12&4294967295|g>>>20);g=e+(c^f&(b^c))+d[14]+2792965006&4294967295;e=f+(g<<17&4294967295|g>>>15);g=c+(b^e&(f^b))+d[15]+1236535329&4294967295;c=e+(g<<22&4294967295|g>>>10);g=b+(e^f&(c^e))+d[1]+4129170786&4294967295;b=c+(g<<5&4294967295|g>>> +27);g=f+(c^e&(b^c))+d[6]+3225465664&4294967295;f=b+(g<<9&4294967295|g>>>23);g=e+(b^c&(f^b))+d[11]+643717713&4294967295;e=f+(g<<14&4294967295|g>>>18);g=c+(f^b&(e^f))+d[0]+3921069994&4294967295;c=e+(g<<20&4294967295|g>>>12);g=b+(e^f&(c^e))+d[5]+3593408605&4294967295;b=c+(g<<5&4294967295|g>>>27);g=f+(c^e&(b^c))+d[10]+38016083&4294967295;f=b+(g<<9&4294967295|g>>>23);g=e+(b^c&(f^b))+d[15]+3634488961&4294967295;e=f+(g<<14&4294967295|g>>>18);g=c+(f^b&(e^f))+d[4]+3889429448&4294967295;c=e+(g<<20&4294967295| +g>>>12);g=b+(e^f&(c^e))+d[9]+568446438&4294967295;b=c+(g<<5&4294967295|g>>>27);g=f+(c^e&(b^c))+d[14]+3275163606&4294967295;f=b+(g<<9&4294967295|g>>>23);g=e+(b^c&(f^b))+d[3]+4107603335&4294967295;e=f+(g<<14&4294967295|g>>>18);g=c+(f^b&(e^f))+d[8]+1163531501&4294967295;c=e+(g<<20&4294967295|g>>>12);g=b+(e^f&(c^e))+d[13]+2850285829&4294967295;b=c+(g<<5&4294967295|g>>>27);g=f+(c^e&(b^c))+d[2]+4243563512&4294967295;f=b+(g<<9&4294967295|g>>>23);g=e+(b^c&(f^b))+d[7]+1735328473&4294967295;e=f+(g<<14&4294967295| +g>>>18);g=c+(f^b&(e^f))+d[12]+2368359562&4294967295;c=e+(g<<20&4294967295|g>>>12);g=b+(c^e^f)+d[5]+4294588738&4294967295;b=c+(g<<4&4294967295|g>>>28);g=f+(b^c^e)+d[8]+2272392833&4294967295;f=b+(g<<11&4294967295|g>>>21);g=e+(f^b^c)+d[11]+1839030562&4294967295;e=f+(g<<16&4294967295|g>>>16);g=c+(e^f^b)+d[14]+4259657740&4294967295;c=e+(g<<23&4294967295|g>>>9);g=b+(c^e^f)+d[1]+2763975236&4294967295;b=c+(g<<4&4294967295|g>>>28);g=f+(b^c^e)+d[4]+1272893353&4294967295;f=b+(g<<11&4294967295|g>>>21);g=e+(f^ +b^c)+d[7]+4139469664&4294967295;e=f+(g<<16&4294967295|g>>>16);g=c+(e^f^b)+d[10]+3200236656&4294967295;c=e+(g<<23&4294967295|g>>>9);g=b+(c^e^f)+d[13]+681279174&4294967295;b=c+(g<<4&4294967295|g>>>28);g=f+(b^c^e)+d[0]+3936430074&4294967295;f=b+(g<<11&4294967295|g>>>21);g=e+(f^b^c)+d[3]+3572445317&4294967295;e=f+(g<<16&4294967295|g>>>16);g=c+(e^f^b)+d[6]+76029189&4294967295;c=e+(g<<23&4294967295|g>>>9);g=b+(c^e^f)+d[9]+3654602809&4294967295;b=c+(g<<4&4294967295|g>>>28);g=f+(b^c^e)+d[12]+3873151461&4294967295; +f=b+(g<<11&4294967295|g>>>21);g=e+(f^b^c)+d[15]+530742520&4294967295;e=f+(g<<16&4294967295|g>>>16);g=c+(e^f^b)+d[2]+3299628645&4294967295;c=e+(g<<23&4294967295|g>>>9);g=b+(e^(c|~f))+d[0]+4096336452&4294967295;b=c+(g<<6&4294967295|g>>>26);g=f+(c^(b|~e))+d[7]+1126891415&4294967295;f=b+(g<<10&4294967295|g>>>22);g=e+(b^(f|~c))+d[14]+2878612391&4294967295;e=f+(g<<15&4294967295|g>>>17);g=c+(f^(e|~b))+d[5]+4237533241&4294967295;c=e+(g<<21&4294967295|g>>>11);g=b+(e^(c|~f))+d[12]+1700485571&4294967295;b=c+ +(g<<6&4294967295|g>>>26);g=f+(c^(b|~e))+d[3]+2399980690&4294967295;f=b+(g<<10&4294967295|g>>>22);g=e+(b^(f|~c))+d[10]+4293915773&4294967295;e=f+(g<<15&4294967295|g>>>17);g=c+(f^(e|~b))+d[1]+2240044497&4294967295;c=e+(g<<21&4294967295|g>>>11);g=b+(e^(c|~f))+d[8]+1873313359&4294967295;b=c+(g<<6&4294967295|g>>>26);g=f+(c^(b|~e))+d[15]+4264355552&4294967295;f=b+(g<<10&4294967295|g>>>22);g=e+(b^(f|~c))+d[6]+2734768916&4294967295;e=f+(g<<15&4294967295|g>>>17);g=c+(f^(e|~b))+d[13]+1309151649&4294967295; +c=e+(g<<21&4294967295|g>>>11);g=b+(e^(c|~f))+d[4]+4149444226&4294967295;b=c+(g<<6&4294967295|g>>>26);g=f+(c^(b|~e))+d[11]+3174756917&4294967295;f=b+(g<<10&4294967295|g>>>22);g=e+(b^(f|~c))+d[2]+718787259&4294967295;e=f+(g<<15&4294967295|g>>>17);g=c+(f^(e|~b))+d[9]+3951481745&4294967295;a.b[0]=a.b[0]+b&4294967295;a.b[1]=a.b[1]+(e+(g<<21&4294967295|g>>>11))&4294967295;a.b[2]=a.b[2]+e&4294967295;a.b[3]=a.b[3]+f&4294967295} +function nj(a,b){var c;void 0===c&&(c=b.length);for(var d=c-a.a,e=a.c,f=a.g,g=0;gc.g?c.a:2*c.a)-c.g);b[0]=128;for(var d=1;dd;++d)for(var f=0;32>f;f+=8)b[e++]=c.b[d]>>>f&255;if(8192>=b.length)c=String.fromCharCode.apply(null, +b);else for(c="",d=0;dF.width?F.width-ya:Va,Nb=H+Ua>F.height?F.height-Ua:H;b.drawImage(F,ya,Ua,Qb,Nb,z,X,Qb*c,Nb*c);1!=N&&(b.globalAlpha=Aa);if(1!=A||0!==D)cd(u,a),b.transform(a[0], +a[1],a[4],a[5],a[12],a[13])}++n;break;case 5:q=z[1];r=z[2];K=z[3];oa=z[4]*c;H=z[5]*c;D=z[6];A=z[7]*c;F=z[8];for(N=z[9];qthis.c&&(this.c=this.g.lineWidth,this.f=null)}; +function Yj(a,b,c){Oj.call(this,a,b,c);this.g={ug:void 0,fd:void 0,ad:void 0,bd:null,cd:void 0,dd:void 0,ed:void 0,fillStyle:void 0,strokeStyle:void 0,lineCap:void 0,lineDash:null,lineJoin:void 0,lineWidth:void 0,miterLimit:void 0}}y(Yj,Oj); +function Zj(a,b,c,d,e){var f=a.g,g=[1];a.a.push(g);a.b.push(g);var h,g=0;for(h=d.length;gthis.c&&(this.c=c.lineWidth,this.f=null)):(c.strokeStyle=void 0,c.lineCap=void 0,c.lineDash=null,c.lineJoin=void 0,c.lineWidth=void 0,c.miterLimit=void 0)}; +function ak(a){var b=a.g,c=b.fillStyle,d=b.strokeStyle,e=b.lineCap,f=b.lineDash,g=b.lineJoin,h=b.lineWidth,l=b.miterLimit;void 0!==c&&b.ug!=c&&(a.a.push([9,c]),b.ug=b.fillStyle);void 0===d||b.fd==d&&b.ad==e&&b.bd==f&&b.cd==g&&b.dd==h&&b.ed==l||(a.a.push([10,d,h,e,g,l,f]),b.fd=d,b.ad=e,b.bd=f,b.cd=g,b.dd=h,b.ed=l)}function bk(a,b,c){Oj.call(this,a,b,c);this.D=this.C=this.A=null;this.o="";this.U=this.v=this.s=this.j=0;this.l=this.i=this.g=null}y(bk,Oj); +function ck(a,b,c,d,e){if(""!==a.o&&a.l&&(a.g||a.i)){if(a.g){var f=a.g,g=a.A;if(!g||g.fillStyle!=f.fillStyle){var h=[9,f.fillStyle];a.a.push(h);a.b.push(h);g?g.fillStyle=f.fillStyle:a.A={fillStyle:f.fillStyle}}}a.i&&(f=a.i,g=a.C,g&&g.lineCap==f.lineCap&&g.lineDash==f.lineDash&&g.lineJoin==f.lineJoin&&g.lineWidth==f.lineWidth&&g.miterLimit==f.miterLimit&&g.strokeStyle==f.strokeStyle||(h=[10,f.strokeStyle,f.lineWidth,f.lineCap,f.lineJoin,f.miterLimit,f.lineDash,!1],a.a.push(h),a.b.push(h),g?(g.lineCap= +f.lineCap,g.lineDash=f.lineDash,g.lineJoin=f.lineJoin,g.lineWidth=f.lineWidth,g.miterLimit=f.miterLimit,g.strokeStyle=f.strokeStyle):a.C={lineCap:f.lineCap,lineDash:f.lineDash,lineJoin:f.lineJoin,lineWidth:f.lineWidth,miterLimit:f.miterLimit,strokeStyle:f.strokeStyle}));f=a.l;g=a.D;g&&g.font==f.font&&g.textAlign==f.textAlign&&g.textBaseline==f.textBaseline||(h=[11,f.font,f.textAlign,f.textBaseline],a.a.push(h),a.b.push(h),g?(g.font=f.font,g.textAlign=f.textAlign,g.textBaseline=f.textBaseline):a.D= +{font:f.font,textAlign:f.textAlign,textBaseline:f.textBaseline});Qj(a,e);f=a.coordinates.length;b=Pj(a,b,0,c,d,!1);b=[5,f,b,a.o,a.j,a.s,a.v,a.U,!!a.g,!!a.i];a.a.push(b);a.b.push(b);Tj(a,e)}} +bk.prototype.Vb=function(a){if(a){var b=a.b;b?(b=b.b,b=xe(b?b:ej),this.g?this.g.fillStyle=b:this.g={fillStyle:b}):this.g=null;var c=a.l;if(c){var b=c.b,d=c.f,e=c.g,f=c.c,g=c.a,c=c.i,d=void 0!==d?d:"round",e=e?e.slice():fj,f=void 0!==f?f:"round",g=void 0!==g?g:1,c=void 0!==c?c:10,b=ve(b?b:gj);if(this.i){var h=this.i;h.lineCap=d;h.lineDash=e;h.lineJoin=f;h.lineWidth=g;h.miterLimit=c;h.strokeStyle=b}else this.i={lineCap:d,lineDash:e,lineJoin:f,lineWidth:g,miterLimit:c,strokeStyle:b}}else this.i=null; +var l=a.g,b=a.f,d=a.c,e=a.i,g=a.a,c=a.Ha(),f=a.o,h=a.j;a=void 0!==l?l:"10px sans-serif";f=void 0!==f?f:"center";h=void 0!==h?h:"middle";this.l?(l=this.l,l.font=a,l.textAlign=f,l.textBaseline=h):this.l={font:a,textAlign:f,textBaseline:h};this.o=void 0!==c?c:"";this.j=void 0!==b?b:0;this.s=void 0!==d?d:0;this.v=void 0!==e?e:0;this.U=void 0!==g?g:1}else this.o=""};function dk(a,b,c,d){this.o=a;this.g=b;this.l=c;this.f=d;this.a={};this.c=Oe(1,1);this.i=Xc()} +function ek(a){for(var b in a.a){var c=a.a[b],d;for(d in c)c[d].ke()}}dk.prototype.ra=function(a,b,c,d,e){var f=this.i;qh(f,.5,.5,1/b,-1/b,-c,-a[0],-a[1]);var g=this.c;g.clearRect(0,0,1,1);var h;void 0!==this.f&&(h=Lb(),Mb(h,a),Ob(h,b*this.f,h));return fk(this,g,f,c,d,function(a){if(0Xa&&(Xa=Aa,m=Va)}if(0===Xa){g=null;break a}Xa=g[m];g[m]=g[l];g[l]=Xa;for(m=l+1;mthis.b/2){var b=[[a.source[0][0],a.source[0][1]],[a.source[1][0],a.source[1][1]],[a.source[2][0],a.source[2][1]]];b[0][0]-n>this.b/2&&(b[0][0]-=this.b);b[1][0]-n>this.b/2&&(b[1][0]-=this.b);b[2][0]-n>this.b/2&&(b[2][0]-=this.b);Math.max(b[0][0],b[1][0],b[2][0])-Math.min(b[0][0],b[1][0],b[2][0])p,r=!1;if(0a.s),r)){Math.abs(b[0]-d[0])<=Math.abs(b[1]-d[1])?(q=[(c[0]+d[0])/2,(c[1]+d[1])/2],n=a.a(q),p=[(e[0]+b[0])/2,(e[1]+b[1])/2],r=a.a(p),xk(a,b,c,q,p,f,g,n,r,m-1),xk(a,p,q,d,e,r,n,h,l,m-1)):(q=[(b[0]+c[0])/2,(b[1]+c[1])/2],n=a.a(q),p=[(d[0]+e[0])/2,(d[1]+e[1])/2],r=a.a(p),xk(a,b,q,p,e,f,n,r,l,m-1),xk(a,q,c,d,p,n,g,h,r,m-1));return}if(q){if(!a.j)return;a.o=!0}a.f.push({source:[f,h,l],target:[b,d,e]});a.f.push({source:[f,g,h],target:[b,c,d]})}} +function yk(a){var b=Lb();a.f.forEach(function(a){a=a.source;Mb(b,a[0]);Mb(b,a[1]);Mb(b,a[2])});return b};function zk(a,b,c,d,e,f){this.v=b;this.s=a.H();var g=b.H(),h=g?mc(c,g):c,g=tk(a,b,kc(h),d);this.o=new wk(a,b,h,this.s,.5*g);this.c=d;this.g=c;a=yk(this.o);this.j=(this.ob=f(a,g,e))?this.ob.f:1;this.Ad=this.i=null;e=2;f=[];this.ob&&(e=0,f=this.ob.l);oh.call(this,c,d,this.j,e,f)}y(zk,oh);zk.prototype.ka=function(){1==this.state&&(Ka(this.Ad),this.Ad=null);oh.prototype.ka.call(this)};zk.prototype.a=function(){return this.i}; +zk.prototype.zd=function(){var a=this.ob.V();2==a&&(this.i=vk(ic(this.g)/this.c,jc(this.g)/this.c,this.j,this.ob.$(),0,this.c,this.g,this.o,[{extent:this.ob.H(),image:this.ob.a()}],0));this.state=a;ph(this)};zk.prototype.load=function(){if(0==this.state){this.state=1;ph(this);var a=this.ob.V();2==a||3==a?this.zd():(this.Ad=B(this.ob,"change",function(){var a=this.ob.V();if(2==a||3==a)Ka(this.Ad),this.Ad=null,this.zd()},this),this.ob.load())}};function Ak(a){jf.call(this,{attributions:a.attributions,extent:a.extent,logo:a.logo,projection:a.projection,state:a.state});this.C=void 0!==a.resolutions?a.resolutions:null;this.a=null;this.qa=0}y(Ak,jf);function Bk(a,b){if(a.C){var c=kb(a.C,b,0);b=a.C[c]}return b} +Ak.prototype.A=function(a,b,c,d){var e=this.f;if(e&&d&&!Oc(e,d)){if(this.a){if(this.qa==this.g&&Oc(this.a.v,d)&&this.a.$()==b&&this.a.f==c&&$b(this.a.H(),a))return this.a;Ta(this.a);this.a=null}this.a=new zk(e,d,a,b,c,function(a,b,c){return this.Mc(a,b,c,e)}.bind(this));this.qa=this.g;return this.a}e&&(d=e);return this.Mc(a,b,c,d)};Ak.prototype.o=function(a){a=a.target;switch(a.V()){case 1:this.b(new Ck(Dk,a));break;case 2:this.b(new Ck(Ek,a));break;case 3:this.b(new Ck(Fk,a))}}; +function Gk(a,b){a.a().src=b}function Ck(a,b){Wa.call(this,a);this.image=b}y(Ck,Wa);var Dk="imageloadstart",Ek="imageloadend",Fk="imageloaderror";function Hk(a){Ak.call(this,{attributions:a.attributions,logo:a.logo,projection:a.projection,resolutions:a.resolutions,state:a.state});this.ia=a.canvasFunction;this.T=null;this.Y=0;this.ta=void 0!==a.ratio?a.ratio:1.5}y(Hk,Ak);Hk.prototype.Mc=function(a,b,c,d){b=Bk(this,b);var e=this.T;if(e&&this.Y==this.g&&e.$()==b&&e.f==c&&Ub(e.H(),a))return e;a=a.slice();oc(a,this.ta);(d=this.ia(a,b,c,[ic(a)/b*c,jc(a)/b*c],d))&&(e=new nk(a,b,c,this.l,d));this.T=e;this.Y=this.g;return e};function Ik(a){eb.call(this);this.i=void 0;this.a="geometry";this.c=null;this.l=void 0;this.f=null;B(this,gb(this.a),this.be,this);void 0!==a&&(a instanceof Tc||!a?this.Ua(a):this.G(a))}y(Ik,eb);k=Ik.prototype;k.clone=function(){var a=new Ik(this.O());a.Ec(this.a);var b=this.W();b&&a.Ua(b.clone());(b=this.c)&&a.sf(b);return a};k.W=function(){return this.get(this.a)};k.Xa=function(){return this.i};k.$j=function(){return this.a};k.Jl=function(){return this.c};k.ec=function(){return this.l};k.Kl=function(){this.u()}; +k.be=function(){this.f&&(Ka(this.f),this.f=null);var a=this.W();a&&(this.f=B(a,"change",this.Kl,this));this.u()};k.Ua=function(a){this.set(this.a,a)};k.sf=function(a){this.l=(this.c=a)?Jk(a):void 0;this.u()};k.mc=function(a){this.i=a;this.u()};k.Ec=function(a){Qa(this,gb(this.a),this.be,this);this.a=a;B(this,gb(this.a),this.be,this);this.be()};function Jk(a){if("function"!==typeof a){var b;b=Array.isArray(a)?a:[a];a=function(){return b}}return a};function Kk(a,b,c,d,e){df.call(this,a,b);this.g=Oe();this.l=d;this.c=null;this.f={gd:!1,Tf:null,bi:-1,Uf:-1,yd:null,ui:[]};this.v=e;this.j=c}y(Kk,df);k=Kk.prototype;k.$a=function(){return-1==this.f.Uf?null:this.g.canvas};k.Ul=function(){return this.l};k.ib=function(){return this.j};k.load=function(){0==this.state&&(this.state=1,ef(this),this.v(this,this.j),this.s(null,NaN,null))};k.gi=function(a){this.c=a;this.state=2;ef(this)};k.vf=function(a){this.o=a};k.ki=function(a){this.s=a};var Lk=document.implementation.createDocument("","",null);function Mk(a,b){return Lk.createElementNS(a,b)}function Nk(a,b){return Ok(a,b,[]).join("")}function Ok(a,b,c){if(a.nodeType==Node.CDATA_SECTION_NODE||a.nodeType==Node.TEXT_NODE)b?c.push(String(a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):c.push(a.nodeValue);else for(a=a.firstChild;a;a=a.nextSibling)Ok(a,b,c);return c}function Pk(a){return a instanceof Document}function Qk(a){return a instanceof Node} +function Rk(a){return(new DOMParser).parseFromString(a,"application/xml")}function Sk(a,b){return function(c,d){var e=a.call(b,c,d);void 0!==e&&mb(d[d.length-1],e)}}function Tk(a,b){return function(c,d){var e=a.call(void 0!==b?b:this,c,d);void 0!==e&&d[d.length-1].push(e)}}function Uk(a,b){return function(c,d){var e=a.call(void 0!==b?b:this,c,d);void 0!==e&&(d[d.length-1]=e)}} +function Vk(a){return function(b,c){var d=a.call(this,b,c);if(void 0!==d){var e=c[c.length-1],f=b.localName,g;f in e?g=e[f]:g=e[f]=[];g.push(d)}}}function J(a,b){return function(c,d){var e=a.call(this,c,d);void 0!==e&&(d[d.length-1][void 0!==b?b:c.localName]=e)}}function L(a,b){return function(c,d,e){a.call(void 0!==b?b:this,c,d,e);e[e.length-1].node.appendChild(c)}} +function Wk(a){var b,c;return function(d,e,f){if(!b){b={};var g={};g[d.localName]=a;b[d.namespaceURI]=g;c=Xk(d.localName)}Yk(b,c,e,f)}}function Xk(a,b){return function(c,d,e){c=d[d.length-1].node;d=a;void 0===d&&(d=e);e=b;void 0===b&&(e=c.namespaceURI);return Mk(e,d)}}var Zk=Xk();function $k(a,b){for(var c=b.length,d=Array(c),e=0;eh.status){var a=b.X(),e;"json"==a||"text"==a?e=h.responseText:"xml"==a?(e=h.responseXML)||(e=Rk(h.responseText)):"arraybuffer"==a&&(e=h.response);e&&c.call(this,b.Fa(e,{featureProjection:g}),b.Oa(e))}else d.call(this)}.bind(this);h.send()}} +function dl(a,b){return cl(a,b,function(a,b){this.vf(b);this.gi(a)},function(){this.state=3;ef(this)})}function el(a,b){return cl(a,b,function(a){this.Jc(a)},na)};function fl(){return[[-Infinity,-Infinity,Infinity,Infinity]]};var gl,hl,il,jl; +(function(){var a={},b={ja:a};(function(c){if("object"===typeof a&&"undefined"!==typeof b)b.ja=c();else{var d;"undefined"!==typeof window?d=window:"undefined"!==typeof global?d=global:"undefined"!==typeof self?d=self:d=this;d.Tp=c()}})(function(){return function d(a,b,g){function h(m,p){if(!b[m]){if(!a[m]){var q="function"==typeof require&&require;if(!p&&q)return q(m,!0);if(l)return l(m,!0);q=Error("Cannot find module '"+m+"'");throw q.code="MODULE_NOT_FOUND",q;}q=b[m]={ja:{}};a[m][0].call(q.ja,function(b){var d= +a[m][1][b];return h(d?d:b)},q,q.ja,d,a,b,g)}return b[m].ja}for(var l="function"==typeof require&&require,m=0;m=a.ca&&b.ga>=a.fa}function x(a){return{children:a,height:1,Ta:!0,ca:Infinity,fa:Infinity,ea:-Infinity, +ga:-Infinity}}function v(a,b,d,e,f){for(var g=[b,d],h;g.length;)d=g.pop(),b=g.pop(),d-b<=e||(h=b+Math.ceil((d-b)/e/2)*e,D(a,h,b,d,f),g.push(b,h,h,d))}b.ja=f;var D=a("quickselect");f.prototype={all:function(){return this.cg(this.data,[])},search:function(a){var b=this.data,d=[],e=this.lb;if(!u(a,b))return d;for(var f=[],g,h,l,m;b;){g=0;for(h=b.children.length;gthis.Te)this.sj(e,b),b--;else break;this.gj(d,e,b)},sj:function(a,b){var d= +a[b],e=d.children.length,f=this.hg;this.hj(d,f,e);e=this.ij(d,f,e);e=x(d.children.splice(e,d.children.length-e));e.height=d.height;e.Ta=d.Ta;g(d,this.lb);g(e,this.lb);b?a[b-1].children.push(e):this.jg(d,e)},jg:function(a,b){this.data=x([a,b]);this.data.height=a.height+1;this.data.Ta=!1;g(this.data,this.lb)},ij:function(a,b,d){var e,f,g,l,m,n,q;m=n=Infinity;for(e=b;e<=d-b;e++)f=h(a,0,e,this.lb),g=h(a,e,d,this.lb),l=Math.max(0,Math.min(f.ea,g.ea)-Math.max(f.ca,g.ca))*Math.max(0,Math.min(f.ga,g.ga)- +Math.max(f.fa,g.fa)),f=p(f)+p(g),l=b;n--)p=a.children[n],l(g,a.Ta?e(p):p),m+=q(g);return m},gj:function(a,b,d){for(;0<=d;d--)l(b[d],a)},kj:function(a){for(var b= +a.length-1,d;0<=b;b--)0===a[b].children.length?0d;){if(600u-r/2?-1:1);f(a,b,Math.max(d,Math.floor(b-u*v/r+x)),Math.min(e,Math.floor(b+(r-u)*v/r+x)),q)}r=a[b];u=d;v=e;g(a,d,b);for(0q(a[u],r);)u++;for(;0b?1:0}b.ja=f},{}]},{},[1])(1)});gl=b.ja})();function kl(a){this.a=gl(a);this.b={}}k=kl.prototype;k.Ca=function(a,b){var c={ca:a[0],fa:a[1],ea:a[2],ga:a[3],value:b};this.a.Ca(c);this.b[w(b)]=c};k.load=function(a,b){for(var c=Array(b.length),d=0,e=b.length;dl[2];)++x,n=m*x,n=Mj(this,a,n),p.Pa(q,e,n,g,f),h-=m;n=Mj(this,a,0)}hj(q,g,b/2,u/2);q!=c&&(Kj(this,"render",q,a,n),c.drawImage(q.canvas,0,0));q.globalAlpha=r}Lj(this,c,a,n)};Dl.prototype.ra=function(a,b,c,d){if(this.o){var e=this.a,f={};return this.o.ra(a,b.viewState.resolution,b.viewState.rotation,{},function(a){var b=w(a).toString();if(!(b in f))return f[b]=!0,c.call(d,a,e)})}};Dl.prototype.D=function(){uh(this)}; +Dl.prototype.l=function(a){function b(a){var b,d=a.ec();d?b=d.call(a,m):(d=c.i)&&(b=d(a,m));if(b){if(b){d=!1;if(Array.isArray(b))for(var e=0,f=b.length;eK&&this.target.insertBefore(x.target,this.target.childNodes[0]|| +null)}else{if(!a.viewHints[0]&&!a.viewHints[1]){z=pf(x.c,q,x.g[0],D);K=[];A=void 0;for(A in x.a)N=x.a[A],z.contains(N.ma)||K.push(N);z=0;for(oa=K.length;z=m;){r=this.g[e];c=this.s[e];q=w(c).toString();if(void 0===h[q]&&c.W()&&(void 0===n||nc(n,c.W().H()))&&(f.clear(f.COLOR_BUFFER_BIT|f.DEPTH_BUFFER_BIT),f.drawElements(4,b-r,d,r*a),b=l(c))){h=b;break a}b=r;e--}h=void 0}else f.clear(f.COLOR_BUFFER_BIT|f.DEPTH_BUFFER_BIT),um(this,f,a,h,this.l,this.i),h=(h=l(null))?h:void 0;r=h}f.disableVertexAttribArray(p.f);f.disableVertexAttribArray(p.b);f.disableVertexAttribArray(p.c);f.disableVertexAttribArray(p.a);f.disableVertexAttribArray(p.g);return r}; +function um(a,b,c,d,e,f){var g=c.g?5125:5123;c=c.g?4:2;if(Ha(d)){var h;a=0;d=e.length;for(h=0;ab[0]||b[0]>e[0]||0> +b[1]||b[1]>e[1])&&(this.o||(this.o=Oe(1,1)),this.o.clearRect(0,0,1,1),this.o.drawImage(this.c.a(),b[0],b[1],1,1,0,0,1,1),0d?b[0]=d-c:0>e&&(b[0]=Math.abs(e)+ +c),0>f?b[1]=f-c:0>g&&(b[1]=Math.abs(g)+c),0===b[0]&&0===b[1])||(c=a.aa().ab(),d=a.Ga(c),b=[d[0]+b[0],d[1]+b[1]],this.i&&(this.i.source=c,a.Wa(ce(this.i))),a.aa().mb(a.Ma(b)))}}};k.bl=function(){Ym(this)};k.fi=function(a){this.set("element",a)};k.setMap=function(a){this.set("map",a)};k.li=function(a){this.set("offset",a)};k.uf=function(a){this.set("position",a)};function Zm(a,b){var c=a.getBoundingClientRect(),d=c.left+pa.pageXOffset,c=c.top+pa.pageYOffset;return[d,c,d+b[0],c+b[1]]} +k.oi=function(a){this.set("positioning",a)};function $m(a,b){a.a.visible!==b&&(a.f.style.display=b?"":"none",a.a.visible=b)} +function Ym(a){var b=a.he(),c=a.gh();if(void 0!==b&&b.f&&void 0!==c){var c=b.Ga(c),d=b.Za(),b=a.f.style,e=a.Kg(),f=a.Lg(),g=e[0],e=e[1];if("bottom-right"==f||"center-right"==f||"top-right"==f)""!==a.a.fe&&(a.a.fe=b.left=""),g=Math.round(d[0]-c[0]-g)+"px",a.a.De!=g&&(a.a.De=b.right=g);else{""!==a.a.De&&(a.a.De=b.right="");if("bottom-center"==f||"center-center"==f||"top-center"==f)g-=a.f.offsetWidth/2;g=Math.round(c[0]+g)+"px";a.a.fe!=g&&(a.a.fe=b.left=g)}if("bottom-left"==f||"bottom-center"==f||"bottom-right"== +f)""!==a.a.Fe&&(a.a.Fe=b.top=""),c=Math.round(d[1]-c[1]-e)+"px",a.a.Md!=c&&(a.a.Md=b.bottom=c);else{""!==a.a.Md&&(a.a.Md=b.bottom="");if("center-left"==f||"center-center"==f||"center-right"==f)e-=a.f.offsetHeight/2;c=Math.round(c[1]+e)+"px";a.a.Fe!=c&&(a.a.Fe=b.top=c)}$m(a,!0)}else $m(a,!1)};function an(a){a=a?a:{};this.l=void 0!==a.collapsed?a.collapsed:!0;this.o=void 0!==a.collapsible?a.collapsible:!0;this.o||(this.l=!1);var b=void 0!==a.className?a.className:"ol-overviewmap",c=void 0!==a.tipLabel?a.tipLabel:"Overview map",d=void 0!==a.collapseLabel?a.collapseLabel:"\u00ab";"string"===typeof d?(this.j=document.createElement("span"),this.j.textContent=d):this.j=d;d=void 0!==a.label?a.label:"\u00bb";"string"===typeof d?(this.v=document.createElement("span"),this.v.textContent=d):this.v= +d;var e=this.o&&!this.l?this.j:this.v,d=document.createElement("button");d.setAttribute("type","button");d.title=c;d.appendChild(e);B(d,"click",this.gm,this);c=document.createElement("DIV");c.className="ol-overviewmap-map";var f=this.f=new Q({controls:new le,interactions:new le,target:c,view:a.view});a.layers&&a.layers.forEach(function(a){f.kg(a)},this);e=document.createElement("DIV");e.className="ol-overviewmap-box";e.style.boxSizing="border-box";this.A=new Xm({position:[0,0],positioning:"bottom-left", +element:e});this.f.lg(this.A);e=document.createElement("div");e.className=b+" ol-unselectable ol-control"+(this.l&&this.o?" ol-collapsed":"")+(this.o?"":" ol-uncollapsible");e.appendChild(c);e.appendChild(d);Xe.call(this,{element:e,render:a.render?a.render:bn,target:a.target})}y(an,Xe);k=an.prototype; +k.setMap=function(a){var b=this.a;a!==b&&(b&&(b=b.aa())&&Qa(b,gb("rotation"),this.de,this),Xe.prototype.setMap.call(this,a),a&&(this.s.push(B(a,"propertychange",this.Wk,this)),0===this.f.eh().dc()&&this.f.ji(a.xc()),a=a.aa()))&&(B(a,gb("rotation"),this.de,this),Wd(a)&&(this.f.Xc(),cn(this)))};k.Wk=function(a){"view"===a.key&&((a=a.oldValue)&&Qa(a,gb("rotation"),this.de,this),a=this.a.aa(),B(a,gb("rotation"),this.de,this))};k.de=function(){this.f.aa().ie(this.a.aa().La())}; +function bn(){var a=this.a,b=this.f;if(a.f&&b.f){var c=a.Za(),a=a.aa().Kc(c),d=b.Za(),c=b.aa().Kc(d),e=b.Ga(fc(a)),f=b.Ga(dc(a)),b=Math.abs(e[0]-f[0]),e=Math.abs(e[1]-f[1]),f=d[0],d=d[1];b<.1*f||e<.1*d||b>.75*f||e>.75*d?cn(this):Ub(c,a)||(a=this.f,c=this.a.aa(),a.aa().mb(c.ab()))}dn(this)}function cn(a){var b=a.a;a=a.f;var c=b.Za(),b=b.aa().Kc(c),c=a.Za();a=a.aa();oc(b,1/(.1*Math.pow(2,Math.log(7.5)/Math.LN2/2)));a.cf(b,c)} +function dn(a){var b=a.a,c=a.f;if(b.f&&c.f){var d=b.Za(),e=b.aa(),f=c.aa();c.Za();var c=e.La(),b=a.A,g=a.A.Sd(),e=e.Kc(d),d=f.$(),f=cc(e),e=ec(e),h;if(a=a.a.aa().ab())h=[f[0]-a[0],f[1]-a[1]],Gb(h,c),Bb(h,a);b.uf(h);g&&(g.style.width=Math.abs((f[0]-e[0])/d)+"px",g.style.height=Math.abs((e[1]-f[1])/d)+"px")}}k.gm=function(a){a.preventDefault();en(this)}; +function en(a){a.element.classList.toggle("ol-collapsed");a.l?Te(a.j,a.v):Te(a.v,a.j);a.l=!a.l;var b=a.f;a.l||b.f||(b.Xc(),cn(a),Pa(b,"postrender",function(){dn(this)},a))}k.fm=function(){return this.o};k.im=function(a){this.o!==a&&(this.o=a,this.element.classList.toggle("ol-uncollapsible"),!a&&this.l&&en(this))};k.hm=function(a){this.o&&this.l!==a&&en(this)};k.em=function(){return this.l};k.pk=function(){return this.f};function fn(a){a=a?a:{};var b=void 0!==a.className?a.className:"ol-scale-line";this.o=document.createElement("DIV");this.o.className=b+"-inner";this.f=document.createElement("DIV");this.f.className=b+" ol-unselectable";this.f.appendChild(this.o);this.v=null;this.j=void 0!==a.minWidth?a.minWidth:64;this.l=!1;this.C=void 0;this.A="";Xe.call(this,{element:this.f,render:a.render?a.render:gn,target:a.target});B(this,gb("units"),this.R,this);this.D(a.units||"metric")}y(fn,Xe);var hn=[1,2,5]; +fn.prototype.wb=function(){return this.get("units")};function gn(a){(a=a.frameState)?this.v=a.viewState:this.v=null;jn(this)}fn.prototype.R=function(){jn(this)};fn.prototype.D=function(a){this.set("units",a)}; +function jn(a){var b=a.v;if(b){var c=b.projection,d=c.$b(),b=c.getPointResolution(b.resolution,b.center)*d,d=a.j*b,c="",e=a.wb();"degrees"==e?(c=uc.degrees,b/=c,dd?(c="in",b/=.0254):1609.344>d?(c="ft",b/=.3048):(c="mi",b/=1609.344):"nautical"==e?(b/=1852,c="nm"):"metric"==e?1>d?(c="mm",b*=1E3):1E3>d?c="m":(c="km",b/=1E3):"us"==e&&(.9144>d?(c="in",b*=39.37):1609.344>d?(c="ft",b/=.30480061):(c="mi",b/=1609.3472));for(var e= +3*Math.floor(Math.log(a.j*b)/Math.log(10)),f;;){f=hn[(e%3+3)%3]*Math.pow(10,Math.floor(e/3));d=Math.round(f/b);if(isNaN(d)){a.f.style.display="none";a.l=!1;return}if(d>=a.j)break;++e}b=f+" "+c;a.A!=b&&(a.o.innerHTML=b,a.A=b);a.C!=d&&(a.o.style.width=d+"px",a.C=d);a.l||(a.f.style.display="",a.l=!0)}else a.l&&(a.f.style.display="none",a.l=!1)};function kn(a){a=a?a:{};this.f=void 0;this.l=ln;this.v=[];this.C=this.j=0;this.T=null;this.ia=!1;this.Y=void 0!==a.duration?a.duration:200;var b=void 0!==a.className?a.className:"ol-zoomslider",c=document.createElement("button");c.setAttribute("type","button");c.className=b+"-thumb ol-unselectable";var d=document.createElement("div");d.className=b+" ol-unselectable ol-control";d.appendChild(c);this.o=new Pg(d);B(this.o,zg,this.Ik,this);B(this.o,Ag,this.Ng,this);B(this.o,Bg,this.Og,this);B(d,"click", +this.Hk,this);B(c,"click",Ya);Xe.call(this,{element:d,render:a.render?a.render:mn})}y(kn,Xe);kn.prototype.ka=function(){Ta(this.o);Xe.prototype.ka.call(this)};var ln=0;k=kn.prototype;k.setMap=function(a){Xe.prototype.setMap.call(this,a);a&&a.render()}; +function mn(a){if(a.frameState){if(!this.ia){var b=this.element,c=b.offsetWidth,d=b.offsetHeight,e=b.firstElementChild,f=pa.getComputedStyle(e),b=e.offsetWidth+parseFloat(f.marginRight)+parseFloat(f.marginLeft),e=e.offsetHeight+parseFloat(f.marginTop)+parseFloat(f.marginBottom);this.T=[b,e];c>d?(this.l=1,this.C=c-b):(this.l=ln,this.j=d-e);this.ia=!0}a=a.frameState.viewState.resolution;a!==this.f&&(this.f=a,nn(this,a))}} +k.Hk=function(a){var b=this.a,c=b.aa(),d=c.$();b.Wa(ee({resolution:d,duration:this.Y,easing:Zd}));a=on(this,sa(1===this.l?(a.offsetX-this.T[0]/2)/this.C:(a.offsetY-this.T[1]/2)/this.j,0,1));c.Ub(c.constrainResolution(a))}; +k.Ik=function(a){if(!this.A&&a.b.target===this.element.firstElementChild&&(Xd(this.a.aa(),1),this.D=a.clientX,this.R=a.clientY,this.A=!0,0===this.v.length)){a=this.Ng;var b=this.Og;this.v.push(B(document,"mousemove",a,this),B(document,"touchmove",a,this),B(document,Ag,a,this),B(document,"mouseup",b,this),B(document,"touchend",b,this),B(document,Bg,b,this))}}; +k.Ng=function(a){if(this.A){var b=this.element.firstElementChild;this.f=on(this,sa(1===this.l?(a.clientX-this.D+parseInt(b.style.left,10))/this.C:(a.clientY-this.R+parseInt(b.style.top,10))/this.j,0,1));this.a.aa().Ub(this.f);nn(this,this.f);this.D=a.clientX;this.R=a.clientY}};k.Og=function(){if(this.A){var a=this.a,b=a.aa();Xd(b,-1);a.Wa(ee({resolution:this.f,duration:this.Y,easing:Zd}));a=b.constrainResolution(this.f);b.Ub(a);this.A=!1;this.R=this.D=void 0;this.v.forEach(Ka);this.v.length=0}}; +function nn(a,b){var c;c=1-Vd(a.a.aa())(b);var d=a.element.firstElementChild;1==a.l?d.style.left=a.C*c+"px":d.style.top=a.j*c+"px"}function on(a,b){return Ud(a.a.aa())(1-b)};function pn(a){a=a?a:{};this.f=a.extent?a.extent:null;var b=void 0!==a.className?a.className:"ol-zoom-extent",c=void 0!==a.label?a.label:"E",d=void 0!==a.tipLabel?a.tipLabel:"Fit to extent",e=document.createElement("button");e.setAttribute("type","button");e.title=d;e.appendChild("string"===typeof c?document.createTextNode(c):c);B(e,"click",this.l,this);c=document.createElement("div");c.className=b+" ol-unselectable ol-control";c.appendChild(e);Xe.call(this,{element:c,target:a.target})}y(pn,Xe); +pn.prototype.l=function(a){a.preventDefault();var b=this.a;a=b.aa();var c=this.f?this.f:a.l.H(),b=b.Za();a.cf(c,b)};function qn(a){eb.call(this);a=a?a:{};this.a=null;B(this,gb("tracking"),this.Il,this);this.rf(void 0!==a.tracking?a.tracking:!1)}y(qn,eb);k=qn.prototype;k.ka=function(){this.rf(!1);eb.prototype.ka.call(this)}; +k.co=function(a){if(null!==a.alpha){var b=wa(a.alpha);this.set("alpha",b);"boolean"===typeof a.absolute&&a.absolute?this.set("heading",b):ea(a.webkitCompassHeading)&&-1!=a.webkitCompassAccuracy&&this.set("heading",wa(a.webkitCompassHeading))}null!==a.beta&&this.set("beta",wa(a.beta));null!==a.gamma&&this.set("gamma",wa(a.gamma));this.u()};k.Oj=function(){return this.get("alpha")};k.Rj=function(){return this.get("beta")};k.Yj=function(){return this.get("gamma")};k.Hl=function(){return this.get("heading")}; +k.$g=function(){return this.get("tracking")};k.Il=function(){if(jg){var a=this.$g();a&&!this.a?this.a=B(pa,"deviceorientation",this.co,this):a||null===this.a||(Ka(this.a),this.a=null)}};k.rf=function(a){this.set("tracking",a)};function rn(){this.defaultDataProjection=null}function sn(a,b,c){var d;c&&(d={dataProjection:c.dataProjection?c.dataProjection:a.Oa(b),featureProjection:c.featureProjection});return tn(a,d)}function tn(a,b){var c;b&&(c={featureProjection:b.featureProjection,dataProjection:b.dataProjection?b.dataProjection:a.defaultDataProjection,rightHanded:b.rightHanded},b.decimals&&(c.decimals=b.decimals));return c} +function un(a,b,c){var d=c?yc(c.featureProjection):null,e=c?yc(c.dataProjection):null,f;d&&e&&!Oc(d,e)?a instanceof Tc?f=(b?a.clone():a).jb(b?d:e,b?e:d):f=Sc(b?a.slice():a,b?d:e,b?e:d):f=a;if(b&&c&&c.decimals){var g=Math.pow(10,c.decimals);a=function(a){for(var b=0,c=a.length;b>1),h=+ib(g[e],c),0>h?l=e+1:(m=e,n=!h);e=n?l:~l;0>e?(c=(c-g[-e-2])/(g[-e-1]-g[-e-2]),b+=(-e-2)*d,g=za(a[b],a[b+d],c),h=za(a[b+1],a[b+d+1],c)):(g=a[b+e*d],h=a[b+e*d+1])}return f?(f[0]= +g,f[1]=h,f):[g,h]}function yn(a,b,c,d,e,f){if(c==b)return null;if(e>1,ea||this.i.length<=a)return null;var b=new R(null);b.ba(this.f,this.B.slice(0===a?0:this.i[a-1],this.i[a]));return b}; +k.md=function(){var a=this.B,b=this.i,c=this.f,d=[],e=0,f,g;f=0;for(g=b.length;fa||b<=a)return null;b=new C(null);b.ba(this.f,this.B.slice(a*this.a,(a+1)*this.a));return b};k.je=function(){var a=this.B,b=this.f,c=this.a,d=[],e,f;e=0;for(f=a.length;ea||this.i.length<=a)return null;var b;0===a?b=0:(b=this.i[a-1],b=b[b.length-1]);a=this.i[a].slice();var c=a[a.length-1];if(0!==b){var d,e;d=0;for(e=a.length;da||0!==this.o&&a2*this.g&&jp(this),!0):!1};function jp(a){if(a.g!=a.b.length){for(var b=0,c=0;bb)throw Error("Bad port number "+b);a.o=b}else a.o=null}function qp(a,b,c){b instanceof sp?(a.i=b,yp(a.i,a.c)):(c||(b=tp(b,zp)),a.i=new sp(b,0,a.c))}function Ap(a){return a instanceof np?a.clone():new np(a,void 0)} +function Bp(a,b){a instanceof np||(a=Ap(a));b instanceof np||(b=Ap(b));var c=a,d=b,e=c.clone(),f=!!d.g;f?op(e,d.g):f=!!d.l;f?e.l=d.l:f=!!d.a;f?e.a=d.a:f=null!=d.o;var g=d.b;if(f)pp(e,d.o);else if(f=!!d.b)if("/"!=g.charAt(0)&&(c.a&&!c.b?g="/"+g:(c=e.b.lastIndexOf("/"),-1!=c&&(g=e.b.substr(0,c+1)+g))),c=g,".."==c||"."==c)g="";else if(-1!=c.indexOf("./")||-1!=c.indexOf("/.")){for(var g=0==c.lastIndexOf("/",0),c=c.split("/"),h=[],l=0;l>4&15).toString(16)+(a&15).toString(16)} +var up=/[#\/\?@]/g,wp=/[\#\?:]/g,vp=/[\#\?]/g,zp=/[\#\?@]/g,xp=/#/g;function sp(a,b,c){this.a=this.b=null;this.g=a||null;this.f=!!c}function Dp(a){a.b||(a.b=new ip,a.a=0,a.g&&mp(a.g,function(b,c){a.add(decodeURIComponent(b.replace(/\+/g," ")),c)}))}k=sp.prototype;k.wc=function(){Dp(this);return this.a};k.add=function(a,b){Dp(this);this.g=null;a=Ep(this,a);var c=this.b.get(a);c||this.b.set(a,c=[]);c.push(b);this.a=this.a+1;return this}; +k.remove=function(a){Dp(this);a=Ep(this,a);return kp(this.b.a,a)?(this.g=null,this.a=this.a-this.b.get(a).length,this.b.remove(a)):!1};k.clear=function(){this.b=this.g=null;this.a=0};k.Ya=function(){Dp(this);return 0==this.a};function Fp(a,b){Dp(a);b=Ep(a,b);return kp(a.b.a,b)}k.N=function(){Dp(this);for(var a=this.b.zc(),b=this.b.N(),c=[],d=0;dd;++d){var e=parseInt(c[d],10).toString(16);c[d]=1==e.length?"0"+e:e}ho(a,c.join(""))} +function Lq(a,b,c){a={node:a};var d=b.X(),e,f;"GeometryCollection"==d?(e=b.ff(),f=Mq):"MultiPoint"==d?(e=b.je(),f=Nq):"MultiLineString"==d?(e=b.md(),f=Oq):"MultiPolygon"==d&&(e=b.Wd(),f=Pq);bl(a,Qq,f,e,c)}function Rq(a,b,c){bl({node:a},Sq,Tq,[b],c)} +function Uq(a,b,c){var d={node:a};b.Xa()&&a.setAttribute("id",b.Xa());a=b.O();var e=b.ec();e&&(e=e.call(b,0))&&(e=Array.isArray(e)?e[0]:e,this.l&&(a.Style=e),(e=e.Ha())&&(a.name=e.Ha()));e=Vq[c[c.length-1].node.namespaceURI];a=$k(a,e);bl(d,Wq,Zk,a,c,e);a=c[0];(b=b.W())&&(b=un(b,!0,a));bl(d,Wq,Mq,[b],c)}function Xq(a,b,c){var d=b.la();a={node:a};a.layout=b.f;a.stride=b.va();bl(a,Yq,Zq,[d],c)}function $q(a,b,c){b=b.Vd();var d=b.shift();a={node:a};bl(a,ar,br,b,c);bl(a,ar,cr,[d],c)} +function dr(a,b){io(a,Math.round(b*b*1E6)/1E6)} +var er=M(Kp,["Document","Placemark"]),hr=M(Kp,{Document:L(function(a,b,c){bl({node:a},fr,gr,b,c,void 0,this)}),Placemark:L(Uq)}),fr=M(Kp,{Placemark:L(Uq)}),ir={Point:"Point",LineString:"LineString",LinearRing:"LinearRing",Polygon:"Polygon",MultiPoint:"MultiGeometry",MultiLineString:"MultiGeometry",MultiPolygon:"MultiGeometry",GeometryCollection:"MultiGeometry"},jr=M(Kp,["href"],M(Jp,["x","y","w","h"])),kr=M(Kp,{href:L(ho)},M(Jp,{x:L(io),y:L(io),w:L(io),h:L(io)})),lr=M(Kp,["scale","heading","Icon", +"hotSpot"]),nr=M(Kp,{Icon:L(function(a,b,c){a={node:a};var d=jr[c[c.length-1].node.namespaceURI],e=$k(b,d);bl(a,kr,Zk,e,c,d);d=jr[Jp[0]];e=$k(b,d);bl(a,kr,mr,e,c,d)}),heading:L(io),hotSpot:L(function(a,b){a.setAttribute("x",b.x);a.setAttribute("y",b.y);a.setAttribute("xunits",b.$f);a.setAttribute("yunits",b.ag)}),scale:L(dr)}),or=M(Kp,["color","scale"]),pr=M(Kp,{color:L(Kq),scale:L(dr)}),qr=M(Kp,["color","width"]),rr=M(Kp,{color:L(Kq),width:L(io)}),Sq=M(Kp,{LinearRing:L(Xq)}),Qq=M(Kp,{LineString:L(Xq), +Point:L(Xq),Polygon:L($q),GeometryCollection:L(Lq)}),Vq=M(Kp,"name open visibility address phoneNumber description styleUrl Style".split(" ")),Wq=M(Kp,{MultiGeometry:L(Lq),LineString:L(Xq),LinearRing:L(Xq),Point:L(Xq),Polygon:L($q),Style:L(function(a,b,c){a={node:a};var d={},e=b.c,f=b.f,g=b.a;b=b.Ha();g instanceof Dh&&(d.IconStyle=g);b&&(d.LabelStyle=b);f&&(d.LineStyle=f);e&&(d.PolyStyle=e);b=sr[c[c.length-1].node.namespaceURI];d=$k(d,b);bl(a,tr,Zk,d,c,b)}),address:L(ho),description:L(ho),name:L(ho), +open:L(go),phoneNumber:L(ho),styleUrl:L(ho),visibility:L(go)}),Yq=M(Kp,{coordinates:L(function(a,b,c){c=c[c.length-1];var d=c.layout;c=c.stride;var e;"XY"==d||"XYM"==d?e=2:("XYZ"==d||"XYZM"==d)&&(e=3);var f,g=b.length,h="";if(0f)if(g)if(56320> +f){d.push(239,191,189);g=f;continue}else f=g-55296<<10|f-56320|65536,g=null;else{56319f?d.push(f):2048>f?d.push(f>>6|192,f&63|128):65536>f?d.push(f>>12|224,f>>6&63|128,f&63|128):d.push(f>>18|240,f>>12&63|128,f>>6&63|128,f&63|128)}return d}b.ja=f;var h=a("ieee754"),l,m,n;l={$h:function(a){return(this[a]|this[a+1]<<8|this[a+2]<<16)+16777216*this[a+3]},Zf:function(a,b){this[b]=a;this[b+1]=a>>>8;this[b+2]=a>>>16;this[b+ +3]=a>>>24},Sh:function(a){return(this[a]|this[a+1]<<8|this[a+2]<<16)+(this[a+3]<<24)},Nf:function(a){return h.read(this,a,!0,23,4)},Hf:function(a){return h.read(this,a,!0,52,8)},Di:function(a,b){return h.write(this,a,b,!0,23,4)},Ai:function(a,b){return h.write(this,a,b,!0,52,8)},toString:function(a,b,d){var e=a="";d=Math.min(this.length,d||this.length);for(b=b||0;b=f?(a+=decodeURIComponent(e)+String.fromCharCode(f),e=""):e+="%"+f.toString(16)}return a+=decodeURIComponent(e)}, +write:function(a,b){for(var d=a===m?n:g(a),e=0;e +e)return a;e=d[b.da++];a+=34359738368*(e&127);if(128>e)return a;e=d[b.da++];a+=4398046511104*(e&127);if(128>e)return a;e=d[b.da++];a+=562949953421312*(e&127);if(128>e)return a;e=d[b.da++];a+=72057594037927936*(e&127);if(128>e)return a;e=d[b.da++];if(128>e)return a+0x7fffffffffffffff*(e&127);throw Error("Expected varint not more than 10 bytes");}b.ja=g;var l=f.Ap||a("./buffer");g.f=0;g.g=1;g.b=2;g.a=5;var m=Math.pow(2,63);g.prototype={Lf:function(a,b,d){for(d=d||this.length;this.da>3,b,this);this.da===f&&this.op(e)}return b},Bo:function(){var a=this.Cb.Nf(this.da);this.da+=4;return a},xo:function(){var a=this.Cb.Hf(this.da);this.da+=8;return a},Da:function(){var a=this.Cb,b,d;d=a[this.da++];b=d&127;if(128>d)return b;d=a[this.da++];b|=(d&127)<<7;if(128>d)return b;d=a[this.da++];b|=(d&127)<<14;if(128>d)return b;d=a[this.da++];b|=(d&127)<<21;return 128>d?b:h(b,this)},Mo:function(){var a=this.da,b=this.Da();if(be?f<<7*e:f*Math.pow(2,7*e));return-b-1},xd:function(){var a=this.Da();return 1===a%2?(a+1)/-2:a/2},vo:function(){return!!this.Da()},Qf:function(){var a=this.Da()+this.da,b=this.Cb.toString("utf8",this.da,a);this.da=a;return b},op:function(a){a&=7;if(a===g.f)for(;127>1,u=-7;f=d?f-1:0;var x=d?-1:1,v=a[b+f];f+=x;d=v&(1<<-u)-1;v>>=-u;for(u+=p;0>=-u;for(u+=e;0>1,v=23===f?Math.pow(2,-24)-Math.pow(2,-77):0;p=e?0:p-1;var D=e?1:-1,A=0>b||0===b&&0>1/b?1:0;b=Math.abs(b);isNaN(b)||Infinity===b?(b=isNaN(b)?1:0,e=u):(e=Math.floor(Math.log(b)/Math.LN2),1>b*(q=Math.pow(2,-e))&&(e--,q*=2),b=1<=e+x?b+v/q:b+v*Math.pow(2,1-x),2<=b*q&&(e++,q/=2),e+x>=u?(b=0,e=u):1<=e+x?(b=(b*q-1)*Math.pow(2,f),e+=x):(b=b*Math.pow(2,x-1)*Math.pow(2,f),e=0));for(;8<=f;a[d+p]=b&255,p+=D,b/=256,f-=8);e=e<>=3),e--,1===d||2===d)f+=a.xd(),g+=a.xd(),1===d&&(x&&u.push(x),x=[]),x.push(new h(f,g));else if(7===d)x&&x.push(x[0].clone());else throw Error("unknown command "+d);x&&u.push(x);return u};f.prototype.bbox=function(){var a=this.qc;a.da=this.Qe;for(var b=a.Da()+a.da,d=1,e=0,f=0,g=0,h=Infinity,x=-Infinity,v=Infinity,D=-Infinity;a.da>=3),e--,1===d||2===d)f+=a.xd(),g+=a.xd(),fx&&(x=f),gD&&(D= +g);else if(7!==d)throw Error("unknown command "+d);return[h,v,x,D]}},{"point-geometry":5}],4:[function(a,b){function f(a,b){this.version=1;this.name=null;this.extent=4096;this.length=0;this.qc=a;this.Id=[];this.Kd=[];this.Hd=[];a.Lf(g,this,b);this.length=this.Hd.length}function g(a,b,d){15===a?b.version=d.Da():1===a?b.name=d.Qf():5===a?b.extent=d.Da():2===a?b.Hd.push(d.da):3===a?b.Id.push(d.Qf()):4===a&&b.Kd.push(h(d))}function h(a){for(var b=null,d=a.Da()+a.da;a.da>3,b=1===b?a.Qf(): +2===b?a.Bo():3===b?a.xo():4===b?a.Mo():5===b?a.Da():6===b?a.xd():7===b?a.vo():null;return b}var l=a("./vectortilefeature.js");b.ja=f;f.prototype.feature=function(a){if(0>a||a>=this.Hd.length)throw Error("feature index out of bounds");this.qc.da=this.Hd[a];a=this.qc.Da()+this.qc.da;return new l(this.qc,a,this.extent,this.Id,this.Kd)}},{"./vectortilefeature.js":3}],5:[function(a,b){function f(a,b){this.x=a;this.y=b}b.ja=f;f.prototype={clone:function(){return new f(this.x,this.y)},add:function(a){return this.clone().fj(a)}, +rotate:function(a){return this.clone().qj(a)},round:function(){return this.clone().rj()},angle:function(){return Math.atan2(this.y,this.x)},fj:function(a){this.x+=a.x;this.y+=a.y;return this},qj:function(a){var b=Math.cos(a);a=Math.sin(a);var d=a*this.x+b*this.y;this.x=b*this.x-a*this.y;this.y=d;return this},rj:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this}};f.b=function(a){return a instanceof f?a:Array.isArray(a)?new f(a[0],a[1]):a}},{}]},{},[1])(1)});il=b.ja})();function wr(a){this.defaultDataProjection=null;a=a?a:{};this.defaultDataProjection=new vc({code:"",units:"tile-pixels"});this.b=a.featureClass?a.featureClass:hk;this.g=a.geometryName?a.geometryName:"geometry";this.a=a.layerName?a.layerName:"layer";this.f=a.layers?a.layers:null}y(wr,rn);wr.prototype.X=function(){return"arraybuffer"}; +wr.prototype.Fa=function(a,b){var c=this.f,d=new hl(a),d=new il.ej(d),e=[],f=this.b,g,h,l;for(l in d.layers)if(!c||-1!=c.indexOf(l)){g=d.layers[l];for(var m=0,n=g.length;me?~(e<<1):e<<1;c="";d=0;for(e=a.length;d>=5;h+=String.fromCharCode(f+63);c+=h}return c} +function us(a,b){var c=b?b:1E5,d=[],e=0,f=0,g,h;g=0;for(h=a.length;gl?(d.push(e),f=e=0):f+=5}e=0;for(f=d.length;e>1):g>>1;e=0;for(f=d.length;e=b||"."==b||"-"==b){c.type=4;var d,b=a.b,e=!1,f=!1;do{if("."==d)e=!0;else if("e"==d||"E"==d)f=!0;d=a.a.charAt(++a.b)}while("0"<=d&&"9">=d||"."==d&&(void 0===e||!e)||!f&&("e"==d||"E"==d)||f&&("-"==d||"+"==d));a=parseFloat(a.a.substring(b,a.b--));c.value=a}else if("a"<=b&&"z">=b||"A"<=b&&"Z">=b){c.type=1;b=a.b;do d=a.a.charAt(++a.b);while("a"<=d&&"z">= +d||"A"<=d&&"Z">=d);a=a.a.substring(b,a.b--).toUpperCase();c.value=a}else{if(" "==b||"\t"==b||"\r"==b||"\n"==b)return at(a);if(""===b)c.type=6;else throw Error("Unexpected character: "+b);}return c}function Zs(a){this.a=a}k=Zs.prototype;k.match=function(a){if(a=this.b.type==a)this.b=at(this.a);return a}; +function bt(a){var b=a.b;if(a.match(1)){var c=b.value;if("GEOMETRYCOLLECTION"==c){a:{if(a.match(2)){b=[];do b.push(bt(a));while(a.match(5));if(a.match(3)){a=b;break a}}else if(ct(a)){a=[];break a}throw Error(dt(a));}return new Ln(a)}var d=et[c],b=ft[c];if(!d||!b)throw Error("Invalid geometry type: "+c);a=d.call(a);return new b(a)}throw Error(dt(a));}k.Ef=function(){if(this.match(2)){var a=gt(this);if(this.match(3))return a}else if(ct(this))return null;throw Error(dt(this));}; +k.Df=function(){if(this.match(2)){var a=ht(this);if(this.match(3))return a}else if(ct(this))return[];throw Error(dt(this));};k.Ff=function(){if(this.match(2)){var a=it(this);if(this.match(3))return a}else if(ct(this))return[];throw Error(dt(this));};k.io=function(){if(this.match(2)){var a;if(2==this.b.type)for(a=[this.Ef()];this.match(5);)a.push(this.Ef());else a=ht(this);if(this.match(3))return a}else if(ct(this))return[];throw Error(dt(this));}; +k.ho=function(){if(this.match(2)){var a=it(this);if(this.match(3))return a}else if(ct(this))return[];throw Error(dt(this));};k.jo=function(){if(this.match(2)){for(var a=[this.Ff()];this.match(5);)a.push(this.Ff());if(this.match(3))return a}else if(ct(this))return[];throw Error(dt(this));};function gt(a){for(var b=[],c=0;2>c;++c){var d=a.b;if(a.match(4))b.push(d.value);else break}if(2==b.length)return b;throw Error(dt(a));}function ht(a){for(var b=[gt(a)];a.match(5);)b.push(gt(a));return b} +function it(a){for(var b=[a.Df()];a.match(5);)b.push(a.Df());return b}function ct(a){var b=1==a.b.type&&"EMPTY"==a.b.value;b&&(a.b=at(a.a));return b}function dt(a){return"Unexpected `"+a.b.value+"` at position "+a.b.position+" in `"+a.a.a+"`"}var ft={POINT:C,LINESTRING:R,POLYGON:E,MULTIPOINT:Bn,MULTILINESTRING:S,MULTIPOLYGON:T},et={POINT:Zs.prototype.Ef,LINESTRING:Zs.prototype.Df,POLYGON:Zs.prototype.Ff,MULTIPOINT:Zs.prototype.io,MULTILINESTRING:Zs.prototype.ho,MULTIPOLYGON:Zs.prototype.jo};function jt(){this.version=void 0}y(jt,Zr);jt.prototype.a=function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType==Node.ELEMENT_NODE)return this.b(a);return null};jt.prototype.b=function(a){this.version=a.getAttribute("version").trim();return(a=O({version:this.version},kt,a,[]))?a:null};function lt(a,b){return O({},mt,a,b)}function nt(a,b){return O({},ot,a,b)}function pt(a,b){var c=lt(a,b);if(c){var d=[fo(a.getAttribute("width")),fo(a.getAttribute("height"))];c.size=d;return c}} +function qt(a,b){return O([],rt,a,b)} +var st=[null,"http://www.opengis.net/wms"],kt=M(st,{Service:J(function(a,b){return O({},tt,a,b)}),Capability:J(function(a,b){return O({},ut,a,b)})}),ut=M(st,{Request:J(function(a,b){return O({},vt,a,b)}),Exception:J(function(a,b){return O([],wt,a,b)}),Layer:J(function(a,b){return O({},xt,a,b)})}),tt=M(st,{Name:J(U),Title:J(U),Abstract:J(U),KeywordList:J(qt),OnlineResource:J(Yr),ContactInformation:J(function(a,b){return O({},yt,a,b)}),Fees:J(U),AccessConstraints:J(U),LayerLimit:J(eo),MaxWidth:J(eo), +MaxHeight:J(eo)}),yt=M(st,{ContactPersonPrimary:J(function(a,b){return O({},zt,a,b)}),ContactPosition:J(U),ContactAddress:J(function(a,b){return O({},At,a,b)}),ContactVoiceTelephone:J(U),ContactFacsimileTelephone:J(U),ContactElectronicMailAddress:J(U)}),zt=M(st,{ContactPerson:J(U),ContactOrganization:J(U)}),At=M(st,{AddressType:J(U),Address:J(U),City:J(U),StateOrProvince:J(U),PostCode:J(U),Country:J(U)}),wt=M(st,{Format:Tk(U)}),xt=M(st,{Name:J(U),Title:J(U),Abstract:J(U),KeywordList:J(qt),CRS:Vk(U), +EX_GeographicBoundingBox:J(function(a,b){var c=O({},Bt,a,b);if(c){var d=c.westBoundLongitude,e=c.southBoundLatitude,f=c.eastBoundLongitude,c=c.northBoundLatitude;return void 0===d||void 0===e||void 0===f||void 0===c?void 0:[d,e,f,c]}}),BoundingBox:Vk(function(a){var b=[co(a.getAttribute("minx")),co(a.getAttribute("miny")),co(a.getAttribute("maxx")),co(a.getAttribute("maxy"))],c=[co(a.getAttribute("resx")),co(a.getAttribute("resy"))];return{crs:a.getAttribute("CRS"),extent:b,res:c}}),Dimension:Vk(function(a){return{name:a.getAttribute("name"), +units:a.getAttribute("units"),unitSymbol:a.getAttribute("unitSymbol"),"default":a.getAttribute("default"),multipleValues:$n(a.getAttribute("multipleValues")),nearestValue:$n(a.getAttribute("nearestValue")),current:$n(a.getAttribute("current")),values:U(a)}}),Attribution:J(function(a,b){return O({},Ct,a,b)}),AuthorityURL:Vk(function(a,b){var c=lt(a,b);if(c)return c.name=a.getAttribute("name"),c}),Identifier:Vk(U),MetadataURL:Vk(function(a,b){var c=lt(a,b);if(c)return c.type=a.getAttribute("type"), +c}),DataURL:Vk(lt),FeatureListURL:Vk(lt),Style:Vk(function(a,b){return O({},Dt,a,b)}),MinScaleDenominator:J(bo),MaxScaleDenominator:J(bo),Layer:Vk(function(a,b){var c=b[b.length-1],d=O({},xt,a,b);if(d){var e=$n(a.getAttribute("queryable"));void 0===e&&(e=c.queryable);d.queryable=void 0!==e?e:!1;e=fo(a.getAttribute("cascaded"));void 0===e&&(e=c.cascaded);d.cascaded=e;e=$n(a.getAttribute("opaque"));void 0===e&&(e=c.opaque);d.opaque=void 0!==e?e:!1;e=$n(a.getAttribute("noSubsets"));void 0===e&&(e=c.noSubsets); +d.noSubsets=void 0!==e?e:!1;(e=co(a.getAttribute("fixedWidth")))||(e=c.fixedWidth);d.fixedWidth=e;(e=co(a.getAttribute("fixedHeight")))||(e=c.fixedHeight);d.fixedHeight=e;["Style","CRS","AuthorityURL"].forEach(function(a){a in c&&(d[a]=(d[a]||[]).concat(c[a]))});"EX_GeographicBoundingBox BoundingBox Dimension Attribution MinScaleDenominator MaxScaleDenominator".split(" ").forEach(function(a){a in d||(d[a]=c[a])});return d}})}),Ct=M(st,{Title:J(U),OnlineResource:J(Yr),LogoURL:J(pt)}),Bt=M(st,{westBoundLongitude:J(bo), +eastBoundLongitude:J(bo),southBoundLatitude:J(bo),northBoundLatitude:J(bo)}),vt=M(st,{GetCapabilities:J(nt),GetMap:J(nt),GetFeatureInfo:J(nt)}),ot=M(st,{Format:Vk(U),DCPType:Vk(function(a,b){return O({},Et,a,b)})}),Et=M(st,{HTTP:J(function(a,b){return O({},Ft,a,b)})}),Ft=M(st,{Get:J(lt),Post:J(lt)}),Dt=M(st,{Name:J(U),Title:J(U),Abstract:J(U),LegendURL:Vk(pt),StyleSheetURL:J(lt),StyleURL:J(lt)}),mt=M(st,{Format:J(U),OnlineResource:J(Yr)}),rt=M(st,{Keyword:Tk(U)});function Gt(a){a=a?a:{};this.g="http://mapserver.gis.umn.edu/mapserver";this.b=new ko;this.c=a.layers?a.layers:null;Un.call(this)}y(Gt,Un); +Gt.prototype.lc=function(a,b){var c={};b&&Ea(c,sn(this,a,b));var d=[c];a.setAttribute("namespaceURI",this.g);var e=a.localName,c=[];if(0!==a.childNodes.length){if("msGMLOutput"==e)for(var f=0,g=a.childNodes.length;f=b[0]||a[1]<=b[1]&&a[3]>=b[1]?!0:bc(a,this.sg,this)):!1}; +k.jm=function(a){var b=this.a,c=this.B[b]-this.B[0],d=a.slice();d[b]=d[0]+c;for(c=1;cf[2])&&(c=h*Math.ceil((f[0]-c)/h),d=[d[0]+c, +d[1],d[2]+c,d[3]]);c=this.s[0];f=this.s[1];h=-1;m=Math.pow(this.Ba*g,2);p=[];q=[];g=0;for(l=bu.length;ga.Sa:a.c===wu&&(d=a.a[0].length>a.Sa,e=[a.a[0][0],a.a[0][a.a[0].length-2]]);if(d)for(var d=b.map,f=0,g=e.length;fa.Aa,a.D(f,d);else if(a.c===wu){f=a.a[0];f.push(c.slice());if(e=f.length>a.Aa)a.s=f[0];a.D(a.a,d)}Fu(a);e&&a.jd()}k.Qo=function(){var a=this.j.W(),b,c;this.c===yu?(b=this.a,b.splice(-2,1),this.D(b,a)):this.c===wu&&(b=this.a[0],b.splice(-2,1),c=this.A.W(),c.pa(b),this.D(this.a,a));0===b.length&&(this.s=null);Fu(this)}; +k.jd=function(){var a=Gu(this),b=this.a,c=a.W();this.c===yu?(b.pop(),this.D(b,c)):this.c===wu&&(b[0].pop(),b[0].push(b[0][0]),this.D(b,c));"MultiPoint"===this.Y?a.Ua(new Bn([b])):"MultiLineString"===this.Y?a.Ua(new S([b])):"MultiPolygon"===this.Y&&a.Ua(new T([b]));this.b(new qu("drawend",a));this.qb&&this.qb.push(a);this.Hc&&this.Hc.rb(a)};function Gu(a){a.s=null;var b=a.j;b&&(a.j=null,a.R=null,a.A=null,a.qa.ha().clear(!0));return b} +k.rm=function(a){var b=a.W();this.j=a;this.a=b.Z();a=this.a[this.a.length-1];this.s=a.slice();this.a.push(a.slice());Fu(this);this.b(new qu("drawstart",this.j))};k.Gc=rc;function Fu(a){var b=[];a.j&&b.push(a.j);a.A&&b.push(a.A);a.R&&b.push(a.R);a=a.qa.ha();a.clear(!0);a.Jc(b)}k.yi=function(){var a=this.v,b=this.f();a&&b||Gu(this);this.qa.setMap(b?a:null)}; +function vu(a){var b;"Point"===a||"MultiPoint"===a?b=xu:"LineString"===a||"MultiLineString"===a?b=yu:"Polygon"===a||"MultiPolygon"===a?b=wu:"Circle"===a&&(b=Du);return b}var xu="Point",yu="LineString",wu="Polygon",Du="Circle";function Hu(a,b,c){Wa.call(this,a);this.features=b;this.mapBrowserEvent=c}y(Hu,Wa); +function Iu(a){ji.call(this,{handleDownEvent:Ju,handleDragEvent:Ku,handleEvent:Lu,handleUpEvent:Mu});this.Hb=a.condition?a.condition:ii;this.Sa=function(a){return ei(a)&&di(a)};this.qb=a.deleteCondition?a.deleteCondition:this.Sa;this.Aa=this.c=null;this.qa=[0,0];this.D=this.T=!1;this.a=new kl;this.R=void 0!==a.pixelTolerance?a.pixelTolerance:10;this.s=this.ta=!1;this.j=[];this.S=new G({source:new P({useSpatialIndex:!1,wrapX:!!a.wrapX}),style:a.style?a.style:Nu(),updateWhileAnimating:!0,updateWhileInteracting:!0}); +this.za={Point:this.ym,LineString:this.kh,LinearRing:this.kh,Polygon:this.zm,MultiPoint:this.wm,MultiLineString:this.vm,MultiPolygon:this.xm,GeometryCollection:this.um};this.A=a.features;this.A.forEach(this.xf,this);B(this.A,"add",this.sm,this);B(this.A,"remove",this.tm,this);this.Y=null}y(Iu,ji);k=Iu.prototype;k.xf=function(a){var b=a.W();b.X()in this.za&&this.za[b.X()].call(this,a,b);(b=this.v)&&Ou(this,this.qa,b);B(a,"change",this.jh,this)}; +function Pu(a,b){a.D||(a.D=!0,a.b(new Hu("modifystart",a.A,b)))}function Qu(a,b){Ru(a,b);a.c&&0===a.A.dc()&&(a.S.ha().nb(a.c),a.c=null);Qa(b,"change",a.jh,a)}function Ru(a,b){var c=a.a,d=[];c.forEach(function(a){b===a.feature&&d.push(a)});for(var e=d.length-1;0<=e;--e)c.remove(d[e])}k.setMap=function(a){this.S.setMap(a);ji.prototype.setMap.call(this,a)};k.sm=function(a){this.xf(a.element)};k.jh=function(a){this.s||(a=a.target,Qu(this,a),this.xf(a))};k.tm=function(a){Qu(this,a.element)}; +k.ym=function(a,b){var c=b.Z(),c={feature:a,geometry:b,na:[c,c]};this.a.Ca(b.H(),c)};k.wm=function(a,b){var c=b.Z(),d,e,f;e=0;for(f=c.length;ec?g[1]:g[0]);Su(a,h);c={};c[w(g)]=!0;b=1;for(l=f.length;bh&&(h=0);c=m.geometry;d=e=c.Z();p=!1;switch(c.X()){case "MultiLineString":2c&&(a.index+=e)})}function Nu(){var a=wj();return function(){return a.Point}};function Vu(a,b,c,d){Wa.call(this,a);this.selected=b;this.deselected=c;this.mapBrowserEvent=d}y(Vu,Wa); +function Wu(a){Vh.call(this,{handleEvent:Xu});var b=a?a:{};this.C=b.condition?b.condition:di;this.A=b.addCondition?b.addCondition:rc;this.D=b.removeCondition?b.removeCondition:rc;this.R=b.toggleCondition?b.toggleCondition:fi;this.j=b.multi?b.multi:!1;this.o=b.filter?b.filter:qc;this.c=new G({source:new P({useSpatialIndex:!1,features:b.features,wrapX:b.wrapX}),style:b.style?b.style:Yu(),updateWhileAnimating:!0,updateWhileInteracting:!0});if(b.layers)if("function"===typeof b.layers)a=function(a){return b.layers(a)}; +else{var c=b.layers;a=function(a){return jb(c,a)}}else a=qc;this.s=a;this.a={};a=this.c.ha().c;B(a,"add",this.Am,this);B(a,"remove",this.Dm,this)}y(Wu,Vh);k=Wu.prototype;k.Bm=function(){return this.c.ha().c};k.Cm=function(a){a=w(a);return this.a[a]}; +function Xu(a){if(!this.C(a))return!0;var b=this.A(a),c=this.D(a),d=this.R(a),e=!b&&!c&&!d,f=a.map,g=this.c.ha().c,h=[],l=[];if(e)Fa(this.a),f.kd(a.pixel,function(a,b){if(this.o(a,b)){l.push(a);var c=w(a);this.a[c]=b;return!this.j}},this,this.s),0d?g[1]:g[0],c=b.Ga(l)}else this.T&&(l=Cb(e,g),c=b.Ga(l),Math.sqrt(Hb(d,c))<=this.c&&(f=!0,this.qa&&(e=b.Ga(g[0]),h=b.Ga(g[1]),e=Hb(c,e),d=Hb(c,h),h=Math.sqrt(Math.min(e, +d)),h=h<=this.c)))&&(l=e>d?g[1]:g[0],c=b.Ga(l));f&&(c=[Math.round(c[0]),Math.round(c[1])])}b=l;f&&(a.coordinate=b.slice(0,2),a.pixel=c);return ki.call(this,a)}function av(){var a=Ga(this.A);a.length&&(a.forEach(this.xi,this),this.A={});return!1}function bv(a,b){return Ib(this.S,a.na)-Ib(this.S,b.na)};function cv(a,b,c){Wa.call(this,a);this.features=b;this.coordinate=c}y(cv,Wa);function dv(a){ji.call(this,{handleDownEvent:ev,handleDragEvent:fv,handleMoveEvent:gv,handleUpEvent:hv});this.s=void 0;this.a=null;this.c=void 0!==a.features?a.features:null;var b;if(a.layers)if("function"===typeof a.layers)b=function(b){return a.layers(b)};else{var c=a.layers;b=function(a){return jb(c,a)}}else b=qc;this.A=b;this.j=null}y(dv,ji); +function ev(a){this.j=iv(this,a.pixel,a.map);return!this.a&&this.j?(this.a=a.coordinate,gv.call(this,a),this.b(new cv("translatestart",this.c,a.coordinate)),!0):!1}function hv(a){return this.a?(this.a=null,gv.call(this,a),this.b(new cv("translateend",this.c,a.coordinate)),!0):!1} +function fv(a){if(this.a){a=a.coordinate;var b=a[0]-this.a[0],c=a[1]-this.a[1];if(this.c)this.c.forEach(function(a){var d=a.W();d.Sc(b,c);a.Ua(d)});else if(this.j){var d=this.j.W();d.Sc(b,c);this.j.Ua(d)}this.a=a;this.b(new cv("translating",this.c,a))}} +function gv(a){var b=a.map.yc();if(a=a.map.kd(a.pixel,function(a){return a})){var c=!1;this.c&&jb(this.c.a,a)&&(c=!0);this.s=b.style.cursor;b.style.cursor=this.a?"-webkit-grabbing":c?"-webkit-grab":"pointer";b.style.cursor=this.a?c?"grab":"pointer":"grabbing"}else b.style.cursor=void 0!==this.s?this.s:"",this.s=void 0}function iv(a,b,c){var d=null;b=c.kd(b,function(a){return a},a,a.A);a.c&&jb(a.c.a,b)&&(d=b);return d};function V(a){a=a?a:{};var b=Ea({},a);delete b.gradient;delete b.radius;delete b.blur;delete b.shadow;delete b.weight;G.call(this,b);this.f=null;this.ia=void 0!==a.shadow?a.shadow:250;this.Y=void 0;this.c=null;B(this,gb("gradient"),this.Lk,this);this.ii(a.gradient?a.gradient:jv);this.di(void 0!==a.blur?a.blur:15);this.qh(void 0!==a.radius?a.radius:8);B(this,gb("blur"),this.lf,this);B(this,gb("radius"),this.lf,this);this.lf();var c=a.weight?a.weight:"weight",d;"string"===typeof c?d=function(a){return a.get(c)}: +d=c;this.l(function(a){a=d(a);a=void 0!==a?sa(a,0,1):1;var b=255*a|0,c=this.c[b];c||(c=[new rj({image:new Dh({opacity:a,src:this.Y})})],this.c[b]=c);return c}.bind(this));this.set("renderOrder",null);B(this,"render",this.dl,this)}y(V,G);var jv=["#00f","#0ff","#0f0","#ff0","#f00"];k=V.prototype;k.zg=function(){return this.get("blur")};k.Gg=function(){return this.get("gradient")};k.ph=function(){return this.get("radius")}; +k.Lk=function(){for(var a=this.Gg(),b=Oe(1,256),c=b.createLinearGradient(0,0,1,256),d=1/(a.length-1),e=0,f=a.length;e=d)this.state=4;else if(this.A=new wk(a,c,f,e,d*(void 0!==m?m:.5)),0===this.A.f.length)this.state=4;else if(this.s=b.Lb(d),c=yk(this.A),e&&(a.a?(c[1]=sa(c[1], +e[1],e[3]),c[3]=sa(c[3],e[1],e[3])):c=mc(c,e)),gc(c))if(a=pf(b,c,this.s),100>(a.ea-a.ca+1)*(a.ga-a.fa+1)){for(b=a.ca;b<=a.ea;b++)for(c=a.fa;c<=a.ga;c++)(m=l(this.s,b,c,g))&&this.g.push(m);0===this.g.length&&(this.state=4)}else this.state=3;else this.state=4}y(lv,df);lv.prototype.ka=function(){1==this.state&&(this.Wc.forEach(Ka),this.Wc=null);df.prototype.ka.call(this)}; +lv.prototype.$a=function(a){if(void 0!==a){var b=w(a);if(b in this.c)return this.c[b];a=Ha(this.c)?this.l:this.l.cloneNode(!1);return this.c[b]=a}return this.l}; +lv.prototype.zd=function(){var a=[];this.g.forEach(function(b){b&&2==b.V()&&a.push({extent:this.j.Ea(b.ma),image:b.$a()})},this);this.g.length=0;if(0===a.length)this.state=3;else{var b=this.U[0],c=this.v.Ja(b),d=ea(c)?c:c[0],c=ea(c)?c:c[1],b=this.v.$(b),e=this.j.$(this.s),f=this.v.Ea(this.U);this.l=vk(d,c,this.D,e,this.j.H(),b,f,this.A,a,this.C,this.R);this.state=2}ef(this)}; +lv.prototype.load=function(){if(0==this.state){this.state=1;ef(this);var a=0;this.Wc=[];this.g.forEach(function(b){var c=b.V();if(0==c||1==c){a++;var d;d=B(b,"change",function(){var c=b.V();if(2==c||3==c||4==c)Ka(d),a--,0===a&&(this.Wc.forEach(Ka),this.Wc=null,this.zd())},this);this.Wc.push(d)}},this);this.g.forEach(function(a){0==a.V()&&a.load()});0===a&&pa.setTimeout(this.zd.bind(this),0)}};function W(a){Jl.call(this,{attributions:a.attributions,cacheSize:a.cacheSize,extent:a.extent,logo:a.logo,opaque:a.opaque,projection:a.projection,state:a.state,tileGrid:a.tileGrid,tileLoadFunction:a.tileLoadFunction?a.tileLoadFunction:mv,tilePixelRatio:a.tilePixelRatio,tileUrlFunction:a.tileUrlFunction,url:a.url,urls:a.urls,wrapX:a.wrapX});this.crossOrigin=void 0!==a.crossOrigin?a.crossOrigin:null;this.tileClass=void 0!==a.tileClass?a.tileClass:fu;this.i={};this.s={};this.qa=a.reprojectionErrorThreshold; +this.C=!1}y(W,Jl);k=W.prototype;k.Ah=function(){if(cf(this.a))return!0;for(var a in this.i)if(cf(this.i[a]))return!0;return!1};k.Lc=function(a,b){var c=this.pd(a);this.a.Lc(this.a==c?b:{});for(var d in this.i){var e=this.i[d];e.Lc(e==c?b:{})}};k.Ud=function(a){return this.f&&a&&!Oc(this.f,a)?0:this.gf()};k.gf=function(){return 0};k.jf=function(a){return this.f&&a&&!Oc(this.f,a)?!1:Jl.prototype.jf.call(this,a)}; +k.eb=function(a){var b=this.f;return!this.tileGrid||b&&!Oc(b,a)?(b=w(a).toString(),b in this.s||(this.s[b]=vf(a)),this.s[b]):this.tileGrid};k.pd=function(a){var b=this.f;if(!b||Oc(b,a))return this.a;a=w(a).toString();a in this.i||(this.i[a]=new bf);return this.i[a]};function nv(a,b,c,d,e,f,g){b=[b,c,d];e=(c=Cf(a,b,f))?a.tileUrlFunction(c,e,f):void 0;e=new a.tileClass(b,void 0!==e?0:4,void 0!==e?e:"",a.crossOrigin,a.tileLoadFunction);e.key=g;B(e,"change",a.Bh,a);return e} +k.ac=function(a,b,c,d,e){if(this.f&&e&&!Oc(this.f,e)){var f=this.pd(e);b=[a,b,c];a=this.Eb.apply(this,b);if(Ze(f,a))return f.get(a);var g=this.f;c=this.eb(g);var h=this.eb(e),l=Cf(this,b,e);d=new lv(g,c,e,h,b,l,this.bc(d),this.gf(),function(a,b,c,d){return ov(this,a,b,c,d,g)}.bind(this),this.qa,this.C);f.set(a,d);return d}return ov(this,a,b,c,d,e)}; +function ov(a,b,c,d,e,f){var g,h=a.Eb(b,c,d),l=a.cc;if(Ze(a.a,h)){if(g=a.a.get(h),g.key!=l){var m=g;g.a&&g.a.key==l?(g=g.a,2==m.V()&&(g.a=m)):(g=nv(a,b,c,d,e,f,l),2==m.V()?g.a=m:m.a&&2==m.a.V()&&(g.a=m.a,m.a=null));g.a&&(g.a.a=null);a.a.replace(h,g)}}else g=nv(a,b,c,d,e,f,l),a.a.set(h,g);return g}k.zb=function(a){if(this.C!=a){this.C=a;for(var b in this.i)this.i[b].clear();this.u()}};k.Ab=function(a,b){var c=yc(a);c&&(c=w(c).toString(),c in this.s||(this.s[c]=b))};function mv(a,b){a.$a().src=b};function pv(a){W.call(this,{cacheSize:a.cacheSize,crossOrigin:"anonymous",opaque:!0,projection:yc("EPSG:3857"),reprojectionErrorThreshold:a.reprojectionErrorThreshold,state:"loading",tileLoadFunction:a.tileLoadFunction,wrapX:void 0!==a.wrapX?a.wrapX:!0});this.j=void 0!==a.culture?a.culture:"en-us";this.c=void 0!==a.maxZoom?a.maxZoom:-1;kv("https://dev.virtualearth.net/REST/v1/Imagery/Metadata/"+a.imagerySet+"?uriScheme=https&include=ImageryProviders&key="+a.key,this.v.bind(this),void 0,"jsonp")} +y(pv,W);var qv=new je({html:'Terms of Use'}); +pv.prototype.v=function(a){if(200!=a.statusCode||"OK"!=a.statusDescription||"ValidCredentials"!=a.authenticationResultCode||1!=a.resourceSets.length||1!=a.resourceSets[0].resources.length)lf(this,"error");else{var b=a.brandLogoUri;-1==b.indexOf("https")&&(b=b.replace("http","https"));var c=a.resourceSets[0].resources[0],d=-1==this.c?c.zoomMax:this.c;a=wf(this.f);var e=yf({extent:a,minZoom:c.zoomMin,maxZoom:d,tileSize:c.imageWidth==c.imageHeight?c.imageWidth:[c.imageWidth,c.imageHeight]});this.tileGrid= +e;var f=this.j;this.tileUrlFunction=Gl(c.imageUrlSubdomains.map(function(a){var b=[0,0,0],d=c.imageUrl.replace("{subdomain}",a).replace("{culture}",f);return function(a){if(a)return $e(a[0],a[1],-a[2]-1,b),d.replace("{quadkey}",af(b))}}));if(c.imageryProviders){var g=Bc(yc("EPSG:4326"),this.f);a=c.imageryProviders.map(function(a){var b=a.attribution,c={};a.coverageAreas.forEach(function(a){var b=a.zoomMin,f=Math.min(a.zoomMax,d);a=a.bbox;a=pc([a[1],a[0],a[3],a[2]],g);var h,l;for(h=b;h<=f;++h)l=h.toString(), +b=pf(e,a,h),l in c?c[l].push(b):c[l]=[b]});return new je({html:b,tileRanges:c})});a.push(qv);this.oa(a)}this.R=b;lf(this,"ready")}};function rv(a){a=a||{};var b=void 0!==a.projection?a.projection:"EPSG:3857",c=void 0!==a.tileGrid?a.tileGrid:yf({extent:wf(b),maxZoom:a.maxZoom,minZoom:a.minZoom,tileSize:a.tileSize});W.call(this,{attributions:a.attributions,cacheSize:a.cacheSize,crossOrigin:a.crossOrigin,logo:a.logo,opaque:a.opaque,projection:b,reprojectionErrorThreshold:a.reprojectionErrorThreshold,tileGrid:c,tileLoadFunction:a.tileLoadFunction,tilePixelRatio:a.tilePixelRatio,tileUrlFunction:a.tileUrlFunction,url:a.url,urls:a.urls, +wrapX:void 0!==a.wrapX?a.wrapX:!0})}y(rv,W);function sv(a){this.v=a.account;this.A=a.map||"";this.c=a.config||{};this.j={};rv.call(this,{attributions:a.attributions,cacheSize:a.cacheSize,crossOrigin:a.crossOrigin,logo:a.logo,maxZoom:void 0!==a.maxZoom?a.maxZoom:18,minZoom:a.minZoom,projection:a.projection,state:"loading",wrapX:a.wrapX});tv(this)}y(sv,rv);k=sv.prototype;k.Tj=function(){return this.c};k.up=function(a){Ea(this.c,a);tv(this)};k.$o=function(a){this.c=a||{};tv(this)}; +function tv(a){var b=JSON.stringify(a.c);if(a.j[b])uv(a,a.j[b]);else{var c="https://"+a.v+".cartodb.com/api/v1/map";a.A&&(c+="/named/"+a.A);var d=new XMLHttpRequest;d.addEventListener("load",a.Nk.bind(a,b));d.addEventListener("error",a.Mk.bind(a));d.open("POST",c);d.setRequestHeader("Content-type","application/json");d.send(JSON.stringify(a.c))}} +k.Nk=function(a,b){var c=b.target;if(200<=c.status&&300>c.status){var d;try{d=JSON.parse(c.responseText)}catch(e){lf(this,"error");return}uv(this,d);this.j[a]=d;lf(this,"ready")}else lf(this,"error")};k.Mk=function(){lf(this,"error")};function uv(a,b){a.Va("https://"+b.cdn_url.https+"/"+a.v+"/api/v1/map/"+b.layergroupid+"/{z}/{x}/{y}.png")};function Y(a){P.call(this,{attributions:a.attributions,extent:a.extent,logo:a.logo,projection:a.projection,wrapX:a.wrapX});this.C=void 0;this.ta=void 0!==a.distance?a.distance:20;this.A=[];this.ia=a.geometryFunction||function(a){return a.W()};this.v=a.source;this.v.I("change",Y.prototype.Sa,this)}y(Y,P);Y.prototype.Aa=function(){return this.v};Y.prototype.Pc=function(a,b,c){this.v.Pc(a,b,c);b!==this.C&&(this.clear(),this.C=b,vv(this),this.Jc(this.A))}; +Y.prototype.Sa=function(){this.clear();vv(this);this.Jc(this.A);this.u()};function vv(a){if(void 0!==a.C){a.A.length=0;for(var b=Lb(),c=a.ta*a.C,d=a.v.oe(),e={},f=0,g=d.length;fm*l?h*g/(m*p):l*g/(n*p),SETVIEWCENTERX:f[0],SETVIEWCENTERY:f[1]};Ea(e,this.j);d=xv(d,e);d=new eu(a,b,c,this.l,d,this.Y,this.c);B(d,"change",this.o,this)}else d=null;this.i=d;this.S=this.g;return d};k.Xm=function(){return this.c};k.$m=function(a){Ea(this.j,a);this.u()};k.Zm=function(a){this.i=null;this.c=a;this.u()};function Av(a){var b=a.imageExtent,c=void 0!==a.crossOrigin?a.crossOrigin:null,d=void 0!==a.imageLoadFunction?a.imageLoadFunction:Gk;Ak.call(this,{attributions:a.attributions,logo:a.logo,projection:yc(a.projection)});this.c=new eu(b,void 0,1,this.l,a.url,c,d);this.i=a.imageSize?a.imageSize:null;B(this.c,"change",this.o,this)}y(Av,Ak);Av.prototype.Mc=function(a){return nc(a,this.c.H())?this.c:null}; +Av.prototype.o=function(a){if(2==this.c.V()){var b=this.c.H(),c=this.c.a(),d,e;this.i?(d=this.i[0],e=this.i[1]):(d=c.width,e=c.height);b=Math.ceil(ic(b)/(jc(b)/e));if(b!=d){var b=Oe(b,e),f=b.canvas;b.drawImage(c,0,0,d,e,0,0,f.width,f.height);this.c.g=f}}Ak.prototype.o.call(this,a)};function Bv(a){a=a||{};Ak.call(this,{attributions:a.attributions,logo:a.logo,projection:a.projection,resolutions:a.resolutions});this.ta=void 0!==a.crossOrigin?a.crossOrigin:null;this.j=a.url;this.S=void 0!==a.imageLoadFunction?a.imageLoadFunction:Gk;this.i=a.params||{};this.v=!0;Cv(this);this.ia=a.serverType;this.Aa=void 0!==a.hidpi?a.hidpi:!0;this.c=null;this.T=[0,0];this.Y=0;this.s=void 0!==a.ratio?a.ratio:1.5}y(Bv,Ak);var Dv=[101,101];k=Bv.prototype; +k.fn=function(a,b,c,d){if(void 0!==this.j){var e=lc(a,b,0,Dv),f={SERVICE:"WMS",VERSION:"1.3.0",REQUEST:"GetFeatureInfo",FORMAT:"image/png",TRANSPARENT:!0,QUERY_LAYERS:this.i.LAYERS};Ea(f,this.i,d);d=Math.floor((e[3]-a[1])/b);f[this.v?"I":"X"]=Math.floor((a[0]-e[0])/b);f[this.v?"J":"Y"]=d;return Ev(this,e,Dv,1,yc(c),f)}};k.hn=function(){return this.i}; +k.Mc=function(a,b,c,d){if(void 0===this.j)return null;b=Bk(this,b);1==c||this.Aa&&void 0!==this.ia||(c=1);a=a.slice();var e=(a[0]+a[2])/2,f=(a[1]+a[3])/2,g=b/c,h=ic(a)/g,g=jc(a)/g,l=this.c;if(l&&this.Y==this.g&&l.$()==b&&l.f==c&&Ub(l.H(),a))return l;if(1!=this.s){var l=this.s*ic(a)/2,m=this.s*jc(a)/2;a[0]=e-l;a[1]=f-m;a[2]=e+l;a[3]=f+m}e={SERVICE:"WMS",VERSION:"1.3.0",REQUEST:"GetMap",FORMAT:"image/png",TRANSPARENT:!0};Ea(e,this.i);this.T[0]=Math.ceil(h*this.s);this.T[1]=Math.ceil(g*this.s);d=Ev(this, +a,this.T,c,d,e);this.c=new eu(a,b,c,this.l,d,this.ta,this.S);this.Y=this.g;B(this.c,"change",this.o,this);return this.c};k.gn=function(){return this.S}; +function Ev(a,b,c,d,e,f){f[a.v?"CRS":"SRS"]=e.cb;"STYLES"in a.i||(f.STYLES="");if(1!=d)switch(a.ia){case "geoserver":d=90*d+.5|0;f.FORMAT_OPTIONS="FORMAT_OPTIONS"in f?f.FORMAT_OPTIONS+(";dpi:"+d):"dpi:"+d;break;case "mapserver":f.MAP_RESOLUTION=90*d;break;case "carmentaserver":case "qgis":f.DPI=90*d}f.WIDTH=c[0];f.HEIGHT=c[1];c=e.b;var g;a.v&&"ne"==c.substr(0,2)?g=[b[1],b[0],b[3],b[2]]:g=b;f.BBOX=g.join(",");return xv(a.j,f)}k.jn=function(){return this.j};k.kn=function(a){this.c=null;this.S=a;this.u()}; +k.ln=function(a){a!=this.j&&(this.j=a,this.c=null,this.u())};k.mn=function(a){Ea(this.i,a);Cv(this);this.c=null;this.u()};function Cv(a){a.v=0<=Ab(a.i.VERSION||"1.3.0")};function Fv(a){a=a||{};var b;void 0!==a.attributions?b=a.attributions:b=[Gv];rv.call(this,{attributions:b,cacheSize:a.cacheSize,crossOrigin:void 0!==a.crossOrigin?a.crossOrigin:"anonymous",opaque:void 0!==a.opaque?a.opaque:!0,maxZoom:void 0!==a.maxZoom?a.maxZoom:19,reprojectionErrorThreshold:a.reprojectionErrorThreshold,tileLoadFunction:a.tileLoadFunction,url:void 0!==a.url?a.url:"https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png",wrapX:a.wrapX})}y(Fv,rv);var Gv=new je({html:'© OpenStreetMap contributors.'});(function(){var a={},b={ja:a};(function(c){if("object"===typeof a&&"undefined"!==typeof b)b.ja=c();else{var d;"undefined"!==typeof window?d=window:"undefined"!==typeof global?d=global:"undefined"!==typeof self?d=self:d=this;d.Sp=c()}})(function(){return function d(a,b,g){function h(m,p){if(!b[m]){if(!a[m]){var q="function"==typeof require&&require;if(!p&&q)return q(m,!0);if(l)return l(m,!0);q=Error("Cannot find module '"+m+"'");throw q.code="MODULE_NOT_FOUND",q;}q=b[m]={ja:{}};a[m][0].call(q.ja,function(b){var d= +a[m][1][b];return h(d?d:b)},q,q.ja,d,a,b,g)}return b[m].ja}for(var l="function"==typeof require&&require,m=0;mthis.oj;)this.$c.shift().qg(null,null)};l.prototype.fg=function(){if(0===this.Jd&&0Stamen Design, under CC BY 3.0.'}),Gv];function Tv(a){a=a||{};W.call(this,{attributions:a.attributions,cacheSize:a.cacheSize,crossOrigin:a.crossOrigin,logo:a.logo,projection:a.projection,reprojectionErrorThreshold:a.reprojectionErrorThreshold,tileGrid:a.tileGrid,tileLoadFunction:a.tileLoadFunction,url:a.url,urls:a.urls,wrapX:void 0!==a.wrapX?a.wrapX:!0});this.c=a.params||{};this.j=Lb()}y(Tv,W);Tv.prototype.v=function(){return this.c};Tv.prototype.bc=function(a){return a}; +Tv.prototype.vc=function(a,b,c){var d=this.tileGrid;d||(d=this.eb(c));if(!(d.b.length<=a[0])){var e=d.Ea(a,this.j),f=hf(d.Ja(a[0]),this.o);1!=b&&(f=gf(f,b,this.o));d={F:"image",FORMAT:"PNG32",TRANSPARENT:!0};Ea(d,this.c);var g=this.urls;g?(c=c.cb.split(":").pop(),d.SIZE=f[0]+","+f[1],d.BBOX=e.join(","),d.BBOXSR=c,d.IMAGESR=c,d.DPI=Math.round(d.DPI?d.DPI*b:90*b),a=(1==g.length?g[0]:g[xa((a[1]<a.status){var b;try{b=JSON.parse(a.responseText)}catch(c){this.me();return}this.yh(b)}else this.me()};k.nn=function(){this.me()};k.Ak=function(){return this.c}; +k.yh=function(a){var b=yc("EPSG:4326"),c=this.f,d;void 0!==a.bounds&&(d=pc(a.bounds,Bc(b,c)));var e=a.minzoom||0,f=a.maxzoom||22;this.tileGrid=c=yf({extent:wf(c),maxZoom:f,minZoom:e});this.tileUrlFunction=Fl(a.tiles,c);if(void 0!==a.attribution&&!this.l){b=void 0!==d?d:b.H();d={};for(var g;e<=f;++e)g=e.toString(),d[g]=[pf(c,b,e)];this.oa([new je({html:a.attribution,tileRanges:d})])}this.c=a;lf(this,"ready")};k.me=function(){lf(this,"error")};function Xv(a){zf.call(this,{projection:yc("EPSG:3857"),state:"loading"});this.s=void 0!==a.preemptive?a.preemptive:!0;this.j=Hl;this.i=void 0;this.c=a.jsonp||!1;if(a.url)if(this.c)kv(a.url,this.Bf.bind(this),this.ne.bind(this));else{var b=new XMLHttpRequest;b.addEventListener("load",this.tn.bind(this));b.addEventListener("error",this.sn.bind(this));b.open("GET",a.url);b.send()}else a.tileJSON&&this.Bf(a.tileJSON)}y(Xv,zf);k=Xv.prototype; +k.tn=function(a){a=a.target;if(200<=a.status&&300>a.status){var b;try{b=JSON.parse(a.responseText)}catch(c){this.ne();return}this.Bf(b)}else this.ne()};k.sn=function(){this.ne()};k.xk=function(){return this.i};k.Ij=function(a,b,c,d,e){this.tileGrid?(b=this.tileGrid.Zd(a,b),Yv(this.ac(b[0],b[1],b[2],1,this.f),a,c,d,e)):!0===e?Tf(function(){c.call(d,null)}):c.call(d,null)};k.ne=function(){lf(this,"error")}; +k.Bf=function(a){var b=yc("EPSG:4326"),c=this.f,d;void 0!==a.bounds&&(d=pc(a.bounds,Bc(b,c)));var e=a.minzoom||0,f=a.maxzoom||22;this.tileGrid=c=yf({extent:wf(c),maxZoom:f,minZoom:e});this.i=a.template;var g=a.grids;if(g){this.j=Fl(g,c);if(void 0!==a.attribution){b=void 0!==d?d:b.H();for(d={};e<=f;++e)g=e.toString(),d[g]=[pf(c,b,e)];this.oa([new je({html:a.attribution,tileRanges:d})])}lf(this,"ready")}else lf(this,"error")}; +k.ac=function(a,b,c,d,e){var f=this.Eb(a,b,c);if(Ze(this.a,f))return this.a.get(f);a=[a,b,c];b=Cf(this,a,e);d=this.j(b,d,e);d=new Zv(a,void 0!==d?0:4,void 0!==d?d:"",this.tileGrid.Ea(a),this.s,this.c);this.a.set(f,d);return d};k.Yf=function(a,b,c){a=this.Eb(a,b,c);Ze(this.a,a)&&this.a.get(a)};function Zv(a,b,c,d,e,f){df.call(this,a,b);this.s=c;this.g=d;this.U=e;this.c=this.j=this.l=null;this.v=f}y(Zv,df);k=Zv.prototype;k.$a=function(){return null}; +k.getData=function(a){if(!this.l||!this.j)return null;var b=this.l[Math.floor((1-(a[1]-this.g[1])/(this.g[3]-this.g[1]))*this.l.length)];if("string"!==typeof b)return null;b=b.charCodeAt(Math.floor((a[0]-this.g[0])/(this.g[2]-this.g[0])*b.length));93<=b&&b--;35<=b&&b--;b-=32;a=null;b in this.j&&(b=this.j[b],this.c&&b in this.c?a=this.c[b]:a=b);return a}; +function Yv(a,b,c,d,e){0==a.state&&!0===e?(Pa(a,"change",function(){c.call(d,this.getData(b))},a),$v(a)):!0===e?Tf(function(){c.call(d,this.getData(b))},a):c.call(d,a.getData(b))}k.ib=function(){return this.s};k.ae=function(){this.state=3;ef(this)};k.zh=function(a){this.l=a.grid;this.j=a.keys;this.c=a.data;this.state=4;ef(this)}; +function $v(a){if(0==a.state)if(a.state=1,a.v)kv(a.s,a.zh.bind(a),a.ae.bind(a));else{var b=new XMLHttpRequest;b.addEventListener("load",a.rn.bind(a));b.addEventListener("error",a.qn.bind(a));b.open("GET",a.s);b.send()}}k.rn=function(a){a=a.target;if(200<=a.status&&300>a.status){var b;try{b=JSON.parse(a.responseText)}catch(c){this.ae();return}this.zh(b)}else this.ae()};k.qn=function(){this.ae()};k.load=function(){this.U&&$v(this)};function aw(a){a=a||{};var b=a.params||{};W.call(this,{attributions:a.attributions,cacheSize:a.cacheSize,crossOrigin:a.crossOrigin,logo:a.logo,opaque:!("TRANSPARENT"in b?b.TRANSPARENT:1),projection:a.projection,reprojectionErrorThreshold:a.reprojectionErrorThreshold,tileGrid:a.tileGrid,tileLoadFunction:a.tileLoadFunction,url:a.url,urls:a.urls,wrapX:void 0!==a.wrapX?a.wrapX:!0});this.v=void 0!==a.gutter?a.gutter:0;this.c=b;this.j=!0;this.A=a.serverType;this.T=void 0!==a.hidpi?a.hidpi:!0;this.S=""; +bw(this);this.Y=Lb();cw(this);Bf(this,dw(this))}y(aw,W);k=aw.prototype; +k.vn=function(a,b,c,d){c=yc(c);var e=this.tileGrid;e||(e=this.eb(c));b=e.Zd(a,b);if(!(e.b.length<=b[0])){var f=e.$(b[0]),g=e.Ea(b,this.Y),e=hf(e.Ja(b[0]),this.o),h=this.v;0!==h&&(e=ff(e,h,this.o),g=Ob(g,f*h,g));h={SERVICE:"WMS",VERSION:"1.3.0",REQUEST:"GetFeatureInfo",FORMAT:"image/png",TRANSPARENT:!0,QUERY_LAYERS:this.c.LAYERS};Ea(h,this.c,d);d=Math.floor((g[3]-a[1])/f);h[this.j?"I":"X"]=Math.floor((a[0]-g[0])/f);h[this.j?"J":"Y"]=d;return ew(this,b,e,g,1,c,h)}};k.gf=function(){return this.v}; +k.Eb=function(a,b,c){return this.S+W.prototype.Eb.call(this,a,b,c)};k.wn=function(){return this.c}; +function ew(a,b,c,d,e,f,g){var h=a.urls;if(h){g.WIDTH=c[0];g.HEIGHT=c[1];g[a.j?"CRS":"SRS"]=f.cb;"STYLES"in a.c||(g.STYLES="");if(1!=e)switch(a.A){case "geoserver":c=90*e+.5|0;g.FORMAT_OPTIONS="FORMAT_OPTIONS"in g?g.FORMAT_OPTIONS+(";dpi:"+c):"dpi:"+c;break;case "mapserver":g.MAP_RESOLUTION=90*e;break;case "carmentaserver":case "qgis":g.DPI=90*e}f=f.b;a.j&&"ne"==f.substr(0,2)&&(a=d[0],d[0]=d[1],d[1]=a,a=d[2],d[2]=d[3],d[3]=a);g.BBOX=d.join(",");return xv(1==h.length?h[0]:h[xa((b[1]<f||d>f;)e.push([Math.ceil(c/f),Math.ceil(d/f)]),f+=f;break;case "truncated":for(;c>f||d>f;)e.push([Math.ceil(c/f),Math.ceil(d/f)]),c>>=1,d>>=1}e.push([1,1]);e.reverse();for(var f=[1],g=[0],d=1,c=e.length;dthis.g||c+this.b>this.g)return null;d=mw(this,!1,a,b,c,d,f);if(!d)return null;a=mw(this,!0,a,b,c,void 0!==e?e:na,f);return{offsetX:d.offsetX,offsetY:d.offsetY,image:d.image,Sg:a.image}}; +function mw(a,b,c,d,e,f,g){var h=b?a.i:a.c,l,m,n;m=0;for(n=h.length;m=b+this.b&&f.height>=c+this.b)return h={offsetX:f.x+this.b,offsetY:f.y+this.b,image:this.c},this.f[a]=h,d.call(e,this.g,f.x+this.b,f.y+this.b),a=g,b+=this.b,d=c+this.b,f.width-b>f.height-d?(c={x:f.x+b,y:f.y,width:f.width-b,height:f.height},b={x:f.x,y:f.y+d,width:b,height:f.height-d},nw(this,a,c,b)):(c={x:f.x+b,y:f.y,width:f.width-b,height:d},b={x:f.x,y:f.y+d,width:f.width,height:f.height-d},nw(this, +a,c,b)),h;return null};function nw(a,b,c,d){b=[b,1];0e&&(e=0);f=c.TileMatrixSetLink[e].TileMatrixSet; +var g=c.Format[0];"format"in b&&(g=b.format);e=sb(c.Style,function(a){return"style"in b?a.Title==b.style:a.isDefault});0>e&&(e=0);e=c.Style[e].Identifier;var h={};"Dimension"in c&&c.Dimension.forEach(function(a){var b=a.Identifier,c=a.Default;void 0===c&&(c=a.Value[0]);h[b]=c});var l=ob(a.Contents.TileMatrixSet,function(a){return a.Identifier==f}),m;m="projection"in b?yc(b.projection):yc(l.SupportedCRS.replace(/urn:ogc:def:crs:(\w+):(.*:)?(\w+)$/,"$1:$3"));var n=c.WGS84BoundingBox,p,q;void 0!==n&& +(q=yc("EPSG:4326").H(),q=n[0]==q[0]&&n[2]==q[2],p=Sc(n,"EPSG:4326",m),(n=m.H())&&(Ub(n,p)||(p=void 0)));var l=gw(l,p),r=[];p=b.requestEncoding;p=void 0!==p?p:"";if("OperationsMetadata"in a&&"GetTile"in a.OperationsMetadata)for(var n=a.OperationsMetadata.GetTile.DCP.HTTP.Get,u=0,x=n.length;u Date: Tue, 5 Jul 2016 22:25:31 +0100 Subject: [PATCH 32/32] Add a note about the map API change. --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index 91bdffc..84a6e47 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,20 @@ See the file COPYING for details. * tries to do things "the debian way" when it comes to config, package structure, etc * probably a bunch of other things I've forgotten.. +# A note on maps + +Previously, the dump1090 webmap used Google's map API. As of July 2016, Google's policy on keyless use of their +API has changed and it's no longer practical to use that API. To avoid having a completely nonfunctional +map on new installs that have not been grandfathered, dump1090 now uses the OpenLayers map API. + +This means: + +* The default view now uses OpenStreetMap tiles; +* Google's maps are not available even with an API key (Google does not allow use of their imagery via + third-party APIs such as OpenLayers); +* There are a couple of new layers - Bing and Mapzen - that can be enabled by providing an API key + in config.js. See the comments in config.js for details. + # Simple install via apt-get There is a repository that contains the current releases. To set up the repository: