From 78a1ad842bdce8a53dca0a68fa545171755bbeb2 Mon Sep 17 00:00:00 2001 From: boombuler Date: Fri, 22 Feb 2013 20:22:11 +0100 Subject: [PATCH 01/74] new plugin to calculate how to set links for max field count --- plugins/README.md | 1 + plugins/max-links.user.js | 252 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 253 insertions(+) create mode 100644 plugins/max-links.user.js diff --git a/plugins/README.md b/plugins/README.md index 35eb5d86..95a611b7 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -14,6 +14,7 @@ Available Plugins - [**Highlight Weakened Portals**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-portal-weakness.user.js) fill portals with red to indicate portal's state of disrepair. The brighter the color the more attention needed (recharge, shields, resonators). A dashed portal means a resonator is missing. - [**Render Limit Increase**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/render-limit-increase.user.js) increases render limits. Good for high density areas (e.g. London, UK) and faster PCs. - [**Resonator Display Zoom Level Decrease**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/resonator-display-zoom-level-decrease.user.js) Resonator start displaying earlier. +- [**Max-Links**]((https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/rmax-links.user.js) Calculates how to link the portals to create the maximum number of fields. ### available only with the development version diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js new file mode 100644 index 00000000..57074a10 --- /dev/null +++ b/plugins/max-links.user.js @@ -0,0 +1,252 @@ +// ==UserScript== +// @id max-links@boombuler +// @name iitc: Max-Links-Plugin +// @version 0.1 +// @description Calculates how to link the portals to create the maximum number of fields. +// @include http://www.ingress.com/intel* +// @match http://www.ingress.com/intel* +// ==/UserScript== + +// The algorithm is taken from https://github.com/ironwallaby/delaunay + +function wrapper() { + // ensure plugin framework is there, even if iitc is not yet loaded + if(typeof window.plugin !== 'function') + window.plugin = function() {}; + + // PLUGIN START //////////////////////////////////////////////////////// + + // use own namespace for plugin + window.plugin.portalfolding = function() {}; + + var MAX_LINK_COLOR = '#FF0000'; + + var Triangle = function (a, b, c) { + this.a = a + this.b = b + this.c = c + + var A = b.x - a.x, + B = b.y - a.y, + C = c.x - a.x, + D = c.y - a.y, + E = A * (a.x + b.x) + B * (a.y + b.y), + F = C * (a.x + c.x) + D * (a.y + c.y), + G = 2 * (A * (c.y - b.y) - B * (c.x - b.x)), + minx, miny, dx, dy + + /* If the points of the triangle are collinear, then just find the + * extremes and use the midpoint as the center of the circumcircle. */ + if(Math.abs(G) < 0.000001) { + minx = Math.min(a.x, b.x, c.x) + miny = Math.min(a.y, b.y, c.y) + dx = (Math.max(a.x, b.x, c.x) - minx) * 0.5 + dy = (Math.max(a.y, b.y, c.y) - miny) * 0.5 + + this.x = minx + dx + this.y = miny + dy + this.r = dx * dx + dy * dy + } + + else { + this.x = (D*E - B*F) / G + this.y = (A*F - C*E) / G + dx = this.x - a.x + dy = this.y - a.y + this.r = dx * dx + dy * dy + } + } + + Triangle.prototype.draw = function(layer) { + var drawLine = function(src, dest) { + var poly = L.polyline([[src.y, src.x], [dest.y, dest.x]], { + color: MAX_LINK_COLOR, + opacity: 1, + weight:2, + clickable: false, + smoothFactor: 10 + }); + poly.addTo(layer); + }; + + drawLine(this.a, this.b); + drawLine(this.b, this.c); + drawLine(this.c, this.a); + } + + var dedup = function (edges) { + var j = edges.length, + a, b, i, m, n + + outer: while(j) { + b = edges[--j] + a = edges[--j] + i = j + while(i) { + n = edges[--i] + m = edges[--i] + if((a === m && b === n) || (a === n && b === m)) { + edges.splice(j, 2) + edges.splice(i, 2) + j -= 2 + continue outer + } + } + } + } + + var triangulate = function (vertices) { + /* Bail if there aren't enough vertices to form any triangles. */ + if(vertices.length < 3) + return [] + + /* Ensure the vertex array is in order of descending X coordinate + * (which is needed to ensure a subquadratic runtime), and then find + * the bounding box around the points. */ + vertices.sort(function (a, b) { return b.x - a.x }); + + var i = vertices.length - 1, + xmin = vertices[i].x, + xmax = vertices[0].x, + ymin = vertices[i].y, + ymax = ymin + + while(i--) { + if(vertices[i].y < ymin) ymin = vertices[i].y + if(vertices[i].y > ymax) ymax = vertices[i].y + } + + /* Find a supertriangle, which is a triangle that surrounds all the + * vertices. This is used like something of a sentinel value to remove + * cases in the main algorithm, and is removed before we return any + * results. + * + * Once found, put it in the "open" list. (The "open" list is for + * triangles who may still need to be considered; the "closed" list is + * for triangles which do not.) */ + var dx = xmax - xmin, + dy = ymax - ymin, + dmax = (dx > dy) ? dx : dy, + xmid = (xmax + xmin) * 0.5, + ymid = (ymax + ymin) * 0.5, + open = [ + new Triangle( + {x: xmid - 20 * dmax, y: ymid - dmax, __sentinel: true}, + {x: xmid , y: ymid + 20 * dmax, __sentinel: true}, + {x: xmid + 20 * dmax, y: ymid - dmax, __sentinel: true} + ) + ], + closed = [], + edges = [], + j, a, b + + /* Incrementally add each vertex to the mesh. */ + i = vertices.length + while(i--) { + /* For each open triangle, check to see if the current point is + * inside it's circumcircle. If it is, remove the triangle and add + * it's edges to an edge list. */ + edges.length = 0 + j = open.length + while(j--) { + /* If this point is to the right of this triangle's circumcircle, + * then this triangle should never get checked again. Remove it + * from the open list, add it to the closed list, and skip. */ + dx = vertices[i].x - open[j].x + if(dx > 0 && dx * dx > open[j].r) { + closed.push(open[j]) + open.splice(j, 1) + continue + } + + /* If not, skip this triangle. */ + dy = vertices[i].y - open[j].y + if(dx * dx + dy * dy > open[j].r) + continue + + /* Remove the triangle and add it's edges to the edge list. */ + edges.push( + open[j].a, open[j].b, + open[j].b, open[j].c, + open[j].c, open[j].a + ) + open.splice(j, 1) + } + + /* Remove any doubled edges. */ + dedup(edges) + + /* Add a new triangle for each edge. */ + j = edges.length + while(j) { + b = edges[--j] + a = edges[--j] + open.push(new Triangle(a, b, vertices[i])) + } + } + + /* Copy any remaining open triangles to the closed list, and then + * remove any triangles that share a vertex with the supertriangle. */ + Array.prototype.push.apply(closed, open) + + i = closed.length + while(i--) + if(closed[i].a.__sentinel || + closed[i].b.__sentinel || + closed[i].c.__sentinel) + closed.splice(i, 1) + + /* Yay, we're done! */ + return closed + } + + + var layer = null; + + window.plugin.portalfolding.toggle = function() { + if (layer) { + // toggle off + window.map.removeLayer(layer); + layer = null; + return; + } + + var locations = []; + for (var key in window.portals) { + var loc = window.portals[key].options.details.locationE6; + var nloc = { x: loc.lngE6/1E6, y: loc.latE6/1E6 }; + locations.push(nloc); + } + + layer = L.layerGroup([]) + + + var triangles = triangulate(locations); + var i = triangles.length + while(i) { + triangles[--i].draw(layer) + } + + window.map.addLayer(layer); + return layer; + } + + var setup = function() { + $('#toolbox').append('toggle MaxLinks '); + } + + // PLUGIN END ////////////////////////////////////////////////////////// + if(window.iitcLoaded && typeof setup === 'function') { + setup(); + } else { + if(window.bootPlugins) + window.bootPlugins.push(setup); + else + window.bootPlugins = [setup]; + } +} // wrapper end + +// inject code into site context +var script = document.createElement('script'); +script.appendChild(document.createTextNode('('+ wrapper +')();')); +(document.body || document.head || document.documentElement).appendChild(script); \ No newline at end of file From ed7ede3273d6f1e7bf305ba590adb0e326734957 Mon Sep 17 00:00:00 2001 From: boombuler Date: Fri, 22 Feb 2013 20:25:45 +0100 Subject: [PATCH 02/74] added name to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c98b771e..f32219af 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ Please do! [vita10gy](https://github.com/vita10gy), [Xelio](https://github.com/Xelio), [ZauberNerd](https://github.com/ZauberNerd) +[Boombuler](https://github.com/Boombuler) Attribution & License From c546b7c13dbaff5a15ebb58eca3a2bd6cb4485d9 Mon Sep 17 00:00:00 2001 From: boombuler Date: Fri, 22 Feb 2013 23:04:40 +0100 Subject: [PATCH 03/74] fixed overlapping links --- plugins/max-links.user.js | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 57074a10..1f1e4ae7 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -57,9 +57,10 @@ function wrapper() { } } - Triangle.prototype.draw = function(layer) { + Triangle.prototype.draw = function(layer, divX, divY) { var drawLine = function(src, dest) { - var poly = L.polyline([[src.y, src.x], [dest.y, dest.x]], { + var poly = L.polyline([[(src.y + divY)/1E6, (src.x + divX)/1E6], + [(dest.y + divY)/1E6, (dest.x + divX)/1E6]], { color: MAX_LINK_COLOR, opacity: 1, weight:2, @@ -212,19 +213,31 @@ function wrapper() { } var locations = []; + var minX = 0; + var minY = 0; + for (var key in window.portals) { var loc = window.portals[key].options.details.locationE6; - var nloc = { x: loc.lngE6/1E6, y: loc.latE6/1E6 }; + var nloc = { x: loc.lngE6, y: loc.latE6 }; + if (nloc.x < minX) minX = nloc.x; + if (nloc.y < minX) minX = nloc.y; locations.push(nloc); } - - layer = L.layerGroup([]) + var i = locations.length; + while(i) { + var nloc = locations[--i]; + nloc.x += Math.abs(minX); + nloc.y += Math.abs(minY); + } + + layer = L.layerGroup([]) var triangles = triangulate(locations); - var i = triangles.length + i = triangles.length; while(i) { - triangles[--i].draw(layer) + var triangle = triangles[--i]; + triangle.draw(layer, minX, minY) } window.map.addLayer(layer); From 8d419c3c95ee5a12c29d4b9a5cdbeb7023c3bec0 Mon Sep 17 00:00:00 2001 From: boombuler Date: Sat, 23 Feb 2013 15:57:06 +0100 Subject: [PATCH 04/74] added update / download url --- README.md | 2 +- plugins/max-links.user.js | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index eacceeb6..6cd2f6ab 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ Please do! [Bananeweizen](https://github.com/Bananeweizen), [blakjakau](https://github.com/blakjakau), +[boombuler](https://github.com/boombuler), [cmrn](https://github.com/cmrn), [epf](https://github.com/epf), [integ3r](https://github.com/integ3r), @@ -85,7 +86,6 @@ Please do! [vita10gy](https://github.com/vita10gy), [Xelio](https://github.com/Xelio), [ZauberNerd](https://github.com/ZauberNerd) -[Boombuler](https://github.com/Boombuler) Attribution & License diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 1f1e4ae7..9fa43d56 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -2,6 +2,8 @@ // @id max-links@boombuler // @name iitc: Max-Links-Plugin // @version 0.1 +// @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/max-links.user.js +// @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/max-links.user.js // @description Calculates how to link the portals to create the maximum number of fields. // @include http://www.ingress.com/intel* // @match http://www.ingress.com/intel* From c36afe506e612b46e338feabcb90d3ff7bac0c15 Mon Sep 17 00:00:00 2001 From: boombuler Date: Sat, 23 Feb 2013 16:18:02 +0100 Subject: [PATCH 05/74] applyed codingstyle --- plugins/max-links.user.js | 422 +++++++++++++++++++------------------- 1 file changed, 210 insertions(+), 212 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 9fa43d56..07c1261a 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -12,242 +12,240 @@ // The algorithm is taken from https://github.com/ironwallaby/delaunay function wrapper() { - // ensure plugin framework is there, even if iitc is not yet loaded - if(typeof window.plugin !== 'function') - window.plugin = function() {}; + // ensure plugin framework is there, even if iitc is not yet loaded + if(typeof window.plugin !== 'function') + window.plugin = function() {}; - // PLUGIN START //////////////////////////////////////////////////////// + // PLUGIN START //////////////////////////////////////////////////////// - // use own namespace for plugin - window.plugin.portalfolding = function() {}; + // use own namespace for plugin + window.plugin.portalfolding = function() {}; - var MAX_LINK_COLOR = '#FF0000'; + var MAX_LINK_COLOR = '#FF0000'; - var Triangle = function (a, b, c) { - this.a = a - this.b = b - this.c = c + var Triangle = function (a, b, c) { + this.a = a; + this.b = b; + this.c = c; - var A = b.x - a.x, - B = b.y - a.y, - C = c.x - a.x, - D = c.y - a.y, - E = A * (a.x + b.x) + B * (a.y + b.y), - F = C * (a.x + c.x) + D * (a.y + c.y), - G = 2 * (A * (c.y - b.y) - B * (c.x - b.x)), - minx, miny, dx, dy - - /* If the points of the triangle are collinear, then just find the - * extremes and use the midpoint as the center of the circumcircle. */ - if(Math.abs(G) < 0.000001) { - minx = Math.min(a.x, b.x, c.x) - miny = Math.min(a.y, b.y, c.y) - dx = (Math.max(a.x, b.x, c.x) - minx) * 0.5 - dy = (Math.max(a.y, b.y, c.y) - miny) * 0.5 + var A = b.x - a.x, + B = b.y - a.y, + C = c.x - a.x, + D = c.y - a.y, + E = A * (a.x + b.x) + B * (a.y + b.y), + F = C * (a.x + c.x) + D * (a.y + c.y), + G = 2 * (A * (c.y - b.y) - B * (c.x - b.x)), + minx, miny, dx, dy - this.x = minx + dx - this.y = miny + dy - this.r = dx * dx + dy * dy - } + /* If the points of the triangle are collinear, then just find the + * extremes and use the midpoint as the center of the circumcircle. */ + if(Math.abs(G) < 0.000001) { + minx = Math.min(a.x, b.x, c.x) + miny = Math.min(a.y, b.y, c.y) + dx = (Math.max(a.x, b.x, c.x) - minx) * 0.5 + dy = (Math.max(a.y, b.y, c.y) - miny) * 0.5 - else { - this.x = (D*E - B*F) / G - this.y = (A*F - C*E) / G - dx = this.x - a.x - dy = this.y - a.y - this.r = dx * dx + dy * dy - } - } - - Triangle.prototype.draw = function(layer, divX, divY) { - var drawLine = function(src, dest) { - var poly = L.polyline([[(src.y + divY)/1E6, (src.x + divX)/1E6], - [(dest.y + divY)/1E6, (dest.x + divX)/1E6]], { - color: MAX_LINK_COLOR, - opacity: 1, - weight:2, - clickable: false, - smoothFactor: 10 - }); - poly.addTo(layer); - }; - - drawLine(this.a, this.b); - drawLine(this.b, this.c); - drawLine(this.c, this.a); - } - - var dedup = function (edges) { - var j = edges.length, - a, b, i, m, n - - outer: while(j) { - b = edges[--j] - a = edges[--j] - i = j - while(i) { - n = edges[--i] - m = edges[--i] - if((a === m && b === n) || (a === n && b === m)) { - edges.splice(j, 2) - edges.splice(i, 2) - j -= 2 - continue outer - } - } - } + this.x = minx + dx + this.y = miny + dy + this.r = dx * dx + dy * dy + } else { + this.x = (D*E - B*F) / G + this.y = (A*F - C*E) / G + dx = this.x - a.x + dy = this.y - a.y + this.r = dx * dx + dy * dy } + } + + Triangle.prototype.draw = function(layer, divX, divY) { + var drawLine = function(src, dest) { + var poly = L.polyline([[(src.y + divY)/1E6, (src.x + divX)/1E6], + [(dest.y + divY)/1E6, (dest.x + divX)/1E6]], { + color: MAX_LINK_COLOR, + opacity: 1, + weight:2, + clickable: false, + smoothFactor: 10 + }); + poly.addTo(layer); + }; + + drawLine(this.a, this.b); + drawLine(this.b, this.c); + drawLine(this.c, this.a); + } - var triangulate = function (vertices) { - /* Bail if there aren't enough vertices to form any triangles. */ - if(vertices.length < 3) - return [] - - /* Ensure the vertex array is in order of descending X coordinate - * (which is needed to ensure a subquadratic runtime), and then find - * the bounding box around the points. */ - vertices.sort(function (a, b) { return b.x - a.x }); - - var i = vertices.length - 1, - xmin = vertices[i].x, - xmax = vertices[0].x, - ymin = vertices[i].y, - ymax = ymin - - while(i--) { - if(vertices[i].y < ymin) ymin = vertices[i].y - if(vertices[i].y > ymax) ymax = vertices[i].y + var dedup = function (edges) { + var j = edges.length, a, b, i, m, n; + + outer: while(j) { + b = edges[--j]; + a = edges[--j]; + i = j; + while(i) { + n = edges[--i]; + m = edges[--i]; + if((a === m && b === n) || (a === n && b === m)) { + edges.splice(j, 2); + edges.splice(i, 2); + j -= 2; + continue outer; } - - /* Find a supertriangle, which is a triangle that surrounds all the - * vertices. This is used like something of a sentinel value to remove - * cases in the main algorithm, and is removed before we return any - * results. - * - * Once found, put it in the "open" list. (The "open" list is for - * triangles who may still need to be considered; the "closed" list is - * for triangles which do not.) */ - var dx = xmax - xmin, - dy = ymax - ymin, - dmax = (dx > dy) ? dx : dy, - xmid = (xmax + xmin) * 0.5, - ymid = (ymax + ymin) * 0.5, - open = [ - new Triangle( - {x: xmid - 20 * dmax, y: ymid - dmax, __sentinel: true}, - {x: xmid , y: ymid + 20 * dmax, __sentinel: true}, - {x: xmid + 20 * dmax, y: ymid - dmax, __sentinel: true} - ) - ], - closed = [], - edges = [], - j, a, b - - /* Incrementally add each vertex to the mesh. */ - i = vertices.length - while(i--) { - /* For each open triangle, check to see if the current point is - * inside it's circumcircle. If it is, remove the triangle and add - * it's edges to an edge list. */ - edges.length = 0 - j = open.length - while(j--) { - /* If this point is to the right of this triangle's circumcircle, - * then this triangle should never get checked again. Remove it - * from the open list, add it to the closed list, and skip. */ - dx = vertices[i].x - open[j].x - if(dx > 0 && dx * dx > open[j].r) { - closed.push(open[j]) - open.splice(j, 1) - continue - } - - /* If not, skip this triangle. */ - dy = vertices[i].y - open[j].y - if(dx * dx + dy * dy > open[j].r) - continue - - /* Remove the triangle and add it's edges to the edge list. */ - edges.push( - open[j].a, open[j].b, - open[j].b, open[j].c, - open[j].c, open[j].a - ) - open.splice(j, 1) - } - - /* Remove any doubled edges. */ - dedup(edges) - - /* Add a new triangle for each edge. */ - j = edges.length - while(j) { - b = edges[--j] - a = edges[--j] - open.push(new Triangle(a, b, vertices[i])) - } - } - - /* Copy any remaining open triangles to the closed list, and then - * remove any triangles that share a vertex with the supertriangle. */ - Array.prototype.push.apply(closed, open) - - i = closed.length - while(i--) - if(closed[i].a.__sentinel || - closed[i].b.__sentinel || - closed[i].c.__sentinel) - closed.splice(i, 1) - - /* Yay, we're done! */ - return closed } + } + } + var triangulate = function (vertices) { + /* Bail if there aren't enough vertices to form any triangles. */ + if(vertices.length < 3) + return [] + + /* Ensure the vertex array is in order of descending X coordinate + * (which is needed to ensure a subquadratic runtime), and then find + * the bounding box around the points. */ + vertices.sort(function (a, b) { return b.x - a.x }); + + var i = vertices.length - 1, + xmin = vertices[i].x, + xmax = vertices[0].x, + ymin = vertices[i].y, + ymax = ymin; + + while(i--) { + if(vertices[i].y < ymin) + ymin = vertices[i].y; + if(vertices[i].y > ymax) + ymax = vertices[i].y; + } + + /* Find a supertriangle, which is a triangle that surrounds all the + * vertices. This is used like something of a sentinel value to remove + * cases in the main algorithm, and is removed before we return any + * results. + * + * Once found, put it in the "open" list. (The "open" list is for + * triangles who may still need to be considered; the "closed" list is + * for triangles which do not.) */ + var dx = xmax - xmin, + dy = ymax - ymin, + dmax = (dx > dy) ? dx : dy, + xmid = (xmax + xmin) * 0.5, + ymid = (ymax + ymin) * 0.5, + open = [ + new Triangle( + {x: xmid - 20 * dmax, y: ymid - dmax, __sentinel: true}, + {x: xmid , y: ymid + 20 * dmax, __sentinel: true}, + {x: xmid + 20 * dmax, y: ymid - dmax, __sentinel: true} + ) + ], + closed = [], + edges = [], + j, a, b; + + /* Incrementally add each vertex to the mesh. */ + i = vertices.length; + while(i--) { + /* For each open triangle, check to see if the current point is + * inside it's circumcircle. If it is, remove the triangle and add + * it's edges to an edge list. */ + edges.length = 0; + j = open.length; + while(j--) { + /* If this point is to the right of this triangle's circumcircle, + * then this triangle should never get checked again. Remove it + * from the open list, add it to the closed list, and skip. */ + dx = vertices[i].x - open[j].x; + if(dx > 0 && dx * dx > open[j].r) { + closed.push(open[j]); + open.splice(j, 1); + continue; + } + + /* If not, skip this triangle. */ + dy = vertices[i].y - open[j].y; + if(dx * dx + dy * dy > open[j].r) + continue; + + /* Remove the triangle and add it's edges to the edge list. */ + edges.push( + open[j].a, open[j].b, + open[j].b, open[j].c, + open[j].c, open[j].a + ); + open.splice(j, 1); + } + + /* Remove any doubled edges. */ + dedup(edges); + + /* Add a new triangle for each edge. */ + j = edges.length; + while(j) { + b = edges[--j]; + a = edges[--j]; + open.push(new Triangle(a, b, vertices[i])); + } + } + + /* Copy any remaining open triangles to the closed list, and then + * remove any triangles that share a vertex with the supertriangle. */ + Array.prototype.push.apply(closed, open); + + i = closed.length; + while(i--) + if(closed[i].a.__sentinel || closed[i].b.__sentinel || closed[i].c.__sentinel) + closed.splice(i, 1); + + /* Yay, we're done! */ + return closed; + } var layer = null; window.plugin.portalfolding.toggle = function() { - if (layer) { - // toggle off - window.map.removeLayer(layer); - layer = null; - return; - } + if (layer) { + // toggle off + window.map.removeLayer(layer); + layer = null; + return; + } - var locations = []; - var minX = 0; - var minY = 0; + var locations = []; + var minX = 0; + var minY = 0; - for (var key in window.portals) { - var loc = window.portals[key].options.details.locationE6; - var nloc = { x: loc.lngE6, y: loc.latE6 }; - if (nloc.x < minX) minX = nloc.x; - if (nloc.y < minX) minX = nloc.y; - locations.push(nloc); - } + for (var key in window.portals) { + var loc = window.portals[key].options.details.locationE6; + var nloc = { x: loc.lngE6, y: loc.latE6 }; + if (nloc.x < minX) + minX = nloc.x; + if (nloc.y < minX) + minX = nloc.y; + locations.push(nloc); + } - var i = locations.length; - while(i) { - var nloc = locations[--i]; - nloc.x += Math.abs(minX); - nloc.y += Math.abs(minY); - } + var i = locations.length; + while(i) { + var nloc = locations[--i]; + nloc.x += Math.abs(minX); + nloc.y += Math.abs(minY); + } - layer = L.layerGroup([]) + layer = L.layerGroup([]) - var triangles = triangulate(locations); - i = triangles.length; - while(i) { - var triangle = triangles[--i]; - triangle.draw(layer, minX, minY) - } + var triangles = triangulate(locations); + i = triangles.length; + while(i) { + var triangle = triangles[--i]; + triangle.draw(layer, minX, minY) + } - window.map.addLayer(layer); - return layer; - } + window.map.addLayer(layer); + return layer; + } var setup = function() { - $('#toolbox').append('toggle MaxLinks '); + $('#toolbox').append('toggle MaxLinks '); } // PLUGIN END ////////////////////////////////////////////////////////// From 29749ebbe1a64904dd6f0249cf534c5b81e6b6d1 Mon Sep 17 00:00:00 2001 From: boombuler Date: Sat, 23 Feb 2013 17:06:21 +0100 Subject: [PATCH 06/74] add to layerchooser instead of the toolbox + code cleanup --- plugins/max-links.user.js | 113 +++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 58 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 07c1261a..0738f0c9 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -192,71 +192,68 @@ function wrapper() { Array.prototype.push.apply(closed, open); i = closed.length; - while(i--) + while(i--) { if(closed[i].a.__sentinel || closed[i].b.__sentinel || closed[i].c.__sentinel) closed.splice(i, 1); - - /* Yay, we're done! */ - return closed; } + + /* Yay, we're done! */ + return closed; + } - var layer = null; + window.plugin.portalfolding.layer = null; - window.plugin.portalfolding.toggle = function() { - if (layer) { - // toggle off - window.map.removeLayer(layer); - layer = null; - return; - } - - var locations = []; - var minX = 0; - var minY = 0; - - for (var key in window.portals) { - var loc = window.portals[key].options.details.locationE6; - var nloc = { x: loc.lngE6, y: loc.latE6 }; - if (nloc.x < minX) - minX = nloc.x; - if (nloc.y < minX) - minX = nloc.y; - locations.push(nloc); - } - - var i = locations.length; - while(i) { - var nloc = locations[--i]; - nloc.x += Math.abs(minX); - nloc.y += Math.abs(minY); - } - - layer = L.layerGroup([]) - - var triangles = triangulate(locations); - i = triangles.length; - while(i) { - var triangle = triangles[--i]; - triangle.draw(layer, minX, minY) - } - - window.map.addLayer(layer); - return layer; - } + var updating = false; + var fillLayer = function() { + if (updating) + return; + updating = true; + window.plugin.portalfolding.layer.clearLayers(); - var setup = function() { - $('#toolbox').append('toggle MaxLinks '); - } + var locations = []; + var minX = 0; + var minY = 0; + + $.each(window.portals, function(guid, portal) { + var loc = portal.options.details.locationE6; + var nloc = { x: loc.lngE6, y: loc.latE6 }; + if (nloc.x < minX) + minX = nloc.x; + if (nloc.y < minX) + minX = nloc.y; + locations.push(nloc); + }); + + $.each(locations, function(idx, nloc) { + nloc.x += Math.abs(minX); + nloc.y += Math.abs(minY); + }); - // PLUGIN END ////////////////////////////////////////////////////////// - if(window.iitcLoaded && typeof setup === 'function') { - setup(); - } else { - if(window.bootPlugins) - window.bootPlugins.push(setup); - else - window.bootPlugins = [setup]; - } + var triangles = triangulate(locations); + $.each(triangles, function(idx, triangle) { + triangle.draw(window.plugin.portalfolding.layer, minX, minY) + }); + updating = false; + } + + var setup = function() { + window.plugin.portalfolding.layer = L.layerGroup([]); + window.map.on('layeradd', function(e) { + if (e.layer === window.plugin.portalfolding.layer) + fillLayer(); + }); + window.layerChooser.addOverlay(window.plugin.portalfolding.layer, 'Maximum Links'); + } + + // PLUGIN END ////////////////////////////////////////////////////////// + if(window.iitcLoaded && typeof setup === 'function') { + setup(); + } else { + if(window.bootPlugins) + window.bootPlugins.push(setup); + else + window.bootPlugins = [setup]; + } } // wrapper end // inject code into site context From 9035e966f1445e61b01f1dd032f9decc55a6a379 Mon Sep 17 00:00:00 2001 From: vita10gy Date: Sat, 23 Feb 2013 16:01:38 -0600 Subject: [PATCH 07/74] Portal Weakness Colors --- plugins/README.md | 2 +- plugins/show-portal-weakness.user.js | 44 ++++++++++++++++------------ 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/plugins/README.md b/plugins/README.md index 25d781fd..db11bac2 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -12,7 +12,7 @@ Available Plugins - [**Compute AP Stats**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/compute-ap-stats.user.js) Shows the potential AP an agent could obtain by destroying and rebuilding all the portals in the current zoom area. - [**Draw Tools**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/draw-tools.user.js) allows to draw circles and lines on the map to aid you with planning your next big field. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_draw_tools.png) - [**Guess Player Level**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/guess-player-levels.user.js) looks for the highest placed resonator per player in the current view to guess the player level. -- [**Highlight Weakened Portals**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-portal-weakness.user.js) fill portals with red to indicate portal's state of disrepair. The brighter the color the more attention needed (recharge, shields, resonators). A dashed portal means a resonator is missing. +- [**Highlight Weakened Portals**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-portal-weakness.user.js) fill portals with red to indicate portal's state of disrepair. The brighter the color the more attention needed (recharge, shields, resonators). A dashed portal means a resonator is missing. Red, needs energy and shields. Orange, only needs energy (either recharge or resonators). Yellow, only needs shields. - [**Player Tracker**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/player-tracker.user.js) Draws trails for user actions in the last hour. At the last known location there’s a tooltip that shows the data in a table. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_player_tracker.png). - [**Render Limit Increase**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/render-limit-increase.user.js) increases render limits. Good for high density areas (e.g. London, UK) and faster PCs. - [**Resonator Display Zoom Level Decrease**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/resonator-display-zoom-level-decrease.user.js) Resonator start displaying earlier. diff --git a/plugins/show-portal-weakness.user.js b/plugins/show-portal-weakness.user.js index 332605d8..d52ac658 100644 --- a/plugins/show-portal-weakness.user.js +++ b/plugins/show-portal-weakness.user.js @@ -1,11 +1,11 @@ // ==UserScript== // @id iitc-plugin-show-portal-weakness@vita10gy // @name iitc: show portal weakness -// @version 0.2 +// @version 0.3 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-portal-weakness.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-portal-weakness.user.js -// @description Uses the fill color of the portals to denote if the portal is weak (Needs recharging, missing a resonator, needs shields) +// @description Uses the fill color of the portals to denote if the portal is weak (Needs recharging, missing a resonator, needs shields) Red, needs energy and shields. Orange, only needs energy (either recharge or resonators). Yellow, only needs shields. // @include http://www.ingress.com/intel* // @match http://www.ingress.com/intel* // ==/UserScript== @@ -24,26 +24,26 @@ window.plugin.portalWeakness.portalAdded = function(data) { var d = data.portal.options.details; var portal_weakness = 0; - if(getTeam(d) != 0) - { - if(window.getTotalPortalEnergy(d)> 0 && window.getCurrentPortalEnergy(d) < window.getTotalPortalEnergy(d)) - { + if(getTeam(d) != 0) { + var only_shields = true; + var missing_shields = 0; + if(window.getTotalPortalEnergy(d)> 0 && window.getCurrentPortalEnergy(d) < window.getTotalPortalEnergy(d)) { portal_weakness = 1 - (window.getCurrentPortalEnergy(d)/window.getTotalPortalEnergy(d)); + only_shields = false; } //Ding the portal for every missing sheild. - $.each(d.portalV2.linkedModArray, function(ind, mod) - { - if(mod == null) - { - portal_weakness += .03; + $.each(d.portalV2.linkedModArray, function(ind, mod) { + if(mod == null) { + missing_shields++; + portal_weakness += .08; } }); //Ding the portal for every missing resonator. var resCount = 0; - $.each(d.resonatorArray.resonators, function(ind, reso) - { + $.each(d.resonatorArray.resonators, function(ind, reso) { if(reso == null) { portal_weakness += .125; + only_shields = false; } else { resCount++; @@ -57,11 +57,19 @@ window.plugin.portalWeakness.portalAdded = function(data) { portal_weakness = 1; } - if(portal_weakness>0) - { - var color = 'red'; - var fill_opacity = Math.round((portal_weakness*.8 + .2)*100)/100; - var params = {fillColor: color, fillOpacity: fill_opacity, radius: data.portal.options.radius+1}; + if(portal_weakness>0) { + var fill_opacity = portal_weakness*.7 + .3; + var color = 'orange'; + if(only_shields) { + color = 'yellow'; + //If only shields are missing, make portal yellow, but fill more than usual since pale yellow is basically invisible + fill_opacity = missing_shields*.15 + .1; + } + else if(missing_shields>0) { + color = 'red'; + } + fill_opacity = Math.round(fill_opacity*100)/100; + var params = {fillColor: color, fillOpacity: fill_opacity}; if(resCount<8) { // Hole per missing resonator From f8215107fc2a579ba3f2669703573c1a674f082b Mon Sep 17 00:00:00 2001 From: vita10gy Date: Sat, 23 Feb 2013 16:20:55 -0600 Subject: [PATCH 08/74] Portal size tweak Slight change so that level 1 and level 2 portals aren't the same size anymore. Also, make exception for unclaimed portals so they aren't a tiny dot. --- code/map_data.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/map_data.js b/code/map_data.js index a28af7b4..c0c87dfb 100644 --- a/code/map_data.js +++ b/code/map_data.js @@ -261,8 +261,11 @@ window.renderPortal = function(ent) { // pre-loads player names for high zoom levels loadPlayerNamesForPortal(ent[2]); - var lvWeight = Math.max(2, portalLevel / 1.5); - var lvRadius = Math.max(portalLevel + 3, 5); + var lvWeight = Math.max(2, Math.floor(portalLevel) / 1.5); + var lvRadius = Math.floor(portalLevel) + 4; + if(team === window.TEAM_NONE) { + lvRadius = 7; + } var p = L.circleMarker(latlng, { radius: lvRadius + (L.Browser.mobile ? PORTAL_RADIUS_ENLARGE_MOBILE : 0), From ff560ab3cae1bcb716c73a042dc13d1d447af926 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Sat, 23 Feb 2013 23:58:24 +0100 Subject: [PATCH 09/74] release 0.7.1 to fix the portal rendering issue. Fixes #278, fixes #283 --- NEWS.md | 6 ++++-- dist/total-conversion-build.user.js | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/NEWS.md b/NEWS.md index 857f3bca..c8cc64c7 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ -CHANGES IN 0.7 -============== +CHANGES IN 0.7 / 0.7.1 +====================== + +- 0.7.1 fixes an oversight that prevented some portals from showing (by saithis) ### General - from now on there will be [nightly builds](https://www.dropbox.com/sh/lt9p0s40kt3cs6m/3xzpyiVBnF) available. You need to manually update them if you want to stay on nightly. You should be offered to update to the next release version, though. Be sure to [have read the guide on how to report bugs](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/HACKING.md#how-do-i-report-bugs) before using a nightly version. diff --git a/dist/total-conversion-build.user.js b/dist/total-conversion-build.user.js index 7957b94d..f920b407 100644 --- a/dist/total-conversion-build.user.js +++ b/dist/total-conversion-build.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id ingress-intel-total-conversion@breunigs // @name intel map total conversion -// @version 0.7-2013-02-23-141531 +// @version 0.7.1-2013-02-23-235612 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js @@ -15,7 +15,7 @@ if(document.getElementsByTagName('html')[0].getAttribute('itemscope') != null) throw('Ingress Intel Website is down, not a userscript issue.'); -window.iitcBuildDate = '2013-02-23-141531'; +window.iitcBuildDate = '2013-02-23-235612'; // disable vanilla JS window.onload = function() {}; @@ -294,7 +294,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; window._hooks = {} window.VALID_HOOKS = ['portalAdded', 'portalDetailsUpdated', - 'publicChatDataAvailable', 'portalDataLoaded']; + 'publicChatDataAvailable', 'portalDataLoaded', 'beforePortalReRender']; window.runHooks = function(event, data) { if(VALID_HOOKS.indexOf(event) === -1) throw('Unknown event type: ' + event); From 3395df51e8cb276be6a07da495f42fceb3b68c1b Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Sun, 24 Feb 2013 00:03:16 +0100 Subject: [PATCH 10/74] encourage users to search for existing issues before creating a new one --- HACKING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HACKING.md b/HACKING.md index a1aa0fab..fbd7c943 100644 --- a/HACKING.md +++ b/HACKING.md @@ -68,7 +68,7 @@ How do I report bugs? - press `SHIFT+F5` (or shift-click the reload button). Wait for the page to load. - press `CTRL+F5`, same as above. -If your issue persists, continue. Provide **all** of the information below, even if you don’t think this is necessary. +If your issue persists, continue. The next step is to look for existing issues, maybe someone else has a similar problem. You can look [through the existing issues](https://github.com/breunigs/ingress-intel-total-conversion/issues?sort=updated&state=open) or use the search function on the top right. If your issue persists, open a new issue and provide **all** of the information below, even if you don’t think this is necessary. - a descriptive title - your browser and its version From 335e84e7ce849ec25fcb125e2aaec1ac0d51941b Mon Sep 17 00:00:00 2001 From: vita10gy Date: Sat, 23 Feb 2013 17:27:54 -0600 Subject: [PATCH 11/74] Fixing Nits --- plugins/show-portal-weakness.user.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/plugins/show-portal-weakness.user.js b/plugins/show-portal-weakness.user.js index d52ac658..fa83fcec 100644 --- a/plugins/show-portal-weakness.user.js +++ b/plugins/show-portal-weakness.user.js @@ -24,7 +24,7 @@ window.plugin.portalWeakness.portalAdded = function(data) { var d = data.portal.options.details; var portal_weakness = 0; - if(getTeam(d) != 0) { + if(getTeam(d) !== 0) { var only_shields = true; var missing_shields = 0; if(window.getTotalPortalEnergy(d)> 0 && window.getCurrentPortalEnergy(d) < window.getTotalPortalEnergy(d)) { @@ -33,7 +33,7 @@ window.plugin.portalWeakness.portalAdded = function(data) { } //Ding the portal for every missing sheild. $.each(d.portalV2.linkedModArray, function(ind, mod) { - if(mod == null) { + if(mod === null) { missing_shields++; portal_weakness += .08; } @@ -41,36 +41,34 @@ window.plugin.portalWeakness.portalAdded = function(data) { //Ding the portal for every missing resonator. var resCount = 0; $.each(d.resonatorArray.resonators, function(ind, reso) { - if(reso == null) { + if(reso === null) { portal_weakness += .125; only_shields = false; - } - else { + } else { resCount++; } }); - if(portal_weakness<0) { + if(portal_weakness < 0) { portal_weakness = 0; } - if(portal_weakness>1) + if(portal_weakness > 1) { portal_weakness = 1; } - if(portal_weakness>0) { + if(portal_weakness > 0) { var fill_opacity = portal_weakness*.7 + .3; var color = 'orange'; if(only_shields) { color = 'yellow'; //If only shields are missing, make portal yellow, but fill more than usual since pale yellow is basically invisible fill_opacity = missing_shields*.15 + .1; - } - else if(missing_shields>0) { + } else if(missing_shields > 0) { color = 'red'; } fill_opacity = Math.round(fill_opacity*100)/100; var params = {fillColor: color, fillOpacity: fill_opacity}; - if(resCount<8) + if(resCount < 8) { // Hole per missing resonator var dash = new Array(8-resCount + 1).join("1,4,") + "100,0" From 48ee7ce2af2e5470997bc52bbbfc83ddac28bae8 Mon Sep 17 00:00:00 2001 From: vita10gy Date: Sat, 23 Feb 2013 17:36:55 -0600 Subject: [PATCH 12/74] Missed one --- plugins/show-portal-weakness.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/show-portal-weakness.user.js b/plugins/show-portal-weakness.user.js index fa83fcec..4314a97a 100644 --- a/plugins/show-portal-weakness.user.js +++ b/plugins/show-portal-weakness.user.js @@ -27,7 +27,7 @@ window.plugin.portalWeakness.portalAdded = function(data) { if(getTeam(d) !== 0) { var only_shields = true; var missing_shields = 0; - if(window.getTotalPortalEnergy(d)> 0 && window.getCurrentPortalEnergy(d) < window.getTotalPortalEnergy(d)) { + if(window.getTotalPortalEnergy(d) > 0 && window.getCurrentPortalEnergy(d) < window.getTotalPortalEnergy(d)) { portal_weakness = 1 - (window.getCurrentPortalEnergy(d)/window.getTotalPortalEnergy(d)); only_shields = false; } From ad234ce84d28eab83b3c5103006c7e05254b0b6f Mon Sep 17 00:00:00 2001 From: vita10gy Date: Sat, 23 Feb 2013 18:44:57 -0600 Subject: [PATCH 13/74] More Nits --- plugins/show-portal-weakness.user.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/show-portal-weakness.user.js b/plugins/show-portal-weakness.user.js index 4314a97a..aef05e06 100644 --- a/plugins/show-portal-weakness.user.js +++ b/plugins/show-portal-weakness.user.js @@ -26,7 +26,7 @@ window.plugin.portalWeakness.portalAdded = function(data) { var portal_weakness = 0; if(getTeam(d) !== 0) { var only_shields = true; - var missing_shields = 0; + var missing_shields = 0; if(window.getTotalPortalEnergy(d) > 0 && window.getCurrentPortalEnergy(d) < window.getTotalPortalEnergy(d)) { portal_weakness = 1 - (window.getCurrentPortalEnergy(d)/window.getTotalPortalEnergy(d)); only_shields = false; @@ -61,7 +61,8 @@ window.plugin.portalWeakness.portalAdded = function(data) { var color = 'orange'; if(only_shields) { color = 'yellow'; - //If only shields are missing, make portal yellow, but fill more than usual since pale yellow is basically invisible + //If only shields are missing, make portal yellow + //but fill more than usual since pale yellow is basically invisible fill_opacity = missing_shields*.15 + .1; } else if(missing_shields > 0) { color = 'red'; From f5b7299cd50d249f2b4b3ad6c2c1f173a871a44b Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Sun, 24 Feb 2013 08:19:40 +0100 Subject: [PATCH 14/74] improve enlightenment color on map. Fixes #289, thanks tomhuze. --- main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.js b/main.js index 6f0b6f16..970ac8db 100644 --- a/main.js +++ b/main.js @@ -158,7 +158,7 @@ window.MAX_DRAWN_FIELDS = 200; window.RESONATOR_DISPLAY_ZOOM_LEVEL = 17; window.COLOR_SELECTED_PORTAL = '#f00'; -window.COLORS = ['#FFCE00', '#0088FF', '#03FE03']; // none, res, enl +window.COLORS = ['#FFCE00', '#0088FF', '#03DC03']; // none, res, enl window.COLORS_LVL = ['#000', '#FECE5A', '#FFA630', '#FF7315', '#E40000', '#FD2992', '#EB26CD', '#C124E0', '#9627F4']; window.COLORS_MOD = {VERY_RARE: '#F78AF6', RARE: '#AD8AFF', COMMON: '#84FBBD'}; From b10fedf887fc7701581d8801d187a844aa8fc23a Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Sun, 24 Feb 2013 10:52:54 +0100 Subject: [PATCH 15/74] forgot to commit version number change --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c29ade7c..2dde6289 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ IITC can be [extended with the use of plugins](https://github.com/breunigs/ingre Install ------- -Current version is 0.7. [See NEWS.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/NEWS.md). +Current version is 0.7.1. [See NEWS.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/NEWS.md). [**INSTALL**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js) From f213a481e853761cbdc66c0ebc18c730fd4cff90 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Sun, 24 Feb 2013 10:54:08 +0100 Subject: [PATCH 16/74] avoid rendering small fields and links for improved perf. This change is experimental, so please report any rendering issues that could be related to this. --- code/map_data.js | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/code/map_data.js b/code/map_data.js index c0c87dfb..196a975e 100644 --- a/code/map_data.js +++ b/code/map_data.js @@ -484,9 +484,19 @@ window.renderLink = function(ent) { weight:2, clickable: false, guid: ent[0], - smoothFactor: 10 + smoothFactor: 0 // doesn’t work for two points anyway, so disable }); + // determine which links are very short and don’t render them at all. + // in most cases this will go unnoticed, but improve rendering speed. + poly._map = window.map; + poly.projectLatlngs(); + var op = poly._originalPoints; + var dist = Math.abs(op[0].x - op[1].x) + Math.abs(op[0].y - op[1].y); + if(dist <= 10) { + return; + } + if(!getPaddedBounds().intersects(poly.getBounds())) return; poly.on('remove', function() { delete window.links[this.options.guid]; }); @@ -515,16 +525,27 @@ window.renderField = function(ent) { [reg.vertexB.location.latE6/1E6, reg.vertexB.location.lngE6/1E6], [reg.vertexC.location.latE6/1E6, reg.vertexC.location.lngE6/1E6] ]; + var poly = L.polygon(latlngs, { fillColor: COLORS[team], fillOpacity: 0.25, stroke: false, clickable: false, - smoothFactor: 10, - vertices: ent[2].capturedRegion, + smoothFactor: 0, // hiding small fields will be handled below + vertices: reg, lastUpdate: ent[1], guid: ent[0]}); + // determine which fields are too small to be rendered and don’t + // render them, so they don’t count towards the maximum fields limit. + // This saves some DOM operations as well, but given the relatively + // low amount of fields there isn’t much to gain. + // The algorithm is the same as used by Leaflet. + poly._map = window.map; + poly.projectLatlngs(); + var count = L.LineUtil.simplify(poly._originalPoints, 6).length; + if(count <= 2) return; + if(!getPaddedBounds().intersects(poly.getBounds())) return; poly.on('remove', function() { delete window.fields[this.options.guid]; }); From de4ad906458011f82d2a45693b5569cb17543f6c Mon Sep 17 00:00:00 2001 From: boombuler Date: Sun, 24 Feb 2013 11:34:39 +0100 Subject: [PATCH 17/74] changed namespace to maxLinks --- plugins/max-links.user.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 0738f0c9..9f35c877 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -19,7 +19,7 @@ function wrapper() { // PLUGIN START //////////////////////////////////////////////////////// // use own namespace for plugin - window.plugin.portalfolding = function() {}; + window.plugin.maxLinks = function() {}; var MAX_LINK_COLOR = '#FF0000'; @@ -201,14 +201,14 @@ function wrapper() { return closed; } - window.plugin.portalfolding.layer = null; + window.plugin.maxLinks.layer = null; var updating = false; var fillLayer = function() { if (updating) return; updating = true; - window.plugin.portalfolding.layer.clearLayers(); + window.plugin.maxLinks.layer.clearLayers(); var locations = []; var minX = 0; @@ -231,18 +231,18 @@ function wrapper() { var triangles = triangulate(locations); $.each(triangles, function(idx, triangle) { - triangle.draw(window.plugin.portalfolding.layer, minX, minY) + triangle.draw(window.plugin.maxLinks.layer, minX, minY) }); updating = false; } var setup = function() { - window.plugin.portalfolding.layer = L.layerGroup([]); + window.plugin.maxLinks.layer = L.layerGroup([]); window.map.on('layeradd', function(e) { - if (e.layer === window.plugin.portalfolding.layer) + if (e.layer === window.plugin.maxLinks.layer) fillLayer(); }); - window.layerChooser.addOverlay(window.plugin.portalfolding.layer, 'Maximum Links'); + window.layerChooser.addOverlay(window.plugin.maxLinks.layer, 'Maximum Links'); } // PLUGIN END ////////////////////////////////////////////////////////// From bbf7f6448898487495389af7d6c0b160881e2b13 Mon Sep 17 00:00:00 2001 From: boombuler Date: Sun, 24 Feb 2013 15:33:10 +0100 Subject: [PATCH 18/74] moved some functions to namespace --- plugins/max-links.user.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 9f35c877..6e21d34a 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -95,7 +95,7 @@ function wrapper() { } } - var triangulate = function (vertices) { + window.plugin.maxLinks.triangulate = function (vertices) { /* Bail if there aren't enough vertices to form any triangles. */ if(vertices.length < 3) return [] @@ -204,7 +204,8 @@ function wrapper() { window.plugin.maxLinks.layer = null; var updating = false; - var fillLayer = function() { + + window.plugin.maxLinks.updateLayer = function() { if (updating) return; updating = true; @@ -229,7 +230,7 @@ function wrapper() { nloc.y += Math.abs(minY); }); - var triangles = triangulate(locations); + var triangles = window.plugin.maxLinks.triangulate(locations); $.each(triangles, function(idx, triangle) { triangle.draw(window.plugin.maxLinks.layer, minX, minY) }); @@ -240,8 +241,9 @@ function wrapper() { window.plugin.maxLinks.layer = L.layerGroup([]); window.map.on('layeradd', function(e) { if (e.layer === window.plugin.maxLinks.layer) - fillLayer(); - }); + window.plugin.maxLinks.updateLayer(); + }); + window.map.on('zoomend moveend', fwindow.plugin.maxLinks.updateLayer); window.layerChooser.addOverlay(window.plugin.maxLinks.layer, 'Maximum Links'); } From d8874d10484d17ccb8fb1fa58b3a95da02684ac1 Mon Sep 17 00:00:00 2001 From: boombuler Date: Sun, 24 Feb 2013 15:34:40 +0100 Subject: [PATCH 19/74] readme should be in alphabetical order --- plugins/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/README.md b/plugins/README.md index d23f3a3c..0dc4f5da 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -13,11 +13,11 @@ Available Plugins - [**Draw Tools**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/draw-tools.user.js) allows to draw circles and lines on the map to aid you with planning your next big field. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_draw_tools.png) - [**Guess Player Level**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/guess-player-levels.user.js) looks for the highest placed resonator per player in the current view to guess the player level. - [**Highlight Weakened Portals**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-portal-weakness.user.js) fill portals with red to indicate portal's state of disrepair. The brighter the color the more attention needed (recharge, shields, resonators). A dashed portal means a resonator is missing. +- [**Max-Links**]((https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/max-links.user.js) Calculates how to link the portals to create the maximum number of fields. - [**Player Tracker**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/player-tracker.user.js) Draws trails for user actions in the last hour. At the last known location there’s a tooltip that shows the data in a table. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_player_tracker.png). - [**Render Limit Increase**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/render-limit-increase.user.js) increases render limits. Good for high density areas (e.g. London, UK) and faster PCs. - [**Resonator Display Zoom Level Decrease**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/resonator-display-zoom-level-decrease.user.js) Resonator start displaying earlier. - [**Show Portal Address**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-address.user.js) Shows portal address in the side panel. -- [**Max-Links**]((https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/max-links.user.js) Calculates how to link the portals to create the maximum number of fields. ### available only with the development version From f44e9bd3a224e54e9d76c20e76f5430485bb1f8c Mon Sep 17 00:00:00 2001 From: boombuler Date: Sun, 24 Feb 2013 15:56:58 +0100 Subject: [PATCH 20/74] fixed typo + only update links if the layer is visible --- plugins/max-links.user.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 6e21d34a..b1cd801f 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -203,10 +203,9 @@ function wrapper() { window.plugin.maxLinks.layer = null; - var updating = false; - + var updating = false; window.plugin.maxLinks.updateLayer = function() { - if (updating) + if (updating || window.plugin.maxLinks.layer === null || !window.map.hasLayer(window.plugin.maxLinks.layer)) return; updating = true; window.plugin.maxLinks.layer.clearLayers(); @@ -243,7 +242,7 @@ function wrapper() { if (e.layer === window.plugin.maxLinks.layer) window.plugin.maxLinks.updateLayer(); }); - window.map.on('zoomend moveend', fwindow.plugin.maxLinks.updateLayer); + window.map.on('zoomend moveend', window.plugin.maxLinks.updateLayer); window.layerChooser.addOverlay(window.plugin.maxLinks.layer, 'Maximum Links'); } From df40a182bea91eebc22903d2ba8d03046727643d Mon Sep 17 00:00:00 2001 From: boombuler Date: Sun, 24 Feb 2013 16:10:47 +0100 Subject: [PATCH 21/74] added screenshot of plugin --- screenshots/plugin_max_links.png | Bin 0 -> 121130 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 screenshots/plugin_max_links.png diff --git a/screenshots/plugin_max_links.png b/screenshots/plugin_max_links.png new file mode 100644 index 0000000000000000000000000000000000000000..d40b40540ddfcdbbac9580633a511cf02d760faa GIT binary patch literal 121130 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%0ACmu}&-slW-Z1`kY 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 Date: Sun, 24 Feb 2013 16:08:12 -0600 Subject: [PATCH 22/74] Nits --- plugins/show-portal-weakness.user.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plugins/show-portal-weakness.user.js b/plugins/show-portal-weakness.user.js index aef05e06..3e272dde 100644 --- a/plugins/show-portal-weakness.user.js +++ b/plugins/show-portal-weakness.user.js @@ -51,8 +51,7 @@ window.plugin.portalWeakness.portalAdded = function(data) { if(portal_weakness < 0) { portal_weakness = 0; } - if(portal_weakness > 1) - { + if(portal_weakness > 1) { portal_weakness = 1; } @@ -62,15 +61,14 @@ window.plugin.portalWeakness.portalAdded = function(data) { if(only_shields) { color = 'yellow'; //If only shields are missing, make portal yellow - //but fill more than usual since pale yellow is basically invisible + // but fill more than usual since pale yellow is basically invisible fill_opacity = missing_shields*.15 + .1; } else if(missing_shields > 0) { color = 'red'; } fill_opacity = Math.round(fill_opacity*100)/100; var params = {fillColor: color, fillOpacity: fill_opacity}; - if(resCount < 8) - { + if(resCount < 8) { // Hole per missing resonator var dash = new Array(8-resCount + 1).join("1,4,") + "100,0" params["dashArray"] = dash; From a94bf4475ba5366c1c605ffa6e97226839a58552 Mon Sep 17 00:00:00 2001 From: boombuler Date: Sun, 24 Feb 2013 23:10:22 +0100 Subject: [PATCH 23/74] added a renderlimit for the plugin --- code/hooks.js | 7 +++++-- code/utils_misc.js | 4 +++- plugins/max-links.user.js | 24 ++++++++++++++++++++---- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/code/hooks.js b/code/hooks.js index 92840b7c..8bef1098 100644 --- a/code/hooks.js +++ b/code/hooks.js @@ -43,13 +43,16 @@ // redrawn. It is called early on in the // code/map_data.js#renderPortal as long as there was an // old portal for the guid. - +// checkRenderLimit: callback is passed the argument of +// {reached : false} to indicate that the renderlimit is reached +// set reached to true. window._hooks = {} window.VALID_HOOKS = ['portalAdded', 'portalDetailsUpdated', - 'publicChatDataAvailable', 'portalDataLoaded', 'beforePortalReRender']; + 'publicChatDataAvailable', 'portalDataLoaded', 'beforePortalReRender', + 'checkRenderLimit']; window.runHooks = function(event, data) { if(VALID_HOOKS.indexOf(event) === -1) throw('Unknown event type: ' + event); diff --git a/code/utils_misc.js b/code/utils_misc.js index 48704d0c..6638955f 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -128,7 +128,9 @@ window.renderLimitReached = function() { if(Object.keys(portals).length >= MAX_DRAWN_PORTALS) return true; if(Object.keys(links).length >= MAX_DRAWN_LINKS) return true; if(Object.keys(fields).length >= MAX_DRAWN_FIELDS) return true; - return false; + var param = { 'reached': false }; + window.runHooks('checkRenderLimit', param); + return param.reached; } window.getMinPortalLevel = function() { diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index b1cd801f..5a7d2476 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -20,9 +20,10 @@ function wrapper() { // use own namespace for plugin window.plugin.maxLinks = function() {}; - + + window.plugin.maxLinks.MAX_DRAWN_LINKS = 400; var MAX_LINK_COLOR = '#FF0000'; - + var Triangle = function (a, b, c) { this.a = a; this.b = b; @@ -203,7 +204,8 @@ function wrapper() { window.plugin.maxLinks.layer = null; - var updating = false; + var updating = false; + var renderLimitReached = false; window.plugin.maxLinks.updateLayer = function() { if (updating || window.plugin.maxLinks.layer === null || !window.map.hasLayer(window.plugin.maxLinks.layer)) return; @@ -230,14 +232,28 @@ function wrapper() { }); var triangles = window.plugin.maxLinks.triangulate(locations); + var drawnLinks = 0; + renderLimitReached = false; $.each(triangles, function(idx, triangle) { - triangle.draw(window.plugin.maxLinks.layer, minX, minY) + if (drawnLinks <= window.plugin.maxLinks.MAX_DRAWN_LINKS) { + triangle.draw(window.plugin.maxLinks.layer, minX, minY); + drawnLinks += 3; + } else { + renderLimitReached = true; + } }); updating = false; + window.renderUpdateStatus(); } var setup = function() { window.plugin.maxLinks.layer = L.layerGroup([]); + + window.addHook('checkRenderLimit', function(e) { + if (window.map.hasLayer(window.plugin.maxLinks.layer) && renderLimitReached) + e.reached = true; + }); + window.map.on('layeradd', function(e) { if (e.layer === window.plugin.maxLinks.layer) window.plugin.maxLinks.updateLayer(); From 4ecec63a0d6644e67e713cf59660f76533268f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cheng=20=28=E9=84=AD=E9=83=81=E9=82=A6=29?= Date: Sun, 24 Feb 2013 22:56:16 +0800 Subject: [PATCH 24/74] Show full portal capture time on tooltips --- USERGUIDE.md | 2 +- code/portal_detail_display.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/USERGUIDE.md b/USERGUIDE.md index c345ab4b..643147c1 100644 --- a/USERGUIDE.md +++ b/USERGUIDE.md @@ -117,7 +117,7 @@ Starting from the top, the sidebar shows this information: “Random Details” are displayed in four columns. The outer ones show the data while the inner ones are the titles. - owner: who deployed the first resonator after it has been neutral/unclaimed. -- since: when was the first resonator deployed after it has been neutral/unclaimed. +- since: when was the first resonator deployed after it has been neutral/unclaimed. The reasonators decay every 24hrs from capture. Move the cursor over it to show the full date time. - range: shows how far links made from this portal can be. Click on the value to zoom out to link range. The red circle shows how far links may reach. - energy: shows current and maximum energy if fully charged. The tooltip contains the exact numbers. - links: shows incoming and outgoing links. The tooltip explains the icons. diff --git a/code/portal_detail_display.js b/code/portal_detail_display.js index ffd653c9..f930d5ca 100644 --- a/code/portal_detail_display.js +++ b/code/portal_detail_display.js @@ -26,7 +26,10 @@ window.renderPortalDetails = function(guid) { : null; var playerText = player ? ['owner', player] : null; - var time = d.captured ? unixTimeToString(d.captured.capturedTime) : null; + var time = d.captured + ? '' + + unixTimeToString(d.captured.capturedTime) + '' + : null; var sinceText = time ? ['since', time] : null; var linkedFields = ['fields', d.portalV2.linkedFields.length]; From 1e4c372bdd75b16e3bd0df93c7c285f85161838f Mon Sep 17 00:00:00 2001 From: Cameron Moon Date: Mon, 25 Feb 2013 15:34:32 +1100 Subject: [PATCH 25/74] Changed all instances of Enlightenment to Enlightened --- README.md | 2 +- USERGUIDE.md | 2 +- code/game_status.js | 2 +- plugins/guess-player-levels.user.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 2dde6289..68662e92 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ Contributing Please do! -(Obviously, Resistance folks must send in complete patches while Enlightenment gals and guys may just open feature request ☺). If you want to hack the source, please [read HACKING.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/HACKING.md) . +(Obviously, Resistance folks must send in complete patches while Enlightened gals and guys may just open feature request ☺). If you want to hack the source, please [read HACKING.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/HACKING.md) . **So far, these people have contributed:** diff --git a/USERGUIDE.md b/USERGUIDE.md index c345ab4b..c495edef 100644 --- a/USERGUIDE.md +++ b/USERGUIDE.md @@ -33,7 +33,7 @@ The chat is split up into several categories. It usually only shows messages for **The chat categories are:** - full: shows all automated messages *(23:57 \ destroyed an L3 Resonator on Two Spikes)* - compact: shows only the latest automated message per user -- public: shows user generated public messages (both Enlightenment and Resistance can read it) +- public: shows user generated public messages (both Enlightened and Resistance can read it) - faction: shows messages for own faction (e.g. only Resistance can read Resistance messages) **Posting messages:** diff --git a/code/game_status.js b/code/game_status.js index fe29b868..907d76e3 100644 --- a/code/game_status.js +++ b/code/game_status.js @@ -15,7 +15,7 @@ window.updateGameScore = function(data) { var es = ' '+Math.round(ep)+'%'; $('#gamestat').html(rs+es).one('click', function() { window.updateGameScore() }); // help cursor via “#gamestat span” - $('#gamestat').attr('title', 'Resistance:\t'+r+' MindUnits\nEnlightenment:\t'+e+' MindUnits'); + $('#gamestat').attr('title', 'Resistance:\t'+r+' MindUnits\nEnlightened:\t'+e+' MindUnits'); window.setTimeout('window.updateGameScore', REFRESH_GAME_SCORE*1000); } diff --git a/plugins/guess-player-levels.user.js b/plugins/guess-player-levels.user.js index e8249042..6d987894 100644 --- a/plugins/guess-player-levels.user.js +++ b/plugins/guess-player-levels.user.js @@ -88,7 +88,7 @@ window.plugin.guessPlayerLevels.guess = function() { }); var s = 'the players have at least the following level:\n\n'; - s += 'Resistance:\t   \tEnlightenment:\t\n'; + s += 'Resistance:\t   \tEnlightened:\t\n'; var namesR = plugin.guessPlayerLevels.sort(playersRes); var namesE = plugin.guessPlayerLevels.sort(playersEnl); From 9782883b5cb7a5c6f1c0d8d0b49d55fac295950d Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Mon, 25 Feb 2013 08:15:24 +0100 Subject: [PATCH 26/74] maybe fix #295 --- code/boot.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/code/boot.js b/code/boot.js index 70542bab..4f231010 100644 --- a/code/boot.js +++ b/code/boot.js @@ -58,10 +58,6 @@ window.setupMap = function() { {zoomControl: !(localStorage['iitc.zoom.buttons'] === 'false')} )); - try { - map.addLayer(views[readCookie('ingress.intelmap.type')]); - } catch(e) { map.addLayer(views[0]); } - var addLayers = {}; portalsLayers = []; @@ -91,6 +87,14 @@ window.setupMap = function() { }, addLayers); map.addControl(window.layerChooser); + + // set the map AFTER adding the layer chooser, or Chrome reorders the + // layers. This likely leads to broken layer selection because the + // views/cookie order does not match the layer chooser order. + try { + map.addLayer(views[readCookie('ingress.intelmap.type')]); + } catch(e) { map.addLayer(views[0]); } + map.attributionControl.setPrefix(''); // listen for changes and store them in cookies map.on('moveend', window.storeMapPosition); From 67d4fbbe0311d8355926e5d40f19f4c06436fb03 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Mon, 25 Feb 2013 08:17:10 +0100 Subject: [PATCH 27/74] =?UTF-8?q?don=E2=80=99t=20render=20resources=20outs?= =?UTF-8?q?ide=20the=20view=20port=20when=20the=20render=20limit=20is=20ab?= =?UTF-8?q?out=20to=20be=20hit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/utils_misc.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/code/utils_misc.js b/code/utils_misc.js index 48704d0c..e208fcc0 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -117,6 +117,7 @@ window.getPaddedBounds = function() { window._storedPaddedBounds = null; }); } + if(renderLimitReached(0.7)) return window.map.getBounds(); if(window._storedPaddedBounds) return window._storedPaddedBounds; var p = window.map.getBounds().pad(VIEWPORT_PAD_RATIO); @@ -124,10 +125,16 @@ window.getPaddedBounds = function() { return p; } -window.renderLimitReached = function() { - if(Object.keys(portals).length >= MAX_DRAWN_PORTALS) return true; - if(Object.keys(links).length >= MAX_DRAWN_LINKS) return true; - if(Object.keys(fields).length >= MAX_DRAWN_FIELDS) return true; +// returns true if the render limit has been reached. The default ratio +// is 1, which means it will tell you if there are more items drawn than +// acceptable. A value of 0.9 will tell you if 90% of the amount of +// acceptable entities have been drawn. You can use this to heuristi- +// cally detect if the render limit will be hit. +window.renderLimitReached = function(ratio) { + ratio = ratio || 1; + if(Object.keys(portals).length*ratio >= MAX_DRAWN_PORTALS) return true; + if(Object.keys(links).length*ratio >= MAX_DRAWN_LINKS) return true; + if(Object.keys(fields).length*ratio >= MAX_DRAWN_FIELDS) return true; return false; } From 459c4b422bcd26bba32f4e17083e1c89b19764a4 Mon Sep 17 00:00:00 2001 From: Florian Sundermann Date: Mon, 25 Feb 2013 08:44:43 +0100 Subject: [PATCH 28/74] new hook to let plugins indicate a renderlimit --- code/hooks.js | 6 +++++- code/utils_misc.js | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/hooks.js b/code/hooks.js index 92840b7c..fbf5c602 100644 --- a/code/hooks.js +++ b/code/hooks.js @@ -43,13 +43,17 @@ // redrawn. It is called early on in the // code/map_data.js#renderPortal as long as there was an // old portal for the guid. +// checkRenderLimit: callback is passed the argument of +// {reached : false} to indicate that the renderlimit is reached +// set reached to true. window._hooks = {} window.VALID_HOOKS = ['portalAdded', 'portalDetailsUpdated', - 'publicChatDataAvailable', 'portalDataLoaded', 'beforePortalReRender']; + 'publicChatDataAvailable', 'portalDataLoaded', 'beforePortalReRender', + 'checkRenderLimit']; window.runHooks = function(event, data) { if(VALID_HOOKS.indexOf(event) === -1) throw('Unknown event type: ' + event); diff --git a/code/utils_misc.js b/code/utils_misc.js index e208fcc0..8600a0ed 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -135,7 +135,9 @@ window.renderLimitReached = function(ratio) { if(Object.keys(portals).length*ratio >= MAX_DRAWN_PORTALS) return true; if(Object.keys(links).length*ratio >= MAX_DRAWN_LINKS) return true; if(Object.keys(fields).length*ratio >= MAX_DRAWN_FIELDS) return true; - return false; + var param = { 'reached': false }; + window.runHooks('checkRenderLimit', param); + return param.reached; } window.getMinPortalLevel = function() { From 1fdad5cfdf6c6bc70beb3a4f202e8984fc08f472 Mon Sep 17 00:00:00 2001 From: Florian Sundermann Date: Mon, 25 Feb 2013 08:50:41 +0100 Subject: [PATCH 29/74] Revert "added a renderlimit for the plugin" This reverts commit a94bf4475ba5366c1c605ffa6e97226839a58552. --- code/hooks.js | 7 ++----- code/utils_misc.js | 4 +--- plugins/max-links.user.js | 24 ++++-------------------- 3 files changed, 7 insertions(+), 28 deletions(-) diff --git a/code/hooks.js b/code/hooks.js index 8bef1098..92840b7c 100644 --- a/code/hooks.js +++ b/code/hooks.js @@ -43,16 +43,13 @@ // redrawn. It is called early on in the // code/map_data.js#renderPortal as long as there was an // old portal for the guid. -// checkRenderLimit: callback is passed the argument of -// {reached : false} to indicate that the renderlimit is reached -// set reached to true. + window._hooks = {} window.VALID_HOOKS = ['portalAdded', 'portalDetailsUpdated', - 'publicChatDataAvailable', 'portalDataLoaded', 'beforePortalReRender', - 'checkRenderLimit']; + 'publicChatDataAvailable', 'portalDataLoaded', 'beforePortalReRender']; window.runHooks = function(event, data) { if(VALID_HOOKS.indexOf(event) === -1) throw('Unknown event type: ' + event); diff --git a/code/utils_misc.js b/code/utils_misc.js index 6638955f..48704d0c 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -128,9 +128,7 @@ window.renderLimitReached = function() { if(Object.keys(portals).length >= MAX_DRAWN_PORTALS) return true; if(Object.keys(links).length >= MAX_DRAWN_LINKS) return true; if(Object.keys(fields).length >= MAX_DRAWN_FIELDS) return true; - var param = { 'reached': false }; - window.runHooks('checkRenderLimit', param); - return param.reached; + return false; } window.getMinPortalLevel = function() { diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 5a7d2476..b1cd801f 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -20,10 +20,9 @@ function wrapper() { // use own namespace for plugin window.plugin.maxLinks = function() {}; - - window.plugin.maxLinks.MAX_DRAWN_LINKS = 400; + var MAX_LINK_COLOR = '#FF0000'; - + var Triangle = function (a, b, c) { this.a = a; this.b = b; @@ -204,8 +203,7 @@ function wrapper() { window.plugin.maxLinks.layer = null; - var updating = false; - var renderLimitReached = false; + var updating = false; window.plugin.maxLinks.updateLayer = function() { if (updating || window.plugin.maxLinks.layer === null || !window.map.hasLayer(window.plugin.maxLinks.layer)) return; @@ -232,28 +230,14 @@ function wrapper() { }); var triangles = window.plugin.maxLinks.triangulate(locations); - var drawnLinks = 0; - renderLimitReached = false; $.each(triangles, function(idx, triangle) { - if (drawnLinks <= window.plugin.maxLinks.MAX_DRAWN_LINKS) { - triangle.draw(window.plugin.maxLinks.layer, minX, minY); - drawnLinks += 3; - } else { - renderLimitReached = true; - } + triangle.draw(window.plugin.maxLinks.layer, minX, minY) }); updating = false; - window.renderUpdateStatus(); } var setup = function() { window.plugin.maxLinks.layer = L.layerGroup([]); - - window.addHook('checkRenderLimit', function(e) { - if (window.map.hasLayer(window.plugin.maxLinks.layer) && renderLimitReached) - e.reached = true; - }); - window.map.on('layeradd', function(e) { if (e.layer === window.plugin.maxLinks.layer) window.plugin.maxLinks.updateLayer(); From de39c45a3417dbd828c181e44f862edfe8b72386 Mon Sep 17 00:00:00 2001 From: Florian Sundermann Date: Mon, 25 Feb 2013 08:56:39 +0100 Subject: [PATCH 30/74] added a renderlimit --- plugins/max-links.user.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index b1cd801f..9815f350 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -20,7 +20,7 @@ function wrapper() { // use own namespace for plugin window.plugin.maxLinks = function() {}; - + window.plugin.maxLinks.MAX_DRAWN_LINKS = 400; var MAX_LINK_COLOR = '#FF0000'; var Triangle = function (a, b, c) { @@ -203,7 +203,8 @@ function wrapper() { window.plugin.maxLinks.layer = null; - var updating = false; + var updating = false; + var renderLimitReached = false; window.plugin.maxLinks.updateLayer = function() { if (updating || window.plugin.maxLinks.layer === null || !window.map.hasLayer(window.plugin.maxLinks.layer)) return; @@ -230,14 +231,26 @@ function wrapper() { }); var triangles = window.plugin.maxLinks.triangulate(locations); + var drawnLinks = 0; + renderLimitReached = false; $.each(triangles, function(idx, triangle) { - triangle.draw(window.plugin.maxLinks.layer, minX, minY) + if (drawnLinks <= window.plugin.maxLinks.MAX_DRAWN_LINKS) { + triangle.draw(window.plugin.maxLinks.layer, minX, minY) + drawnLinks += 3; + } else { + renderLimitReached = true; + } }); updating = false; + window.renderUpdateStatus(); } var setup = function() { window.plugin.maxLinks.layer = L.layerGroup([]); + window.addHook('checkRenderLimit', function(e) { + if (window.map.hasLayer(window.plugin.maxLinks.layer) && renderLimitReached) + e.reached = true; + }); window.map.on('layeradd', function(e) { if (e.layer === window.plugin.maxLinks.layer) window.plugin.maxLinks.updateLayer(); From 286a4ba37677136b91b54908502511bd62679e15 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Mon, 25 Feb 2013 09:21:48 +0100 Subject: [PATCH 31/74] update position method when players attack multiple portals at once. It now takes repetition into account, e.g. if one burster destroys 4 resos on porta A and only one on B she is now placed closer to A rather than in the middle of both. --- plugins/player-tracker.user.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/plugins/player-tracker.user.js b/plugins/player-tracker.user.js index 08cf3bdf..8595f971 100644 --- a/plugins/player-tracker.user.js +++ b/plugins/player-tracker.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-player-tracker@breunigs // @name iitc: player tracker -// @version 0.5 +// @version 0.6 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/player-tracker.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/player-tracker.user.js @@ -163,13 +163,14 @@ window.plugin.playerTracker.processNewData = function(data) { } window.plugin.playerTracker.getLatLngFromEvent = function(ev) { - var lats = $.map(ev.latlngs, function(ll) { return [ll[0]] }); - var lngs = $.map(ev.latlngs, function(ll) { return [ll[1]] }); - var latmax = Math.max.apply(null, lats); - var latmin = Math.min.apply(null, lats); - var lngmax = Math.max.apply(null, lngs); - var lngmin = Math.min.apply(null, lngs); - return L.latLng((latmax + latmin) / 2, (lngmax + lngmin) / 2); + var lats = 0; + var lngs = 0; + $.each(ev.latlngs, function() { + lats += this[0]; + lngs += this[1]; + }); + + return L.latLng(lats / ev.latlngs.length, lngs / ev.latlngs.length); } window.plugin.playerTracker.ago = function(time, now) { From 9748664b20efd649246e00d826d04f7d808165c1 Mon Sep 17 00:00:00 2001 From: boombuler Date: Mon, 25 Feb 2013 10:19:24 +0100 Subject: [PATCH 32/74] moved delaunay algorithm to external file --- dist/delaunay.js | 169 ++++++++++++++++++++++++++++ plugins/max-links.user.js | 227 ++++++-------------------------------- 2 files changed, 205 insertions(+), 191 deletions(-) create mode 100644 dist/delaunay.js diff --git a/dist/delaunay.js b/dist/delaunay.js new file mode 100644 index 00000000..c4533930 --- /dev/null +++ b/dist/delaunay.js @@ -0,0 +1,169 @@ + // Source from https://github.com/ironwallaby/delaunay + + window.delaunay = function() {}; + + window.delaunay.Triangle = function (a, b, c) { + this.a = a + this.b = b + this.c = c + + var A = b.x - a.x, + B = b.y - a.y, + C = c.x - a.x, + D = c.y - a.y, + E = A * (a.x + b.x) + B * (a.y + b.y), + F = C * (a.x + c.x) + D * (a.y + c.y), + G = 2 * (A * (c.y - b.y) - B * (c.x - b.x)), + minx, miny, dx, dy + + /* If the points of the triangle are collinear, then just find the + * extremes and use the midpoint as the center of the circumcircle. */ + if(Math.abs(G) < 0.000001) { + minx = Math.min(a.x, b.x, c.x) + miny = Math.min(a.y, b.y, c.y) + dx = (Math.max(a.x, b.x, c.x) - minx) * 0.5 + dy = (Math.max(a.y, b.y, c.y) - miny) * 0.5 + + this.x = minx + dx + this.y = miny + dy + this.r = dx * dx + dy * dy + } + + else { + this.x = (D*E - B*F) / G + this.y = (A*F - C*E) / G + dx = this.x - a.x + dy = this.y - a.y + this.r = dx * dx + dy * dy + } + } + + function byX(a, b) { + return b.x - a.x + } + + function dedup(edges) { + var j = edges.length, + a, b, i, m, n + + outer: while(j) { + b = edges[--j] + a = edges[--j] + i = j + while(i) { + n = edges[--i] + m = edges[--i] + if((a === m && b === n) || (a === n && b === m)) { + edges.splice(j, 2) + edges.splice(i, 2) + j -= 2 + continue outer + } + } + } + } + + window.delaunay.triangulate = function (vertices) { + /* Bail if there aren't enough vertices to form any triangles. */ + if(vertices.length < 3) + return [] + + /* Ensure the vertex array is in order of descending X coordinate + * (which is needed to ensure a subquadratic runtime), and then find + * the bounding box around the points. */ + vertices.sort(byX) + + var i = vertices.length - 1, + xmin = vertices[i].x, + xmax = vertices[0].x, + ymin = vertices[i].y, + ymax = ymin + + while(i--) { + if(vertices[i].y < ymin) ymin = vertices[i].y + if(vertices[i].y > ymax) ymax = vertices[i].y + } + + /* Find a supertriangle, which is a triangle that surrounds all the + * vertices. This is used like something of a sentinel value to remove + * cases in the main algorithm, and is removed before we return any + * results. + * + * Once found, put it in the "open" list. (The "open" list is for + * triangles who may still need to be considered; the "closed" list is + * for triangles which do not.) */ + var dx = xmax - xmin, + dy = ymax - ymin, + dmax = (dx > dy) ? dx : dy, + xmid = (xmax + xmin) * 0.5, + ymid = (ymax + ymin) * 0.5, + open = [ + new window.delaunay.Triangle( + {x: xmid - 20 * dmax, y: ymid - dmax, __sentinel: true}, + {x: xmid , y: ymid + 20 * dmax, __sentinel: true}, + {x: xmid + 20 * dmax, y: ymid - dmax, __sentinel: true} + ) + ], + closed = [], + edges = [], + j, a, b + + /* Incrementally add each vertex to the mesh. */ + i = vertices.length + while(i--) { + /* For each open triangle, check to see if the current point is + * inside it's circumcircle. If it is, remove the triangle and add + * it's edges to an edge list. */ + edges.length = 0 + j = open.length + while(j--) { + /* If this point is to the right of this triangle's circumcircle, + * then this triangle should never get checked again. Remove it + * from the open list, add it to the closed list, and skip. */ + dx = vertices[i].x - open[j].x + if(dx > 0 && dx * dx > open[j].r) { + closed.push(open[j]) + open.splice(j, 1) + continue + } + + /* If not, skip this triangle. */ + dy = vertices[i].y - open[j].y + if(dx * dx + dy * dy > open[j].r) + continue + + /* Remove the triangle and add it's edges to the edge list. */ + edges.push( + open[j].a, open[j].b, + open[j].b, open[j].c, + open[j].c, open[j].a + ) + open.splice(j, 1) + } + + /* Remove any doubled edges. */ + dedup(edges) + + /* Add a new triangle for each edge. */ + j = edges.length + while(j) { + b = edges[--j] + a = edges[--j] + open.push(new window.delaunay.Triangle(a, b, vertices[i])) + } + } + + /* Copy any remaining open triangles to the closed list, and then + * remove any triangles that share a vertex with the supertriangle. */ + Array.prototype.push.apply(closed, open) + + i = closed.length + while(i--) + if(closed[i].a.__sentinel || + closed[i].b.__sentinel || + closed[i].c.__sentinel) + closed.splice(i, 1) + + /* Yay, we're done! */ + return closed + } \ No newline at end of file diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 5a7d2476..3f435897 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -9,8 +9,6 @@ // @match http://www.ingress.com/intel* // ==/UserScript== -// The algorithm is taken from https://github.com/ironwallaby/delaunay - function wrapper() { // ensure plugin framework is there, even if iitc is not yet loaded if(typeof window.plugin !== 'function') @@ -21,191 +19,24 @@ function wrapper() { // use own namespace for plugin window.plugin.maxLinks = function() {}; + // const values window.plugin.maxLinks.MAX_DRAWN_LINKS = 400; - var MAX_LINK_COLOR = '#FF0000'; - - var Triangle = function (a, b, c) { - this.a = a; - this.b = b; - this.c = c; - - var A = b.x - a.x, - B = b.y - a.y, - C = c.x - a.x, - D = c.y - a.y, - E = A * (a.x + b.x) + B * (a.y + b.y), - F = C * (a.x + c.x) + D * (a.y + c.y), - G = 2 * (A * (c.y - b.y) - B * (c.x - b.x)), - minx, miny, dx, dy - - /* If the points of the triangle are collinear, then just find the - * extremes and use the midpoint as the center of the circumcircle. */ - if(Math.abs(G) < 0.000001) { - minx = Math.min(a.x, b.x, c.x) - miny = Math.min(a.y, b.y, c.y) - dx = (Math.max(a.x, b.x, c.x) - minx) * 0.5 - dy = (Math.max(a.y, b.y, c.y) - miny) * 0.5 - - this.x = minx + dx - this.y = miny + dy - this.r = dx * dx + dy * dy - } else { - this.x = (D*E - B*F) / G - this.y = (A*F - C*E) / G - dx = this.x - a.x - dy = this.y - a.y - this.r = dx * dx + dy * dy - } - } - - Triangle.prototype.draw = function(layer, divX, divY) { - var drawLine = function(src, dest) { - var poly = L.polyline([[(src.y + divY)/1E6, (src.x + divX)/1E6], - [(dest.y + divY)/1E6, (dest.x + divX)/1E6]], { - color: MAX_LINK_COLOR, - opacity: 1, - weight:2, - clickable: false, - smoothFactor: 10 - }); - poly.addTo(layer); - }; - - drawLine(this.a, this.b); - drawLine(this.b, this.c); - drawLine(this.c, this.a); - } + var STROKE_STYLE = { + color: '#FF0000', + opacity: 1, + weight:2, + clickable: false, + smoothFactor: 10 + }; + var delaunayScriptLocation = "https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/delaunay.js"; - var dedup = function (edges) { - var j = edges.length, a, b, i, m, n; - outer: while(j) { - b = edges[--j]; - a = edges[--j]; - i = j; - while(i) { - n = edges[--i]; - m = edges[--i]; - if((a === m && b === n) || (a === n && b === m)) { - edges.splice(j, 2); - edges.splice(i, 2); - j -= 2; - continue outer; - } - } - } - } - - window.plugin.maxLinks.triangulate = function (vertices) { - /* Bail if there aren't enough vertices to form any triangles. */ - if(vertices.length < 3) - return [] - /* Ensure the vertex array is in order of descending X coordinate - * (which is needed to ensure a subquadratic runtime), and then find - * the bounding box around the points. */ - vertices.sort(function (a, b) { return b.x - a.x }); - - var i = vertices.length - 1, - xmin = vertices[i].x, - xmax = vertices[0].x, - ymin = vertices[i].y, - ymax = ymin; - - while(i--) { - if(vertices[i].y < ymin) - ymin = vertices[i].y; - if(vertices[i].y > ymax) - ymax = vertices[i].y; - } - - /* Find a supertriangle, which is a triangle that surrounds all the - * vertices. This is used like something of a sentinel value to remove - * cases in the main algorithm, and is removed before we return any - * results. - * - * Once found, put it in the "open" list. (The "open" list is for - * triangles who may still need to be considered; the "closed" list is - * for triangles which do not.) */ - var dx = xmax - xmin, - dy = ymax - ymin, - dmax = (dx > dy) ? dx : dy, - xmid = (xmax + xmin) * 0.5, - ymid = (ymax + ymin) * 0.5, - open = [ - new Triangle( - {x: xmid - 20 * dmax, y: ymid - dmax, __sentinel: true}, - {x: xmid , y: ymid + 20 * dmax, __sentinel: true}, - {x: xmid + 20 * dmax, y: ymid - dmax, __sentinel: true} - ) - ], - closed = [], - edges = [], - j, a, b; - - /* Incrementally add each vertex to the mesh. */ - i = vertices.length; - while(i--) { - /* For each open triangle, check to see if the current point is - * inside it's circumcircle. If it is, remove the triangle and add - * it's edges to an edge list. */ - edges.length = 0; - j = open.length; - while(j--) { - /* If this point is to the right of this triangle's circumcircle, - * then this triangle should never get checked again. Remove it - * from the open list, add it to the closed list, and skip. */ - dx = vertices[i].x - open[j].x; - if(dx > 0 && dx * dx > open[j].r) { - closed.push(open[j]); - open.splice(j, 1); - continue; - } - - /* If not, skip this triangle. */ - dy = vertices[i].y - open[j].y; - if(dx * dx + dy * dy > open[j].r) - continue; - - /* Remove the triangle and add it's edges to the edge list. */ - edges.push( - open[j].a, open[j].b, - open[j].b, open[j].c, - open[j].c, open[j].a - ); - open.splice(j, 1); - } - - /* Remove any doubled edges. */ - dedup(edges); - - /* Add a new triangle for each edge. */ - j = edges.length; - while(j) { - b = edges[--j]; - a = edges[--j]; - open.push(new Triangle(a, b, vertices[i])); - } - } - - /* Copy any remaining open triangles to the closed list, and then - * remove any triangles that share a vertex with the supertriangle. */ - Array.prototype.push.apply(closed, open); - - i = closed.length; - while(i--) { - if(closed[i].a.__sentinel || closed[i].b.__sentinel || closed[i].c.__sentinel) - closed.splice(i, 1); - } - - /* Yay, we're done! */ - return closed; - } - window.plugin.maxLinks.layer = null; var updating = false; - var renderLimitReached = false; + var renderLimitReached = false; + window.plugin.maxLinks.updateLayer = function() { if (updating || window.plugin.maxLinks.layer === null || !window.map.hasLayer(window.plugin.maxLinks.layer)) return; @@ -231,7 +62,7 @@ function wrapper() { nloc.y += Math.abs(minY); }); - var triangles = window.plugin.maxLinks.triangulate(locations); + var triangles = window.delaunay.triangulate(locations); var drawnLinks = 0; renderLimitReached = false; $.each(triangles, function(idx, triangle) { @@ -247,19 +78,33 @@ function wrapper() { } var setup = function() { - window.plugin.maxLinks.layer = L.layerGroup([]); + load(delaunayScriptLocation).thenRun(function() { + + window.delaunay.Triangle.prototype.draw = function(layer, divX, divY) { + var drawLine = function(src, dest) { + var poly = L.polyline([[(src.y + divY)/1E6, (src.x + divX)/1E6], [(dest.y + divY)/1E6, (dest.x + divX)/1E6]], STROKE_STYLE); + poly.addTo(layer); + }; + + drawLine(this.a, this.b); + drawLine(this.b, this.c); + drawLine(this.c, this.a); + } + + window.plugin.maxLinks.layer = L.layerGroup([]); - window.addHook('checkRenderLimit', function(e) { - if (window.map.hasLayer(window.plugin.maxLinks.layer) && renderLimitReached) - e.reached = true; - }); + window.addHook('checkRenderLimit', function(e) { + if (window.map.hasLayer(window.plugin.maxLinks.layer) && renderLimitReached) + e.reached = true; + }); - window.map.on('layeradd', function(e) { - if (e.layer === window.plugin.maxLinks.layer) - window.plugin.maxLinks.updateLayer(); + window.map.on('layeradd', function(e) { + if (e.layer === window.plugin.maxLinks.layer) + window.plugin.maxLinks.updateLayer(); + }); + window.map.on('zoomend moveend', window.plugin.maxLinks.updateLayer); + window.layerChooser.addOverlay(window.plugin.maxLinks.layer, 'Maximum Links'); }); - window.map.on('zoomend moveend', window.plugin.maxLinks.updateLayer); - window.layerChooser.addOverlay(window.plugin.maxLinks.layer, 'Maximum Links'); } // PLUGIN END ////////////////////////////////////////////////////////// From c86e8608bf13d278b840adf05e402c1012404a25 Mon Sep 17 00:00:00 2001 From: boombuler Date: Mon, 25 Feb 2013 10:41:02 +0100 Subject: [PATCH 33/74] support increased render limit within the plugin --- plugins/max-links.user.js | 6 ++++-- plugins/render-limit-increase.user.js | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 86a86447..416d7852 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -20,7 +20,8 @@ function wrapper() { window.plugin.maxLinks = function() {}; // const values - window.plugin.maxLinks.MAX_DRAWN_LINKS = 400; + var MAX_DRAWN_LINKS = 400; + var MAX_DRAWN_LINKS_INCREASED_LIMIT = 1000; var STROKE_STYLE = { color: '#FF0000', opacity: 1, @@ -63,8 +64,9 @@ function wrapper() { var triangles = window.delaunay.triangulate(locations); var drawnLinks = 0; renderLimitReached = false; + var renderlimit = window.USE_INCREASED_RENDER_LIMIT ? MAX_DRAWN_LINKS_INCREASED_LIMIT : MAX_DRAWN_LINKS; $.each(triangles, function(idx, triangle) { - if (drawnLinks <= window.plugin.maxLinks.MAX_DRAWN_LINKS) { + if (drawnLinks <= renderlimit) { triangle.draw(window.plugin.maxLinks.layer, minX, minY) drawnLinks += 3; } else { diff --git a/plugins/render-limit-increase.user.js b/plugins/render-limit-increase.user.js index 56e66b9a..dddd9c19 100644 --- a/plugins/render-limit-increase.user.js +++ b/plugins/render-limit-increase.user.js @@ -39,7 +39,7 @@ window.plugin.renderLimitIncrease.setHigherLimits = function() { window.MAX_DRAWN_PORTALS = 3000; window.MAX_DRAWN_LINKS = 1000; window.MAX_DRAWN_FIELDS = 500; - + window.USE_INCREASED_RENDER_LIMIT = true; // Used for other plugins }; var setup = window.plugin.renderLimitIncrease.setHigherLimits; From e9135e8fbba0f90eef9e35d7b7ea9d170ff934d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cheng=20=28=E9=84=AD=E9=83=81=E9=82=A6=29?= Date: Mon, 25 Feb 2013 21:24:35 +0800 Subject: [PATCH 34/74] Add "j16sdiz" to contrib --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 68662e92..3827c39b 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,7 @@ Please do! [cmrn](https://github.com/cmrn), [epf](https://github.com/epf), [integ3r](https://github.com/integ3r), +[j16sdiz](https://github.com/j16sdiz), [JasonMillward](https://github.com/JasonMillward), [jonatkins](https://github.com/jonatkins), [mledoze](https://github.com/mledoze), From 107f4689e92c9490a44213e1c1f3b57018f8ac5e Mon Sep 17 00:00:00 2001 From: Axel Wagner Date: Mon, 25 Feb 2013 16:21:03 +0100 Subject: [PATCH 35/74] Replace gmaps-link by popup with qrcode and links If you want to use your smartphone for navigation, you can now just scan the qr-code and (if your scanner-app supports it) directly input the locations to your navigation-app. Additionally a link to the location in gapps and OSM will be displayed. --- code/boot.js | 4 +++- code/portal_detail_display.js | 4 ++-- code/utils_misc.js | 8 ++++++++ style.css | 5 +++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/code/boot.js b/code/boot.js index 4f231010..c1e1d515 100644 --- a/code/boot.js +++ b/code/boot.js @@ -297,6 +297,7 @@ function asyncLoadScript(a){return function(b,c){var d=document.createElement("s var LEAFLETGOOGLE = 'http://breunigs.github.com/ingress-intel-total-conversion/dist/leaflet_google.js'; var JQUERY = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'; var JQUERYUI = 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min.js'; +var JQUERYQRCODE = 'http://jeromeetienne.github.com/jquery-qrcode/jquery.qrcode.min.js'; var LEAFLET = 'http://cdn.leafletjs.com/leaflet-0.5/leaflet.js'; var AUTOLINK = 'http://breunigs.github.com/ingress-intel-total-conversion/dist/autolink.js'; var EMPTY = 'data:text/javascript;base64,'; @@ -305,12 +306,13 @@ var EMPTY = 'data:text/javascript;base64,'; var ir = window && window.internalResources ? window.internalResources : []; if(ir.indexOf('jquery') !== -1) JQUERY = EMPTY; if(ir.indexOf('jqueryui') !== -1) JQUERYUI = EMPTY; +if(ir.indexOf('jqueryqrcode') !== -1) JQUERYQRCODE = EMPTY; if(ir.indexOf('leaflet') !== -1) LEAFLET = EMPTY; if(ir.indexOf('autolink') !== -1) AUTOLINK = EMPTY; if(ir.indexOf('leafletgoogle') !== -1) LEAFLETGOOGLE = EMPTY; // after all scripts have loaded, boot the actual app -load(JQUERY, LEAFLET, AUTOLINK).then(LEAFLETGOOGLE, JQUERYUI).onError(function (err) { +load(JQUERY, LEAFLET, AUTOLINK).then(LEAFLETGOOGLE, JQUERYUI, JQUERYQRCODE).onError(function (err) { alert('Could not all resources, the script likely won’t work.\n\nIf this happend the first time for you, it’s probably a temporary issue. Just wait a bit and try again.\n\nIf you installed the script for the first time and this happens:\n– try disabling NoScript if you have it installed\n– press CTRL+SHIFT+K in Firefox or CTRL+SHIFT+I in Chrome/Opera and reload the page. Additional info may be available in the console.\n– Open an issue at https://github.com/breunigs/ingress-intel-total-conversion/issues'); }).thenRun(boot); diff --git a/code/portal_detail_display.js b/code/portal_detail_display.js index f930d5ca..7d02d424 100644 --- a/code/portal_detail_display.js +++ b/code/portal_detail_display.js @@ -50,7 +50,7 @@ window.renderPortalDetails = function(guid) { var lng = d.locationE6.lngE6; var perma = 'http://ingress.com/intel?latE6='+lat+'&lngE6='+lng+'&z=17&pguid='+guid; var imgTitle = 'title="'+getPortalDescriptionFromDetails(d)+'\n\nClick to show full image."'; - var gmaps = 'https://maps.google.com/?q='+lat/1E6+','+lng/1E6; + var poslinks = 'window.showPortalPosLinks('+lat/1E6+','+lng/1E6+')'; var postcard = 'Send in a postcard. Will put it online after receiving. Address:\\n\\nStefan Breunig\\nINF 305 – R045\\n69120 Heidelberg\\nGermany'; $('#portaldetails') @@ -66,7 +66,7 @@ window.renderPortalDetails = function(guid) { + randDetails + resoDetails + '
'+ '' - + '' + + '' + '' + '' + '
' diff --git a/code/utils_misc.js b/code/utils_misc.js index 8600a0ed..ab139d08 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -96,6 +96,14 @@ window.rangeLinkClick = function() { window.smartphone.mapButton.click(); } +window.showPortalPosLinks = function(lat, lng) { + var qrcode = '
'; + var script = ''; + var gmaps = 'gmaps'; + var osm = 'OSM'; + alert(qrcode + script + gmaps + " " + osm); +} + window.reportPortalIssue = function(info) { var t = 'Redirecting you to a Google Help Page. Once there, click on “Contact Us” in the upper right corner.\n\nThe text box contains all necessary information. Press CTRL+C to copy it.'; var d = window.portals[window.selectedPortal].options.details; diff --git a/style.css b/style.css index 43bc610c..07b3688a 100644 --- a/style.css +++ b/style.css @@ -686,6 +686,11 @@ aside { overflow-x: hidden; max-height: 600px !important; max-width: 700px !important; + text-align: center; +} + +.ui-dialog a { + color: #0000ca; } .ui-dialog-buttonpane { From 0767230489c0244d4ce72ff0d8acafecdaae197a Mon Sep 17 00:00:00 2001 From: Axel Wagner Date: Mon, 25 Feb 2013 17:55:37 +0100 Subject: [PATCH 36/74] Make changes asked by breunigs --- code/utils_misc.js | 4 ++-- style.css | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/utils_misc.js b/code/utils_misc.js index ab139d08..dd1eff0a 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -98,10 +98,10 @@ window.rangeLinkClick = function() { window.showPortalPosLinks = function(lat, lng) { var qrcode = '
'; - var script = ''; + var script = ''; var gmaps = 'gmaps'; var osm = 'OSM'; - alert(qrcode + script + gmaps + " " + osm); + alert('
' + qrcode + script + gmaps + ' ' + osm + '
'); } window.reportPortalIssue = function(info) { diff --git a/style.css b/style.css index 07b3688a..d4e30170 100644 --- a/style.css +++ b/style.css @@ -686,7 +686,6 @@ aside { overflow-x: hidden; max-height: 600px !important; max-width: 700px !important; - text-align: center; } .ui-dialog a { From 3acba81b5e49f33fb5edf31cfc289983adbea9a4 Mon Sep 17 00:00:00 2001 From: Axel Wagner Date: Mon, 25 Feb 2013 17:56:19 +0100 Subject: [PATCH 37/74] Add Merovius to contributors --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 68662e92..252bea51 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ Please do! [integ3r](https://github.com/integ3r), [JasonMillward](https://github.com/JasonMillward), [jonatkins](https://github.com/jonatkins), +[Merovius](https://github.com/Merovius), [mledoze](https://github.com/mledoze), [OshiHidra](https://github.com/OshiHidra), [phoenixsong6](https://github.com/phoenixsong6), From 027e13778b424df980ba304785e36a940349107e Mon Sep 17 00:00:00 2001 From: boombuler Date: Mon, 25 Feb 2013 20:14:12 +0100 Subject: [PATCH 38/74] fixed coding style --- plugins/max-links.user.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 416d7852..0b66a5d7 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -23,13 +23,13 @@ function wrapper() { var MAX_DRAWN_LINKS = 400; var MAX_DRAWN_LINKS_INCREASED_LIMIT = 1000; var STROKE_STYLE = { - color: '#FF0000', - opacity: 1, - weight:2, - clickable: false, - smoothFactor: 10 - }; - var delaunayScriptLocation = "https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/delaunay.js"; + color: '#FF0000', + opacity: 1, + weight:2, + clickable: false, + smoothFactor: 10 + }; + var delaunayScriptLocation = 'https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/delaunay.js'; window.plugin.maxLinks.layer = null; From dc058939f40ccf2e20f47e86ec079a3f66f1b1ba Mon Sep 17 00:00:00 2001 From: boombuler Date: Mon, 25 Feb 2013 20:18:04 +0100 Subject: [PATCH 39/74] moved constants to namespace --- plugins/max-links.user.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 0b66a5d7..668089e2 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -20,9 +20,9 @@ function wrapper() { window.plugin.maxLinks = function() {}; // const values - var MAX_DRAWN_LINKS = 400; - var MAX_DRAWN_LINKS_INCREASED_LIMIT = 1000; - var STROKE_STYLE = { + window.plugin.maxLinks.MAX_DRAWN_LINKS = 400; + window.plugin.maxLinks.MAX_DRAWN_LINKS_INCREASED_LIMIT = 1000; + window.plugin.maxLinks.STROKE_STYLE = { color: '#FF0000', opacity: 1, weight:2, @@ -64,7 +64,7 @@ function wrapper() { var triangles = window.delaunay.triangulate(locations); var drawnLinks = 0; renderLimitReached = false; - var renderlimit = window.USE_INCREASED_RENDER_LIMIT ? MAX_DRAWN_LINKS_INCREASED_LIMIT : MAX_DRAWN_LINKS; + var renderlimit = window.USE_INCREASED_RENDER_LIMIT ? window.plugin.maxLinks.MAX_DRAWN_LINKS_INCREASED_LIMIT : window.plugin.maxLinks.MAX_DRAWN_LINKS; $.each(triangles, function(idx, triangle) { if (drawnLinks <= renderlimit) { triangle.draw(window.plugin.maxLinks.layer, minX, minY) @@ -82,7 +82,7 @@ function wrapper() { window.delaunay.Triangle.prototype.draw = function(layer, divX, divY) { var drawLine = function(src, dest) { - var poly = L.polyline([[(src.y + divY)/1E6, (src.x + divX)/1E6], [(dest.y + divY)/1E6, (dest.x + divX)/1E6]], STROKE_STYLE); + var poly = L.polyline([[(src.y + divY)/1E6, (src.x + divX)/1E6], [(dest.y + divY)/1E6, (dest.x + divX)/1E6]], window.plugin.maxLinks.STROKE_STYLE); poly.addTo(layer); }; From c75b99a079d758a907174ab59136bead7777ed57 Mon Sep 17 00:00:00 2001 From: boombuler Date: Mon, 25 Feb 2013 20:21:26 +0100 Subject: [PATCH 40/74] added some linebreaks --- plugins/max-links.user.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 668089e2..586beb16 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -37,7 +37,8 @@ function wrapper() { var renderLimitReached = false; window.plugin.maxLinks.updateLayer = function() { - if (updating || window.plugin.maxLinks.layer === null || !window.map.hasLayer(window.plugin.maxLinks.layer)) + if (updating || window.plugin.maxLinks.layer === null || + !window.map.hasLayer(window.plugin.maxLinks.layer)) return; updating = true; window.plugin.maxLinks.layer.clearLayers(); @@ -64,7 +65,9 @@ function wrapper() { var triangles = window.delaunay.triangulate(locations); var drawnLinks = 0; renderLimitReached = false; - var renderlimit = window.USE_INCREASED_RENDER_LIMIT ? window.plugin.maxLinks.MAX_DRAWN_LINKS_INCREASED_LIMIT : window.plugin.maxLinks.MAX_DRAWN_LINKS; + var renderlimit = window.USE_INCREASED_RENDER_LIMIT ? + window.plugin.maxLinks.MAX_DRAWN_LINKS_INCREASED_LIMIT : + window.plugin.maxLinks.MAX_DRAWN_LINKS; $.each(triangles, function(idx, triangle) { if (drawnLinks <= renderlimit) { triangle.draw(window.plugin.maxLinks.layer, minX, minY) From 0f728944bd757e1f7ee98b8306583662dc9e8ace Mon Sep 17 00:00:00 2001 From: boombuler Date: Mon, 25 Feb 2013 20:24:01 +0100 Subject: [PATCH 41/74] fixed typo --- plugins/max-links.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 586beb16..1063cf98 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -53,7 +53,7 @@ function wrapper() { if (nloc.x < minX) minX = nloc.x; if (nloc.y < minX) - minX = nloc.y; + minY = nloc.y; locations.push(nloc); }); From ca6fb9952ba4be62ba4a0e6e58549aa5d26f69ad Mon Sep 17 00:00:00 2001 From: boombuler Date: Mon, 25 Feb 2013 20:27:10 +0100 Subject: [PATCH 42/74] added link to the screenshot to the readme --- plugins/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/README.md b/plugins/README.md index 86280f0e..6d484586 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -13,7 +13,7 @@ Available Plugins - [**Draw Tools**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/draw-tools.user.js) allows to draw circles and lines on the map to aid you with planning your next big field. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_draw_tools.png) - [**Guess Player Level**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/guess-player-levels.user.js) looks for the highest placed resonator per player in the current view to guess the player level. - [**Highlight Weakened Portals**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-portal-weakness.user.js) fill portals with red to indicate portal's state of disrepair. The brighter the color the more attention needed (recharge, shields, resonators). A dashed portal means a resonator is missing. Red, needs energy and shields. Orange, only needs energy (either recharge or resonators). Yellow, only needs shields. -- [**Max-Links**]((https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/max-links.user.js) Calculates how to link the portals to create the maximum number of fields. +- [**Max-Links**]((https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/max-links.user.js) Calculates how to link the portals to create the maximum number of fields. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_max_links.png) - [**Player Tracker**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/player-tracker.user.js) Draws trails for user actions in the last hour. At the last known location there’s a tooltip that shows the data in a table. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_player_tracker.png). - [**Render Limit Increase**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/render-limit-increase.user.js) increases render limits. Good for high density areas (e.g. London, UK) and faster PCs. - [**Resonator Display Zoom Level Decrease**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/resonator-display-zoom-level-decrease.user.js) Resonator start displaying earlier. From a392c0446981477007a88ce91bc850f908a52c85 Mon Sep 17 00:00:00 2001 From: boombuler Date: Mon, 25 Feb 2013 20:34:25 +0100 Subject: [PATCH 43/74] unindented the wrapper function. --- plugins/max-links.user.js | 186 +++++++++++++++++++------------------- 1 file changed, 94 insertions(+), 92 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 1063cf98..053c601e 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -10,115 +10,117 @@ // ==/UserScript== function wrapper() { - // ensure plugin framework is there, even if iitc is not yet loaded - if(typeof window.plugin !== 'function') - window.plugin = function() {}; - // PLUGIN START //////////////////////////////////////////////////////// +// ensure plugin framework is there, even if iitc is not yet loaded +if(typeof window.plugin !== 'function') + window.plugin = function() {}; - // use own namespace for plugin - window.plugin.maxLinks = function() {}; +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.maxLinks = function() {}; - // const values - window.plugin.maxLinks.MAX_DRAWN_LINKS = 400; - window.plugin.maxLinks.MAX_DRAWN_LINKS_INCREASED_LIMIT = 1000; - window.plugin.maxLinks.STROKE_STYLE = { - color: '#FF0000', - opacity: 1, - weight:2, - clickable: false, - smoothFactor: 10 - }; - var delaunayScriptLocation = 'https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/delaunay.js'; +// const values +window.plugin.maxLinks.MAX_DRAWN_LINKS = 400; +window.plugin.maxLinks.MAX_DRAWN_LINKS_INCREASED_LIMIT = 1000; +window.plugin.maxLinks.STROKE_STYLE = { + color: '#FF0000', + opacity: 1, + weight:2, + clickable: false, + smoothFactor: 10 +}; +var delaunayScriptLocation = 'https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/delaunay.js'; - window.plugin.maxLinks.layer = null; +window.plugin.maxLinks.layer = null; - var updating = false; - var renderLimitReached = false; +var updating = false; +var renderLimitReached = false; - window.plugin.maxLinks.updateLayer = function() { - if (updating || window.plugin.maxLinks.layer === null || - !window.map.hasLayer(window.plugin.maxLinks.layer)) - return; - updating = true; - window.plugin.maxLinks.layer.clearLayers(); +window.plugin.maxLinks.updateLayer = function() { + if (updating || window.plugin.maxLinks.layer === null || + !window.map.hasLayer(window.plugin.maxLinks.layer)) + return; + updating = true; + window.plugin.maxLinks.layer.clearLayers(); - var locations = []; - var minX = 0; - var minY = 0; + var locations = []; + var minX = 0; + var minY = 0; - $.each(window.portals, function(guid, portal) { - var loc = portal.options.details.locationE6; - var nloc = { x: loc.lngE6, y: loc.latE6 }; - if (nloc.x < minX) - minX = nloc.x; - if (nloc.y < minX) - minY = nloc.y; - locations.push(nloc); - }); + $.each(window.portals, function(guid, portal) { + var loc = portal.options.details.locationE6; + var nloc = { x: loc.lngE6, y: loc.latE6 }; + if (nloc.x < minX) + minX = nloc.x; + if (nloc.y < minX) + minY = nloc.y; + locations.push(nloc); + }); - $.each(locations, function(idx, nloc) { - nloc.x += Math.abs(minX); - nloc.y += Math.abs(minY); - }); + $.each(locations, function(idx, nloc) { + nloc.x += Math.abs(minX); + nloc.y += Math.abs(minY); + }); - var triangles = window.delaunay.triangulate(locations); - var drawnLinks = 0; - renderLimitReached = false; - var renderlimit = window.USE_INCREASED_RENDER_LIMIT ? - window.plugin.maxLinks.MAX_DRAWN_LINKS_INCREASED_LIMIT : - window.plugin.maxLinks.MAX_DRAWN_LINKS; - $.each(triangles, function(idx, triangle) { - if (drawnLinks <= renderlimit) { - triangle.draw(window.plugin.maxLinks.layer, minX, minY) - drawnLinks += 3; - } else { - renderLimitReached = true; - } - }); - updating = false; - window.renderUpdateStatus(); - } + var triangles = window.delaunay.triangulate(locations); + var drawnLinks = 0; + renderLimitReached = false; + var renderlimit = window.USE_INCREASED_RENDER_LIMIT ? + window.plugin.maxLinks.MAX_DRAWN_LINKS_INCREASED_LIMIT : + window.plugin.maxLinks.MAX_DRAWN_LINKS; + $.each(triangles, function(idx, triangle) { + if (drawnLinks <= renderlimit) { + triangle.draw(window.plugin.maxLinks.layer, minX, minY) + drawnLinks += 3; + } else { + renderLimitReached = true; + } + }); + updating = false; + window.renderUpdateStatus(); +} - var setup = function() { - load(delaunayScriptLocation).thenRun(function() { +var setup = function() { + load(delaunayScriptLocation).thenRun(function() { - window.delaunay.Triangle.prototype.draw = function(layer, divX, divY) { - var drawLine = function(src, dest) { - var poly = L.polyline([[(src.y + divY)/1E6, (src.x + divX)/1E6], [(dest.y + divY)/1E6, (dest.x + divX)/1E6]], window.plugin.maxLinks.STROKE_STYLE); - poly.addTo(layer); - }; + window.delaunay.Triangle.prototype.draw = function(layer, divX, divY) { + var drawLine = function(src, dest) { + var poly = L.polyline([[(src.y + divY)/1E6, (src.x + divX)/1E6], [(dest.y + divY)/1E6, (dest.x + divX)/1E6]], window.plugin.maxLinks.STROKE_STYLE); + poly.addTo(layer); + }; - drawLine(this.a, this.b); - drawLine(this.b, this.c); - drawLine(this.c, this.a); - } + drawLine(this.a, this.b); + drawLine(this.b, this.c); + drawLine(this.c, this.a); + } - window.plugin.maxLinks.layer = L.layerGroup([]); + window.plugin.maxLinks.layer = L.layerGroup([]); - window.addHook('checkRenderLimit', function(e) { - if (window.map.hasLayer(window.plugin.maxLinks.layer) && renderLimitReached) - e.reached = true; - }); - - window.map.on('layeradd', function(e) { - if (e.layer === window.plugin.maxLinks.layer) - window.plugin.maxLinks.updateLayer(); - }); - window.map.on('zoomend moveend', window.plugin.maxLinks.updateLayer); - window.layerChooser.addOverlay(window.plugin.maxLinks.layer, 'Maximum Links'); + window.addHook('checkRenderLimit', function(e) { + if (window.map.hasLayer(window.plugin.maxLinks.layer) && renderLimitReached) + e.reached = true; }); - } - // PLUGIN END ////////////////////////////////////////////////////////// - if(window.iitcLoaded && typeof setup === 'function') { - setup(); - } else { - if(window.bootPlugins) - window.bootPlugins.push(setup); - else - window.bootPlugins = [setup]; - } + window.map.on('layeradd', function(e) { + if (e.layer === window.plugin.maxLinks.layer) + window.plugin.maxLinks.updateLayer(); + }); + window.map.on('zoomend moveend', window.plugin.maxLinks.updateLayer); + window.layerChooser.addOverlay(window.plugin.maxLinks.layer, 'Maximum Links'); + }); +} + +// PLUGIN END ////////////////////////////////////////////////////////// +if(window.iitcLoaded && typeof setup === 'function') { + setup(); +} else { + if(window.bootPlugins) + window.bootPlugins.push(setup); + else + window.bootPlugins = [setup]; +} + } // wrapper end // inject code into site context From 664c2595cf47707625061afe94e2b923610d3560 Mon Sep 17 00:00:00 2001 From: boombuler Date: Mon, 25 Feb 2013 21:19:46 +0100 Subject: [PATCH 44/74] fixed typo --- plugins/max-links.user.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 053c601e..40d13b49 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -53,7 +53,7 @@ window.plugin.maxLinks.updateLayer = function() { var nloc = { x: loc.lngE6, y: loc.latE6 }; if (nloc.x < minX) minX = nloc.x; - if (nloc.y < minX) + if (nloc.y < minY) minY = nloc.y; locations.push(nloc); }); @@ -81,7 +81,7 @@ window.plugin.maxLinks.updateLayer = function() { window.renderUpdateStatus(); } -var setup = function() { +var setup = function() { load(delaunayScriptLocation).thenRun(function() { window.delaunay.Triangle.prototype.draw = function(layer, divX, divY) { From 6c4ccdff9432414a5ebdd7e3bfa49bf8cffef068 Mon Sep 17 00:00:00 2001 From: boombuler Date: Mon, 25 Feb 2013 21:24:36 +0100 Subject: [PATCH 45/74] moved some vars to namespace --- plugins/max-links.user.js | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 40d13b49..ca45d735 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -30,18 +30,19 @@ window.plugin.maxLinks.STROKE_STYLE = { clickable: false, smoothFactor: 10 }; -var delaunayScriptLocation = 'https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/delaunay.js'; +window.plugin.maxLinks._delaunayScriptLocation = 'https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/delaunay.js'; window.plugin.maxLinks.layer = null; -var updating = false; -var renderLimitReached = false; +window.plugin.maxLinks._updating = false; +window.plugin.maxLinks._renderLimitReached = false; window.plugin.maxLinks.updateLayer = function() { - if (updating || window.plugin.maxLinks.layer === null || + if (window.plugin.maxLinks._updating || + window.plugin.maxLinks.layer === null || !window.map.hasLayer(window.plugin.maxLinks.layer)) return; - updating = true; + window.plugin.maxLinks._updating = true; window.plugin.maxLinks.layer.clearLayers(); var locations = []; @@ -65,7 +66,7 @@ window.plugin.maxLinks.updateLayer = function() { var triangles = window.delaunay.triangulate(locations); var drawnLinks = 0; - renderLimitReached = false; + window.plugin.maxLinks._renderLimitReached = false; var renderlimit = window.USE_INCREASED_RENDER_LIMIT ? window.plugin.maxLinks.MAX_DRAWN_LINKS_INCREASED_LIMIT : window.plugin.maxLinks.MAX_DRAWN_LINKS; @@ -74,15 +75,15 @@ window.plugin.maxLinks.updateLayer = function() { triangle.draw(window.plugin.maxLinks.layer, minX, minY) drawnLinks += 3; } else { - renderLimitReached = true; + window.plugin.maxLinks._renderLimitReached = true; } }); - updating = false; + window.plugin.maxLinks._updating = false; window.renderUpdateStatus(); } -var setup = function() { - load(delaunayScriptLocation).thenRun(function() { +window.plugin.maxLinks.setup = function() { + load(window.plugin.maxLinks._delaunayScriptLocation).thenRun(function() { window.delaunay.Triangle.prototype.draw = function(layer, divX, divY) { var drawLine = function(src, dest) { @@ -98,7 +99,8 @@ var setup = function() { window.plugin.maxLinks.layer = L.layerGroup([]); window.addHook('checkRenderLimit', function(e) { - if (window.map.hasLayer(window.plugin.maxLinks.layer) && renderLimitReached) + if (window.map.hasLayer(window.plugin.maxLinks.layer) && + window.plugin.maxLinks._renderLimitReached) e.reached = true; }); @@ -110,6 +112,7 @@ var setup = function() { window.layerChooser.addOverlay(window.plugin.maxLinks.layer, 'Maximum Links'); }); } +var setup = window.plugin.maxLinks.setup; // PLUGIN END ////////////////////////////////////////////////////////// if(window.iitcLoaded && typeof setup === 'function') { From 799a1012edee742c0511a2cab5c423abf57e2c80 Mon Sep 17 00:00:00 2001 From: boombuler Date: Mon, 25 Feb 2013 21:54:52 +0100 Subject: [PATCH 46/74] recalculate the links as soon as the portals are loaded --- plugins/max-links.user.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index ca45d735..f2af8e20 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -99,9 +99,14 @@ window.plugin.maxLinks.setup = function() { window.plugin.maxLinks.layer = L.layerGroup([]); window.addHook('checkRenderLimit', function(e) { - if (window.map.hasLayer(window.plugin.maxLinks.layer) && - window.plugin.maxLinks._renderLimitReached) - e.reached = true; + if (window.map.hasLayer(window.plugin.maxLinks.layer) && + window.plugin.maxLinks._renderLimitReached) + e.reached = true; + }); + + window.addHook('portalDataLoaded', function(e) { + if (window.map.hasLayer(window.plugin.maxLinks.layer)) + window.plugin.maxLinks.updateLayer(); }); window.map.on('layeradd', function(e) { From b58050320ba3fd7e1e99f0529102dc62f12ff2cb Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Mon, 25 Feb 2013 22:00:28 +0100 Subject: [PATCH 47/74] support https as well (fixes #309). Also bump version number in main which is was an oversight when releasing 0.7/0.71 --- code/utils_misc.js | 2 +- main.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/utils_misc.js b/code/utils_misc.js index 8600a0ed..a95f5c0f 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -54,7 +54,7 @@ window.postAjax = function(action, data, success, error) { // use full URL to avoid issues depending on how people set their // slash. See: // https://github.com/breunigs/ingress-intel-total-conversion/issues/56 - url: 'http://www.ingress.com/rpc/dashboard.'+action, + url: window.location.protocol + '//www.ingress.com/rpc/dashboard.'+action, type: 'POST', data: data, dataType: 'json', diff --git a/main.js b/main.js index 970ac8db..aa8b9598 100644 --- a/main.js +++ b/main.js @@ -1,13 +1,13 @@ // ==UserScript== // @id ingress-intel-total-conversion@breunigs // @name intel map total conversion -// @version 0.6-@@BUILDDATE@@ +// @version 0.7.1-@@BUILDDATE@@ // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @description total conversion for the ingress intel map. -// @include http://www.ingress.com/intel* -// @match http://www.ingress.com/intel* +// @include *://www.ingress.com/intel* +// @match *://www.ingress.com/intel* // ==/UserScript== From 849099c2993c9d010661aaeae0eece27703c6750 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Mon, 25 Feb 2013 22:39:06 +0100 Subject: [PATCH 48/74] add more HTTPS links. IITC is likely still broken for HTTPS Intel Map. --- code/boot.js | 8 ++++---- code/utils_misc.js | 2 +- main.js | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/boot.js b/code/boot.js index c1e1d515..cac8721f 100644 --- a/code/boot.js +++ b/code/boot.js @@ -294,12 +294,12 @@ function asyncLoadScript(a){return function(b,c){var d=document.createElement("s // modified version of https://github.com/shramov/leaflet-plugins. Also // contains the default Ingress map style. -var LEAFLETGOOGLE = 'http://breunigs.github.com/ingress-intel-total-conversion/dist/leaflet_google.js'; +var LEAFLETGOOGLE = 'https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/leaflet_google.js'; var JQUERY = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'; -var JQUERYUI = 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min.js'; -var JQUERYQRCODE = 'http://jeromeetienne.github.com/jquery-qrcode/jquery.qrcode.min.js'; +var JQUERYUI = 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min.js'; +var JQUERYQRCODE = 'https://raw.github.com/jeromeetienne/jquery-qrcode/master/jquery.qrcode.min.js'; var LEAFLET = 'http://cdn.leafletjs.com/leaflet-0.5/leaflet.js'; -var AUTOLINK = 'http://breunigs.github.com/ingress-intel-total-conversion/dist/autolink.js'; +var AUTOLINK = 'https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/autolink.js'; var EMPTY = 'data:text/javascript;base64,'; // don’t download resources which have been injected already diff --git a/code/utils_misc.js b/code/utils_misc.js index 4d1444bc..1f640e78 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -54,7 +54,7 @@ window.postAjax = function(action, data, success, error) { // use full URL to avoid issues depending on how people set their // slash. See: // https://github.com/breunigs/ingress-intel-total-conversion/issues/56 - url: window.location.protocol + '//www.ingress.com/rpc/dashboard.'+action, + url: 'https://www.ingress.com/rpc/dashboard.'+action, type: 'POST', data: data, dataType: 'json', diff --git a/main.js b/main.js index aa8b9598..db95ae40 100644 --- a/main.js +++ b/main.js @@ -56,7 +56,7 @@ var ir = window.internalResources || []; var mainstyle = 'http://breunigs.github.com/ingress-intel-total-conversion/style.css?@@BUILDDATE@@'; var smartphone = 'http://breunigs.github.com/ingress-intel-total-conversion/mobile/smartphone.css?@@BUILDDATE@@'; var leaflet = 'http://cdn.leafletjs.com/leaflet-0.5/leaflet.css'; -var coda = 'http://fonts.googleapis.com/css?family=Coda'; +var coda = 'https://fonts.googleapis.com/css?family=Coda'; // remove complete page. We only wanted the user-data and the page’s // security context so we can access the API easily. Setup as much as From 7a326478193315b72bedcf01b4ade19557f69b30 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Mon, 25 Feb 2013 22:45:44 +0100 Subject: [PATCH 49/74] serve own leaflet until they can make it available via https --- dist/leaflet.0.5.js | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 dist/leaflet.0.5.js diff --git a/dist/leaflet.0.5.js b/dist/leaflet.0.5.js new file mode 100644 index 00000000..48751885 --- /dev/null +++ b/dist/leaflet.0.5.js @@ -0,0 +1,8 @@ +/* + Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com + (c) 2010-2013, Vladimir Agafonkin, CloudMade +*/ +(function(t,e,i){var n,o;typeof exports!=i+""?n=exports:(o=t.L,n={},n.noConflict=function(){return t.L=o,this},t.L=n),n.version="0.5",n.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),limitExecByInterval:function(t,e,n){var o,s;return function a(){var r=arguments;return o?(s=!0,i):(o=!0,setTimeout(function(){o=!1,s&&(a.apply(n,r),s=!1)},e),t.apply(n,r),i)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},splitWords:function(t){return t.replace(/^\s+|\s+$/g,"").split(/\s+/)},setOptions:function(t,e){return t.options=n.extend({},t.options,e),t.options},getParamString:function(t,e){var i=[];for(var n in t)t.hasOwnProperty(n)&&i.push(n+"="+t[n]);return(e&&-1!==e.indexOf("?")?"&":"?")+i.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,i){var n=e[i];if(!e.hasOwnProperty(i))throw Error("No value provided for variable "+t);return n})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;o.length>i&&!n;i++)n=t[o[i]+e];return n}function o(e){var i=+new Date,n=Math.max(0,16-(i-s));return s=i+n,t.setTimeout(e,n)}var s=0,a=t.requestAnimationFrame||e("RequestAnimationFrame")||o,r=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};n.Util.requestAnimFrame=function(e,s,r,h){return e=n.bind(e,s),r&&a===o?(e(),i):a.call(t,e,h)},n.Util.cancelAnimFrame=function(e){e&&r.call(t,e)}}(),n.extend=n.Util.extend,n.bind=n.Util.bind,n.stamp=n.Util.stamp,n.setOptions=n.Util.setOptions,n.Class=function(){},n.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var o=new i;o.constructor=e,e.prototype=o;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(n.extend(e,t.statics),delete t.statics),t.includes&&(n.Util.extend.apply(null,[o].concat(t.includes)),delete t.includes),t.options&&o.options&&(t.options=n.extend({},o.options,t.options)),n.extend(o,t),o._initHooks=[];var a=this;return o.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=o._initHooks.length;e>t;t++)o._initHooks[t].call(this)}},e},n.Class.include=function(t){n.extend(this.prototype,t)},n.Class.mergeOptions=function(t){n.extend(this.prototype.options,t)},n.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";n.Mixin={},n.Mixin.Events={addEventListener:function(t,e,i){var o,a,r,h=this[s]=this[s]||{};if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.addEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)h[t[a]]=h[t[a]]||[],h[t[a]].push({action:e,context:i||this});return this},hasEventListeners:function(t){return s in this&&t in this[s]&&this[s][t].length>0},removeEventListener:function(t,e,i){var o,a,r,h,l,u=this[s];if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.removeEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)if(this.hasEventListeners(t[a]))for(h=u[t[a]],l=h.length-1;l>=0;l--)e&&h[l].action!==e||i&&h[l].context!==i||h.splice(l,1);return this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;for(var i=n.extend({type:t,target:this},e),o=this[s][t].slice(),a=0,r=o.length;r>a;a++)o[a].action.call(o[a].context||this,i);return this}},n.Mixin.Events.on=n.Mixin.Events.addEventListener,n.Mixin.Events.off=n.Mixin.Events.removeEventListener,n.Mixin.Events.fire=n.Mixin.Events.fireEvent,function(){var o=!!t.ActiveXObject,s=o&&!t.XMLHttpRequest,a=o&&!e.querySelector,r=navigator.userAgent.toLowerCase(),h=-1!==r.indexOf("webkit"),l=-1!==r.indexOf("chrome"),u=-1!==r.indexOf("android"),c=-1!==r.search("android [23]"),_=typeof orientation!=i+"",d=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,p="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,m=e.documentElement,f=o&&"transition"in m.style,g="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,v="MozPerspective"in m.style,y="OTransition"in m.style,L=!t.L_DISABLE_3D&&(f||g||v||y),P=!t.L_NO_TOUCH&&function(){var t="ontouchstart";if(d||t in m)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();n.Browser={ie:o,ie6:s,ie7:a,webkit:h,android:u,android23:c,chrome:l,ie3d:f,webkit3d:g,gecko3d:v,opera3d:y,any3d:L,mobile:_,mobileWebkit:_&&h,mobileWebkit3d:_&&g,mobileOpera:_&&t.opera,touch:P,msTouch:d,retina:p}}(),n.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},n.Point.prototype={clone:function(){return new n.Point(this.x,this.y)},add:function(t){return this.clone()._add(n.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(n.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=n.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t.x===this.x&&t.y===this.y},toString:function(){return"Point("+n.Util.formatNum(this.x)+", "+n.Util.formatNum(this.y)+")"}},n.point=function(t,e,i){return t instanceof n.Point?t:n.Util.isArray(t)?new n.Point(t[0],t[1]):isNaN(t)?t:new n.Point(t,e,i)},n.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.Bounds.prototype={extend:function(t){return t=n.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new n.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new n.Point(this.min.x,this.max.y)},getTopRight:function(){return new n.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof n.Point?n.point(t):n.bounds(t),t instanceof n.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=n.bounds(t);var e=this.min,i=this.max,o=t.min,s=t.max,a=s.x>=e.x&&o.x<=i.x,r=s.y>=e.y&&o.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},n.bounds=function(t,e){return!t||t instanceof n.Bounds?t:new n.Bounds(t,e)},n.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},n.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new n.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},n.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,o=0,s=0,a=t,r=e.body,h=n.Browser.ie7;do{if(o+=a.offsetTop||0,s+=a.offsetLeft||0,o+=parseInt(n.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(n.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=n.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){o+=r.scrollTop||0,s+=r.scrollLeft||0;break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;o-=a.scrollTop||0,s-=a.scrollLeft||0,n.DomUtil.documentIsLtr()||!n.Browser.webkit&&!h||(s+=a.scrollWidth-a.clientWidth,h&&"hidden"!==n.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==n.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new n.Point(s,o)},documentIsLtr:function(){return n.DomUtil._docIsLtrCached||(n.DomUtil._docIsLtrCached=!0,n.DomUtil._docIsLtr="ltr"===n.DomUtil.getStyle(e.body,"direction")),n.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},disableTextSelection:function(){e.selection&&e.selection.empty&&e.selection.empty(),this._onselectstart||(this._onselectstart=e.onselectstart||null,e.onselectstart=n.Util.falseFn)},enableTextSelection:function(){e.onselectstart===n.Util.falseFn&&(e.onselectstart=this._onselectstart,this._onselectstart=null)},hasClass:function(t,e){return t.className.length>0&&RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){n.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){function i(t,i){return i===e?"":t}t.className=t.className.replace(/(\S+)\s*/g,i).replace(/(^\s+|\s+$)/,"")},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;t.length>n;n++)if(t[n]in i)return t[n];return!1},getTranslateString:function(t){var e=n.Browser.webkit3d,i="translate"+(e?"3d":"")+"(",o=(e?",0":"")+")";return i+t.x+"px,"+t.y+"px"+o},getScaleString:function(t,e){var i=n.DomUtil.getTranslateString(e.add(e.multiplyBy(-1*t))),o=" scale("+t+") ";return i+o},setPosition:function(t,e,i){t._leaflet_pos=e,!i&&n.Browser.any3d?(t.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(e),n.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden")):(t.style.left=e.x+"px",t.style.top=e.y+"px")},getPosition:function(t){return t._leaflet_pos}},n.DomUtil.TRANSFORM=n.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]),n.DomUtil.TRANSITION=n.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),n.DomUtil.TRANSITION_END="webkitTransition"===n.DomUtil.TRANSITION||"OTransition"===n.DomUtil.TRANSITION?n.DomUtil.TRANSITION+"End":"transitionend",n.LatLng=function(t,e){var i=parseFloat(t),n=parseFloat(e);if(isNaN(i)||isNaN(n))throw Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=i,this.lng=n},n.extend(n.LatLng,{DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,MAX_MARGIN:1e-9}),n.LatLng.prototype={equals:function(t){if(!t)return!1;t=n.latLng(t);var e=Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng));return n.LatLng.MAX_MARGIN>=e},toString:function(t){return"LatLng("+n.Util.formatNum(this.lat,t)+", "+n.Util.formatNum(this.lng,t)+")"},distanceTo:function(t){t=n.latLng(t);var e=6378137,i=n.LatLng.DEG_TO_RAD,o=(t.lat-this.lat)*i,s=(t.lng-this.lng)*i,a=this.lat*i,r=t.lat*i,h=Math.sin(o/2),l=Math.sin(s/2),u=h*h+l*l*Math.cos(a)*Math.cos(r);return 2*e*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))},wrap:function(t,e){var i=this.lng;return t=t||-180,e=e||180,i=(i+e)%(e-t)+(t>i||i===e?e:t),new n.LatLng(this.lat,i)}},n.latLng=function(t,e){return t instanceof n.LatLng?t:n.Util.isArray(t)?new n.LatLng(t[0],t[1]):isNaN(t)?t:new n.LatLng(t,e)},n.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.LatLngBounds.prototype={extend:function(t){return t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t),t instanceof n.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new n.LatLng(t.lat,t.lng),this._northEast=new n.LatLng(t.lat,t.lng)):t instanceof n.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,o=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new n.LatLngBounds(new n.LatLng(e.lat-o,e.lng-s),new n.LatLng(i.lat+o,i.lng+s))},getCenter:function(){return new n.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new n.LatLng(this._northEast.lat,this._southWest.lng)},getSouthEast:function(){return new n.LatLng(this._southWest.lat,this._northEast.lng)},contains:function(t){t="number"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t);var e,i,o=this._southWest,s=this._northEast;return t instanceof n.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=o.lat&&i.lat<=s.lat&&e.lng>=o.lng&&i.lng<=s.lng},intersects:function(t){t=n.latLngBounds(t);var e=this._southWest,i=this._northEast,o=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&o.lat<=i.lat,r=s.lng>=e.lng&&o.lng<=i.lng;return a&&r},toBBoxString:function(){var t=this._southWest,e=this._northEast;return[t.lng,t.lat,e.lng,e.lat].join(",")},equals:function(t){return t?(t=n.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},n.latLngBounds=function(t,e){return!t||t instanceof n.LatLngBounds?t:new n.LatLngBounds(t,e)},n.Projection={},n.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=o*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new n.Point(s,a)},unproject:function(t){var e=n.LatLng.RAD_TO_DEG,i=t.x*e,o=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new n.LatLng(o,i)}},n.Projection.LonLat={project:function(t){return new n.Point(t.lng,t.lat)},unproject:function(t){return new n.LatLng(t.y,t.x)}},n.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},n.CRS.Simple=n.extend({},n.CRS,{projection:n.Projection.LonLat,transformation:new n.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),n.CRS.EPSG3857=n.extend({},n.CRS,{code:"EPSG:3857",projection:n.Projection.SphericalMercator,transformation:new n.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),n.CRS.EPSG900913=n.extend({},n.CRS.EPSG3857,{code:"EPSG:900913"}),n.CRS.EPSG4326=n.extend({},n.CRS,{code:"EPSG:4326",projection:n.Projection.LonLat,transformation:new n.Transformation(1/360,.5,-1/360,.5)}),n.Map=n.Class.extend({includes:n.Mixin.Events,options:{crs:n.CRS.EPSG3857,fadeAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23,trackResize:!0,markerZoomAnimation:n.DomUtil.TRANSITION&&n.Browser.any3d},initialize:function(t,e){e=n.setOptions(this,e),this._initContainer(t),this._initLayout(),this.callInitHooks(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(n.latLng(e.center),e.zoom,!0),this._initLayers(e.layers)},setView:function(t,e){return this._resetView(n.latLng(t),this._limitZoom(e)),this},setZoom:function(t){return this.setView(this.getCenter(),t)},zoomIn:function(t){return this.setZoom(this._zoom+(t||1))},zoomOut:function(t){return this.setZoom(this._zoom-(t||1))},fitBounds:function(t){var e=this.getBoundsZoom(t);return this.setView(n.latLngBounds(t).getCenter(),e)},fitWorld:function(){var t=new n.LatLng(-60,-170),e=new n.LatLng(85,179);return this.fitBounds(new n.LatLngBounds(t,e))},panTo:function(t){return this.setView(t,this._zoom)},panBy:function(t){return this.fire("movestart"),this._rawPanBy(n.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){if(t=n.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this;var e=this.getBoundsZoom(t,!0);return this._boundsMinZoom=e,this._loaded&&(e>this._zoom?this.setView(t.getCenter(),e):this.panInsideBounds(t)),this},panInsideBounds:function(t){t=n.latLngBounds(t);var e=this.getBounds(),i=this.project(e.getSouthWest()),o=this.project(e.getNorthEast()),s=this.project(t.getSouthWest()),a=this.project(t.getNorthEast()),r=0,h=0;return o.ya.x&&(r=a.x-o.x),i.y>s.y&&(h=s.y-i.y),i.x=r);return c&&e?null:e?r:r-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new n.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new n.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(n.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(n.point(t),e)},layerPointToLatLng:function(t){var e=n.point(t).add(this._initialTopLeftPoint);return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(n.latLng(t))._round();return e._subtract(this._initialTopLeftPoint)},containerPointToLayerPoint:function(t){return n.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return n.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(n.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(n.latLng(t)))},mouseEventToContainerPoint:function(t){return n.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=n.DomUtil.get(t);if(e._leaflet)throw Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;n.DomUtil.addClass(t,"leaflet-container"),n.Browser.touch&&n.DomUtil.addClass(t,"leaflet-touch"),this.options.fadeAnimation&&n.DomUtil.addClass(t,"leaflet-fade-anim");var e=n.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(n.DomUtil.addClass(t.markerPane,e),n.DomUtil.addClass(t.shadowPane,e),n.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return n.DomUtil.create("div",t,e||this._panes.objectsPane)},_initLayers:function(t){t=t?n.Util.isArray(t)?t:[t]:[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0;var e,i;for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,o){var s=this._zoom!==e;o||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):n.DomUtil.setPosition(this._mapPane,new n.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,this.fire("viewreset",{hard:!i}),this.fire("move"),(s||o)&&this.fire("zoomend"),this.fire("moveend",{hard:!i}),a&&this.fire("load")},_rawPanBy:function(t){n.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_updateZoomLevels:function(){var t,e=1/0,n=-1/0;for(t in this._zoomBoundLayers)if(this._zoomBoundLayers.hasOwnProperty(t)){var o=this._zoomBoundLayers[t];isNaN(o.options.minZoom)||(e=Math.min(e,o.options.minZoom)),isNaN(o.options.maxZoom)||(n=Math.max(n,o.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e)},_initEvents:function(){if(n.DomEvent){n.DomEvent.on(this._container,"click",this._onMouseClick,this);var e,i,o=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(e=0,i=o.length;i>e;e++)n.DomEvent.on(this._container,o[e],this._fireMouseEvent,this);this.options.trackResize&&n.DomEvent.on(t,"resize",this._onResize,this)}},_onResize:function(){n.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=n.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||this.dragging&&this.dragging.moved()||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&n.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),o=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(o);this.fire(e,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this._tileBg&&(clearTimeout(this._clearTileBgTimer),this._clearTileBgTimer=setTimeout(n.bind(this._clearTileBg,this),500))},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_getMapPanePos:function(){return n.DomUtil.getPosition(this._mapPane)},_getTopLeftPoint:function(){if(!this._loaded)throw Error("Set map center and zoom first.");return this._initialTopLeftPoint.subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),n.map=function(t,e){return new n.Map(t,e)},n.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.3142,R_MAJOR:6378137,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=o*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var _=Math.tan(.5*(.5*Math.PI-h))/c;return h=-a*Math.log(_),new n.Point(r,h)},unproject:function(t){for(var e,i=n.LatLng.RAD_TO_DEG,o=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/o,r=s/o,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/s),u=Math.PI/2-2*Math.atan(l),c=15,_=1e-7,d=c,p=.1;Math.abs(p)>_&&--d>0;)e=h*Math.sin(u),p=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=p;return new n.LatLng(u*i,a)}},n.CRS.EPSG3395=n.extend({},n.CRS,{code:"EPSG:3395",projection:n.Projection.Mercator,transformation:function(){var t=n.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new n.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),n.TileLayer=n.Class.extend({includes:n.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:n.Browser.mobile,updateWhenIdle:n.Browser.mobile},initialize:function(t,e){e=n.setOptions(this,e),e.detectRetina&&n.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._initContainer(),this._createTileProto(),t.on({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||(this._limitedUpdate=n.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._map._panes.tilePane.empty=!1,this._reset(!0),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){n.DomUtil.setOpacity(this._container,this.options.opacity);var t,e=this._tiles;if(n.Browser.webkit)for(t in e)e.hasOwnProperty(t)&&(e[t].style.webkitTransform+=" translate(0,0)")},_initContainer:function(){var t=this._map._panes.tilePane;(!this._container||t.empty)&&(this._container=n.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),t.appendChild(this._container),1>this.options.opacity&&this._updateOpacity())},_resetCallback:function(t){this._reset(t.hard)},_reset:function(t){var e=this._tiles;for(var i in e)e.hasOwnProperty(i)&&this.fire("tileunload",{tile:e[i]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),t&&this._container&&(this._container.innerHTML=""),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||this.options.minZoom>e)){var o=new n.Point(Math.floor(t.min.x/i),Math.floor(t.min.y/i)),s=new n.Point(Math.floor(t.max.x/i),Math.floor(t.max.y/i)),a=new n.Bounds(o,s);this._addTilesFromCenterOut(a),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(a)}}},_addTilesFromCenterOut:function(t){var i,o,s,a=[],r=t.getCenter();for(i=t.min.y;t.max.y>=i;i++)for(o=t.min.x;t.max.x>=o;o++)s=new n.Point(o,i),this._tileShouldBeLoaded(s)&&a.push(s);var h=a.length;if(0!==h){a.sort(function(t,e){return t.distanceTo(r)-e.distanceTo(r)});var l=e.createDocumentFragment();for(this._tilesToLoad||this.fire("loading"),this._tilesToLoad+=h,o=0;h>o;o++)this._addTile(a[o],l);this._container.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;if(!this.options.continuousWorld){var e=this._getWrapTileNum();if(this.options.noWrap&&(0>t.x||t.x>=e)||0>t.y||t.y>=e)return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)this._tiles.hasOwnProperty(o)&&(e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(t.min.x>i||i>t.max.x||t.min.y>n||n>t.max.y)&&this._removeTile(o))},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(n.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._container&&this._container.removeChild(e),n.Browser.android||(e.src=n.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),o=this._getTile();n.DomUtil.setPosition(o,i,n.Browser.chrome||n.Browser.android23),this._tiles[t.x+":"+t.y]=o,this._loadTile(o,t),o.parentNode!==this._container&&e.appendChild(o) +},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return this._adjustTilePoint(t),n.Util.template(this._url,n.extend({s:this._getSubdomain(t),z:this._getZoomForUrl(),x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e+e)%e),this.options.tms&&(t.y=e-t.y-1)},_getSubdomain:function(t){var e=(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=n.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,t.src=this.getTileUrl(e)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||this.fire("load")},_tileOnLoad:function(){var t=this._layer;this.src!==n.Util.emptyImageUrl&&(n.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),n.tileLayer=function(t,e){return new n.TileLayer(t,e)},n.TileLayer.WMS=n.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=n.extend({},this.defaultWmsParams);i.width=i.height=e.detectRetina&&n.Browser.retina?2*this.options.tileSize:this.options.tileSize;for(var o in e)this.options.hasOwnProperty(o)||(i[o]=e[o]);this.wmsParams=i,n.setOptions(this,e)},onAdd:function(t){var e=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[e]=t.options.crs.code,n.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t,e){this._adjustTilePoint(t);var i=this._map,o=i.options.crs,s=this.options.tileSize,a=t.multiplyBy(s),r=a.add(new n.Point(s,s)),h=o.project(i.unproject(a,e)),l=o.project(i.unproject(r,e)),u=[h.x,l.y,l.x,h.y].join(","),c=n.Util.template(this._url,{s:this._getSubdomain(t)});return c+n.Util.getParamString(this.wmsParams,c)+"&bbox="+u},setParams:function(t,e){return n.extend(this.wmsParams,t),e||this.redraw(),this}}),n.tileLayer.wms=function(t,e){return new n.TileLayer.WMS(t,e)},n.TileLayer.Canvas=n.TileLayer.extend({options:{async:!1},initialize:function(t){n.setOptions(this,t)},redraw:function(){var t=this._tiles;for(var e in t)t.hasOwnProperty(e)&&this._redrawTile(t[e])},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=n.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),n.tileLayer.canvas=function(t){return new n.TileLayer.Canvas(t)},n.ImageOverlay=n.Class.extend({includes:n.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=n.latLngBounds(e),n.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&n.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},_initImage:function(){this._image=n.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&n.Browser.any3d?n.DomUtil.addClass(this._image,"leaflet-zoom-animated"):n.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),n.extend(this._image,{galleryimg:"no",onselectstart:n.Util.falseFn,onmousemove:n.Util.falseFn,onload:n.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,o=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/o)));i.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(l)+" scale("+o+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);n.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){n.DomUtil.setOpacity(this._image,this.options.opacity)}}),n.imageOverlay=function(t,e,i){return new n.ImageOverlay(t,e,i)},n.Icon=n.Class.extend({options:{className:""},initialize:function(t){n.setOptions(this,t)},createIcon:function(){return this._createIcon("icon")},createShadow:function(){return this._createIcon("shadow")},_createIcon:function(t){var e=this._getIconUrl(t);if(!e){if("icon"===t)throw Error("iconUrl not set in Icon options (see the docs).");return null}var i=this._createImg(e);return this._setIconStyles(i,t),i},_setIconStyles:function(t,e){var i,o=this.options,s=n.point(o[e+"Size"]);i="shadow"===e?n.point(o.shadowAnchor||o.iconAnchor):n.point(o.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+o.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t){var i;return n.Browser.ie6?(i=e.createElement("div"),i.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")'):(i=e.createElement("img"),i.src=t),i},_getIconUrl:function(t){return n.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),n.icon=function(t){return new n.Icon(t)},n.Icon.Default=n.Icon.extend({options:{iconSize:new n.Point(25,41),iconAnchor:new n.Point(12,41),popupAnchor:new n.Point(1,-34),shadowSize:new n.Point(41,41)},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];n.Browser.retina&&"icon"===t&&(t+="@2x");var i=n.Icon.Default.imagePath;if(!i)throw Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),n.Icon.Default.imagePath=function(){var t,i,n,o,s=e.getElementsByTagName("script"),a=/\/?leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=s.length;i>t;t++)if(n=s[t].src,o=n.match(a))return n.split(a)[0]+"/images"}(),n.Marker=n.Class.extend({includes:n.Mixin.Events,options:{icon:new n.Icon.Default,title:"",clickable:!0,draggable:!1,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){n.setOptions(this,e),this._latlng=n.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._removeIcon(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=n.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this._map&&this._removeIcon(),this.options.icon=t,this._map&&(this._initIcon(),this.update()),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,o=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=!1;this._icon||(this._icon=t.icon.createIcon(),t.title&&(this._icon.title=t.title),this._initInteraction(),s=1>this.options.opacity,n.DomUtil.addClass(this._icon,o),t.riseOnHover&&n.DomEvent.on(this._icon,"mouseover",this._bringToFront,this).on(this._icon,"mouseout",this._resetZIndex,this)),this._shadow||(this._shadow=t.icon.createShadow(),this._shadow&&(n.DomUtil.addClass(this._shadow,o),s=1>this.options.opacity)),s&&this._updateOpacity();var a=this._map._panes;a.markerPane.appendChild(this._icon),this._shadow&&a.shadowPane.appendChild(this._shadow)},_removeIcon:function(){var t=this._map._panes;this.options.riseOnHover&&n.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),t.markerPane.removeChild(this._icon),this._shadow&&t.shadowPane.removeChild(this._shadow),this._icon=this._shadow=null},_setPos:function(t){n.DomUtil.setPosition(this._icon,t),this._shadow&&n.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];n.DomUtil.addClass(t,"leaflet-clickable"),n.DomEvent.on(t,"click",this._onMouseClick,this);for(var i=0;e.length>i;i++)n.DomEvent.on(t,e[i],this._fireMouseEvent,this);n.Handler.MarkerDrag&&(this.dragging=new n.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_onMouseClick:function(t){var e=this.dragging&&this.dragging.moved();(this.hasEventListeners(t.type)||e)&&n.DomEvent.stopPropagation(t),e||(this.dragging&&this.dragging._enabled||!this._map.dragging||!this._map.dragging.moved())&&this.fire(t.type,{originalEvent:t})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&n.DomEvent.preventDefault(t),"mousedown"!==t.type&&n.DomEvent.stopPropagation(t)},setOpacity:function(t){this.options.opacity=t,this._map&&this._updateOpacity()},_updateOpacity:function(){n.DomUtil.setOpacity(this._icon,this.options.opacity),this._shadow&&n.DomUtil.setOpacity(this._shadow,this.options.opacity)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)}}),n.marker=function(t,e){return new n.Marker(t,e)},n.DivIcon=n.Icon.extend({options:{iconSize:new n.Point(12,12),className:"leaflet-div-icon"},createIcon:function(){var t=e.createElement("div"),i=this.options;return i.html&&(t.innerHTML=i.html),i.bgPos&&(t.style.backgroundPosition=-i.bgPos.x+"px "+-i.bgPos.y+"px"),this._setIconStyles(t,"icon"),t},createShadow:function(){return null}}),n.divIcon=function(t){return new n.DivIcon(t)},n.Map.mergeOptions({closePopupOnClick:!0}),n.Popup=n.Class.extend({includes:n.Mixin.Events,options:{minWidth:50,maxWidth:300,maxHeight:null,autoPan:!0,closeButton:!0,offset:new n.Point(0,6),autoPanPadding:new n.Point(5,5),className:"",zoomAnimation:!0},initialize:function(t,e){n.setOptions(this,t),this._source=e,this._animated=n.Browser.any3d&&this.options.zoomAnimation},onAdd:function(t){this._map=t,this._container||this._initLayout(),this._updateContent();var e=t.options.fadeAnimation;e&&n.DomUtil.setOpacity(this._container,0),t._panes.popupPane.appendChild(this._container),t.on("viewreset",this._updatePosition,this),this._animated&&t.on("zoomanim",this._zoomAnimation,this),t.options.closePopupOnClick&&t.on("preclick",this._close,this),this._update(),e&&n.DomUtil.setOpacity(this._container,1)},addTo:function(t){return t.addLayer(this),this},openOn:function(t){return t.openPopup(this),this},onRemove:function(t){t._panes.popupPane.removeChild(this._container),n.Util.falseFn(this._container.offsetWidth),t.off({viewreset:this._updatePosition,preclick:this._close,zoomanim:this._zoomAnimation},this),t.options.fadeAnimation&&n.DomUtil.setOpacity(this._container,0),this._map=null},setLatLng:function(t){return this._latlng=n.latLng(t),this._update(),this},setContent:function(t){return this._content=t,this._update(),this},_close:function(){var t=this._map;t&&(t._popup=null,t.removeLayer(this).fire("popupclose",{popup:this}))},_initLayout:function(){var t,e="leaflet-popup",i=e+" "+this.options.className+" leaflet-zoom-"+(this._animated?"animated":"hide"),o=this._container=n.DomUtil.create("div",i);this.options.closeButton&&(t=this._closeButton=n.DomUtil.create("a",e+"-close-button",o),t.href="#close",t.innerHTML="×",n.DomEvent.on(t,"click",this._onCloseButtonClick,this));var s=this._wrapper=n.DomUtil.create("div",e+"-content-wrapper",o);n.DomEvent.disableClickPropagation(s),this._contentNode=n.DomUtil.create("div",e+"-content",s),n.DomEvent.on(this._contentNode,"mousewheel",n.DomEvent.stopPropagation),this._tipContainer=n.DomUtil.create("div",e+"-tip-container",o),this._tip=n.DomUtil.create("div",e+"-tip",this._tipContainer)},_update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},_updateContent:function(){if(this._content){if("string"==typeof this._content)this._contentNode.innerHTML=this._content;else{for(;this._contentNode.hasChildNodes();)this._contentNode.removeChild(this._contentNode.firstChild);this._contentNode.appendChild(this._content)}this.fire("contentupdate")}},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var i=t.offsetWidth;i=Math.min(i,this.options.maxWidth),i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="";var o=t.offsetHeight,s=this.options.maxHeight,a="leaflet-popup-scrolled";s&&o>s?(e.height=s+"px",n.DomUtil.addClass(t,a)):n.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=this.options.offset;e&&n.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);n.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,o=new n.Point(this._containerLeft,-e-this._containerBottom);this._animated&&o._add(n.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(o),a=this.options.autoPanPadding,r=t.getSize(),h=0,l=0;0>s.x&&(h=s.x-a.x),s.x+i>r.x&&(h=s.x+i-r.x+a.x),0>s.y&&(l=s.y-a.y),s.y+e>r.y&&(l=s.y+e-r.y+a.y),(h||l)&&t.panBy(new n.Point(h,l))}},_onCloseButtonClick:function(t){this._close(),n.DomEvent.stop(t)}}),n.popup=function(t,e){return new n.Popup(t,e)},n.Marker.include({openPopup:function(){return this._popup&&this._map&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},bindPopup:function(t,e){var i=n.point(this.options.icon.options.popupAnchor)||new n.Point(0,0);return i=i.add(n.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=n.extend({offset:i},e),this._popup||this.on("click",this.openPopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popup=new n.Popup(e,this).setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.openPopup).off("remove",this.closePopup).off("move",this._movePopup)),this},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),n.Map.include({openPopup:function(t){return this.closePopup(),this._popup=t,this.addLayer(t).fire("popupopen",{popup:this._popup})},closePopup:function(){return this._popup&&this._popup._close(),this}}),n.LayerGroup=n.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=n.stamp(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._map&&this._map.removeLayer(t),this},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)this._layers.hasOwnProperty(e)&&(i=this._layers[e],i[t]&&i[t].apply(i,n));return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)this._layers.hasOwnProperty(i)&&t.call(e,this._layers[i])},setZIndex:function(t){return this.invoke("setZIndex",t)}}),n.layerGroup=function(t){return new n.LayerGroup(t)},n.FeatureGroup=n.LayerGroup.extend({includes:n.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu"},addLayer:function(t){return this._layers[n.stamp(t)]?this:(t.on(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return t.off(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new n.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof n.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t.layer=t.target,t.target=this,this.fire(t.type,t)}}),n.featureGroup=function(t){return new n.FeatureGroup(t)},n.Path=n.Class.extend({includes:[n.Mixin.Events],statics:{CLIP_PADDING:n.Browser.mobile?Math.max(0,Math.min(.5,(1280/Math.max(t.innerWidth,t.innerHeight)-1)/2)):.5},options:{stroke:!0,color:"#0033ff",dashArray:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){n.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,n.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return n.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),n.Map.include({_updatePathViewport:function(){var t=n.Path.CLIP_PADDING,e=this.getSize(),i=n.DomUtil.getPosition(this._mapPane),o=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=o.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new n.Bounds(o,s)}}),n.Path.SVG_NS="http://www.w3.org/2000/svg",n.Browser.svg=!(!e.createElementNS||!e.createElementNS(n.Path.SVG_NS,"svg").createSVGRect),n.Path=n.Path.extend({statics:{SVG:n.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(n.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray")):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(n.Browser.svg||!n.Browser.vml)&&this._path.setAttribute("class","leaflet-clickable"),n.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;t.length>e;e++)n.DomEvent.on(this._container,t[e],this._fireMouseEvent,this)}},_onMouseClick:function(t){this._map.dragging&&this._map.dragging.moved()||this._fireMouseEvent(t)},_fireMouseEvent:function(t){if(this.hasEventListeners(t.type)){var e=this._map,i=e.mouseEventToContainerPoint(t),o=e.containerPointToLayerPoint(i),s=e.layerPointToLatLng(o);this.fire(t.type,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t}),"contextmenu"===t.type&&n.DomEvent.preventDefault(t),"mousemove"!==t.type&&n.DomEvent.stopPropagation(t)}}}),n.Map.include({_initPathRoot:function(){this._pathRoot||(this._pathRoot=n.Path.prototype._createElement("svg"),this._panes.overlayPane.appendChild(this._pathRoot),this.options.zoomAnimation&&n.Browser.any3d?(this._pathRoot.setAttribute("class"," leaflet-zoom-animated"),this.on({zoomanim:this._animatePathZoom,zoomend:this._endPathZoom})):this._pathRoot.setAttribute("class"," leaflet-zoom-hide"),this.on("moveend",this._updateSvgViewport),this._updateSvgViewport())},_animatePathZoom:function(t){var e=this.getZoomScale(t.zoom),i=this._getCenterOffset(t.center)._multiplyBy(-e)._add(this._pathViewport.min);this._pathRoot.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(i)+" scale("+e+") ",this._pathZooming=!0},_endPathZoom:function(){this._pathZooming=!1},_updateSvgViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max,o=i.x-e.x,s=i.y-e.y,a=this._pathRoot,r=this._panes.overlayPane;n.Browser.mobileWebkit&&r.removeChild(a),n.DomUtil.setPosition(a,e),a.setAttribute("width",o),a.setAttribute("height",s),a.setAttribute("viewBox",[e.x,e.y,o,s].join(" ")),n.Browser.mobileWebkit&&r.appendChild(a)}}}),n.Path.include({bindPopup:function(t,e){return(!this._popup||e)&&(this._popup=new n.Popup(e,this)),this._popup.setContent(t),this._popupHandlersAdded||(this.on("click",this._openPopup,this).on("remove",this.closePopup,this),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this._openPopup).off("remove",this.closePopup),this._popupHandlersAdded=!1),this},openPopup:function(t){return this._popup&&(t=t||this._latlng||this._latlngs[Math.floor(this._latlngs.length/2)],this._openPopup({latlng:t})),this},closePopup:function(){return this._popup&&this._popup._close(),this},_openPopup:function(t){this._popup.setLatLng(t.latlng),this._map.openPopup(this._popup)}}),n.Browser.vml=!n.Browser.svg&&function(){try{var t=e.createElement("div");t.innerHTML='';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),n.Path=n.Browser.svg||!n.Browser.vml?n.Path:n.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");n.DomUtil.addClass(t,"leaflet-vml-shape"),this.options.clickable&&n.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?i.dashArray instanceof Array?i.dashArray.join(" "):i.dashArray.replace(/ *, */g," "):""):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),n.Map.include(n.Browser.svg||!n.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),n.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),n.Path=n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?n.Path:n.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return n.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&this._map.off("click",this._onClick,this),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!n.Path._updateRequest&&(n.Path._updateRequest=n.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){n.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,o,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,o=this._parts[t].length;o>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof n.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&this._map.on("click",this._onClick,this)},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",{latlng:t.latlng,layerPoint:t.layerPoint,containerPoint:t.containerPoint,originalEvent:t})}}),n.Map.include(n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),o=this._pathRoot;n.DomUtil.setPosition(o,e),o.width=i.x,o.height=i.y,o.getContext("2d").translate(-e.x,-e.y)}}}),n.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,o,s){var a=e.x-t.x,r=e.y-t.y,h=s.min,l=s.max;return 8&o?new n.Point(t.x+a*(l.y-t.y)/r,l.y):4&o?new n.Point(t.x+a*(h.y-t.y)/r,h.y):2&o?new n.Point(l.x,t.y+r*(l.x-t.x)/a):1&o?new n.Point(h.x,t.y+r*(h.x-t.x)/a):i},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,o){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,o?h*h+l*l:new n.Point(a,r)}},n.Polyline=n.Path.extend({initialize:function(t,e){n.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(n.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,o=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u]; +var _=n.LineUtil._sqClosestPointOnSegment(t,e,i,!0);o>_&&(o=_,a=n.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(o)),a},getBounds:function(){var t,e,i=new n.LatLngBounds,o=this.getLatLngs();for(t=0,e=o.length;e>t;t++)i.extend(o[t]);return i},_convertLatLngs:function(t){var e,i;for(e=0,i=t.length;i>e;e++){if(n.Util.isArray(t[e])&&"number"!=typeof t[e][0])return;t[e]=n.latLng(t[e])}return t},_initEvents:function(){n.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=n.Path.VML,o=0,s=t.length,a="";s>o;o++)e=t[o],i&&e._round(),a+=(o?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,o,s=this._originalPoints,a=s.length;if(this.options.noClip)return this._parts=[s],i;this._parts=[];var r=this._parts,h=this._map._pathViewport,l=n.LineUtil;for(t=0,e=0;a-1>t;t++)o=l.clipSegment(s[t],s[t+1],h,t),o&&(r[e]=r[e]||[],r[e].push(o[0]),(o[1]!==s[t+1]||t===a-2)&&(r[e].push(o[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=n.LineUtil,i=0,o=t.length;o>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),n.Path.prototype._updatePath.call(this))}}),n.polyline=function(t,e){return new n.Polyline(t,e)},n.PolyUtil={},n.PolyUtil.clipPolygon=function(t,e){var i,o,s,a,r,h,l,u,c,_=[1,4,2,8],d=n.LineUtil;for(o=0,l=t.length;l>o;o++)t[o]._code=d._getBitCode(t[o],e);for(a=0;4>a;a++){for(u=_[a],i=[],o=0,l=t.length,s=l-1;l>o;s=o++)r=t[o],h=t[s],r._code&u?h._code&u||(c=d._getEdgeIntersection(h,r,u,e),c._code=d._getBitCode(c,e),i.push(c)):(h._code&u&&(c=d._getEdgeIntersection(h,r,u,e),c._code=d._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},n.Polygon=n.Polyline.extend({options:{fill:!0},initialize:function(t,e){n.Polyline.prototype.initialize.call(this,t,e),t&&n.Util.isArray(t[0])&&"number"!=typeof t[0][0]&&(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1))},projectLatlngs:function(){if(n.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,o;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,o=this._holes[t].length;o>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,o=this._parts.length;o>i;i++){var s=n.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=n.Polyline.prototype._getPathPartStr.call(this,t);return e+(n.Browser.svg?"z":"x")}}),n.polygon=function(t,e){return new n.Polygon(t,e)},function(){function t(t){return n.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this}})}n.MultiPolyline=t(n.Polyline),n.MultiPolygon=t(n.Polygon),n.multiPolyline=function(t,e){return new n.MultiPolyline(t,e)},n.multiPolygon=function(t,e){return new n.MultiPolygon(t,e)}}(),n.Rectangle=n.Polygon.extend({initialize:function(t,e){n.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=n.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),n.rectangle=function(t,e){return new n.Rectangle(t,e)},n.Circle=n.Path.extend({initialize:function(t,e,i){n.Path.prototype.initialize.call(this,i),this._latlng=n.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=n.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=new n.LatLng(this._latlng.lat,this._latlng.lng-t),i=this._map.latLngToLayerPoint(e);this._point=this._map.latLngToLayerPoint(this._latlng),this._radius=Math.max(Math.round(this._point.x-i.x),1)},getBounds:function(){var t=this._getLngRadius(),e=360*(this._mRadius/40075017),i=this._latlng,o=new n.LatLng(i.lat-e,i.lng-t),s=new n.LatLng(i.lat+e,i.lng+t);return new n.LatLngBounds(o,s)},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":n.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,"+23592600)},getRadius:function(){return this._mRadius},_getLatRadius:function(){return 360*(this._mRadius/40075017)},_getLngRadius:function(){return this._getLatRadius()/Math.cos(n.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],o=0,r=l.length,s=r-1;r>o;s=o++)if((e||0!==o)&&(h=n.LineUtil.pointToSegmentDistance(t,l[s],l[o]),u>=h))return!0;return!1}}:{}),n.Polygon.include(n.Path.CANVAS?{_containsPoint:function(t){var e,i,o,s,a,r,h,l,u=!1;if(n.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],o=e[r],i.y>t.y!=o.y>t.y&&t.x<(o.x-i.x)*(t.y-i.y)/(o.y-i.y)+i.x&&(u=!u);return u}}:{}),n.Circle.include(n.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),n.GeoJSON=n.FeatureGroup.extend({initialize:function(t,e){n.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,o=n.Util.isArray(t)?t:t.features;if(o){for(e=0,i=o.length;i>e;e++)(o[e].geometries||o[e].geometry)&&this.addData(o[e]);return this}var s=this.options;if(!s.filter||s.filter(t)){var a=n.GeoJSON.geometryToLayer(t,s.pointToLayer);return a.feature=t,a.defaultOptions=a.options,this.resetStyle(a),s.onEachFeature&&s.onEachFeature(t,a),this.addLayer(a)}},resetStyle:function(t){var e=this.options.style;e&&(n.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),n.extend(n.GeoJSON,{geometryToLayer:function(t,e){var i,o,s,a,r,h="Feature"===t.type?t.geometry:t,l=h.coordinates,u=[];switch(h.type){case"Point":return i=this.coordsToLatLng(l),e?e(t,i):new n.Marker(i);case"MultiPoint":for(s=0,a=l.length;a>s;s++)i=this.coordsToLatLng(l[s]),r=e?e(t,i):new n.Marker(i),u.push(r);return new n.FeatureGroup(u);case"LineString":return o=this.coordsToLatLngs(l),new n.Polyline(o);case"Polygon":return o=this.coordsToLatLngs(l,1),new n.Polygon(o);case"MultiLineString":return o=this.coordsToLatLngs(l,1),new n.MultiPolyline(o);case"MultiPolygon":return o=this.coordsToLatLngs(l,2),new n.MultiPolygon(o);case"GeometryCollection":for(s=0,a=h.geometries.length;a>s;s++)r=this.geometryToLayer({geometry:h.geometries[s],type:"Feature",properties:t.properties},e),u.push(r);return new n.FeatureGroup(u);default:throw Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t,e){var i=parseFloat(t[e?0:1]),o=parseFloat(t[e?1:0]);return new n.LatLng(i,o)},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):this.coordsToLatLng(t[o],i),a.push(n);return a}}),n.geoJson=function(t,e){return new n.GeoJSON(t,e)},n.DomEvent={addListener:function(t,e,o,s){var a,r,h,l=n.stamp(o),u="_leaflet_"+e+l;return t[u]?this:(a=function(e){return o.call(s||t,e||n.DomEvent._getEvent())},n.Browser.msTouch&&0===e.indexOf("touch")?this.addMsTouchListener(t,e,a,l):(n.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,a,l),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",a,!1),t.addEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?(r=a,h="mouseenter"===e?"mouseover":"mouseout",a=function(e){return n.DomEvent._checkMouse(t,e)?r(e):i},t.addEventListener(h,a,!1)):t.addEventListener(e,a,!1):"attachEvent"in t&&t.attachEvent("on"+e,a),t[u]=a,this))},removeListener:function(t,e,i){var o=n.stamp(i),s="_leaflet_"+e+o,a=t[s];if(a)return n.Browser.msTouch&&0===e.indexOf("touch")?this.removeMsTouchListener(t,e,o):n.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,o):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this},disableClickPropagation:function(t){for(var e=n.DomEvent.stopPropagation,i=n.Draggable.START.length-1;i>=0;i--)n.DomEvent.addListener(t,n.Draggable.START[i],e);return n.DomEvent.addListener(t,"click",e).addListener(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return n.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var o=e.body,s=e.documentElement,a=t.pageX?t.pageX:t.clientX+o.scrollLeft+s.scrollLeft,r=t.pageY?t.pageY:t.clientY+o.scrollTop+s.scrollTop,h=new n.Point(a,r);return i?h._subtract(n.DomUtil.getViewportOffset(i)):h},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e}},n.DomEvent.on=n.DomEvent.addListener,n.DomEvent.off=n.DomEvent.removeListener,n.Draggable=n.Class.extend({includes:n.Mixin.Events,statics:{START:n.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",MSPointerDown:"touchmove"},TAP_TOLERANCE:15},initialize:function(t,e,i){this._element=t,this._dragStartTarget=e||t,this._longPress=i&&!n.Browser.msTouch},enable:function(){if(!this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.on(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.off(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(!(!n.Browser.touch&&t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t),n.Draggable._disabled))){if(this._simulateClick=!0,t.touches&&t.touches.length>1)return this._simulateClick=!1,clearTimeout(this._longPressTimeout),i;var o=t.touches&&1===t.touches.length?t.touches[0]:t,s=o.target;n.Browser.touch&&"a"===s.tagName.toLowerCase()&&n.DomUtil.addClass(s,"leaflet-active"),this._moved=!1,this._moving||(this._startPoint=new n.Point(o.clientX,o.clientY),this._startPos=this._newPos=n.DomUtil.getPosition(this._element),t.touches&&1===t.touches.length&&n.Browser.touch&&this._longPress&&(this._longPressTimeout=setTimeout(n.bind(function(){var t=this._newPos&&this._newPos.distanceTo(this._startPos)||0;n.Draggable.TAP_TOLERANCE>t&&(this._simulateClick=!1,this._onUp(),this._simulateEvent("contextmenu",o))},this),1e3)),n.DomEvent.on(e,n.Draggable.MOVE[t.type],this._onMove,this),n.DomEvent.on(e,n.Draggable.END[t.type],this._onUp,this))}},_onMove:function(t){if(!(t.touches&&t.touches.length>1)){var e=t.touches&&1===t.touches.length?t.touches[0]:t,i=new n.Point(e.clientX,e.clientY),o=i.subtract(this._startPoint);(o.x||o.y)&&(n.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=n.DomUtil.getPosition(this._element).subtract(o),n.Browser.touch||(n.DomUtil.disableTextSelection(),this._setMovingCursor())),this._newPos=this._startPos.add(o),this._moving=!0,n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))}},_updatePosition:function(){this.fire("predrag"),n.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){var i;if(clearTimeout(this._longPressTimeout),this._simulateClick&&t.changedTouches){var o=t.changedTouches[0],s=o.target,a=this._newPos&&this._newPos.distanceTo(this._startPos)||0;"a"===s.tagName.toLowerCase()&&n.DomUtil.removeClass(s,"leaflet-active"),n.Draggable.TAP_TOLERANCE>a&&(i=o)}n.Browser.touch||(n.DomUtil.enableTextSelection(),this._restoreCursor());for(var r in n.Draggable.MOVE)n.Draggable.MOVE.hasOwnProperty(r)&&(n.DomEvent.off(e,n.Draggable.MOVE[r],this._onMove),n.DomEvent.off(e,n.Draggable.END[r],this._onUp));this._moved&&(n.Util.cancelAnimFrame(this._animRequest),this.fire("dragend")),this._moving=!1,i&&(this._moved=!1,this._simulateEvent("click",i))},_setMovingCursor:function(){n.DomUtil.addClass(e.body,"leaflet-dragging")},_restoreCursor:function(){n.DomUtil.removeClass(e.body,"leaflet-dragging")},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),n.Handler=n.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),n.Map.mergeOptions({dragging:!0,inertia:!n.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:n.Browser.touch?32:18,easeLinearity:.25,longPress:!0,worldCopyJump:!1}),n.Map.Drag=n.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new n.Draggable(t._mapPane,t._container,t.options.longPress),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint(new n.LatLng(0,0));this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project(new n.LatLng(0,180)).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)e.inertiaThreshold||!this._positions[0];if(o)t.fire("moveend");else{var s=this._lastPos.subtract(this._positions[0]),a=(this._lastTime+i-this._times[0])/1e3,r=e.easeLinearity,h=s.multiplyBy(r/a),l=h.distanceTo(new n.Point(0,0)),u=Math.min(e.inertiaMaxSpeed,l),c=h.multiplyBy(u/l),_=u/(e.inertiaDeceleration*r),d=c.multiplyBy(-_/2).round();n.Util.requestAnimFrame(function(){t.panBy(d,_,r)})}t.fire("dragend"),e.maxBounds&&n.Util.requestAnimFrame(this._panInsideMaxBounds,t,!0,t._container)},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)}}),n.Map.addInitHook("addHandler","dragging",n.Map.Drag),n.Map.mergeOptions({doubleClickZoom:!0}),n.Map.DoubleClickZoom=n.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(t){this.setView(t.latlng,this._zoom+1)}}),n.Map.addInitHook("addHandler","doubleClickZoom",n.Map.DoubleClickZoom),n.Map.mergeOptions({scrollWheelZoom:!0}),n.Map.ScrollWheelZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){n.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll)},_onWheelScroll:function(t){var e=n.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(n.bind(this._performZoom,this),i),n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();if(e=e>0?Math.ceil(e):Math.round(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e){var n=i+e,o=this._getCenterForScrollWheelZoom(n);t.setView(o,n)}},_getCenterForScrollWheelZoom:function(t){var e=this._map,i=e.getZoomScale(t),n=e.getSize()._divideBy(2),o=this._lastMousePos._subtract(n)._multiplyBy(1-1/i),s=e._getTopLeftPoint()._add(n)._add(o);return e.unproject(s)}}),n.Map.addInitHook("addHandler","scrollWheelZoom",n.Map.ScrollWheelZoom),n.extend(n.DomEvent,{_touchstart:n.Browser.msTouch?"MSPointerDown":"touchstart",_touchend:n.Browser.msTouch?"MSPointerUp":"touchend",addDoubleTapListener:function(t,i,o){function s(t){var e;if(n.Browser.msTouch?(p.push(t.pointerId),e=p.length):e=t.touches.length,!(e>1)){var i=Date.now(),o=i-(r||i);h=t.touches?t.touches[0]:t,l=o>0&&u>=o,r=i}}function a(t){if(n.Browser.msTouch){var e=p.indexOf(t.pointerId);if(-1===e)return;p.splice(e,1)}if(l){if(n.Browser.msTouch){var o,s={};for(var a in h)o=h[a],s[a]="function"==typeof o?o.bind(h):o;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",_=this._touchstart,d=this._touchend,p=[];t[c+_+o]=s,t[c+d+o]=a;var m=n.Browser.msTouch?e.documentElement:t;return t.addEventListener(_,s,!1),m.addEventListener(d,a,!1),n.Browser.msTouch&&m.addEventListener("MSPointerCancel",a,!1),this},removeDoubleTapListener:function(t,i){var o="_leaflet_";return t.removeEventListener(this._touchstart,t[o+this._touchstart+i],!1),(n.Browser.msTouch?e.documentElement:t).removeEventListener(this._touchend,t[o+this._touchend+i],!1),n.Browser.msTouch&&e.documentElement.removeEventListener("MSPointerCancel",t[o+this._touchend+i],!1),this}}),n.extend(n.DomEvent,{_msTouches:[],_msDocumentListener:!1,addMsTouchListener:function(t,e,i,n){switch(e){case"touchstart":return this.addMsTouchListenerStart(t,e,i,n);case"touchend":return this.addMsTouchListenerEnd(t,e,i,n);case"touchmove":return this.addMsTouchListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addMsTouchListenerStart:function(t,i,n,o){var s="_leaflet_",a=this._msTouches,r=function(t){for(var e=!1,i=0;a.length>i;i++)if(a[i].pointerId===t.pointerId){e=!0;break}e||a.push(t),t.touches=a.slice(),t.changedTouches=[t],n(t)};if(t[s+"touchstart"+o]=r,t.addEventListener("MSPointerDown",r,!1),!this._msDocumentListener){var h=function(t){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a.splice(e,1);break}};e.documentElement.addEventListener("MSPointerUp",h,!1),e.documentElement.addEventListener("MSPointerCancel",h,!1),this._msDocumentListener=!0}return this},addMsTouchListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE||0!==t.buttons){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._msTouches;return t[s+"touchmove"+n]=o,t.addEventListener("MSPointerMove",o,!1),this},addMsTouchListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._msTouches,a=function(t){for(var e=0;s.length>e;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener("MSPointerUp",a,!1),t.addEventListener("MSPointerCancel",a,!1),this},removeMsTouchListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener("MSPointerDown",o,!1);break;case"touchmove":t.removeEventListener("MSPointerMove",o,!1);break;case"touchend":t.removeEventListener("MSPointerUp",o,!1),t.removeEventListener("MSPointerCancel",o,!1)}return this}}),n.Map.mergeOptions({touchZoom:n.Browser.touch&&!n.Browser.android23}),n.Map.TouchZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){n.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var o=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=o.add(s)._divideBy(2),this._startDist=o.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),n.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),n.DomEvent.preventDefault(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length){var e=this._map,i=e.mouseEventToLayerPoint(t.touches[0]),o=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(o)/this._startDist,this._delta=i._add(o)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(this._moved||(n.DomUtil.addClass(e._mapPane,"leaflet-zoom-anim leaflet-touching"),e.fire("movestart").fire("zoomstart")._prepareTileBg(),this._moved=!0),n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),n.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e);t.fire("zoomanim",{center:i,zoom:t.getScaleZoom(this._scale)}),t._tileBg.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(this._delta)+" "+n.DomUtil.getScaleString(this._scale,this._startCenter)},_onTouchEnd:function(){if(this._moved&&this._zooming){var t=this._map;this._zooming=!1,n.DomUtil.removeClass(t._mapPane,"leaflet-touching"),n.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),o=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r);t.fire("zoomanim",{center:o,zoom:h}),t._runAnimation(o,h,t.getZoomScale(h)/this._scale,i,!0)}},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),n.Map.addInitHook("addHandler","touchZoom",n.Map.TouchZoom),n.Map.mergeOptions({boxZoom:!0}),n.Map.BoxZoom=n.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){n.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){n.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(n.DomUtil.disableTextSelection(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=n.DomUtil.create("div","leaflet-zoom-box",this._pane),n.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",n.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).preventDefault(t),this._map.fire("boxzoomstart"),i)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,o=this._map.mouseEventToLayerPoint(t),s=o.subtract(e),a=new n.Point(Math.min(o.x,e.x),Math.min(o.y,e.y));n.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_onMouseUp:function(t){this._pane.removeChild(this._box),this._container.style.cursor="",n.DomUtil.enableTextSelection(),n.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp);var i=this._map,o=i.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(o)){var s=new n.LatLngBounds(i.layerPointToLatLng(this._startLayerPoint),i.layerPointToLatLng(o));i.fitBounds(s),i.fire("boxzoomend",{boxZoomBounds:s})}}}),n.Map.addInitHook("addHandler","boxZoom",n.Map.BoxZoom),n.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),n.Map.Keyboard=n.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),n.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;n.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){this._focused||this._map._container.focus()},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){n.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){n.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(this._panKeys.hasOwnProperty(e))i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds);else{if(!this._zoomKeys.hasOwnProperty(e))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}n.DomEvent.stop(t)}}),n.Map.addInitHook("addHandler","keyboard",n.Map.Keyboard),n.Handler.MarkerDrag=n.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new n.Draggable(t,t).on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this)),this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=n.DomUtil.getPosition(t._icon),o=t._map.layerPointToLatLng(i);e&&n.DomUtil.setPosition(e,i),t._latlng=o,t.fire("move",{latlng:o}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),n.Handler.PolyEdit=n.Handler.extend({options:{icon:new n.DivIcon({iconSize:new n.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"})},initialize:function(t,e){this._poly=t,n.setOptions(this,e)},addHooks:function(){this._poly._map&&(this._markerGroup||this._initMarkers(),this._poly._map.addLayer(this._markerGroup))},removeHooks:function(){this._poly._map&&(this._poly._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers)},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new n.LayerGroup),this._markers=[];var t,e,i,o,s=this._poly._latlngs;for(t=0,i=s.length;i>t;t++)o=this._createMarker(s[t],t),o.on("click",this._onMarkerClick,this),this._markers.push(o);var a,r;for(t=0,e=i-1;i>t;e=t++)(0!==t||n.Polygon&&this._poly instanceof n.Polygon)&&(a=this._markers[e],r=this._markers[t],this._createMiddleMarker(a,r),this._updatePrevNext(a,r))},_createMarker:function(t,e){var i=new n.Marker(t,{draggable:!0,icon:this.options.icon});return i._origLatLng=t,i._index=e,i.on("drag",this._onMarkerDrag,this),i.on("dragend",this._fireEdit,this),this._markerGroup.addLayer(i),i},_fireEdit:function(){this._poly.fire("edit")},_onMarkerDrag:function(t){var e=t.target;n.extend(e._origLatLng,e._latlng),e._middleLeft&&e._middleLeft.setLatLng(this._getMiddleLatLng(e._prev,e)),e._middleRight&&e._middleRight.setLatLng(this._getMiddleLatLng(e,e._next)),this._poly.redraw()},_onMarkerClick:function(t){if(!(3>this._poly._latlngs.length)){var e=t.target,i=e._index;this._markerGroup.removeLayer(e),this._markers.splice(i,1),this._poly.spliceLatLngs(i,1),this._updateIndexes(i,-1),this._updatePrevNext(e._prev,e._next),e._middleLeft&&this._markerGroup.removeLayer(e._middleLeft),e._middleRight&&this._markerGroup.removeLayer(e._middleRight),e._prev&&e._next?this._createMiddleMarker(e._prev,e._next):e._prev?e._next||(e._prev._middleRight=null):e._next._middleLeft=null,this._poly.fire("edit")}},_updateIndexes:function(t,e){this._markerGroup.eachLayer(function(i){i._index>t&&(i._index+=e)})},_createMiddleMarker:function(t,e){var i,n,o,s=this._getMiddleLatLng(t,e),a=this._createMarker(s);a.setOpacity(.6),t._middleRight=e._middleLeft=a,n=function(){var n=e._index;a._index=n,a.off("click",i).on("click",this._onMarkerClick,this),s.lat=a.getLatLng().lat,s.lng=a.getLatLng().lng,this._poly.spliceLatLngs(n,0,s),this._markers.splice(n,0,a),a.setOpacity(1),this._updateIndexes(n,1),e._index++,this._updatePrevNext(t,a),this._updatePrevNext(a,e)},o=function(){a.off("dragstart",n,this),a.off("dragend",o,this),this._createMiddleMarker(t,a),this._createMiddleMarker(a,e)},i=function(){n.call(this),o.call(this),this._poly.fire("edit")},a.on("click",i,this).on("dragstart",n,this).on("dragend",o,this),this._markerGroup.addLayer(a)},_updatePrevNext:function(t,e){t&&(t._next=e),e&&(e._prev=t)},_getMiddleLatLng:function(t,e){var i=this._poly._map,n=i.latLngToLayerPoint(t.getLatLng()),o=i.latLngToLayerPoint(e.getLatLng());return i.layerPointToLatLng(n._add(o)._divideBy(2))}}),n.Polyline.addInitHook(function(){n.Handler.PolyEdit&&(this.editing=new n.Handler.PolyEdit(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()})}),n.Control=n.Class.extend({options:{position:"topright"},initialize:function(t){n.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this +},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),o=t._controlCorners[i];return n.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?o.insertBefore(e,o.firstChild):o.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this}}),n.control=function(t){return new n.Control(t)},n.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=n.DomUtil.create("div",a,o)}var e=this._controlCorners={},i="leaflet-",o=this._controlContainer=n.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")}}),n.Control.Zoom=n.Control.extend({options:{position:"topleft"},onAdd:function(t){var e="leaflet-control-zoom",i="leaflet-bar",o=i+"-part",s=n.DomUtil.create("div",e+" "+i);return this._map=t,this._zoomInButton=this._createButton("+","Zoom in",e+"-in "+o+" "+o+"-top",s,this._zoomIn,this),this._zoomOutButton=this._createButton("-","Zoom out",e+"-out "+o+" "+o+"-bottom",s,this._zoomOut,this),t.on("zoomend",this._updateDisabled,this),s},onRemove:function(t){t.off("zoomend",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,o,s,a){var r=n.DomUtil.create("a",i,o);r.innerHTML=t,r.href="#",r.title=e;var h=n.DomEvent.stopPropagation;return n.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",n.DomEvent.preventDefault).on(r,"click",s,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-control-zoom-disabled";n.DomUtil.removeClass(this._zoomInButton,e),n.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&n.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&n.DomUtil.addClass(this._zoomInButton,e)}}),n.Map.mergeOptions({zoomControl:!0}),n.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new n.Control.Zoom,this.addControl(this.zoomControl))}),n.control.zoom=function(t){return new n.Control.Zoom(t)},n.Control.Attribution=n.Control.extend({options:{position:"bottomright",prefix:'Powered by Leaflet'},initialize:function(t){n.setOptions(this,t),this._attributions={}},onAdd:function(t){return this._container=n.DomUtil.create("div","leaflet-control-attribution"),n.DomEvent.disableClickPropagation(this._container),t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):i},removeAttribution:function(t){return t?(this._attributions[t]--,this._update(),this):i},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions.hasOwnProperty(e)&&this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" — ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),n.Map.mergeOptions({attributionControl:!0}),n.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new n.Control.Attribution).addTo(this))}),n.control.attribution=function(t){return new n.Control.Attribution(t)},n.Control.Scale=n.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=n.DomUtil.create("div",e),o=this.options;return this._addScales(o,e,i),t.on(o.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=n.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=n.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),n.control.scale=function(t){return new n.Control.Scale(t)},n.Control.Layers=n.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){n.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var o in t)t.hasOwnProperty(o)&&this._addLayer(t[o],o);for(o in e)e.hasOwnProperty(o)&&this._addLayer(e[o],o,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=n.DomUtil.create("div",t);n.Browser.touch?n.DomEvent.on(e,"click",n.DomEvent.stopPropagation):(n.DomEvent.disableClickPropagation(e),n.DomEvent.on(e,"mousewheel",n.DomEvent.stopPropagation));var i=this._form=n.DomUtil.create("form",t+"-list");if(this.options.collapsed){n.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var o=this._layersLink=n.DomUtil.create("a",t+"-toggle",e);o.href="#",o.title="Layers",n.Browser.touch?n.DomEvent.on(o,"click",n.DomEvent.stopPropagation).on(o,"click",n.DomEvent.preventDefault).on(o,"click",this._expand,this):n.DomEvent.on(o,"focus",this._expand,this),this._map.on("movestart",this._collapse,this)}else this._expand();this._baseLayersList=n.DomUtil.create("div",t+"-base",i),this._separator=n.DomUtil.create("div",t+"-separator",i),this._overlaysList=n.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var o=n.stamp(t);this._layers[o]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t=!1,e=!1;for(var i in this._layers)if(this._layers.hasOwnProperty(i)){var n=this._layers[i];this._addItem(n),e=e||n.overlay,t=t||!n.overlay}this._separator.style.display=e&&t?"":"none"}},_onLayerChange:function(t){var e=n.stamp(t.layer);this._layers[e]&&!this._handlingClick&&this._update()},_createRadioElement:function(t,i){var n='t;t++)e=o[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?(this._map.addLayer(i.layer),i.overlay||(n=i.layer)):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);n&&(this._map.setZoom(this._map.getZoom()),this._map.fire("baselayerchange",{layer:n})),this._handlingClick=!1},_expand:function(){n.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),n.control.layers=function(t,e,i){return new n.Control.Layers(t,e,i)},n.PosAnimation=n.Class.extend({includes:n.Mixin.Events,run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this.fire("start"),t.style[n.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(o||.5)+",1)",n.DomEvent.on(t,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),n.DomUtil.setPosition(t,e),n.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(n.bind(this.fire,this,"step"),50)},stop:function(){this._inProgress&&(n.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),n.Util.falseFn(this._el.offsetWidth))},_transformRe:/(-?[\d\.]+), (-?[\d\.]+)\)/,_getPos:function(){var e,i,o,s=this._el,a=t.getComputedStyle(s);return n.Browser.any3d?(o=a[n.DomUtil.TRANSFORM].match(this._transformRe),e=parseFloat(o[1]),i=parseFloat(o[2])):(e=parseFloat(a.left),i=parseFloat(a.top)),new n.Point(e,i,!0)},_onTransitionEnd:function(){n.DomEvent.off(this._el,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[n.DomUtil.TRANSITION]="",clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),n.Map.include({setView:function(t,e,i){e=this._limitZoom(e);var n=this._zoom!==e;if(this._loaded&&!i&&this._layers){this._panAnim&&this._panAnim.stop();var o=n?this._zoomToIfClose&&this._zoomToIfClose(t,e):this._panByIfClose(t);if(o)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e,i){if(t=n.point(t),!t.x&&!t.y)return this;this._panAnim||(this._panAnim=new n.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),this.fire("movestart"),n.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var o=n.DomUtil.getPosition(this._mapPane).subtract(t)._round();return this._panAnim.run(this._mapPane,o,e||.25,i),this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){n.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_panByIfClose:function(t){var e=this._getCenterOffset(t)._floor();return this._offsetIsWithinView(e)?(this.panBy(e),!0):!1},_offsetIsWithinView:function(t,e){var i=e||1,n=this.getSize();return Math.abs(t.x)<=n.x*i&&Math.abs(t.y)<=n.y*i}}),n.PosAnimation=n.DomUtil.TRANSITION?n.PosAnimation:n.PosAnimation.extend({run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(o||.5,.2),this._startPos=n.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=n.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));n.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){n.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),n.Map.mergeOptions({zoomAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23&&!n.Browser.mobileOpera}),n.DomUtil.TRANSITION&&n.Map.addInitHook(function(){n.DomEvent.on(this._mapPane,n.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),n.Map.include(n.DomUtil.TRANSITION?{_zoomToIfClose:function(t,e){if(this._animatingZoom)return!0;if(!this.options.zoomAnimation)return!1;var i=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/i);if(!this._offsetIsWithinView(o,1))return!1;n.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this.fire("movestart").fire("zoomstart"),this.fire("zoomanim",{center:t,zoom:e});var s=this._getCenterLayerPoint().add(o);return this._prepareTileBg(),this._runAnimation(t,e,i,s),!0},_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_runAnimation:function(t,e,i,o,s){this._animateToCenter=t,this._animateToZoom=e,this._animatingZoom=!0,n.Draggable&&(n.Draggable._disabled=!0);var a=n.DomUtil.TRANSFORM,r=this._tileBg;clearTimeout(this._clearTileBgTimer),n.Util.falseFn(r.offsetWidth);var h=n.DomUtil.getScaleString(i,o),l=r.style[a];r.style[a]=s?l+" "+h:h+" "+l},_prepareTileBg:function(){var t=this._tilePane,e=this._tileBg;if(e&&this._getLoadedTilesPercentage(e)>.5&&.5>this._getLoadedTilesPercentage(t))return t.style.visibility="hidden",t.empty=!0,this._stopLoadingImages(t),i;e||(e=this._tileBg=this._createPane("leaflet-tile-pane",this._mapPane),e.style.zIndex=1),e.style[n.DomUtil.TRANSFORM]="",e.style.visibility="hidden",e.empty=!0,t.empty=!1,this._tilePane=this._panes.tilePane=e;var o=this._tileBg=t;n.DomUtil.addClass(o,"leaflet-zoom-animated"),this._stopLoadingImages(o)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,o,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)o=s[e],o.complete||(o.onload=n.Util.falseFn,o.onerror=n.Util.falseFn,o.src=n.Util.emptyImageUrl,o.parentNode.removeChild(o))},_onZoomTransitionEnd:function(){this._restoreTileFront(),n.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),n.Util.falseFn(this._tileBg.offsetWidth),this._animatingZoom=!1,this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),n.Draggable&&(n.Draggable._disabled=!1)},_restoreTileFront:function(){this._tilePane.innerHTML="",this._tilePane.style.visibility="",this._tilePane.style.zIndex=2,this._tileBg.style.zIndex=1},_clearTileBg:function(){this._animatingZoom||this.touchZoom._zooming||(this._tileBg.innerHTML="")}}:{}),n.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locationOptions=n.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=n.bind(this._handleGeolocationResponse,this),i=n.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locationOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=180*t.coords.accuracy/4e7,i=2*e,o=t.coords.latitude,s=t.coords.longitude,a=new n.LatLng(o,s),r=new n.LatLng(o-e,s-i),h=new n.LatLng(o+e,s+i),l=new n.LatLngBounds(r,h),u=this._locationOptions;if(u.setView){var c=Math.min(this.getBoundsZoom(l),u.maxZoom);this.setView(a,c)}this.fire("locationfound",{latlng:a,bounds:l,accuracy:t.coords.accuracy})}})})(this,document); \ No newline at end of file From 538b57c7f7d4ecc84954e774cd0593be6373165b Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Mon, 25 Feb 2013 23:58:07 +0100 Subject: [PATCH 50/74] Due to ingress.com/intel now force-redirecting to the HTTPS version, loading dependencies just got a lot harder. External JS and CSS files are now included directly in the file while building. This does not yet work for plugins. I will make an emergency release soon, so at least main works. --- build.py | 21 +- code/boot.js | 27 +- external/jquery.qrcode.min.js | 28 ++ external/leaflet.css | 457 ++++++++++++++++++ dist/leaflet.0.5.js => external/leaflet.js | 0 main.js | 31 +- .../assets/js/ingressSplash.html | 8 +- plugins/compute-ap-stats.user.js | 4 +- plugins/draw-tools.user.js | 6 +- plugins/guess-player-levels.user.js | 4 +- plugins/player-tracker.user.js | 4 +- plugins/render-limit-increase.user.js | 6 +- .../reso-energy-pct-in-portal-detail.user.js | 4 +- ...onator-display-zoom-level-decrease.user.js | 4 +- plugins/show-address.user.js | 4 +- plugins/show-portal-weakness.user.js | 4 +- 16 files changed, 546 insertions(+), 66 deletions(-) create mode 100644 external/jquery.qrcode.min.js create mode 100644 external/leaflet.css rename dist/leaflet.0.5.js => external/leaflet.js (100%) diff --git a/build.py b/build.py index 2752f8e9..dc85495f 100755 --- a/build.py +++ b/build.py @@ -2,19 +2,34 @@ import glob import time +import re def readfile(fn): with open(fn, 'Ur', encoding='utf8') as f: return f.read() +def loaderString(var): + fn = var.group(1) + return readfile(fn).replace('\n', '\\n').replace('\'', '\\\'') + +def loaderRaw(var): + fn = var.group(1) + return readfile(fn) + + c = '\n\n'.join(map(readfile, glob.glob('code/*'))) n = time.strftime('%Y-%m-%d-%H%M%S') -m = readfile('main.js').replace('@@BUILDDATE@@', n) +m = readfile('main.js') + m = m.split('@@INJECTHERE@@') m.insert(1, c) -t = '\n\n'.join(m) +m = '\n\n'.join(m) + +m = m.replace('@@BUILDDATE@@', n) +m = re.sub('@@INCLUDERAW:([0-9a-zA-Z_./-]+)@@', loaderRaw, m) +m = re.sub('@@INCLUDESTRING:([0-9a-zA-Z_./-]+)@@', loaderString, m) with open('iitc-debug.user.js', 'w', encoding='utf8') as f: - f.write(t) + f.write(m) # vim: ai si ts=4 sw=4 sts=4 et diff --git a/code/boot.js b/code/boot.js index cac8721f..7cfd6d23 100644 --- a/code/boot.js +++ b/code/boot.js @@ -291,28 +291,17 @@ function boot() { // Copyright (c) 2010 Chris O'Hara . MIT Licensed function asyncLoadScript(a){return function(b,c){var d=document.createElement("script");d.type="text/javascript",d.src=a,d.onload=b,d.onerror=c,d.onreadystatechange=function(){var a=this.readyState;if(a==="loaded"||a==="complete")d.onreadystatechange=null,b()},head.insertBefore(d,head.firstChild)}}(function(a){a=a||{};var b={},c,d;c=function(a,d,e){var f=a.halt=!1;a.error=function(a){throw a},a.next=function(c){c&&(f=!1);if(!a.halt&&d&&d.length){var e=d.shift(),g=e.shift();f=!0;try{b[g].apply(a,[e,e.length,g])}catch(h){a.error(h)}}return a};for(var g in b){if(typeof a[g]=="function")continue;(function(e){a[e]=function(){var g=Array.prototype.slice.call(arguments);if(e==="onError"){if(d)return b.onError.apply(a,[g,g.length]),a;var h={};return b.onError.apply(h,[g,g.length]),c(h,null,"onError")}return g.unshift(e),d?(a.then=a[e],d.push(g),f?a:a.next()):c({},[g],e)}})(g)}return e&&(a.then=a[e]),a.call=function(b,c){c.unshift(b),d.unshift(c),a.next(!0)},a.next()},d=a.addMethod=function(d){var e=Array.prototype.slice.call(arguments),f=e.pop();for(var g=0,h=e.length;ga||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]= +0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c= +j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount- +b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0g;g++)if(null==this.modules[b][i-g]){var n=!1;f>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a, +c),b=new t,e=0;e8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d= +0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+ +a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;dc)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+ +a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256), +LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d +this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b>>7-a%8&1)},put:function(a,c){for(var d=0;d>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1, +correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e").css("height",b+"px").appendTo(c);for(i=0;i").css("width", +d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery); diff --git a/external/leaflet.css b/external/leaflet.css new file mode 100644 index 00000000..ea3da390 --- /dev/null +++ b/external/leaflet.css @@ -0,0 +1,457 @@ +/* required styles */ + +.leaflet-map-pane, +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-tile-pane, +.leaflet-overlay-pane, +.leaflet-shadow-pane, +.leaflet-marker-pane, +.leaflet-popup-pane, +.leaflet-overlay-pane svg, +.leaflet-zoom-box, +.leaflet-image-layer, +.leaflet-layer { + position: absolute; + left: 0; + top: 0; + } +.leaflet-container { + overflow: hidden; + -ms-touch-action: none; + } +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + } +.leaflet-marker-icon, +.leaflet-marker-shadow { + display: block; + } +/* map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container img { + max-width: none !important; + } +/* stupid Android 2 doesn't understand "max-width: none" properly */ +.leaflet-container img.leaflet-image-layer { + max-width: 15000px !important; + } +.leaflet-tile { + filter: inherit; + visibility: hidden; + } +.leaflet-tile-loaded { + visibility: inherit; + } +.leaflet-zoom-box { + width: 0; + height: 0; + } + +.leaflet-tile-pane { z-index: 2; } +.leaflet-objects-pane { z-index: 3; } +.leaflet-overlay-pane { z-index: 4; } +.leaflet-shadow-pane { z-index: 5; } +.leaflet-marker-pane { z-index: 6; } +.leaflet-popup-pane { z-index: 7; } + + +/* control positioning */ + +.leaflet-control { + position: relative; + z-index: 7; + pointer-events: auto; + } +.leaflet-top, +.leaflet-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; + } +.leaflet-top { + top: 0; + } +.leaflet-right { + right: 0; + } +.leaflet-bottom { + bottom: 0; + } +.leaflet-left { + left: 0; + } +.leaflet-control { + float: left; + clear: both; + } +.leaflet-right .leaflet-control { + float: right; + } +.leaflet-top .leaflet-control { + margin-top: 10px; + } +.leaflet-bottom .leaflet-control { + margin-bottom: 10px; + } +.leaflet-left .leaflet-control { + margin-left: 10px; + } +.leaflet-right .leaflet-control { + margin-right: 10px; + } + + +/* zoom and fade animations */ + +.leaflet-fade-anim .leaflet-tile, +.leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + -o-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; + } +.leaflet-fade-anim .leaflet-tile-loaded, +.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { + opacity: 1; + } + +.leaflet-zoom-anim .leaflet-zoom-animated { + -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); + -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); + -o-transition: -o-transform 0.25s cubic-bezier(0,0,0.25,1); + transition: transform 0.25s cubic-bezier(0,0,0.25,1); + } +.leaflet-zoom-anim .leaflet-tile, +.leaflet-pan-anim .leaflet-tile, +.leaflet-touching .leaflet-zoom-animated { + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; + } + +.leaflet-zoom-anim .leaflet-zoom-hide { + visibility: hidden; + } + + +/* cursors */ + +.leaflet-clickable { + cursor: pointer; + } +.leaflet-container { + cursor: -webkit-grab; + cursor: -moz-grab; + } +.leaflet-popup-pane, +.leaflet-control { + cursor: auto; + } +.leaflet-dragging, +.leaflet-dragging .leaflet-clickable, +.leaflet-dragging .leaflet-container { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + } + + +/* visual tweaks */ + +.leaflet-container { + background: #ddd; + outline: 0; + } +.leaflet-container a { + color: #0078A8; + } +.leaflet-container a.leaflet-active { + outline: 2px solid orange; + } +.leaflet-zoom-box { + border: 2px dotted #05f; + background: white; + opacity: 0.5; + } + + +/* general typography */ +.leaflet-container { + font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; + } + + +/* general toolbar styles */ + +.leaflet-bar { + box-shadow: 0 0 8px rgba(0,0,0,0.4); + border: 1px solid #888; + -webkit-border-radius: 5px; + border-radius: 5px; + } +.leaflet-bar-part { + background-color: rgba(255, 255, 255, 0.8); + border-bottom: 1px solid #aaa; + } +.leaflet-bar-part-top { + -webkit-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; + } +.leaflet-bar-part-bottom { + -webkit-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; + border-bottom: none; + } + +.leaflet-touch .leaflet-bar { + -webkit-border-radius: 10px; + border-radius: 10px; + } +.leaflet-touch .leaflet-bar-part { + border-bottom: 4px solid rgba(0,0,0,0.3); + } +.leaflet-touch .leaflet-bar-part-top { + -webkit-border-radius: 7px 7px 0 0; + border-radius: 7px 7px 0 0; + } +.leaflet-touch .leaflet-bar-part-bottom { + -webkit-border-radius: 0 0 7px 7px; + border-radius: 0 0 7px 7px; + border-bottom: none; + } + + +/* zoom control */ + +.leaflet-container .leaflet-control-zoom { + margin-left: 13px; + margin-top: 12px; + } +.leaflet-control-zoom a { + width: 22px; + height: 22px; + text-align: center; + text-decoration: none; + color: black; + } +.leaflet-control-zoom a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.leaflet-control-zoom a:hover { + background-color: #fff; + color: #777; + } +.leaflet-control-zoom-in { + font: bold 18px/24px Arial, Helvetica, sans-serif; + } +.leaflet-control-zoom-out { + font: bold 23px/20px Tahoma, Verdana, sans-serif; + } +.leaflet-control-zoom a.leaflet-control-zoom-disabled { + cursor: default; + background-color: rgba(255, 255, 255, 0.8); + color: #bbb; + } + +.leaflet-touch .leaflet-control-zoom a { + width: 30px; + height: 30px; + } +.leaflet-touch .leaflet-control-zoom-in { + font-size: 24px; + line-height: 29px; + } +.leaflet-touch .leaflet-control-zoom-out { + font-size: 28px; + line-height: 24px; + } + +/* layers control */ + +.leaflet-control-layers { + box-shadow: 0 1px 7px rgba(0,0,0,0.4); + background: #f8f8f9; + -webkit-border-radius: 8px; + border-radius: 8px; + } +.leaflet-control-layers-toggle { + background-image: url(images/layers.png); + width: 36px; + height: 36px; + } +.leaflet-touch .leaflet-control-layers-toggle { + width: 44px; + height: 44px; + } +.leaflet-control-layers .leaflet-control-layers-list, +.leaflet-control-layers-expanded .leaflet-control-layers-toggle { + display: none; + } +.leaflet-control-layers-expanded .leaflet-control-layers-list { + display: block; + position: relative; + } +.leaflet-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; + } +.leaflet-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; + } +.leaflet-control-layers label { + display: block; + } +.leaflet-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; + } + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background-color: rgba(255, 255, 255, 0.7); + box-shadow: 0 0 5px #bbb; + margin: 0; + } +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + } +.leaflet-container .leaflet-control-attribution, +.leaflet-container .leaflet-control-scale { + font-size: 11px; + } +.leaflet-left .leaflet-control-scale { + margin-left: 5px; + } +.leaflet-bottom .leaflet-control-scale { + margin-bottom: 5px; + } +.leaflet-control-scale-line { + border: 2px solid #777; + border-top: none; + color: black; + line-height: 1.1; + padding: 2px 5px 1px; + font-size: 11px; + text-shadow: 1px 1px 1px #fff; + background-color: rgba(255, 255, 255, 0.5); + box-shadow: 0 -1px 5px rgba(0, 0, 0, 0.2); + white-space: nowrap; + overflow: hidden; + } +.leaflet-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); + } +.leaflet-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; + } + +.leaflet-touch .leaflet-control-attribution, +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-control-zoom { + box-shadow: none; + } +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-control-zoom { + border: 4px solid rgba(0,0,0,0.3); + } + + +/* popup */ + +.leaflet-popup { + position: absolute; + text-align: center; + } +.leaflet-popup-content-wrapper { + padding: 1px; + text-align: left; + -webkit-border-radius: 20px; + border-radius: 20px; + } +.leaflet-popup-content { + margin: 14px 20px; + line-height: 1.4; + } +.leaflet-popup-content p { + margin: 18px 0; + } +.leaflet-popup-tip-container { + margin: 0 auto; + width: 40px; + height: 20px; + position: relative; + overflow: hidden; + } +.leaflet-popup-tip { + width: 15px; + height: 15px; + padding: 1px; + + margin: -8px auto 0; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + } +.leaflet-popup-content-wrapper, .leaflet-popup-tip { + background: white; + + box-shadow: 0 3px 14px rgba(0,0,0,0.4); + } +.leaflet-container a.leaflet-popup-close-button { + position: absolute; + top: 0; + right: 0; + padding: 4px 5px 0 0; + text-align: center; + width: 18px; + height: 14px; + font: 16px/14px Tahoma, Verdana, sans-serif; + color: #c3c3c3; + text-decoration: none; + font-weight: bold; + background: transparent; + } +.leaflet-container a.leaflet-popup-close-button:hover { + color: #999; + } +.leaflet-popup-scrolled { + overflow: auto; + border-bottom: 1px solid #ddd; + border-top: 1px solid #ddd; + } + + +/* div icon */ + +.leaflet-div-icon { + background: #fff; + border: 1px solid #666; + } +.leaflet-editing-icon { + -webkit-border-radius: 2px; + border-radius: 2px; + } diff --git a/dist/leaflet.0.5.js b/external/leaflet.js similarity index 100% rename from dist/leaflet.0.5.js rename to external/leaflet.js diff --git a/main.js b/main.js index db95ae40..3396f14f 100644 --- a/main.js +++ b/main.js @@ -20,6 +20,11 @@ window.iitcBuildDate = '@@BUILDDATE@@'; // disable vanilla JS window.onload = function() {}; +if(window.location.protocol !== 'https:') { + window.location.protocol = 'https:'; + throw('Need to load HTTPS version.'); +} + // rescue user data from original page var scr = document.getElementsByTagName('script'); for(var x in scr) { @@ -51,32 +56,18 @@ for(var i = 0; i < d.length; i++) { // player information is now available in a hash like this: // window.PLAYER = {"ap": "123", "energy": 123, "available_invites": 123, "nickname": "somenick", "team": "ALIENS||RESISTANCE"}; -var ir = window.internalResources || []; - -var mainstyle = 'http://breunigs.github.com/ingress-intel-total-conversion/style.css?@@BUILDDATE@@'; -var smartphone = 'http://breunigs.github.com/ingress-intel-total-conversion/mobile/smartphone.css?@@BUILDDATE@@'; -var leaflet = 'http://cdn.leafletjs.com/leaflet-0.5/leaflet.css'; -var coda = 'https://fonts.googleapis.com/css?family=Coda'; - // remove complete page. We only wanted the user-data and the page’s // security context so we can access the API easily. Setup as much as // possible without requiring scripts. document.getElementsByTagName('head')[0].innerHTML = '' - //~ + '' + 'Ingress Intel Map' - + (ir.indexOf('mainstyle') === -1 - ? '' - : '') - + (ir.indexOf('leafletcss') === -1 - ? '' - : '') + + '' + + '' // this navigator check is also used in code/smartphone.js - + (ir.indexOf('smartphonecss') === -1 && navigator.userAgent.match(/Android.*Mobile/) - ? '' + + (navigator.userAgent.match(/Android.*Mobile/) + ? + '' : '') - + (ir.indexOf('codafont') === -1 - ? '' - : ''); + + ''; document.getElementsByTagName('body')[0].innerHTML = '' + '
Loading, please wait
' @@ -179,7 +170,7 @@ window.RANGE_INDICATOR_COLOR = 'red' window.PORTAL_RADIUS_ENLARGE_MOBILE = 5; -window.DEFAULT_PORTAL_IMG = 'http://commondatastorage.googleapis.com/ingress/img/default-portal-image.png'; +window.DEFAULT_PORTAL_IMG = 'https://commondatastorage.googleapis.com/ingress/img/default-portal-image.png'; window.NOMINATIM = 'http://nominatim.openstreetmap.org/search?format=json&limit=1&q='; // INGRESS CONSTANTS ///////////////////////////////////////////////// diff --git a/mobile/IngressIntelTC/assets/js/ingressSplash.html b/mobile/IngressIntelTC/assets/js/ingressSplash.html index 620be905..49960e18 100644 --- a/mobile/IngressIntelTC/assets/js/ingressSplash.html +++ b/mobile/IngressIntelTC/assets/js/ingressSplash.html @@ -2,7 +2,7 @@ Ingress Intel Total Converion - Mobile & Tablet - '); } From 8ff667e45f361aa7c69e0a8c93509661fff91eb9 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 01:09:52 +0100 Subject: [PATCH 53/74] release 0.7.5. This is an emergency release to fix complete breakage for the upcoming https rollout --- NEWS.md | 15 +- README.md | 6 +- dist/total-conversion-build.user.js | 486 ++++++++++++++++++---------- main.js | 2 +- pack-release.sh | 10 - 5 files changed, 337 insertions(+), 182 deletions(-) delete mode 100755 pack-release.sh diff --git a/NEWS.md b/NEWS.md index c8cc64c7..658922ec 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,17 @@ +CHANGES IN 0.7.5 +================ + +This is an emergency release to keep IITC working with Niantic’s switch to HTTPS. It appears they will roll it out for everyone soon, so IITC now requires HTTPS for everyone; support for HTTP was dropped to keep things sane. Additionally, the following things were changed from 0.7.1: + +- Feature: the “gmaps” link for each portal has been replaced with a “poslinks” one. It offers Google Maps, OpenStreetMap and QR-Codes for easy transfer to your mobile phone (by Merovius). +- Feature: the exact capture time is now shown in a tooltip in the portal details (by j16sdiz) +- Change: most scripts are now included in the UserScript directly. Was the easiest solution to the HTTPS issue. +- Change: minor improvements when render limit is about to be hit. +- Bugfix: map base layer wasn’t always remembered in Chrome + + CHANGES IN 0.7 / 0.7.1 -====================== +---------------------- - 0.7.1 fixes an oversight that prevented some portals from showing (by saithis) @@ -51,7 +63,6 @@ CHANGES IN 0.6 / 0.61 - **SECURITY**: Chat was vulnerable to XSS attacks. Update as soon as possible. - - Feature: [**more plugins**](https://github.com/breunigs/ingress-intel-total-conversion/tree/gh-pages/plugins#readme) - weakened portals: highlights portals with few resonators or ones that are decayed, making it easier to see where diff --git a/README.md b/README.md index 6e33a11a..4e2e03b1 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ IITC can be [extended with the use of plugins](https://github.com/breunigs/ingre Install ------- -Current version is 0.7.1. [See NEWS.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/NEWS.md). +Current version is 0.7.5. [See NEWS.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/NEWS.md). [**INSTALL**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js) @@ -40,7 +40,9 @@ Current version is 0.7.1. [See NEWS.md for details](https://github.com/breunigs/ - Confirm once again. - Reload page. -*Note:* Tampermonkey is optional. However, it offers auto-update, shows correct version numbers and installing user scripts is much easier. If you have installed the scripts directly into Chrome before, I recommend you switch to Tampermonkey. To do so, uninstall the IITC scripts and click each install link again. Follow the procedure explained above. +**NOTE: You still need to manually update IITC with Tampermonkey.** There is a bug in the current stable release. It has been fixed in Tampermonkey’s development version. Until it is released, you need to manually update IITC. + +*Note:* Tampermonkey is optional. However, it ~~offers auto-update~~, shows correct version numbers and installing user scripts is much easier. If you have installed the scripts directly into Chrome before, I recommend you switch to Tampermonkey. To do so, uninstall the IITC scripts and click each install link again. Follow the procedure explained above. ### Opera - Download the script: [download](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js) diff --git a/dist/total-conversion-build.user.js b/dist/total-conversion-build.user.js index f920b407..dba0c24d 100644 --- a/dist/total-conversion-build.user.js +++ b/dist/total-conversion-build.user.js @@ -1,13 +1,13 @@ // ==UserScript== // @id ingress-intel-total-conversion@breunigs // @name intel map total conversion -// @version 0.7.1-2013-02-23-235612 +// @version 0.7.5-2013-02-26-005819 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @description total conversion for the ingress intel map. -// @include http://www.ingress.com/intel* -// @match http://www.ingress.com/intel* +// @include *://www.ingress.com/intel* +// @match *://www.ingress.com/intel* // ==/UserScript== @@ -15,11 +15,16 @@ if(document.getElementsByTagName('html')[0].getAttribute('itemscope') != null) throw('Ingress Intel Website is down, not a userscript issue.'); -window.iitcBuildDate = '2013-02-23-235612'; +window.iitcBuildDate = '2013-02-26-005819'; // disable vanilla JS window.onload = function() {}; +if(window.location.protocol !== 'https:') { + window.location.protocol = 'https:'; + throw('Need to load HTTPS version.'); +} + // rescue user data from original page var scr = document.getElementsByTagName('script'); for(var x in scr) { @@ -51,32 +56,18 @@ for(var i = 0; i < d.length; i++) { // player information is now available in a hash like this: // window.PLAYER = {"ap": "123", "energy": 123, "available_invites": 123, "nickname": "somenick", "team": "ALIENS||RESISTANCE"}; -var ir = window.internalResources || []; - -var mainstyle = 'http://breunigs.github.com/ingress-intel-total-conversion/dist/style.0.7.css'; -var smartphone = 'http://breunigs.github.com/ingress-intel-total-conversion/dist/smartphone.0.7.css'; -var leaflet = 'http://cdn.leafletjs.com/leaflet-0.5/leaflet.css'; -var coda = 'http://fonts.googleapis.com/css?family=Coda'; - // remove complete page. We only wanted the user-data and the page’s // security context so we can access the API easily. Setup as much as // possible without requiring scripts. document.getElementsByTagName('head')[0].innerHTML = '' - //+ '' + 'Ingress Intel Map' - + (ir.indexOf('mainstyle') === -1 - ? '' - : '') - + (ir.indexOf('leafletcss') === -1 - ? '' - : '') + + '' + + '' // this navigator check is also used in code/smartphone.js - + (ir.indexOf('smartphonecss') === -1 && navigator.userAgent.match(/Android.*Mobile/) - ? '' + + (navigator.userAgent.match(/Android.*Mobile/) + ? + '' : '') - + (ir.indexOf('codafont') === -1 - ? '' - : ''); + + ''; document.getElementsByTagName('body')[0].innerHTML = '' + '
Loading, please wait
' @@ -158,7 +149,7 @@ window.MAX_DRAWN_FIELDS = 200; window.RESONATOR_DISPLAY_ZOOM_LEVEL = 17; window.COLOR_SELECTED_PORTAL = '#f00'; -window.COLORS = ['#FFCE00', '#0088FF', '#03FE03']; // none, res, enl +window.COLORS = ['#FFCE00', '#0088FF', '#03DC03']; // none, res, enl window.COLORS_LVL = ['#000', '#FECE5A', '#FFA630', '#FF7315', '#E40000', '#FD2992', '#EB26CD', '#C124E0', '#9627F4']; window.COLORS_MOD = {VERY_RARE: '#F78AF6', RARE: '#AD8AFF', COMMON: '#84FBBD'}; @@ -179,7 +170,7 @@ window.RANGE_INDICATOR_COLOR = 'red' window.PORTAL_RADIUS_ENLARGE_MOBILE = 5; -window.DEFAULT_PORTAL_IMG = 'http://commondatastorage.googleapis.com/ingress/img/default-portal-image.png'; +window.DEFAULT_PORTAL_IMG = 'https://commondatastorage.googleapis.com/ingress/img/default-portal-image.png'; window.NOMINATIM = 'http://nominatim.openstreetmap.org/search?format=json&limit=1&q='; // INGRESS CONSTANTS ///////////////////////////////////////////////// @@ -288,13 +279,17 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; // redrawn. It is called early on in the // code/map_data.js#renderPortal as long as there was an // old portal for the guid. +// checkRenderLimit: callback is passed the argument of +// {reached : false} to indicate that the renderlimit is reached +// set reached to true. window._hooks = {} window.VALID_HOOKS = ['portalAdded', 'portalDetailsUpdated', - 'publicChatDataAvailable', 'portalDataLoaded', 'beforePortalReRender']; + 'publicChatDataAvailable', 'portalDataLoaded', 'beforePortalReRender', + 'checkRenderLimit']; window.runHooks = function(event, data) { if(VALID_HOOKS.indexOf(event) === -1) throw('Unknown event type: ' + event); @@ -580,8 +575,11 @@ window.renderPortal = function(ent) { // pre-loads player names for high zoom levels loadPlayerNamesForPortal(ent[2]); - var lvWeight = Math.max(2, portalLevel / 1.5); - var lvRadius = Math.max(portalLevel + 3, 5); + var lvWeight = Math.max(2, Math.floor(portalLevel) / 1.5); + var lvRadius = Math.floor(portalLevel) + 4; + if(team === window.TEAM_NONE) { + lvRadius = 7; + } var p = L.circleMarker(latlng, { radius: lvRadius + (L.Browser.mobile ? PORTAL_RADIUS_ENLARGE_MOBILE : 0), @@ -800,9 +798,19 @@ window.renderLink = function(ent) { weight:2, clickable: false, guid: ent[0], - smoothFactor: 10 + smoothFactor: 0 // doesn’t work for two points anyway, so disable }); + // determine which links are very short and don’t render them at all. + // in most cases this will go unnoticed, but improve rendering speed. + poly._map = window.map; + poly.projectLatlngs(); + var op = poly._originalPoints; + var dist = Math.abs(op[0].x - op[1].x) + Math.abs(op[0].y - op[1].y); + if(dist <= 10) { + return; + } + if(!getPaddedBounds().intersects(poly.getBounds())) return; poly.on('remove', function() { delete window.links[this.options.guid]; }); @@ -831,16 +839,27 @@ window.renderField = function(ent) { [reg.vertexB.location.latE6/1E6, reg.vertexB.location.lngE6/1E6], [reg.vertexC.location.latE6/1E6, reg.vertexC.location.lngE6/1E6] ]; + var poly = L.polygon(latlngs, { fillColor: COLORS[team], fillOpacity: 0.25, stroke: false, clickable: false, - smoothFactor: 10, - vertices: ent[2].capturedRegion, + smoothFactor: 0, // hiding small fields will be handled below + vertices: reg, lastUpdate: ent[1], guid: ent[0]}); + // determine which fields are too small to be rendered and don’t + // render them, so they don’t count towards the maximum fields limit. + // This saves some DOM operations as well, but given the relatively + // low amount of fields there isn’t much to gain. + // The algorithm is the same as used by Leaflet. + poly._map = window.map; + poly.projectLatlngs(); + var count = L.LineUtil.simplify(poly._originalPoints, 6).length; + if(count <= 2) return; + if(!getPaddedBounds().intersects(poly.getBounds())) return; poly.on('remove', function() { delete window.fields[this.options.guid]; }); @@ -875,108 +894,6 @@ window.findEntityInLeaflet = function(layerGroup, entityHash, guid) { -window.extendLeafletWithText = function() { - - - L.CircleMarkerWithText = L.CircleMarker.extend({ - options: { - fontFamily: 'Coda', - fontStroke: '#fff', - fontWeight: 'bold', - fontStrokeWidth: 2.5, - fontStrokeOpacity: 0.6, - fontFill: '#000', - fontSize: 14 - }, - - initialize: function (latlng, options) { - L.CircleMarker.prototype.initialize.call(this, latlng, options); - }, - - setText: function(text) { - this.options.text = text; - this._updateText(); - }, - - _updateStyle: function() { - L.CircleMarker.prototype._updateStyle.call(this); - this._updateText(); - }, - - _updatePath: function() { - if(this._oldPoint == this._point) return; - this._oldPoint = this._point; - - L.CircleMarker.prototype._updatePath.call(this); - this._updateTextPosition(); - }, - - _updateTextPosition: function() { - if(!this._textOuter) return; - this._textOuter.setAttribute('x', this._point.x); - this._textOuter.setAttribute('y', this._point.y); - this._textInner.setAttribute('x', this._point.x); - this._textInner.setAttribute('y', this._point.y); - }, - - _updateText: function() { - if(!L.Browser.svg) return; - - if(this._text && !this.options.text) { - this._container.removeChild(this._text); - } - - if(!this.options.text) return; - - if(!this._text) { - this._textOuter = this._createElement('text'); - this._textInner = this._createElement('text'); - this._text = this._createElement('g'); - this._text.setAttribute('text-anchor', 'middle'); - - if(this.options.clickable) { - this._text.setAttribute('class', 'leaflet-clickable'); - } - - this._text.appendChild(this._textOuter); - this._text.appendChild(this._textInner); - this._container.appendChild(this._text); - } - - // _textOuter contains the stroke information so the stroke is - // below the text and does not bleed into it. - this._textOuter.setAttribute('stroke', this.options.fontStroke); - this._textOuter.setAttribute('stroke-width', this.options.fontStrokeWidth); - this._textOuter.setAttribute('stroke-opacity', this.options.fontStrokeOpacity); - this._textOuter.setAttribute('dy', this.options.fontSize/2 - 1); - this._textInner.setAttribute('dy', this.options.fontSize/2 - 1); - - // _text contains properties that apply to both stroke and text. - this._text.setAttribute('fill', this.options.fontFill); - this._text.setAttribute('font-size', this.options.fontSize); - this._text.setAttribute('font-family', this.options.fontFamily); - this._text.setAttribute('font-weight', this.options.fontWeight); - - // group elements can’t have positions - this._updateTextPosition(); - - if(this._textOuter.firstChild) { - this._textOuter.firstChild.nodeValue = this.options.text; - this._textInner.firstChild.nodeValue = this.options.text; - } else { - this._textOuter.appendChild(document.createTextNode(this.options.text)); - this._textInner.appendChild(document.createTextNode(this.options.text)); - } - } - }); - - L.circleMarkerWithText = function (latlng, options) { - return new L.CircleMarkerWithText(latlng, options); - }; -} - - - // REQUEST HANDLING ////////////////////////////////////////////////// // note: only meant for portal/links/fields request, everything else // does not count towards “loading” @@ -1147,7 +1064,7 @@ window.postAjax = function(action, data, success, error) { // use full URL to avoid issues depending on how people set their // slash. See: // https://github.com/breunigs/ingress-intel-total-conversion/issues/56 - url: 'http://www.ingress.com/rpc/dashboard.'+action, + url: 'https://www.ingress.com/rpc/dashboard.'+action, type: 'POST', data: data, dataType: 'json', @@ -1189,6 +1106,14 @@ window.rangeLinkClick = function() { window.smartphone.mapButton.click(); } +window.showPortalPosLinks = function(lat, lng) { + var qrcode = '
'; + var script = ''; + var gmaps = 'gmaps'; + var osm = 'OSM'; + alert('
' + qrcode + script + gmaps + ' ' + osm + '
'); +} + window.reportPortalIssue = function(info) { var t = 'Redirecting you to a Google Help Page. Once there, click on “Contact Us” in the upper right corner.\n\nThe text box contains all necessary information. Press CTRL+C to copy it.'; var d = window.portals[window.selectedPortal].options.details; @@ -1210,6 +1135,7 @@ window.getPaddedBounds = function() { window._storedPaddedBounds = null; }); } + if(renderLimitReached(0.7)) return window.map.getBounds(); if(window._storedPaddedBounds) return window._storedPaddedBounds; var p = window.map.getBounds().pad(VIEWPORT_PAD_RATIO); @@ -1217,11 +1143,19 @@ window.getPaddedBounds = function() { return p; } -window.renderLimitReached = function() { - if(Object.keys(portals).length >= MAX_DRAWN_PORTALS) return true; - if(Object.keys(links).length >= MAX_DRAWN_LINKS) return true; - if(Object.keys(fields).length >= MAX_DRAWN_FIELDS) return true; - return false; +// returns true if the render limit has been reached. The default ratio +// is 1, which means it will tell you if there are more items drawn than +// acceptable. A value of 0.9 will tell you if 90% of the amount of +// acceptable entities have been drawn. You can use this to heuristi- +// cally detect if the render limit will be hit. +window.renderLimitReached = function(ratio) { + ratio = ratio || 1; + if(Object.keys(portals).length*ratio >= MAX_DRAWN_PORTALS) return true; + if(Object.keys(links).length*ratio >= MAX_DRAWN_LINKS) return true; + if(Object.keys(fields).length*ratio >= MAX_DRAWN_FIELDS) return true; + var param = { 'reached': false }; + window.runHooks('checkRenderLimit', param); + return param.reached; } window.getMinPortalLevel = function() { @@ -1422,10 +1356,6 @@ window.setupMap = function() { {zoomControl: !(localStorage['iitc.zoom.buttons'] === 'false')} )); - try { - map.addLayer(views[readCookie('ingress.intelmap.type')]); - } catch(e) { map.addLayer(views[0]); } - var addLayers = {}; portalsLayers = []; @@ -1455,6 +1385,14 @@ window.setupMap = function() { }, addLayers); map.addControl(window.layerChooser); + + // set the map AFTER adding the layer chooser, or Chrome reorders the + // layers. This likely leads to broken layer selection because the + // views/cookie order does not match the layer chooser order. + try { + map.addLayer(views[readCookie('ingress.intelmap.type')]); + } catch(e) { map.addLayer(views[0]); } + map.attributionControl.setPrefix(''); // listen for changes and store them in cookies map.on('moveend', window.storeMapPosition); @@ -1597,12 +1535,12 @@ window.setupDialogs = function() { function boot() { window.debug.console.overwriteNativeIfRequired(); - console.log('loading done, booting. Built: ' + window.iitcBuildDate); + console.log('loading done, booting. Built: 2013-02-26-005819'); if(window.deviceID) console.log('Your device ID: ' + window.deviceID); window.runOnSmartphonesBeforeBoot(); // overwrite default Leaflet Marker icon to be a neutral color - var base = 'http://breunigs.github.com/ingress-intel-total-conversion/dist/images/'; + var base = 'https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/images/'; L.Icon.Default.imagePath = base; window.iconEnl = L.Icon.Default.extend({options: { iconUrl: base + 'marker-green.png' } }); @@ -1651,29 +1589,240 @@ function boot() { // Copyright (c) 2010 Chris O'Hara . MIT Licensed function asyncLoadScript(a){return function(b,c){var d=document.createElement("script");d.type="text/javascript",d.src=a,d.onload=b,d.onerror=c,d.onreadystatechange=function(){var a=this.readyState;if(a==="loaded"||a==="complete")d.onreadystatechange=null,b()},head.insertBefore(d,head.firstChild)}}(function(a){a=a||{};var b={},c,d;c=function(a,d,e){var f=a.halt=!1;a.error=function(a){throw a},a.next=function(c){c&&(f=!1);if(!a.halt&&d&&d.length){var e=d.shift(),g=e.shift();f=!0;try{b[g].apply(a,[e,e.length,g])}catch(h){a.error(h)}}return a};for(var g in b){if(typeof a[g]=="function")continue;(function(e){a[e]=function(){var g=Array.prototype.slice.call(arguments);if(e==="onError"){if(d)return b.onError.apply(a,[g,g.length]),a;var h={};return b.onError.apply(h,[g,g.length]),c(h,null,"onError")}return g.unshift(e),d?(a.then=a[e],d.push(g),f?a:a.next()):c({},[g],e)}})(g)}return e&&(a.then=a[e]),a.call=function(b,c){c.unshift(b),d.unshift(c),a.next(!0)},a.next()},d=a.addMethod=function(d){var e=Array.prototype.slice.call(arguments),f=e.pop();for(var g=0,h=e.length;gi;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),limitExecByInterval:function(t,e,n){var o,s;return function a(){var r=arguments;return o?(s=!0,i):(o=!0,setTimeout(function(){o=!1,s&&(a.apply(n,r),s=!1)},e),t.apply(n,r),i)}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},splitWords:function(t){return t.replace(/^\s+|\s+$/g,"").split(/\s+/)},setOptions:function(t,e){return t.options=n.extend({},t.options,e),t.options},getParamString:function(t,e){var i=[];for(var n in t)t.hasOwnProperty(n)&&i.push(n+"="+t[n]);return(e&&-1!==e.indexOf("?")?"&":"?")+i.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,i){var n=e[i];if(!e.hasOwnProperty(i))throw Error("No value provided for variable "+t);return n})},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;o.length>i&&!n;i++)n=t[o[i]+e];return n}function o(e){var i=+new Date,n=Math.max(0,16-(i-s));return s=i+n,t.setTimeout(e,n)}var s=0,a=t.requestAnimationFrame||e("RequestAnimationFrame")||o,r=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};n.Util.requestAnimFrame=function(e,s,r,h){return e=n.bind(e,s),r&&a===o?(e(),i):a.call(t,e,h)},n.Util.cancelAnimFrame=function(e){e&&r.call(t,e)}}(),n.extend=n.Util.extend,n.bind=n.Util.bind,n.stamp=n.Util.stamp,n.setOptions=n.Util.setOptions,n.Class=function(){},n.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var o=new i;o.constructor=e,e.prototype=o;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(n.extend(e,t.statics),delete t.statics),t.includes&&(n.Util.extend.apply(null,[o].concat(t.includes)),delete t.includes),t.options&&o.options&&(t.options=n.extend({},o.options,t.options)),n.extend(o,t),o._initHooks=[];var a=this;return o.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=o._initHooks.length;e>t;t++)o._initHooks[t].call(this)}},e},n.Class.include=function(t){n.extend(this.prototype,t)},n.Class.mergeOptions=function(t){n.extend(this.prototype.options,t)},n.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";n.Mixin={},n.Mixin.Events={addEventListener:function(t,e,i){var o,a,r,h=this[s]=this[s]||{};if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.addEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)h[t[a]]=h[t[a]]||[],h[t[a]].push({action:e,context:i||this});return this},hasEventListeners:function(t){return s in this&&t in this[s]&&this[s][t].length>0},removeEventListener:function(t,e,i){var o,a,r,h,l,u=this[s];if("object"==typeof t){for(o in t)t.hasOwnProperty(o)&&this.removeEventListener(o,t[o],e);return this}for(t=n.Util.splitWords(t),a=0,r=t.length;r>a;a++)if(this.hasEventListeners(t[a]))for(h=u[t[a]],l=h.length-1;l>=0;l--)e&&h[l].action!==e||i&&h[l].context!==i||h.splice(l,1);return this},fireEvent:function(t,e){if(!this.hasEventListeners(t))return this;for(var i=n.extend({type:t,target:this},e),o=this[s][t].slice(),a=0,r=o.length;r>a;a++)o[a].action.call(o[a].context||this,i);return this}},n.Mixin.Events.on=n.Mixin.Events.addEventListener,n.Mixin.Events.off=n.Mixin.Events.removeEventListener,n.Mixin.Events.fire=n.Mixin.Events.fireEvent,function(){var o=!!t.ActiveXObject,s=o&&!t.XMLHttpRequest,a=o&&!e.querySelector,r=navigator.userAgent.toLowerCase(),h=-1!==r.indexOf("webkit"),l=-1!==r.indexOf("chrome"),u=-1!==r.indexOf("android"),c=-1!==r.search("android [23]"),_=typeof orientation!=i+"",d=t.navigator&&t.navigator.msPointerEnabled&&t.navigator.msMaxTouchPoints,p="devicePixelRatio"in t&&t.devicePixelRatio>1||"matchMedia"in t&&t.matchMedia("(min-resolution:144dpi)")&&t.matchMedia("(min-resolution:144dpi)").matches,m=e.documentElement,f=o&&"transition"in m.style,g="WebKitCSSMatrix"in t&&"m11"in new t.WebKitCSSMatrix,v="MozPerspective"in m.style,y="OTransition"in m.style,L=!t.L_DISABLE_3D&&(f||g||v||y),P=!t.L_NO_TOUCH&&function(){var t="ontouchstart";if(d||t in m)return!0;var i=e.createElement("div"),n=!1;return i.setAttribute?(i.setAttribute(t,"return;"),"function"==typeof i[t]&&(n=!0),i.removeAttribute(t),i=null,n):!1}();n.Browser={ie:o,ie6:s,ie7:a,webkit:h,android:u,android23:c,chrome:l,ie3d:f,webkit3d:g,gecko3d:v,opera3d:y,any3d:L,mobile:_,mobileWebkit:_&&h,mobileWebkit3d:_&&g,mobileOpera:_&&t.opera,touch:P,msTouch:d,retina:p}}(),n.Point=function(t,e,i){this.x=i?Math.round(t):t,this.y=i?Math.round(e):e},n.Point.prototype={clone:function(){return new n.Point(this.x,this.y)},add:function(t){return this.clone()._add(n.point(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(n.point(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},distanceTo:function(t){t=n.point(t);var e=t.x-this.x,i=t.y-this.y;return Math.sqrt(e*e+i*i)},equals:function(t){return t.x===this.x&&t.y===this.y},toString:function(){return"Point("+n.Util.formatNum(this.x)+", "+n.Util.formatNum(this.y)+")"}},n.point=function(t,e,i){return t instanceof n.Point?t:n.Util.isArray(t)?new n.Point(t[0],t[1]):isNaN(t)?t:new n.Point(t,e,i)},n.Bounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.Bounds.prototype={extend:function(t){return t=n.point(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new n.Point((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new n.Point(this.min.x,this.max.y)},getTopRight:function(){return new n.Point(this.max.x,this.min.y)},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var e,i;return t="number"==typeof t[0]||t instanceof n.Point?n.point(t):n.bounds(t),t instanceof n.Bounds?(e=t.min,i=t.max):e=i=t,e.x>=this.min.x&&i.x<=this.max.x&&e.y>=this.min.y&&i.y<=this.max.y},intersects:function(t){t=n.bounds(t);var e=this.min,i=this.max,o=t.min,s=t.max,a=s.x>=e.x&&o.x<=i.x,r=s.y>=e.y&&o.y<=i.y;return a&&r},isValid:function(){return!(!this.min||!this.max)}},n.bounds=function(t,e){return!t||t instanceof n.Bounds?t:new n.Bounds(t,e)},n.Transformation=function(t,e,i,n){this._a=t,this._b=e,this._c=i,this._d=n},n.Transformation.prototype={transform:function(t,e){return this._transform(t.clone(),e)},_transform:function(t,e){return e=e||1,t.x=e*(this._a*t.x+this._b),t.y=e*(this._c*t.y+this._d),t},untransform:function(t,e){return e=e||1,new n.Point((t.x/e-this._b)/this._a,(t.y/e-this._d)/this._c)}},n.DomUtil={get:function(t){return"string"==typeof t?e.getElementById(t):t},getStyle:function(t,i){var n=t.style[i];if(!n&&t.currentStyle&&(n=t.currentStyle[i]),(!n||"auto"===n)&&e.defaultView){var o=e.defaultView.getComputedStyle(t,null);n=o?o[i]:null}return"auto"===n?null:n},getViewportOffset:function(t){var i,o=0,s=0,a=t,r=e.body,h=n.Browser.ie7;do{if(o+=a.offsetTop||0,s+=a.offsetLeft||0,o+=parseInt(n.DomUtil.getStyle(a,"borderTopWidth"),10)||0,s+=parseInt(n.DomUtil.getStyle(a,"borderLeftWidth"),10)||0,i=n.DomUtil.getStyle(a,"position"),a.offsetParent===r&&"absolute"===i)break;if("fixed"===i){o+=r.scrollTop||0,s+=r.scrollLeft||0;break}a=a.offsetParent}while(a);a=t;do{if(a===r)break;o-=a.scrollTop||0,s-=a.scrollLeft||0,n.DomUtil.documentIsLtr()||!n.Browser.webkit&&!h||(s+=a.scrollWidth-a.clientWidth,h&&"hidden"!==n.DomUtil.getStyle(a,"overflow-y")&&"hidden"!==n.DomUtil.getStyle(a,"overflow")&&(s+=17)),a=a.parentNode}while(a);return new n.Point(s,o)},documentIsLtr:function(){return n.DomUtil._docIsLtrCached||(n.DomUtil._docIsLtrCached=!0,n.DomUtil._docIsLtr="ltr"===n.DomUtil.getStyle(e.body,"direction")),n.DomUtil._docIsLtr},create:function(t,i,n){var o=e.createElement(t);return o.className=i,n&&n.appendChild(o),o},disableTextSelection:function(){e.selection&&e.selection.empty&&e.selection.empty(),this._onselectstart||(this._onselectstart=e.onselectstart||null,e.onselectstart=n.Util.falseFn)},enableTextSelection:function(){e.onselectstart===n.Util.falseFn&&(e.onselectstart=this._onselectstart,this._onselectstart=null)},hasClass:function(t,e){return t.className.length>0&&RegExp("(^|\\s)"+e+"(\\s|$)").test(t.className)},addClass:function(t,e){n.DomUtil.hasClass(t,e)||(t.className+=(t.className?" ":"")+e)},removeClass:function(t,e){function i(t,i){return i===e?"":t}t.className=t.className.replace(/(\S+)\s*/g,i).replace(/(^\s+|\s+$)/,"")},setOpacity:function(t,e){if("opacity"in t.style)t.style.opacity=e;else if("filter"in t.style){var i=!1,n="DXImageTransform.Microsoft.Alpha";try{i=t.filters.item(n)}catch(o){}e=Math.round(100*e),i?(i.Enabled=100!==e,i.Opacity=e):t.style.filter+=" progid:"+n+"(opacity="+e+")"}},testProp:function(t){for(var i=e.documentElement.style,n=0;t.length>n;n++)if(t[n]in i)return t[n];return!1},getTranslateString:function(t){var e=n.Browser.webkit3d,i="translate"+(e?"3d":"")+"(",o=(e?",0":"")+")";return i+t.x+"px,"+t.y+"px"+o},getScaleString:function(t,e){var i=n.DomUtil.getTranslateString(e.add(e.multiplyBy(-1*t))),o=" scale("+t+") ";return i+o},setPosition:function(t,e,i){t._leaflet_pos=e,!i&&n.Browser.any3d?(t.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(e),n.Browser.mobileWebkit3d&&(t.style.WebkitBackfaceVisibility="hidden")):(t.style.left=e.x+"px",t.style.top=e.y+"px")},getPosition:function(t){return t._leaflet_pos}},n.DomUtil.TRANSFORM=n.DomUtil.testProp(["transform","WebkitTransform","OTransform","MozTransform","msTransform"]),n.DomUtil.TRANSITION=n.DomUtil.testProp(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),n.DomUtil.TRANSITION_END="webkitTransition"===n.DomUtil.TRANSITION||"OTransition"===n.DomUtil.TRANSITION?n.DomUtil.TRANSITION+"End":"transitionend",n.LatLng=function(t,e){var i=parseFloat(t),n=parseFloat(e);if(isNaN(i)||isNaN(n))throw Error("Invalid LatLng object: ("+t+", "+e+")");this.lat=i,this.lng=n},n.extend(n.LatLng,{DEG_TO_RAD:Math.PI/180,RAD_TO_DEG:180/Math.PI,MAX_MARGIN:1e-9}),n.LatLng.prototype={equals:function(t){if(!t)return!1;t=n.latLng(t);var e=Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng));return n.LatLng.MAX_MARGIN>=e},toString:function(t){return"LatLng("+n.Util.formatNum(this.lat,t)+", "+n.Util.formatNum(this.lng,t)+")"},distanceTo:function(t){t=n.latLng(t);var e=6378137,i=n.LatLng.DEG_TO_RAD,o=(t.lat-this.lat)*i,s=(t.lng-this.lng)*i,a=this.lat*i,r=t.lat*i,h=Math.sin(o/2),l=Math.sin(s/2),u=h*h+l*l*Math.cos(a)*Math.cos(r);return 2*e*Math.atan2(Math.sqrt(u),Math.sqrt(1-u))},wrap:function(t,e){var i=this.lng;return t=t||-180,e=e||180,i=(i+e)%(e-t)+(t>i||i===e?e:t),new n.LatLng(this.lat,i)}},n.latLng=function(t,e){return t instanceof n.LatLng?t:n.Util.isArray(t)?new n.LatLng(t[0],t[1]):isNaN(t)?t:new n.LatLng(t,e)},n.LatLngBounds=function(t,e){if(t)for(var i=e?[t,e]:t,n=0,o=i.length;o>n;n++)this.extend(i[n])},n.LatLngBounds.prototype={extend:function(t){return t="number"==typeof t[0]||"string"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t),t instanceof n.LatLng?this._southWest||this._northEast?(this._southWest.lat=Math.min(t.lat,this._southWest.lat),this._southWest.lng=Math.min(t.lng,this._southWest.lng),this._northEast.lat=Math.max(t.lat,this._northEast.lat),this._northEast.lng=Math.max(t.lng,this._northEast.lng)):(this._southWest=new n.LatLng(t.lat,t.lng),this._northEast=new n.LatLng(t.lat,t.lng)):t instanceof n.LatLngBounds&&(this.extend(t._southWest),this.extend(t._northEast)),this},pad:function(t){var e=this._southWest,i=this._northEast,o=Math.abs(e.lat-i.lat)*t,s=Math.abs(e.lng-i.lng)*t;return new n.LatLngBounds(new n.LatLng(e.lat-o,e.lng-s),new n.LatLng(i.lat+o,i.lng+s))},getCenter:function(){return new n.LatLng((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new n.LatLng(this._northEast.lat,this._southWest.lng)},getSouthEast:function(){return new n.LatLng(this._southWest.lat,this._northEast.lng)},contains:function(t){t="number"==typeof t[0]||t instanceof n.LatLng?n.latLng(t):n.latLngBounds(t);var e,i,o=this._southWest,s=this._northEast;return t instanceof n.LatLngBounds?(e=t.getSouthWest(),i=t.getNorthEast()):e=i=t,e.lat>=o.lat&&i.lat<=s.lat&&e.lng>=o.lng&&i.lng<=s.lng},intersects:function(t){t=n.latLngBounds(t);var e=this._southWest,i=this._northEast,o=t.getSouthWest(),s=t.getNorthEast(),a=s.lat>=e.lat&&o.lat<=i.lat,r=s.lng>=e.lng&&o.lng<=i.lng;return a&&r},toBBoxString:function(){var t=this._southWest,e=this._northEast;return[t.lng,t.lat,e.lng,e.lat].join(",")},equals:function(t){return t?(t=n.latLngBounds(t),this._southWest.equals(t.getSouthWest())&&this._northEast.equals(t.getNorthEast())):!1},isValid:function(){return!(!this._southWest||!this._northEast)}},n.latLngBounds=function(t,e){return!t||t instanceof n.LatLngBounds?t:new n.LatLngBounds(t,e)},n.Projection={},n.Projection.SphericalMercator={MAX_LATITUDE:85.0511287798,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=t.lng*e,a=o*e;return a=Math.log(Math.tan(Math.PI/4+a/2)),new n.Point(s,a)},unproject:function(t){var e=n.LatLng.RAD_TO_DEG,i=t.x*e,o=(2*Math.atan(Math.exp(t.y))-Math.PI/2)*e;return new n.LatLng(o,i)}},n.Projection.LonLat={project:function(t){return new n.Point(t.lng,t.lat)},unproject:function(t){return new n.LatLng(t.y,t.x)}},n.CRS={latLngToPoint:function(t,e){var i=this.projection.project(t),n=this.scale(e);return this.transformation._transform(i,n)},pointToLatLng:function(t,e){var i=this.scale(e),n=this.transformation.untransform(t,i);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},scale:function(t){return 256*Math.pow(2,t)}},n.CRS.Simple=n.extend({},n.CRS,{projection:n.Projection.LonLat,transformation:new n.Transformation(1,0,-1,0),scale:function(t){return Math.pow(2,t)}}),n.CRS.EPSG3857=n.extend({},n.CRS,{code:"EPSG:3857",projection:n.Projection.SphericalMercator,transformation:new n.Transformation(.5/Math.PI,.5,-.5/Math.PI,.5),project:function(t){var e=this.projection.project(t),i=6378137;return e.multiplyBy(i)}}),n.CRS.EPSG900913=n.extend({},n.CRS.EPSG3857,{code:"EPSG:900913"}),n.CRS.EPSG4326=n.extend({},n.CRS,{code:"EPSG:4326",projection:n.Projection.LonLat,transformation:new n.Transformation(1/360,.5,-1/360,.5)}),n.Map=n.Class.extend({includes:n.Mixin.Events,options:{crs:n.CRS.EPSG3857,fadeAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23,trackResize:!0,markerZoomAnimation:n.DomUtil.TRANSITION&&n.Browser.any3d},initialize:function(t,e){e=n.setOptions(this,e),this._initContainer(t),this._initLayout(),this.callInitHooks(),this._initEvents(),e.maxBounds&&this.setMaxBounds(e.maxBounds),e.center&&e.zoom!==i&&this.setView(n.latLng(e.center),e.zoom,!0),this._initLayers(e.layers)},setView:function(t,e){return this._resetView(n.latLng(t),this._limitZoom(e)),this},setZoom:function(t){return this.setView(this.getCenter(),t)},zoomIn:function(t){return this.setZoom(this._zoom+(t||1))},zoomOut:function(t){return this.setZoom(this._zoom-(t||1))},fitBounds:function(t){var e=this.getBoundsZoom(t);return this.setView(n.latLngBounds(t).getCenter(),e)},fitWorld:function(){var t=new n.LatLng(-60,-170),e=new n.LatLng(85,179);return this.fitBounds(new n.LatLngBounds(t,e))},panTo:function(t){return this.setView(t,this._zoom)},panBy:function(t){return this.fire("movestart"),this._rawPanBy(n.point(t)),this.fire("move"),this.fire("moveend")},setMaxBounds:function(t){if(t=n.latLngBounds(t),this.options.maxBounds=t,!t)return this._boundsMinZoom=null,this;var e=this.getBoundsZoom(t,!0);return this._boundsMinZoom=e,this._loaded&&(e>this._zoom?this.setView(t.getCenter(),e):this.panInsideBounds(t)),this},panInsideBounds:function(t){t=n.latLngBounds(t);var e=this.getBounds(),i=this.project(e.getSouthWest()),o=this.project(e.getNorthEast()),s=this.project(t.getSouthWest()),a=this.project(t.getNorthEast()),r=0,h=0;return o.ya.x&&(r=a.x-o.x),i.y>s.y&&(h=s.y-i.y),i.x=r);return c&&e?null:e?r:r-1},getSize:function(){return(!this._size||this._sizeChanged)&&(this._size=new n.Point(this._container.clientWidth,this._container.clientHeight),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(){var t=this._getTopLeftPoint();return new n.Bounds(t,t.add(this.getSize()))},getPixelOrigin:function(){return this._initialTopLeftPoint},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t){var e=this.options.crs;return e.scale(t)/e.scale(this._zoom)},getScaleZoom:function(t){return this._zoom+Math.log(t)/Math.LN2},project:function(t,e){return e=e===i?this._zoom:e,this.options.crs.latLngToPoint(n.latLng(t),e)},unproject:function(t,e){return e=e===i?this._zoom:e,this.options.crs.pointToLatLng(n.point(t),e)},layerPointToLatLng:function(t){var e=n.point(t).add(this._initialTopLeftPoint);return this.unproject(e)},latLngToLayerPoint:function(t){var e=this.project(n.latLng(t))._round();return e._subtract(this._initialTopLeftPoint)},containerPointToLayerPoint:function(t){return n.point(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return n.point(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var e=this.containerPointToLayerPoint(n.point(t));return this.layerPointToLatLng(e)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(n.latLng(t)))},mouseEventToContainerPoint:function(t){return n.DomEvent.getMousePosition(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var e=this._container=n.DomUtil.get(t);if(e._leaflet)throw Error("Map container is already initialized.");e._leaflet=!0},_initLayout:function(){var t=this._container;n.DomUtil.addClass(t,"leaflet-container"),n.Browser.touch&&n.DomUtil.addClass(t,"leaflet-touch"),this.options.fadeAnimation&&n.DomUtil.addClass(t,"leaflet-fade-anim");var e=n.DomUtil.getStyle(t,"position");"absolute"!==e&&"relative"!==e&&"fixed"!==e&&(t.style.position="relative"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._mapPane=t.mapPane=this._createPane("leaflet-map-pane",this._container),this._tilePane=t.tilePane=this._createPane("leaflet-tile-pane",this._mapPane),t.objectsPane=this._createPane("leaflet-objects-pane",this._mapPane),t.shadowPane=this._createPane("leaflet-shadow-pane"),t.overlayPane=this._createPane("leaflet-overlay-pane"),t.markerPane=this._createPane("leaflet-marker-pane"),t.popupPane=this._createPane("leaflet-popup-pane");var e=" leaflet-zoom-hide";this.options.markerZoomAnimation||(n.DomUtil.addClass(t.markerPane,e),n.DomUtil.addClass(t.shadowPane,e),n.DomUtil.addClass(t.popupPane,e))},_createPane:function(t,e){return n.DomUtil.create("div",t,e||this._panes.objectsPane)},_initLayers:function(t){t=t?n.Util.isArray(t)?t:[t]:[],this._layers={},this._zoomBoundLayers={},this._tileLayersNum=0;var e,i;for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},_resetView:function(t,e,i,o){var s=this._zoom!==e;o||(this.fire("movestart"),s&&this.fire("zoomstart")),this._zoom=e,this._initialTopLeftPoint=this._getNewTopLeftPoint(t),i?this._initialTopLeftPoint._add(this._getMapPanePos()):n.DomUtil.setPosition(this._mapPane,new n.Point(0,0)),this._tileLayersToLoad=this._tileLayersNum;var a=!this._loaded;this._loaded=!0,this.fire("viewreset",{hard:!i}),this.fire("move"),(s||o)&&this.fire("zoomend"),this.fire("moveend",{hard:!i}),a&&this.fire("load")},_rawPanBy:function(t){n.DomUtil.setPosition(this._mapPane,this._getMapPanePos().subtract(t))},_updateZoomLevels:function(){var t,e=1/0,n=-1/0;for(t in this._zoomBoundLayers)if(this._zoomBoundLayers.hasOwnProperty(t)){var o=this._zoomBoundLayers[t];isNaN(o.options.minZoom)||(e=Math.min(e,o.options.minZoom)),isNaN(o.options.maxZoom)||(n=Math.max(n,o.options.maxZoom))}t===i?this._layersMaxZoom=this._layersMinZoom=i:(this._layersMaxZoom=n,this._layersMinZoom=e)},_initEvents:function(){if(n.DomEvent){n.DomEvent.on(this._container,"click",this._onMouseClick,this);var e,i,o=["dblclick","mousedown","mouseup","mouseenter","mouseleave","mousemove","contextmenu"];for(e=0,i=o.length;i>e;e++)n.DomEvent.on(this._container,o[e],this._fireMouseEvent,this);this.options.trackResize&&n.DomEvent.on(t,"resize",this._onResize,this)}},_onResize:function(){n.Util.cancelAnimFrame(this._resizeRequest),this._resizeRequest=n.Util.requestAnimFrame(this.invalidateSize,this,!1,this._container)},_onMouseClick:function(t){!this._loaded||this.dragging&&this.dragging.moved()||(this.fire("preclick"),this._fireMouseEvent(t))},_fireMouseEvent:function(t){if(this._loaded){var e=t.type;if(e="mouseenter"===e?"mouseover":"mouseleave"===e?"mouseout":e,this.hasEventListeners(e)){"contextmenu"===e&&n.DomEvent.preventDefault(t);var i=this.mouseEventToContainerPoint(t),o=this.containerPointToLayerPoint(i),s=this.layerPointToLatLng(o);this.fire(e,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t})}}},_onTileLayerLoad:function(){this._tileLayersToLoad--,this._tileLayersNum&&!this._tileLayersToLoad&&this._tileBg&&(clearTimeout(this._clearTileBgTimer),this._clearTileBgTimer=setTimeout(n.bind(this._clearTileBg,this),500))},whenReady:function(t,e){return this._loaded?t.call(e||this,this):this.on("load",t,e),this},_getMapPanePos:function(){return n.DomUtil.getPosition(this._mapPane)},_getTopLeftPoint:function(){if(!this._loaded)throw Error("Set map center and zoom first.");return this._initialTopLeftPoint.subtract(this._getMapPanePos())},_getNewTopLeftPoint:function(t,e){var i=this.getSize()._divideBy(2);return this.project(t,e)._subtract(i)._round()},_latLngToNewLayerPoint:function(t,e,i){var n=this._getNewTopLeftPoint(i,e).add(this._getMapPanePos());return this.project(t,e)._subtract(n)},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitZoom:function(t){var e=this.getMinZoom(),i=this.getMaxZoom();return Math.max(e,Math.min(i,t))}}),n.map=function(t,e){return new n.Map(t,e)},n.Projection.Mercator={MAX_LATITUDE:85.0840591556,R_MINOR:6356752.3142,R_MAJOR:6378137,project:function(t){var e=n.LatLng.DEG_TO_RAD,i=this.MAX_LATITUDE,o=Math.max(Math.min(i,t.lat),-i),s=this.R_MAJOR,a=this.R_MINOR,r=t.lng*e*s,h=o*e,l=a/s,u=Math.sqrt(1-l*l),c=u*Math.sin(h);c=Math.pow((1-c)/(1+c),.5*u);var _=Math.tan(.5*(.5*Math.PI-h))/c;return h=-a*Math.log(_),new n.Point(r,h)},unproject:function(t){for(var e,i=n.LatLng.RAD_TO_DEG,o=this.R_MAJOR,s=this.R_MINOR,a=t.x*i/o,r=s/o,h=Math.sqrt(1-r*r),l=Math.exp(-t.y/s),u=Math.PI/2-2*Math.atan(l),c=15,_=1e-7,d=c,p=.1;Math.abs(p)>_&&--d>0;)e=h*Math.sin(u),p=Math.PI/2-2*Math.atan(l*Math.pow((1-e)/(1+e),.5*h))-u,u+=p;return new n.LatLng(u*i,a)}},n.CRS.EPSG3395=n.extend({},n.CRS,{code:"EPSG:3395",projection:n.Projection.Mercator,transformation:function(){var t=n.Projection.Mercator,e=t.R_MAJOR,i=t.R_MINOR;return new n.Transformation(.5/(Math.PI*e),.5,-.5/(Math.PI*i),.5)}()}),n.TileLayer=n.Class.extend({includes:n.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:n.Browser.mobile,updateWhenIdle:n.Browser.mobile},initialize:function(t,e){e=n.setOptions(this,e),e.detectRetina&&n.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._initContainer(),this._createTileProto(),t.on({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||(this._limitedUpdate=n.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._resetCallback,moveend:this._update},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._map._panes.tilePane.empty=!1,this._reset(!0),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-1/0);for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){n.DomUtil.setOpacity(this._container,this.options.opacity);var t,e=this._tiles;if(n.Browser.webkit)for(t in e)e.hasOwnProperty(t)&&(e[t].style.webkitTransform+=" translate(0,0)")},_initContainer:function(){var t=this._map._panes.tilePane;(!this._container||t.empty)&&(this._container=n.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),t.appendChild(this._container),1>this.options.opacity&&this._updateOpacity())},_resetCallback:function(t){this._reset(t.hard)},_reset:function(t){var e=this._tiles;for(var i in e)e.hasOwnProperty(i)&&this.fire("tileunload",{tile:e[i]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),t&&this._container&&(this._container.innerHTML=""),this._initContainer()},_update:function(){if(this._map){var t=this._map.getPixelBounds(),e=this._map.getZoom(),i=this.options.tileSize;if(!(e>this.options.maxZoom||this.options.minZoom>e)){var o=new n.Point(Math.floor(t.min.x/i),Math.floor(t.min.y/i)),s=new n.Point(Math.floor(t.max.x/i),Math.floor(t.max.y/i)),a=new n.Bounds(o,s);this._addTilesFromCenterOut(a),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(a)}}},_addTilesFromCenterOut:function(t){var i,o,s,a=[],r=t.getCenter();for(i=t.min.y;t.max.y>=i;i++)for(o=t.min.x;t.max.x>=o;o++)s=new n.Point(o,i),this._tileShouldBeLoaded(s)&&a.push(s);var h=a.length;if(0!==h){a.sort(function(t,e){return t.distanceTo(r)-e.distanceTo(r)});var l=e.createDocumentFragment();for(this._tilesToLoad||this.fire("loading"),this._tilesToLoad+=h,o=0;h>o;o++)this._addTile(a[o],l);this._container.appendChild(l)}},_tileShouldBeLoaded:function(t){if(t.x+":"+t.y in this._tiles)return!1;if(!this.options.continuousWorld){var e=this._getWrapTileNum();if(this.options.noWrap&&(0>t.x||t.x>=e)||0>t.y||t.y>=e)return!1}return!0},_removeOtherTiles:function(t){var e,i,n,o;for(o in this._tiles)this._tiles.hasOwnProperty(o)&&(e=o.split(":"),i=parseInt(e[0],10),n=parseInt(e[1],10),(t.min.x>i||i>t.max.x||t.min.y>n||n>t.max.y)&&this._removeTile(o))},_removeTile:function(t){var e=this._tiles[t];this.fire("tileunload",{tile:e,url:e.src}),this.options.reuseTiles?(n.DomUtil.removeClass(e,"leaflet-tile-loaded"),this._unusedTiles.push(e)):e.parentNode===this._container&&this._container.removeChild(e),n.Browser.android||(e.src=n.Util.emptyImageUrl),delete this._tiles[t]},_addTile:function(t,e){var i=this._getTilePos(t),o=this._getTile();n.DomUtil.setPosition(o,i,n.Browser.chrome||n.Browser.android23),this._tiles[t.x+":"+t.y]=o,this._loadTile(o,t),o.parentNode!==this._container&&e.appendChild(o) +},_getZoomForUrl:function(){var t=this.options,e=this._map.getZoom();return t.zoomReverse&&(e=t.maxZoom-e),e+t.zoomOffset},_getTilePos:function(t){var e=this._map.getPixelOrigin(),i=this.options.tileSize;return t.multiplyBy(i).subtract(e)},getTileUrl:function(t){return this._adjustTilePoint(t),n.Util.template(this._url,n.extend({s:this._getSubdomain(t),z:this._getZoomForUrl(),x:t.x,y:t.y},this.options))},_getWrapTileNum:function(){return Math.pow(2,this._getZoomForUrl())},_adjustTilePoint:function(t){var e=this._getWrapTileNum();this.options.continuousWorld||this.options.noWrap||(t.x=(t.x%e+e)%e),this.options.tms&&(t.y=e-t.y-1)},_getSubdomain:function(t){var e=(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[e]},_createTileProto:function(){var t=this._tileImg=n.DomUtil.create("img","leaflet-tile");t.style.width=t.style.height=this.options.tileSize+"px",t.galleryimg="no"},_getTile:function(){if(this.options.reuseTiles&&this._unusedTiles.length>0){var t=this._unusedTiles.pop();return this._resetTile(t),t}return this._createTile()},_resetTile:function(){},_createTile:function(){var t=this._tileImg.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t.onload=this._tileOnLoad,t.onerror=this._tileOnError,t.src=this.getTileUrl(e)},_tileLoaded:function(){this._tilesToLoad--,this._tilesToLoad||this.fire("load")},_tileOnLoad:function(){var t=this._layer;this.src!==n.Util.emptyImageUrl&&(n.DomUtil.addClass(this,"leaflet-tile-loaded"),t.fire("tileload",{tile:this,url:this.src})),t._tileLoaded()},_tileOnError:function(){var t=this._layer;t.fire("tileerror",{tile:this,url:this.src});var e=t.options.errorTileUrl;e&&(this.src=e),t._tileLoaded()}}),n.tileLayer=function(t,e){return new n.TileLayer(t,e)},n.TileLayer.WMS=n.TileLayer.extend({defaultWmsParams:{service:"WMS",request:"GetMap",version:"1.1.1",layers:"",styles:"",format:"image/jpeg",transparent:!1},initialize:function(t,e){this._url=t;var i=n.extend({},this.defaultWmsParams);i.width=i.height=e.detectRetina&&n.Browser.retina?2*this.options.tileSize:this.options.tileSize;for(var o in e)this.options.hasOwnProperty(o)||(i[o]=e[o]);this.wmsParams=i,n.setOptions(this,e)},onAdd:function(t){var e=parseFloat(this.wmsParams.version)>=1.3?"crs":"srs";this.wmsParams[e]=t.options.crs.code,n.TileLayer.prototype.onAdd.call(this,t)},getTileUrl:function(t,e){this._adjustTilePoint(t);var i=this._map,o=i.options.crs,s=this.options.tileSize,a=t.multiplyBy(s),r=a.add(new n.Point(s,s)),h=o.project(i.unproject(a,e)),l=o.project(i.unproject(r,e)),u=[h.x,l.y,l.x,h.y].join(","),c=n.Util.template(this._url,{s:this._getSubdomain(t)});return c+n.Util.getParamString(this.wmsParams,c)+"&bbox="+u},setParams:function(t,e){return n.extend(this.wmsParams,t),e||this.redraw(),this}}),n.tileLayer.wms=function(t,e){return new n.TileLayer.WMS(t,e)},n.TileLayer.Canvas=n.TileLayer.extend({options:{async:!1},initialize:function(t){n.setOptions(this,t)},redraw:function(){var t=this._tiles;for(var e in t)t.hasOwnProperty(e)&&this._redrawTile(t[e])},_redrawTile:function(t){this.drawTile(t,t._tilePoint,this._map._zoom)},_createTileProto:function(){var t=this._canvasProto=n.DomUtil.create("canvas","leaflet-tile");t.width=t.height=this.options.tileSize},_createTile:function(){var t=this._canvasProto.cloneNode(!1);return t.onselectstart=t.onmousemove=n.Util.falseFn,t},_loadTile:function(t,e){t._layer=this,t._tilePoint=e,this._redrawTile(t),this.options.async||this.tileDrawn(t)},drawTile:function(){},tileDrawn:function(t){this._tileOnLoad.call(t)}}),n.tileLayer.canvas=function(t){return new n.TileLayer.Canvas(t)},n.ImageOverlay=n.Class.extend({includes:n.Mixin.Events,options:{opacity:1},initialize:function(t,e,i){this._url=t,this._bounds=n.latLngBounds(e),n.setOptions(this,i)},onAdd:function(t){this._map=t,this._image||this._initImage(),t._panes.overlayPane.appendChild(this._image),t.on("viewreset",this._reset,this),t.options.zoomAnimation&&n.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._image),t.off("viewreset",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},bringToFront:function(){return this._image&&this._map._panes.overlayPane.appendChild(this._image),this},bringToBack:function(){var t=this._map._panes.overlayPane;return this._image&&t.insertBefore(this._image,t.firstChild),this},_initImage:function(){this._image=n.DomUtil.create("img","leaflet-image-layer"),this._map.options.zoomAnimation&&n.Browser.any3d?n.DomUtil.addClass(this._image,"leaflet-zoom-animated"):n.DomUtil.addClass(this._image,"leaflet-zoom-hide"),this._updateOpacity(),n.extend(this._image,{galleryimg:"no",onselectstart:n.Util.falseFn,onmousemove:n.Util.falseFn,onload:n.bind(this._onImageLoad,this),src:this._url})},_animateZoom:function(t){var e=this._map,i=this._image,o=e.getZoomScale(t.zoom),s=this._bounds.getNorthWest(),a=this._bounds.getSouthEast(),r=e._latLngToNewLayerPoint(s,t.zoom,t.center),h=e._latLngToNewLayerPoint(a,t.zoom,t.center)._subtract(r),l=r._add(h._multiplyBy(.5*(1-1/o)));i.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(l)+" scale("+o+") "},_reset:function(){var t=this._image,e=this._map.latLngToLayerPoint(this._bounds.getNorthWest()),i=this._map.latLngToLayerPoint(this._bounds.getSouthEast())._subtract(e);n.DomUtil.setPosition(t,e),t.style.width=i.x+"px",t.style.height=i.y+"px"},_onImageLoad:function(){this.fire("load")},_updateOpacity:function(){n.DomUtil.setOpacity(this._image,this.options.opacity)}}),n.imageOverlay=function(t,e,i){return new n.ImageOverlay(t,e,i)},n.Icon=n.Class.extend({options:{className:""},initialize:function(t){n.setOptions(this,t)},createIcon:function(){return this._createIcon("icon")},createShadow:function(){return this._createIcon("shadow")},_createIcon:function(t){var e=this._getIconUrl(t);if(!e){if("icon"===t)throw Error("iconUrl not set in Icon options (see the docs).");return null}var i=this._createImg(e);return this._setIconStyles(i,t),i},_setIconStyles:function(t,e){var i,o=this.options,s=n.point(o[e+"Size"]);i="shadow"===e?n.point(o.shadowAnchor||o.iconAnchor):n.point(o.iconAnchor),!i&&s&&(i=s.divideBy(2,!0)),t.className="leaflet-marker-"+e+" "+o.className,i&&(t.style.marginLeft=-i.x+"px",t.style.marginTop=-i.y+"px"),s&&(t.style.width=s.x+"px",t.style.height=s.y+"px")},_createImg:function(t){var i;return n.Browser.ie6?(i=e.createElement("div"),i.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+t+'")'):(i=e.createElement("img"),i.src=t),i},_getIconUrl:function(t){return n.Browser.retina&&this.options[t+"RetinaUrl"]?this.options[t+"RetinaUrl"]:this.options[t+"Url"]}}),n.icon=function(t){return new n.Icon(t)},n.Icon.Default=n.Icon.extend({options:{iconSize:new n.Point(25,41),iconAnchor:new n.Point(12,41),popupAnchor:new n.Point(1,-34),shadowSize:new n.Point(41,41)},_getIconUrl:function(t){var e=t+"Url";if(this.options[e])return this.options[e];n.Browser.retina&&"icon"===t&&(t+="@2x");var i=n.Icon.Default.imagePath;if(!i)throw Error("Couldn't autodetect L.Icon.Default.imagePath, set it manually.");return i+"/marker-"+t+".png"}}),n.Icon.Default.imagePath=function(){var t,i,n,o,s=e.getElementsByTagName("script"),a=/\/?leaflet[\-\._]?([\w\-\._]*)\.js\??/;for(t=0,i=s.length;i>t;t++)if(n=s[t].src,o=n.match(a))return n.split(a)[0]+"/images"}(),n.Marker=n.Class.extend({includes:n.Mixin.Events,options:{icon:new n.Icon.Default,title:"",clickable:!0,draggable:!1,zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250},initialize:function(t,e){n.setOptions(this,e),this._latlng=n.latLng(t)},onAdd:function(t){this._map=t,t.on("viewreset",this.update,this),this._initIcon(),this.update(),t.options.zoomAnimation&&t.options.markerZoomAnimation&&t.on("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._removeIcon(),this.fire("remove"),t.off({viewreset:this.update,zoomanim:this._animateZoom},this),this._map=null},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=n.latLng(t),this.update(),this.fire("move",{latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update(),this},setIcon:function(t){return this._map&&this._removeIcon(),this.options.icon=t,this._map&&(this._initIcon(),this.update()),this},update:function(){if(this._icon){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,e=this._map,i=e.options.zoomAnimation&&e.options.markerZoomAnimation,o=i?"leaflet-zoom-animated":"leaflet-zoom-hide",s=!1;this._icon||(this._icon=t.icon.createIcon(),t.title&&(this._icon.title=t.title),this._initInteraction(),s=1>this.options.opacity,n.DomUtil.addClass(this._icon,o),t.riseOnHover&&n.DomEvent.on(this._icon,"mouseover",this._bringToFront,this).on(this._icon,"mouseout",this._resetZIndex,this)),this._shadow||(this._shadow=t.icon.createShadow(),this._shadow&&(n.DomUtil.addClass(this._shadow,o),s=1>this.options.opacity)),s&&this._updateOpacity();var a=this._map._panes;a.markerPane.appendChild(this._icon),this._shadow&&a.shadowPane.appendChild(this._shadow)},_removeIcon:function(){var t=this._map._panes;this.options.riseOnHover&&n.DomEvent.off(this._icon,"mouseover",this._bringToFront).off(this._icon,"mouseout",this._resetZIndex),t.markerPane.removeChild(this._icon),this._shadow&&t.shadowPane.removeChild(this._shadow),this._icon=this._shadow=null},_setPos:function(t){n.DomUtil.setPosition(this._icon,t),this._shadow&&n.DomUtil.setPosition(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPos(e)},_initInteraction:function(){if(this.options.clickable){var t=this._icon,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];n.DomUtil.addClass(t,"leaflet-clickable"),n.DomEvent.on(t,"click",this._onMouseClick,this);for(var i=0;e.length>i;i++)n.DomEvent.on(t,e[i],this._fireMouseEvent,this);n.Handler.MarkerDrag&&(this.dragging=new n.Handler.MarkerDrag(this),this.options.draggable&&this.dragging.enable())}},_onMouseClick:function(t){var e=this.dragging&&this.dragging.moved();(this.hasEventListeners(t.type)||e)&&n.DomEvent.stopPropagation(t),e||(this.dragging&&this.dragging._enabled||!this._map.dragging||!this._map.dragging.moved())&&this.fire(t.type,{originalEvent:t})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&n.DomEvent.preventDefault(t),"mousedown"!==t.type&&n.DomEvent.stopPropagation(t)},setOpacity:function(t){this.options.opacity=t,this._map&&this._updateOpacity()},_updateOpacity:function(){n.DomUtil.setOpacity(this._icon,this.options.opacity),this._shadow&&n.DomUtil.setOpacity(this._shadow,this.options.opacity)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)}}),n.marker=function(t,e){return new n.Marker(t,e)},n.DivIcon=n.Icon.extend({options:{iconSize:new n.Point(12,12),className:"leaflet-div-icon"},createIcon:function(){var t=e.createElement("div"),i=this.options;return i.html&&(t.innerHTML=i.html),i.bgPos&&(t.style.backgroundPosition=-i.bgPos.x+"px "+-i.bgPos.y+"px"),this._setIconStyles(t,"icon"),t},createShadow:function(){return null}}),n.divIcon=function(t){return new n.DivIcon(t)},n.Map.mergeOptions({closePopupOnClick:!0}),n.Popup=n.Class.extend({includes:n.Mixin.Events,options:{minWidth:50,maxWidth:300,maxHeight:null,autoPan:!0,closeButton:!0,offset:new n.Point(0,6),autoPanPadding:new n.Point(5,5),className:"",zoomAnimation:!0},initialize:function(t,e){n.setOptions(this,t),this._source=e,this._animated=n.Browser.any3d&&this.options.zoomAnimation},onAdd:function(t){this._map=t,this._container||this._initLayout(),this._updateContent();var e=t.options.fadeAnimation;e&&n.DomUtil.setOpacity(this._container,0),t._panes.popupPane.appendChild(this._container),t.on("viewreset",this._updatePosition,this),this._animated&&t.on("zoomanim",this._zoomAnimation,this),t.options.closePopupOnClick&&t.on("preclick",this._close,this),this._update(),e&&n.DomUtil.setOpacity(this._container,1)},addTo:function(t){return t.addLayer(this),this},openOn:function(t){return t.openPopup(this),this},onRemove:function(t){t._panes.popupPane.removeChild(this._container),n.Util.falseFn(this._container.offsetWidth),t.off({viewreset:this._updatePosition,preclick:this._close,zoomanim:this._zoomAnimation},this),t.options.fadeAnimation&&n.DomUtil.setOpacity(this._container,0),this._map=null},setLatLng:function(t){return this._latlng=n.latLng(t),this._update(),this},setContent:function(t){return this._content=t,this._update(),this},_close:function(){var t=this._map;t&&(t._popup=null,t.removeLayer(this).fire("popupclose",{popup:this}))},_initLayout:function(){var t,e="leaflet-popup",i=e+" "+this.options.className+" leaflet-zoom-"+(this._animated?"animated":"hide"),o=this._container=n.DomUtil.create("div",i);this.options.closeButton&&(t=this._closeButton=n.DomUtil.create("a",e+"-close-button",o),t.href="#close",t.innerHTML="×",n.DomEvent.on(t,"click",this._onCloseButtonClick,this));var s=this._wrapper=n.DomUtil.create("div",e+"-content-wrapper",o);n.DomEvent.disableClickPropagation(s),this._contentNode=n.DomUtil.create("div",e+"-content",s),n.DomEvent.on(this._contentNode,"mousewheel",n.DomEvent.stopPropagation),this._tipContainer=n.DomUtil.create("div",e+"-tip-container",o),this._tip=n.DomUtil.create("div",e+"-tip",this._tipContainer)},_update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility="",this._adjustPan())},_updateContent:function(){if(this._content){if("string"==typeof this._content)this._contentNode.innerHTML=this._content;else{for(;this._contentNode.hasChildNodes();)this._contentNode.removeChild(this._contentNode.firstChild);this._contentNode.appendChild(this._content)}this.fire("contentupdate")}},_updateLayout:function(){var t=this._contentNode,e=t.style;e.width="",e.whiteSpace="nowrap";var i=t.offsetWidth;i=Math.min(i,this.options.maxWidth),i=Math.max(i,this.options.minWidth),e.width=i+1+"px",e.whiteSpace="",e.height="";var o=t.offsetHeight,s=this.options.maxHeight,a="leaflet-popup-scrolled";s&&o>s?(e.height=s+"px",n.DomUtil.addClass(t,a)):n.DomUtil.removeClass(t,a),this._containerWidth=this._container.offsetWidth},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),e=this._animated,i=this.options.offset;e&&n.DomUtil.setPosition(this._container,t),this._containerBottom=-i.y-(e?0:t.y),this._containerLeft=-Math.round(this._containerWidth/2)+i.x+(e?0:t.x),this._container.style.bottom=this._containerBottom+"px",this._container.style.left=this._containerLeft+"px"}},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);n.DomUtil.setPosition(this._container,e)},_adjustPan:function(){if(this.options.autoPan){var t=this._map,e=this._container.offsetHeight,i=this._containerWidth,o=new n.Point(this._containerLeft,-e-this._containerBottom);this._animated&&o._add(n.DomUtil.getPosition(this._container));var s=t.layerPointToContainerPoint(o),a=this.options.autoPanPadding,r=t.getSize(),h=0,l=0;0>s.x&&(h=s.x-a.x),s.x+i>r.x&&(h=s.x+i-r.x+a.x),0>s.y&&(l=s.y-a.y),s.y+e>r.y&&(l=s.y+e-r.y+a.y),(h||l)&&t.panBy(new n.Point(h,l))}},_onCloseButtonClick:function(t){this._close(),n.DomEvent.stop(t)}}),n.popup=function(t,e){return new n.Popup(t,e)},n.Marker.include({openPopup:function(){return this._popup&&this._map&&(this._popup.setLatLng(this._latlng),this._map.openPopup(this._popup)),this},closePopup:function(){return this._popup&&this._popup._close(),this},bindPopup:function(t,e){var i=n.point(this.options.icon.options.popupAnchor)||new n.Point(0,0);return i=i.add(n.Popup.prototype.options.offset),e&&e.offset&&(i=i.add(e.offset)),e=n.extend({offset:i},e),this._popup||this.on("click",this.openPopup,this).on("remove",this.closePopup,this).on("move",this._movePopup,this),this._popup=new n.Popup(e,this).setContent(t),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this.openPopup).off("remove",this.closePopup).off("move",this._movePopup)),this},_movePopup:function(t){this._popup.setLatLng(t.latlng)}}),n.Map.include({openPopup:function(t){return this.closePopup(),this._popup=t,this.addLayer(t).fire("popupopen",{popup:this._popup})},closePopup:function(){return this._popup&&this._popup._close(),this}}),n.LayerGroup=n.Class.extend({initialize:function(t){this._layers={};var e,i;if(t)for(e=0,i=t.length;i>e;e++)this.addLayer(t[e])},addLayer:function(t){var e=n.stamp(t);return this._layers[e]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._map&&this._map.removeLayer(t),this},clearLayers:function(){return this.eachLayer(this.removeLayer,this),this},invoke:function(t){var e,i,n=Array.prototype.slice.call(arguments,1);for(e in this._layers)this._layers.hasOwnProperty(e)&&(i=this._layers[e],i[t]&&i[t].apply(i,n));return this},onAdd:function(t){this._map=t,this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t),this._map=null},addTo:function(t){return t.addLayer(this),this},eachLayer:function(t,e){for(var i in this._layers)this._layers.hasOwnProperty(i)&&t.call(e,this._layers[i])},setZIndex:function(t){return this.invoke("setZIndex",t)}}),n.layerGroup=function(t){return new n.LayerGroup(t)},n.FeatureGroup=n.LayerGroup.extend({includes:n.Mixin.Events,statics:{EVENTS:"click dblclick mouseover mouseout mousemove contextmenu"},addLayer:function(t){return this._layers[n.stamp(t)]?this:(t.on(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.addLayer.call(this,t),this._popupContent&&t.bindPopup&&t.bindPopup(this._popupContent,this._popupOptions),this.fire("layeradd",{layer:t}))},removeLayer:function(t){return t.off(n.FeatureGroup.EVENTS,this._propagateEvent,this),n.LayerGroup.prototype.removeLayer.call(this,t),this._popupContent&&this.invoke("unbindPopup"),this.fire("layerremove",{layer:t})},bindPopup:function(t,e){return this._popupContent=t,this._popupOptions=e,this.invoke("bindPopup",t,e)},setStyle:function(t){return this.invoke("setStyle",t)},bringToFront:function(){return this.invoke("bringToFront")},bringToBack:function(){return this.invoke("bringToBack")},getBounds:function(){var t=new n.LatLngBounds;return this.eachLayer(function(e){t.extend(e instanceof n.Marker?e.getLatLng():e.getBounds())}),t},_propagateEvent:function(t){t.layer=t.target,t.target=this,this.fire(t.type,t)}}),n.featureGroup=function(t){return new n.FeatureGroup(t)},n.Path=n.Class.extend({includes:[n.Mixin.Events],statics:{CLIP_PADDING:n.Browser.mobile?Math.max(0,Math.min(.5,(1280/Math.max(t.innerWidth,t.innerHeight)-1)/2)):.5},options:{stroke:!0,color:"#0033ff",dashArray:null,weight:5,opacity:.5,fill:!1,fillColor:null,fillOpacity:.2,clickable:!0},initialize:function(t){n.setOptions(this,t)},onAdd:function(t){this._map=t,this._container||(this._initElements(),this._initEvents()),this.projectLatlngs(),this._updatePath(),this._container&&this._map._pathRoot.appendChild(this._container),this.fire("add"),t.on({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){t._pathRoot.removeChild(this._container),this.fire("remove"),this._map=null,n.Browser.vml&&(this._container=null,this._stroke=null,this._fill=null),t.off({viewreset:this.projectLatlngs,moveend:this._updatePath},this)},projectLatlngs:function(){},setStyle:function(t){return n.setOptions(this,t),this._container&&this._updateStyle(),this},redraw:function(){return this._map&&(this.projectLatlngs(),this._updatePath()),this}}),n.Map.include({_updatePathViewport:function(){var t=n.Path.CLIP_PADDING,e=this.getSize(),i=n.DomUtil.getPosition(this._mapPane),o=i.multiplyBy(-1)._subtract(e.multiplyBy(t)._round()),s=o.add(e.multiplyBy(1+2*t)._round());this._pathViewport=new n.Bounds(o,s)}}),n.Path.SVG_NS="http://www.w3.org/2000/svg",n.Browser.svg=!(!e.createElementNS||!e.createElementNS(n.Path.SVG_NS,"svg").createSVGRect),n.Path=n.Path.extend({statics:{SVG:n.Browser.svg},bringToFront:function(){var t=this._map._pathRoot,e=this._container;return e&&t.lastChild!==e&&t.appendChild(e),this},bringToBack:function(){var t=this._map._pathRoot,e=this._container,i=t.firstChild;return e&&i!==e&&t.insertBefore(e,i),this},getPathString:function(){},_createElement:function(t){return e.createElementNS(n.Path.SVG_NS,t)},_initElements:function(){this._map._initPathRoot(),this._initPath(),this._initStyle()},_initPath:function(){this._container=this._createElement("g"),this._path=this._createElement("path"),this._container.appendChild(this._path)},_initStyle:function(){this.options.stroke&&(this._path.setAttribute("stroke-linejoin","round"),this._path.setAttribute("stroke-linecap","round")),this.options.fill&&this._path.setAttribute("fill-rule","evenodd"),this._updateStyle()},_updateStyle:function(){this.options.stroke?(this._path.setAttribute("stroke",this.options.color),this._path.setAttribute("stroke-opacity",this.options.opacity),this._path.setAttribute("stroke-width",this.options.weight),this.options.dashArray?this._path.setAttribute("stroke-dasharray",this.options.dashArray):this._path.removeAttribute("stroke-dasharray")):this._path.setAttribute("stroke","none"),this.options.fill?(this._path.setAttribute("fill",this.options.fillColor||this.options.color),this._path.setAttribute("fill-opacity",this.options.fillOpacity)):this._path.setAttribute("fill","none")},_updatePath:function(){var t=this.getPathString();t||(t="M0 0"),this._path.setAttribute("d",t)},_initEvents:function(){if(this.options.clickable){(n.Browser.svg||!n.Browser.vml)&&this._path.setAttribute("class","leaflet-clickable"),n.DomEvent.on(this._container,"click",this._onMouseClick,this);for(var t=["dblclick","mousedown","mouseover","mouseout","mousemove","contextmenu"],e=0;t.length>e;e++)n.DomEvent.on(this._container,t[e],this._fireMouseEvent,this)}},_onMouseClick:function(t){this._map.dragging&&this._map.dragging.moved()||this._fireMouseEvent(t)},_fireMouseEvent:function(t){if(this.hasEventListeners(t.type)){var e=this._map,i=e.mouseEventToContainerPoint(t),o=e.containerPointToLayerPoint(i),s=e.layerPointToLatLng(o);this.fire(t.type,{latlng:s,layerPoint:o,containerPoint:i,originalEvent:t}),"contextmenu"===t.type&&n.DomEvent.preventDefault(t),"mousemove"!==t.type&&n.DomEvent.stopPropagation(t)}}}),n.Map.include({_initPathRoot:function(){this._pathRoot||(this._pathRoot=n.Path.prototype._createElement("svg"),this._panes.overlayPane.appendChild(this._pathRoot),this.options.zoomAnimation&&n.Browser.any3d?(this._pathRoot.setAttribute("class"," leaflet-zoom-animated"),this.on({zoomanim:this._animatePathZoom,zoomend:this._endPathZoom})):this._pathRoot.setAttribute("class"," leaflet-zoom-hide"),this.on("moveend",this._updateSvgViewport),this._updateSvgViewport())},_animatePathZoom:function(t){var e=this.getZoomScale(t.zoom),i=this._getCenterOffset(t.center)._multiplyBy(-e)._add(this._pathViewport.min);this._pathRoot.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(i)+" scale("+e+") ",this._pathZooming=!0},_endPathZoom:function(){this._pathZooming=!1},_updateSvgViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max,o=i.x-e.x,s=i.y-e.y,a=this._pathRoot,r=this._panes.overlayPane;n.Browser.mobileWebkit&&r.removeChild(a),n.DomUtil.setPosition(a,e),a.setAttribute("width",o),a.setAttribute("height",s),a.setAttribute("viewBox",[e.x,e.y,o,s].join(" ")),n.Browser.mobileWebkit&&r.appendChild(a)}}}),n.Path.include({bindPopup:function(t,e){return(!this._popup||e)&&(this._popup=new n.Popup(e,this)),this._popup.setContent(t),this._popupHandlersAdded||(this.on("click",this._openPopup,this).on("remove",this.closePopup,this),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this._openPopup).off("remove",this.closePopup),this._popupHandlersAdded=!1),this},openPopup:function(t){return this._popup&&(t=t||this._latlng||this._latlngs[Math.floor(this._latlngs.length/2)],this._openPopup({latlng:t})),this},closePopup:function(){return this._popup&&this._popup._close(),this},_openPopup:function(t){this._popup.setLatLng(t.latlng),this._map.openPopup(this._popup)}}),n.Browser.vml=!n.Browser.svg&&function(){try{var t=e.createElement("div");t.innerHTML='';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),n.Path=n.Browser.svg||!n.Browser.vml?n.Path:n.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");n.DomUtil.addClass(t,"leaflet-vml-shape"),this.options.clickable&&n.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,t.dashStyle=i.dashArray?i.dashArray instanceof Array?i.dashArray.join(" "):i.dashArray.replace(/ *, */g," "):""):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),n.Map.include(n.Browser.svg||!n.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),n.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),n.Path=n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?n.Path:n.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return n.setOptions(this,t),this._map&&(this._updateStyle(),this._requestUpdate()),this},onRemove:function(t){t.off("viewreset",this.projectLatlngs,this).off("moveend",this._updatePath,this),this.options.clickable&&this._map.off("click",this._onClick,this),this._requestUpdate(),this._map=null},_requestUpdate:function(){this._map&&!n.Path._updateRequest&&(n.Path._updateRequest=n.Util.requestAnimFrame(this._fireMapMoveEnd,this._map))},_fireMapMoveEnd:function(){n.Path._updateRequest=null,this.fire("moveend")},_initElements:function(){this._map._initPathRoot(),this._ctx=this._map._canvasCtx},_updateStyle:function(){var t=this.options;t.stroke&&(this._ctx.lineWidth=t.weight,this._ctx.strokeStyle=t.color),t.fill&&(this._ctx.fillStyle=t.fillColor||t.color)},_drawPath:function(){var t,e,i,o,s,a;for(this._ctx.beginPath(),t=0,i=this._parts.length;i>t;t++){for(e=0,o=this._parts[t].length;o>e;e++)s=this._parts[t][e],a=(0===e?"move":"line")+"To",this._ctx[a](s.x,s.y);this instanceof n.Polygon&&this._ctx.closePath()}},_checkIfEmpty:function(){return!this._parts.length},_updatePath:function(){if(!this._checkIfEmpty()){var t=this._ctx,e=this.options;this._drawPath(),t.save(),this._updateStyle(),e.fill&&(t.globalAlpha=e.fillOpacity,t.fill()),e.stroke&&(t.globalAlpha=e.opacity,t.stroke()),t.restore()}},_initEvents:function(){this.options.clickable&&this._map.on("click",this._onClick,this)},_onClick:function(t){this._containsPoint(t.layerPoint)&&this.fire("click",{latlng:t.latlng,layerPoint:t.layerPoint,containerPoint:t.containerPoint,originalEvent:t})}}),n.Map.include(n.Path.SVG&&!t.L_PREFER_CANVAS||!n.Browser.canvas?{}:{_initPathRoot:function(){var t,i=this._pathRoot;i||(i=this._pathRoot=e.createElement("canvas"),i.style.position="absolute",t=this._canvasCtx=i.getContext("2d"),t.lineCap="round",t.lineJoin="round",this._panes.overlayPane.appendChild(i),this.options.zoomAnimation&&(this._pathRoot.className="leaflet-zoom-animated",this.on("zoomanim",this._animatePathZoom),this.on("zoomend",this._endPathZoom)),this.on("moveend",this._updateCanvasViewport),this._updateCanvasViewport())},_updateCanvasViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max.subtract(e),o=this._pathRoot;n.DomUtil.setPosition(o,e),o.width=i.x,o.height=i.y,o.getContext("2d").translate(-e.x,-e.y)}}}),n.LineUtil={simplify:function(t,e){if(!e||!t.length)return t.slice();var i=e*e;return t=this._reducePoints(t,i),t=this._simplifyDP(t,i)},pointToSegmentDistance:function(t,e,i){return Math.sqrt(this._sqClosestPointOnSegment(t,e,i,!0))},closestPointOnSegment:function(t,e,i){return this._sqClosestPointOnSegment(t,e,i)},_simplifyDP:function(t,e){var n=t.length,o=typeof Uint8Array!=i+""?Uint8Array:Array,s=new o(n);s[0]=s[n-1]=1,this._simplifyDPStep(t,s,e,0,n-1);var a,r=[];for(a=0;n>a;a++)s[a]&&r.push(t[a]);return r},_simplifyDPStep:function(t,e,i,n,o){var s,a,r,h=0;for(a=n+1;o-1>=a;a++)r=this._sqClosestPointOnSegment(t[a],t[n],t[o],!0),r>h&&(s=a,h=r);h>i&&(e[s]=1,this._simplifyDPStep(t,e,i,n,s),this._simplifyDPStep(t,e,i,s,o))},_reducePoints:function(t,e){for(var i=[t[0]],n=1,o=0,s=t.length;s>n;n++)this._sqDist(t[n],t[o])>e&&(i.push(t[n]),o=n);return s-1>o&&i.push(t[s-1]),i},clipSegment:function(t,e,i,n){var o,s,a,r=n?this._lastCode:this._getBitCode(t,i),h=this._getBitCode(e,i);for(this._lastCode=h;;){if(!(r|h))return[t,e];if(r&h)return!1;o=r||h,s=this._getEdgeIntersection(t,e,o,i),a=this._getBitCode(s,i),o===r?(t=s,r=a):(e=s,h=a)}},_getEdgeIntersection:function(t,e,o,s){var a=e.x-t.x,r=e.y-t.y,h=s.min,l=s.max;return 8&o?new n.Point(t.x+a*(l.y-t.y)/r,l.y):4&o?new n.Point(t.x+a*(h.y-t.y)/r,h.y):2&o?new n.Point(l.x,t.y+r*(l.x-t.x)/a):1&o?new n.Point(h.x,t.y+r*(h.x-t.x)/a):i},_getBitCode:function(t,e){var i=0;return t.xe.max.x&&(i|=2),t.ye.max.y&&(i|=8),i},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n},_sqClosestPointOnSegment:function(t,e,i,o){var s,a=e.x,r=e.y,h=i.x-a,l=i.y-r,u=h*h+l*l;return u>0&&(s=((t.x-a)*h+(t.y-r)*l)/u,s>1?(a=i.x,r=i.y):s>0&&(a+=h*s,r+=l*s)),h=t.x-a,l=t.y-r,o?h*h+l*l:new n.Point(a,r)}},n.Polyline=n.Path.extend({initialize:function(t,e){n.Path.prototype.initialize.call(this,e),this._latlngs=this._convertLatLngs(t)},options:{smoothFactor:1,noClip:!1},projectLatlngs:function(){this._originalPoints=[];for(var t=0,e=this._latlngs.length;e>t;t++)this._originalPoints[t]=this._map.latLngToLayerPoint(this._latlngs[t])},getPathString:function(){for(var t=0,e=this._parts.length,i="";e>t;t++)i+=this._getPathPartStr(this._parts[t]);return i},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._latlngs=this._convertLatLngs(t),this.redraw()},addLatLng:function(t){return this._latlngs.push(n.latLng(t)),this.redraw()},spliceLatLngs:function(){var t=[].splice.apply(this._latlngs,arguments);return this._convertLatLngs(this._latlngs),this.redraw(),t},closestLayerPoint:function(t){for(var e,i,o=1/0,s=this._parts,a=null,r=0,h=s.length;h>r;r++)for(var l=s[r],u=1,c=l.length;c>u;u++){e=l[u-1],i=l[u]; +var _=n.LineUtil._sqClosestPointOnSegment(t,e,i,!0);o>_&&(o=_,a=n.LineUtil._sqClosestPointOnSegment(t,e,i))}return a&&(a.distance=Math.sqrt(o)),a},getBounds:function(){var t,e,i=new n.LatLngBounds,o=this.getLatLngs();for(t=0,e=o.length;e>t;t++)i.extend(o[t]);return i},_convertLatLngs:function(t){var e,i;for(e=0,i=t.length;i>e;e++){if(n.Util.isArray(t[e])&&"number"!=typeof t[e][0])return;t[e]=n.latLng(t[e])}return t},_initEvents:function(){n.Path.prototype._initEvents.call(this)},_getPathPartStr:function(t){for(var e,i=n.Path.VML,o=0,s=t.length,a="";s>o;o++)e=t[o],i&&e._round(),a+=(o?"L":"M")+e.x+" "+e.y;return a},_clipPoints:function(){var t,e,o,s=this._originalPoints,a=s.length;if(this.options.noClip)return this._parts=[s],i;this._parts=[];var r=this._parts,h=this._map._pathViewport,l=n.LineUtil;for(t=0,e=0;a-1>t;t++)o=l.clipSegment(s[t],s[t+1],h,t),o&&(r[e]=r[e]||[],r[e].push(o[0]),(o[1]!==s[t+1]||t===a-2)&&(r[e].push(o[1]),e++))},_simplifyPoints:function(){for(var t=this._parts,e=n.LineUtil,i=0,o=t.length;o>i;i++)t[i]=e.simplify(t[i],this.options.smoothFactor)},_updatePath:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),n.Path.prototype._updatePath.call(this))}}),n.polyline=function(t,e){return new n.Polyline(t,e)},n.PolyUtil={},n.PolyUtil.clipPolygon=function(t,e){var i,o,s,a,r,h,l,u,c,_=[1,4,2,8],d=n.LineUtil;for(o=0,l=t.length;l>o;o++)t[o]._code=d._getBitCode(t[o],e);for(a=0;4>a;a++){for(u=_[a],i=[],o=0,l=t.length,s=l-1;l>o;s=o++)r=t[o],h=t[s],r._code&u?h._code&u||(c=d._getEdgeIntersection(h,r,u,e),c._code=d._getBitCode(c,e),i.push(c)):(h._code&u&&(c=d._getEdgeIntersection(h,r,u,e),c._code=d._getBitCode(c,e),i.push(c)),i.push(r));t=i}return t},n.Polygon=n.Polyline.extend({options:{fill:!0},initialize:function(t,e){n.Polyline.prototype.initialize.call(this,t,e),t&&n.Util.isArray(t[0])&&"number"!=typeof t[0][0]&&(this._latlngs=this._convertLatLngs(t[0]),this._holes=t.slice(1))},projectLatlngs:function(){if(n.Polyline.prototype.projectLatlngs.call(this),this._holePoints=[],this._holes){var t,e,i,o;for(t=0,i=this._holes.length;i>t;t++)for(this._holePoints[t]=[],e=0,o=this._holes[t].length;o>e;e++)this._holePoints[t][e]=this._map.latLngToLayerPoint(this._holes[t][e])}},_clipPoints:function(){var t=this._originalPoints,e=[];if(this._parts=[t].concat(this._holePoints),!this.options.noClip){for(var i=0,o=this._parts.length;o>i;i++){var s=n.PolyUtil.clipPolygon(this._parts[i],this._map._pathViewport);s.length&&e.push(s)}this._parts=e}},_getPathPartStr:function(t){var e=n.Polyline.prototype._getPathPartStr.call(this,t);return e+(n.Browser.svg?"z":"x")}}),n.polygon=function(t,e){return new n.Polygon(t,e)},function(){function t(t){return n.FeatureGroup.extend({initialize:function(t,e){this._layers={},this._options=e,this.setLatLngs(t)},setLatLngs:function(e){var i=0,n=e.length;for(this.eachLayer(function(t){n>i?t.setLatLngs(e[i++]):this.removeLayer(t)},this);n>i;)this.addLayer(new t(e[i++],this._options));return this}})}n.MultiPolyline=t(n.Polyline),n.MultiPolygon=t(n.Polygon),n.multiPolyline=function(t,e){return new n.MultiPolyline(t,e)},n.multiPolygon=function(t,e){return new n.MultiPolygon(t,e)}}(),n.Rectangle=n.Polygon.extend({initialize:function(t,e){n.Polygon.prototype.initialize.call(this,this._boundsToLatLngs(t),e)},setBounds:function(t){this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=n.latLngBounds(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}}),n.rectangle=function(t,e){return new n.Rectangle(t,e)},n.Circle=n.Path.extend({initialize:function(t,e,i){n.Path.prototype.initialize.call(this,i),this._latlng=n.latLng(t),this._mRadius=e},options:{fill:!0},setLatLng:function(t){return this._latlng=n.latLng(t),this.redraw()},setRadius:function(t){return this._mRadius=t,this.redraw()},projectLatlngs:function(){var t=this._getLngRadius(),e=new n.LatLng(this._latlng.lat,this._latlng.lng-t),i=this._map.latLngToLayerPoint(e);this._point=this._map.latLngToLayerPoint(this._latlng),this._radius=Math.max(Math.round(this._point.x-i.x),1)},getBounds:function(){var t=this._getLngRadius(),e=360*(this._mRadius/40075017),i=this._latlng,o=new n.LatLng(i.lat-e,i.lng-t),s=new n.LatLng(i.lat+e,i.lng+t);return new n.LatLngBounds(o,s)},getLatLng:function(){return this._latlng},getPathString:function(){var t=this._point,e=this._radius;return this._checkIfEmpty()?"":n.Browser.svg?"M"+t.x+","+(t.y-e)+"A"+e+","+e+",0,1,1,"+(t.x-.1)+","+(t.y-e)+" z":(t._round(),e=Math.round(e),"AL "+t.x+","+t.y+" "+e+","+e+" 0,"+23592600)},getRadius:function(){return this._mRadius},_getLatRadius:function(){return 360*(this._mRadius/40075017)},_getLngRadius:function(){return this._getLatRadius()/Math.cos(n.LatLng.DEG_TO_RAD*this._latlng.lat)},_checkIfEmpty:function(){if(!this._map)return!1;var t=this._map._pathViewport,e=this._radius,i=this._point;return i.x-e>t.max.x||i.y-e>t.max.y||i.x+ei;i++)for(l=this._parts[i],o=0,r=l.length,s=r-1;r>o;s=o++)if((e||0!==o)&&(h=n.LineUtil.pointToSegmentDistance(t,l[s],l[o]),u>=h))return!0;return!1}}:{}),n.Polygon.include(n.Path.CANVAS?{_containsPoint:function(t){var e,i,o,s,a,r,h,l,u=!1;if(n.Polyline.prototype._containsPoint.call(this,t,!0))return!0;for(s=0,h=this._parts.length;h>s;s++)for(e=this._parts[s],a=0,l=e.length,r=l-1;l>a;r=a++)i=e[a],o=e[r],i.y>t.y!=o.y>t.y&&t.x<(o.x-i.x)*(t.y-i.y)/(o.y-i.y)+i.x&&(u=!u);return u}}:{}),n.Circle.include(n.Path.CANVAS?{_drawPath:function(){var t=this._point;this._ctx.beginPath(),this._ctx.arc(t.x,t.y,this._radius,0,2*Math.PI,!1)},_containsPoint:function(t){var e=this._point,i=this.options.stroke?this.options.weight/2:0;return t.distanceTo(e)<=this._radius+i}}:{}),n.GeoJSON=n.FeatureGroup.extend({initialize:function(t,e){n.setOptions(this,e),this._layers={},t&&this.addData(t)},addData:function(t){var e,i,o=n.Util.isArray(t)?t:t.features;if(o){for(e=0,i=o.length;i>e;e++)(o[e].geometries||o[e].geometry)&&this.addData(o[e]);return this}var s=this.options;if(!s.filter||s.filter(t)){var a=n.GeoJSON.geometryToLayer(t,s.pointToLayer);return a.feature=t,a.defaultOptions=a.options,this.resetStyle(a),s.onEachFeature&&s.onEachFeature(t,a),this.addLayer(a)}},resetStyle:function(t){var e=this.options.style;e&&(n.Util.extend(t.options,t.defaultOptions),this._setLayerStyle(t,e))},setStyle:function(t){this.eachLayer(function(e){this._setLayerStyle(e,t)},this)},_setLayerStyle:function(t,e){"function"==typeof e&&(e=e(t.feature)),t.setStyle&&t.setStyle(e)}}),n.extend(n.GeoJSON,{geometryToLayer:function(t,e){var i,o,s,a,r,h="Feature"===t.type?t.geometry:t,l=h.coordinates,u=[];switch(h.type){case"Point":return i=this.coordsToLatLng(l),e?e(t,i):new n.Marker(i);case"MultiPoint":for(s=0,a=l.length;a>s;s++)i=this.coordsToLatLng(l[s]),r=e?e(t,i):new n.Marker(i),u.push(r);return new n.FeatureGroup(u);case"LineString":return o=this.coordsToLatLngs(l),new n.Polyline(o);case"Polygon":return o=this.coordsToLatLngs(l,1),new n.Polygon(o);case"MultiLineString":return o=this.coordsToLatLngs(l,1),new n.MultiPolyline(o);case"MultiPolygon":return o=this.coordsToLatLngs(l,2),new n.MultiPolygon(o);case"GeometryCollection":for(s=0,a=h.geometries.length;a>s;s++)r=this.geometryToLayer({geometry:h.geometries[s],type:"Feature",properties:t.properties},e),u.push(r);return new n.FeatureGroup(u);default:throw Error("Invalid GeoJSON object.")}},coordsToLatLng:function(t,e){var i=parseFloat(t[e?0:1]),o=parseFloat(t[e?1:0]);return new n.LatLng(i,o)},coordsToLatLngs:function(t,e,i){var n,o,s,a=[];for(o=0,s=t.length;s>o;o++)n=e?this.coordsToLatLngs(t[o],e-1,i):this.coordsToLatLng(t[o],i),a.push(n);return a}}),n.geoJson=function(t,e){return new n.GeoJSON(t,e)},n.DomEvent={addListener:function(t,e,o,s){var a,r,h,l=n.stamp(o),u="_leaflet_"+e+l;return t[u]?this:(a=function(e){return o.call(s||t,e||n.DomEvent._getEvent())},n.Browser.msTouch&&0===e.indexOf("touch")?this.addMsTouchListener(t,e,a,l):(n.Browser.touch&&"dblclick"===e&&this.addDoubleTapListener&&this.addDoubleTapListener(t,a,l),"addEventListener"in t?"mousewheel"===e?(t.addEventListener("DOMMouseScroll",a,!1),t.addEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?(r=a,h="mouseenter"===e?"mouseover":"mouseout",a=function(e){return n.DomEvent._checkMouse(t,e)?r(e):i},t.addEventListener(h,a,!1)):t.addEventListener(e,a,!1):"attachEvent"in t&&t.attachEvent("on"+e,a),t[u]=a,this))},removeListener:function(t,e,i){var o=n.stamp(i),s="_leaflet_"+e+o,a=t[s];if(a)return n.Browser.msTouch&&0===e.indexOf("touch")?this.removeMsTouchListener(t,e,o):n.Browser.touch&&"dblclick"===e&&this.removeDoubleTapListener?this.removeDoubleTapListener(t,o):"removeEventListener"in t?"mousewheel"===e?(t.removeEventListener("DOMMouseScroll",a,!1),t.removeEventListener(e,a,!1)):"mouseenter"===e||"mouseleave"===e?t.removeEventListener("mouseenter"===e?"mouseover":"mouseout",a,!1):t.removeEventListener(e,a,!1):"detachEvent"in t&&t.detachEvent("on"+e,a),t[s]=null,this},stopPropagation:function(t){return t.stopPropagation?t.stopPropagation():t.cancelBubble=!0,this},disableClickPropagation:function(t){for(var e=n.DomEvent.stopPropagation,i=n.Draggable.START.length-1;i>=0;i--)n.DomEvent.addListener(t,n.Draggable.START[i],e);return n.DomEvent.addListener(t,"click",e).addListener(t,"dblclick",e)},preventDefault:function(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this},stop:function(t){return n.DomEvent.preventDefault(t).stopPropagation(t)},getMousePosition:function(t,i){var o=e.body,s=e.documentElement,a=t.pageX?t.pageX:t.clientX+o.scrollLeft+s.scrollLeft,r=t.pageY?t.pageY:t.clientY+o.scrollTop+s.scrollTop,h=new n.Point(a,r);return i?h._subtract(n.DomUtil.getViewportOffset(i)):h},getWheelDelta:function(t){var e=0;return t.wheelDelta&&(e=t.wheelDelta/120),t.detail&&(e=-t.detail/3),e},_checkMouse:function(t,e){var i=e.relatedTarget;if(!i)return!0;try{for(;i&&i!==t;)i=i.parentNode}catch(n){return!1}return i!==t},_getEvent:function(){var e=t.event;if(!e)for(var i=arguments.callee.caller;i&&(e=i.arguments[0],!e||t.Event!==e.constructor);)i=i.caller;return e}},n.DomEvent.on=n.DomEvent.addListener,n.DomEvent.off=n.DomEvent.removeListener,n.Draggable=n.Class.extend({includes:n.Mixin.Events,statics:{START:n.Browser.touch?["touchstart","mousedown"]:["mousedown"],END:{mousedown:"mouseup",touchstart:"touchend",MSPointerDown:"touchend"},MOVE:{mousedown:"mousemove",touchstart:"touchmove",MSPointerDown:"touchmove"},TAP_TOLERANCE:15},initialize:function(t,e,i){this._element=t,this._dragStartTarget=e||t,this._longPress=i&&!n.Browser.msTouch},enable:function(){if(!this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.on(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!0}},disable:function(){if(this._enabled){for(var t=n.Draggable.START.length-1;t>=0;t--)n.DomEvent.off(this._dragStartTarget,n.Draggable.START[t],this._onDown,this);this._enabled=!1,this._moved=!1}},_onDown:function(t){if(!(!n.Browser.touch&&t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t),n.Draggable._disabled))){if(this._simulateClick=!0,t.touches&&t.touches.length>1)return this._simulateClick=!1,clearTimeout(this._longPressTimeout),i;var o=t.touches&&1===t.touches.length?t.touches[0]:t,s=o.target;n.Browser.touch&&"a"===s.tagName.toLowerCase()&&n.DomUtil.addClass(s,"leaflet-active"),this._moved=!1,this._moving||(this._startPoint=new n.Point(o.clientX,o.clientY),this._startPos=this._newPos=n.DomUtil.getPosition(this._element),t.touches&&1===t.touches.length&&n.Browser.touch&&this._longPress&&(this._longPressTimeout=setTimeout(n.bind(function(){var t=this._newPos&&this._newPos.distanceTo(this._startPos)||0;n.Draggable.TAP_TOLERANCE>t&&(this._simulateClick=!1,this._onUp(),this._simulateEvent("contextmenu",o))},this),1e3)),n.DomEvent.on(e,n.Draggable.MOVE[t.type],this._onMove,this),n.DomEvent.on(e,n.Draggable.END[t.type],this._onUp,this))}},_onMove:function(t){if(!(t.touches&&t.touches.length>1)){var e=t.touches&&1===t.touches.length?t.touches[0]:t,i=new n.Point(e.clientX,e.clientY),o=i.subtract(this._startPoint);(o.x||o.y)&&(n.DomEvent.preventDefault(t),this._moved||(this.fire("dragstart"),this._moved=!0,this._startPos=n.DomUtil.getPosition(this._element).subtract(o),n.Browser.touch||(n.DomUtil.disableTextSelection(),this._setMovingCursor())),this._newPos=this._startPos.add(o),this._moving=!0,n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updatePosition,this,!0,this._dragStartTarget))}},_updatePosition:function(){this.fire("predrag"),n.DomUtil.setPosition(this._element,this._newPos),this.fire("drag")},_onUp:function(t){var i;if(clearTimeout(this._longPressTimeout),this._simulateClick&&t.changedTouches){var o=t.changedTouches[0],s=o.target,a=this._newPos&&this._newPos.distanceTo(this._startPos)||0;"a"===s.tagName.toLowerCase()&&n.DomUtil.removeClass(s,"leaflet-active"),n.Draggable.TAP_TOLERANCE>a&&(i=o)}n.Browser.touch||(n.DomUtil.enableTextSelection(),this._restoreCursor());for(var r in n.Draggable.MOVE)n.Draggable.MOVE.hasOwnProperty(r)&&(n.DomEvent.off(e,n.Draggable.MOVE[r],this._onMove),n.DomEvent.off(e,n.Draggable.END[r],this._onUp));this._moved&&(n.Util.cancelAnimFrame(this._animRequest),this.fire("dragend")),this._moving=!1,i&&(this._moved=!1,this._simulateEvent("click",i))},_setMovingCursor:function(){n.DomUtil.addClass(e.body,"leaflet-dragging")},_restoreCursor:function(){n.DomUtil.removeClass(e.body,"leaflet-dragging")},_simulateEvent:function(i,n){var o=e.createEvent("MouseEvents");o.initMouseEvent(i,!0,!0,t,1,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),n.target.dispatchEvent(o)}}),n.Handler=n.Class.extend({initialize:function(t){this._map=t},enable:function(){this._enabled||(this._enabled=!0,this.addHooks())},disable:function(){this._enabled&&(this._enabled=!1,this.removeHooks())},enabled:function(){return!!this._enabled}}),n.Map.mergeOptions({dragging:!0,inertia:!n.Browser.android23,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,inertiaThreshold:n.Browser.touch?32:18,easeLinearity:.25,longPress:!0,worldCopyJump:!1}),n.Map.Drag=n.Handler.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new n.Draggable(t._mapPane,t._container,t.options.longPress),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDrag,this),t.on("viewreset",this._onViewReset,this))}this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){var t=this._map;t._panAnim&&t._panAnim.stop(),t.fire("movestart").fire("dragstart"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(){if(this._map.options.inertia){var t=this._lastTime=+new Date,e=this._lastPos=this._draggable._newPos;this._positions.push(e),this._times.push(t),t-this._times[0]>200&&(this._positions.shift(),this._times.shift())}this._map.fire("move").fire("drag")},_onViewReset:function(){var t=this._map.getSize()._divideBy(2),e=this._map.latLngToLayerPoint(new n.LatLng(0,0));this._initialWorldOffset=e.subtract(t).x,this._worldWidth=this._map.project(new n.LatLng(0,180)).x},_onPreDrag:function(){var t=this._worldWidth,e=Math.round(t/2),i=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-e+i)%t+e-i,s=(n+e+i)%t-e-i,a=Math.abs(o+i)e.inertiaThreshold||!this._positions[0];if(o)t.fire("moveend");else{var s=this._lastPos.subtract(this._positions[0]),a=(this._lastTime+i-this._times[0])/1e3,r=e.easeLinearity,h=s.multiplyBy(r/a),l=h.distanceTo(new n.Point(0,0)),u=Math.min(e.inertiaMaxSpeed,l),c=h.multiplyBy(u/l),_=u/(e.inertiaDeceleration*r),d=c.multiplyBy(-_/2).round();n.Util.requestAnimFrame(function(){t.panBy(d,_,r)})}t.fire("dragend"),e.maxBounds&&n.Util.requestAnimFrame(this._panInsideMaxBounds,t,!0,t._container)},_panInsideMaxBounds:function(){this.panInsideBounds(this.options.maxBounds)}}),n.Map.addInitHook("addHandler","dragging",n.Map.Drag),n.Map.mergeOptions({doubleClickZoom:!0}),n.Map.DoubleClickZoom=n.Handler.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick)},_onDoubleClick:function(t){this.setView(t.latlng,this._zoom+1)}}),n.Map.addInitHook("addHandler","doubleClickZoom",n.Map.DoubleClickZoom),n.Map.mergeOptions({scrollWheelZoom:!0}),n.Map.ScrollWheelZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"mousewheel",this._onWheelScroll,this),this._delta=0},removeHooks:function(){n.DomEvent.off(this._map._container,"mousewheel",this._onWheelScroll)},_onWheelScroll:function(t){var e=n.DomEvent.getWheelDelta(t);this._delta+=e,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var i=Math.max(40-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(n.bind(this._performZoom,this),i),n.DomEvent.preventDefault(t),n.DomEvent.stopPropagation(t)},_performZoom:function(){var t=this._map,e=this._delta,i=t.getZoom();if(e=e>0?Math.ceil(e):Math.round(e),e=Math.max(Math.min(e,4),-4),e=t._limitZoom(i+e)-i,this._delta=0,this._startTime=null,e){var n=i+e,o=this._getCenterForScrollWheelZoom(n);t.setView(o,n)}},_getCenterForScrollWheelZoom:function(t){var e=this._map,i=e.getZoomScale(t),n=e.getSize()._divideBy(2),o=this._lastMousePos._subtract(n)._multiplyBy(1-1/i),s=e._getTopLeftPoint()._add(n)._add(o);return e.unproject(s)}}),n.Map.addInitHook("addHandler","scrollWheelZoom",n.Map.ScrollWheelZoom),n.extend(n.DomEvent,{_touchstart:n.Browser.msTouch?"MSPointerDown":"touchstart",_touchend:n.Browser.msTouch?"MSPointerUp":"touchend",addDoubleTapListener:function(t,i,o){function s(t){var e;if(n.Browser.msTouch?(p.push(t.pointerId),e=p.length):e=t.touches.length,!(e>1)){var i=Date.now(),o=i-(r||i);h=t.touches?t.touches[0]:t,l=o>0&&u>=o,r=i}}function a(t){if(n.Browser.msTouch){var e=p.indexOf(t.pointerId);if(-1===e)return;p.splice(e,1)}if(l){if(n.Browser.msTouch){var o,s={};for(var a in h)o=h[a],s[a]="function"==typeof o?o.bind(h):o;h=s}h.type="dblclick",i(h),r=null}}var r,h,l=!1,u=250,c="_leaflet_",_=this._touchstart,d=this._touchend,p=[];t[c+_+o]=s,t[c+d+o]=a;var m=n.Browser.msTouch?e.documentElement:t;return t.addEventListener(_,s,!1),m.addEventListener(d,a,!1),n.Browser.msTouch&&m.addEventListener("MSPointerCancel",a,!1),this},removeDoubleTapListener:function(t,i){var o="_leaflet_";return t.removeEventListener(this._touchstart,t[o+this._touchstart+i],!1),(n.Browser.msTouch?e.documentElement:t).removeEventListener(this._touchend,t[o+this._touchend+i],!1),n.Browser.msTouch&&e.documentElement.removeEventListener("MSPointerCancel",t[o+this._touchend+i],!1),this}}),n.extend(n.DomEvent,{_msTouches:[],_msDocumentListener:!1,addMsTouchListener:function(t,e,i,n){switch(e){case"touchstart":return this.addMsTouchListenerStart(t,e,i,n);case"touchend":return this.addMsTouchListenerEnd(t,e,i,n);case"touchmove":return this.addMsTouchListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addMsTouchListenerStart:function(t,i,n,o){var s="_leaflet_",a=this._msTouches,r=function(t){for(var e=!1,i=0;a.length>i;i++)if(a[i].pointerId===t.pointerId){e=!0;break}e||a.push(t),t.touches=a.slice(),t.changedTouches=[t],n(t)};if(t[s+"touchstart"+o]=r,t.addEventListener("MSPointerDown",r,!1),!this._msDocumentListener){var h=function(t){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a.splice(e,1);break}};e.documentElement.addEventListener("MSPointerUp",h,!1),e.documentElement.addEventListener("MSPointerCancel",h,!1),this._msDocumentListener=!0}return this},addMsTouchListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE||0!==t.buttons){for(var e=0;a.length>e;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._msTouches;return t[s+"touchmove"+n]=o,t.addEventListener("MSPointerMove",o,!1),this},addMsTouchListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._msTouches,a=function(t){for(var e=0;s.length>e;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener("MSPointerUp",a,!1),t.addEventListener("MSPointerCancel",a,!1),this},removeMsTouchListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener("MSPointerDown",o,!1);break;case"touchmove":t.removeEventListener("MSPointerMove",o,!1);break;case"touchend":t.removeEventListener("MSPointerUp",o,!1),t.removeEventListener("MSPointerCancel",o,!1)}return this}}),n.Map.mergeOptions({touchZoom:n.Browser.touch&&!n.Browser.android23}),n.Map.TouchZoom=n.Handler.extend({addHooks:function(){n.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){n.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var o=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=o.add(s)._divideBy(2),this._startDist=o.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),n.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),n.DomEvent.preventDefault(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length){var e=this._map,i=e.mouseEventToLayerPoint(t.touches[0]),o=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(o)/this._startDist,this._delta=i._add(o)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(this._moved||(n.DomUtil.addClass(e._mapPane,"leaflet-zoom-anim leaflet-touching"),e.fire("movestart").fire("zoomstart")._prepareTileBg(),this._moved=!0),n.Util.cancelAnimFrame(this._animRequest),this._animRequest=n.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),n.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e);t.fire("zoomanim",{center:i,zoom:t.getScaleZoom(this._scale)}),t._tileBg.style[n.DomUtil.TRANSFORM]=n.DomUtil.getTranslateString(this._delta)+" "+n.DomUtil.getScaleString(this._scale,this._startCenter)},_onTouchEnd:function(){if(this._moved&&this._zooming){var t=this._map;this._zooming=!1,n.DomUtil.removeClass(t._mapPane,"leaflet-touching"),n.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),o=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r);t.fire("zoomanim",{center:o,zoom:h}),t._runAnimation(o,h,t.getZoomScale(h)/this._scale,i,!0)}},_getScaleOrigin:function(){var t=this._centerOffset.subtract(this._delta).divideBy(this._scale);return this._startCenter.add(t)}}),n.Map.addInitHook("addHandler","touchZoom",n.Map.TouchZoom),n.Map.mergeOptions({boxZoom:!0}),n.Map.BoxZoom=n.Handler.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane},addHooks:function(){n.DomEvent.on(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){n.DomEvent.off(this._container,"mousedown",this._onMouseDown)},_onMouseDown:function(t){return!t.shiftKey||1!==t.which&&1!==t.button?!1:(n.DomUtil.disableTextSelection(),this._startLayerPoint=this._map.mouseEventToLayerPoint(t),this._box=n.DomUtil.create("div","leaflet-zoom-box",this._pane),n.DomUtil.setPosition(this._box,this._startLayerPoint),this._container.style.cursor="crosshair",n.DomEvent.on(e,"mousemove",this._onMouseMove,this).on(e,"mouseup",this._onMouseUp,this).preventDefault(t),this._map.fire("boxzoomstart"),i)},_onMouseMove:function(t){var e=this._startLayerPoint,i=this._box,o=this._map.mouseEventToLayerPoint(t),s=o.subtract(e),a=new n.Point(Math.min(o.x,e.x),Math.min(o.y,e.y));n.DomUtil.setPosition(i,a),i.style.width=Math.max(0,Math.abs(s.x)-4)+"px",i.style.height=Math.max(0,Math.abs(s.y)-4)+"px"},_onMouseUp:function(t){this._pane.removeChild(this._box),this._container.style.cursor="",n.DomUtil.enableTextSelection(),n.DomEvent.off(e,"mousemove",this._onMouseMove).off(e,"mouseup",this._onMouseUp);var i=this._map,o=i.mouseEventToLayerPoint(t);if(!this._startLayerPoint.equals(o)){var s=new n.LatLngBounds(i.layerPointToLatLng(this._startLayerPoint),i.layerPointToLatLng(o));i.fitBounds(s),i.fire("boxzoomend",{boxZoomBounds:s})}}}),n.Map.addInitHook("addHandler","boxZoom",n.Map.BoxZoom),n.Map.mergeOptions({keyboard:!0,keyboardPanOffset:80,keyboardZoomOffset:1}),n.Map.Keyboard=n.Handler.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61],zoomOut:[189,109,173]},initialize:function(t){this._map=t,this._setPanOffset(t.options.keyboardPanOffset),this._setZoomOffset(t.options.keyboardZoomOffset)},addHooks:function(){var t=this._map._container;-1===t.tabIndex&&(t.tabIndex="0"),n.DomEvent.on(t,"focus",this._onFocus,this).on(t,"blur",this._onBlur,this).on(t,"mousedown",this._onMouseDown,this),this._map.on("focus",this._addHooks,this).on("blur",this._removeHooks,this)},removeHooks:function(){this._removeHooks();var t=this._map._container;n.DomEvent.off(t,"focus",this._onFocus,this).off(t,"blur",this._onBlur,this).off(t,"mousedown",this._onMouseDown,this),this._map.off("focus",this._addHooks,this).off("blur",this._removeHooks,this)},_onMouseDown:function(){this._focused||this._map._container.focus()},_onFocus:function(){this._focused=!0,this._map.fire("focus")},_onBlur:function(){this._focused=!1,this._map.fire("blur")},_setPanOffset:function(t){var e,i,n=this._panKeys={},o=this.keyCodes;for(e=0,i=o.left.length;i>e;e++)n[o.left[e]]=[-1*t,0];for(e=0,i=o.right.length;i>e;e++)n[o.right[e]]=[t,0];for(e=0,i=o.down.length;i>e;e++)n[o.down[e]]=[0,t];for(e=0,i=o.up.length;i>e;e++)n[o.up[e]]=[0,-1*t]},_setZoomOffset:function(t){var e,i,n=this._zoomKeys={},o=this.keyCodes;for(e=0,i=o.zoomIn.length;i>e;e++)n[o.zoomIn[e]]=t;for(e=0,i=o.zoomOut.length;i>e;e++)n[o.zoomOut[e]]=-t},_addHooks:function(){n.DomEvent.on(e,"keydown",this._onKeyDown,this)},_removeHooks:function(){n.DomEvent.off(e,"keydown",this._onKeyDown,this)},_onKeyDown:function(t){var e=t.keyCode,i=this._map;if(this._panKeys.hasOwnProperty(e))i.panBy(this._panKeys[e]),i.options.maxBounds&&i.panInsideBounds(i.options.maxBounds);else{if(!this._zoomKeys.hasOwnProperty(e))return;i.setZoom(i.getZoom()+this._zoomKeys[e])}n.DomEvent.stop(t)}}),n.Map.addInitHook("addHandler","keyboard",n.Map.Keyboard),n.Handler.MarkerDrag=n.Handler.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new n.Draggable(t,t).on("dragstart",this._onDragStart,this).on("drag",this._onDrag,this).on("dragend",this._onDragEnd,this)),this._draggable.enable()},removeHooks:function(){this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},_onDragStart:function(){this._marker.closePopup().fire("movestart").fire("dragstart")},_onDrag:function(){var t=this._marker,e=t._shadow,i=n.DomUtil.getPosition(t._icon),o=t._map.layerPointToLatLng(i);e&&n.DomUtil.setPosition(e,i),t._latlng=o,t.fire("move",{latlng:o}).fire("drag")},_onDragEnd:function(){this._marker.fire("moveend").fire("dragend")}}),n.Handler.PolyEdit=n.Handler.extend({options:{icon:new n.DivIcon({iconSize:new n.Point(8,8),className:"leaflet-div-icon leaflet-editing-icon"})},initialize:function(t,e){this._poly=t,n.setOptions(this,e)},addHooks:function(){this._poly._map&&(this._markerGroup||this._initMarkers(),this._poly._map.addLayer(this._markerGroup))},removeHooks:function(){this._poly._map&&(this._poly._map.removeLayer(this._markerGroup),delete this._markerGroup,delete this._markers)},updateMarkers:function(){this._markerGroup.clearLayers(),this._initMarkers()},_initMarkers:function(){this._markerGroup||(this._markerGroup=new n.LayerGroup),this._markers=[];var t,e,i,o,s=this._poly._latlngs;for(t=0,i=s.length;i>t;t++)o=this._createMarker(s[t],t),o.on("click",this._onMarkerClick,this),this._markers.push(o);var a,r;for(t=0,e=i-1;i>t;e=t++)(0!==t||n.Polygon&&this._poly instanceof n.Polygon)&&(a=this._markers[e],r=this._markers[t],this._createMiddleMarker(a,r),this._updatePrevNext(a,r))},_createMarker:function(t,e){var i=new n.Marker(t,{draggable:!0,icon:this.options.icon});return i._origLatLng=t,i._index=e,i.on("drag",this._onMarkerDrag,this),i.on("dragend",this._fireEdit,this),this._markerGroup.addLayer(i),i},_fireEdit:function(){this._poly.fire("edit")},_onMarkerDrag:function(t){var e=t.target;n.extend(e._origLatLng,e._latlng),e._middleLeft&&e._middleLeft.setLatLng(this._getMiddleLatLng(e._prev,e)),e._middleRight&&e._middleRight.setLatLng(this._getMiddleLatLng(e,e._next)),this._poly.redraw()},_onMarkerClick:function(t){if(!(3>this._poly._latlngs.length)){var e=t.target,i=e._index;this._markerGroup.removeLayer(e),this._markers.splice(i,1),this._poly.spliceLatLngs(i,1),this._updateIndexes(i,-1),this._updatePrevNext(e._prev,e._next),e._middleLeft&&this._markerGroup.removeLayer(e._middleLeft),e._middleRight&&this._markerGroup.removeLayer(e._middleRight),e._prev&&e._next?this._createMiddleMarker(e._prev,e._next):e._prev?e._next||(e._prev._middleRight=null):e._next._middleLeft=null,this._poly.fire("edit")}},_updateIndexes:function(t,e){this._markerGroup.eachLayer(function(i){i._index>t&&(i._index+=e)})},_createMiddleMarker:function(t,e){var i,n,o,s=this._getMiddleLatLng(t,e),a=this._createMarker(s);a.setOpacity(.6),t._middleRight=e._middleLeft=a,n=function(){var n=e._index;a._index=n,a.off("click",i).on("click",this._onMarkerClick,this),s.lat=a.getLatLng().lat,s.lng=a.getLatLng().lng,this._poly.spliceLatLngs(n,0,s),this._markers.splice(n,0,a),a.setOpacity(1),this._updateIndexes(n,1),e._index++,this._updatePrevNext(t,a),this._updatePrevNext(a,e)},o=function(){a.off("dragstart",n,this),a.off("dragend",o,this),this._createMiddleMarker(t,a),this._createMiddleMarker(a,e)},i=function(){n.call(this),o.call(this),this._poly.fire("edit")},a.on("click",i,this).on("dragstart",n,this).on("dragend",o,this),this._markerGroup.addLayer(a)},_updatePrevNext:function(t,e){t&&(t._next=e),e&&(e._prev=t)},_getMiddleLatLng:function(t,e){var i=this._poly._map,n=i.latLngToLayerPoint(t.getLatLng()),o=i.latLngToLayerPoint(e.getLatLng());return i.layerPointToLatLng(n._add(o)._divideBy(2))}}),n.Polyline.addInitHook(function(){n.Handler.PolyEdit&&(this.editing=new n.Handler.PolyEdit(this),this.options.editable&&this.editing.enable()),this.on("add",function(){this.editing&&this.editing.enabled()&&this.editing.addHooks()}),this.on("remove",function(){this.editing&&this.editing.enabled()&&this.editing.removeHooks()})}),n.Control=n.Class.extend({options:{position:"topright"},initialize:function(t){n.setOptions(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var e=this._map;return e&&e.removeControl(this),this.options.position=t,e&&e.addControl(this),this +},addTo:function(t){this._map=t;var e=this._container=this.onAdd(t),i=this.getPosition(),o=t._controlCorners[i];return n.DomUtil.addClass(e,"leaflet-control"),-1!==i.indexOf("bottom")?o.insertBefore(e,o.firstChild):o.appendChild(e),this},removeFrom:function(t){var e=this.getPosition(),i=t._controlCorners[e];return i.removeChild(this._container),this._map=null,this.onRemove&&this.onRemove(t),this}}),n.control=function(t){return new n.Control(t)},n.Map.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.removeFrom(this),this},_initControlPos:function(){function t(t,s){var a=i+t+" "+i+s;e[t+s]=n.DomUtil.create("div",a,o)}var e=this._controlCorners={},i="leaflet-",o=this._controlContainer=n.DomUtil.create("div",i+"control-container",this._container);t("top","left"),t("top","right"),t("bottom","left"),t("bottom","right")}}),n.Control.Zoom=n.Control.extend({options:{position:"topleft"},onAdd:function(t){var e="leaflet-control-zoom",i="leaflet-bar",o=i+"-part",s=n.DomUtil.create("div",e+" "+i);return this._map=t,this._zoomInButton=this._createButton("+","Zoom in",e+"-in "+o+" "+o+"-top",s,this._zoomIn,this),this._zoomOutButton=this._createButton("-","Zoom out",e+"-out "+o+" "+o+"-bottom",s,this._zoomOut,this),t.on("zoomend",this._updateDisabled,this),s},onRemove:function(t){t.off("zoomend",this._updateDisabled,this)},_zoomIn:function(t){this._map.zoomIn(t.shiftKey?3:1)},_zoomOut:function(t){this._map.zoomOut(t.shiftKey?3:1)},_createButton:function(t,e,i,o,s,a){var r=n.DomUtil.create("a",i,o);r.innerHTML=t,r.href="#",r.title=e;var h=n.DomEvent.stopPropagation;return n.DomEvent.on(r,"click",h).on(r,"mousedown",h).on(r,"dblclick",h).on(r,"click",n.DomEvent.preventDefault).on(r,"click",s,a),r},_updateDisabled:function(){var t=this._map,e="leaflet-control-zoom-disabled";n.DomUtil.removeClass(this._zoomInButton,e),n.DomUtil.removeClass(this._zoomOutButton,e),t._zoom===t.getMinZoom()&&n.DomUtil.addClass(this._zoomOutButton,e),t._zoom===t.getMaxZoom()&&n.DomUtil.addClass(this._zoomInButton,e)}}),n.Map.mergeOptions({zoomControl:!0}),n.Map.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new n.Control.Zoom,this.addControl(this.zoomControl))}),n.control.zoom=function(t){return new n.Control.Zoom(t)},n.Control.Attribution=n.Control.extend({options:{position:"bottomright",prefix:'Powered by Leaflet'},initialize:function(t){n.setOptions(this,t),this._attributions={}},onAdd:function(t){return this._container=n.DomUtil.create("div","leaflet-control-attribution"),n.DomEvent.disableClickPropagation(this._container),t.on("layeradd",this._onLayerAdd,this).on("layerremove",this._onLayerRemove,this),this._update(),this._container},onRemove:function(t){t.off("layeradd",this._onLayerAdd).off("layerremove",this._onLayerRemove)},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):i},removeAttribution:function(t){return t?(this._attributions[t]--,this._update(),this):i},_update:function(){if(this._map){var t=[];for(var e in this._attributions)this._attributions.hasOwnProperty(e)&&this._attributions[e]&&t.push(e);var i=[];this.options.prefix&&i.push(this.options.prefix),t.length&&i.push(t.join(", ")),this._container.innerHTML=i.join(" — ")}},_onLayerAdd:function(t){t.layer.getAttribution&&this.addAttribution(t.layer.getAttribution())},_onLayerRemove:function(t){t.layer.getAttribution&&this.removeAttribution(t.layer.getAttribution())}}),n.Map.mergeOptions({attributionControl:!0}),n.Map.addInitHook(function(){this.options.attributionControl&&(this.attributionControl=(new n.Control.Attribution).addTo(this))}),n.control.attribution=function(t){return new n.Control.Attribution(t)},n.Control.Scale=n.Control.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0,updateWhenIdle:!1},onAdd:function(t){this._map=t;var e="leaflet-control-scale",i=n.DomUtil.create("div",e),o=this.options;return this._addScales(o,e,i),t.on(o.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,e,i){t.metric&&(this._mScale=n.DomUtil.create("div",e+"-line",i)),t.imperial&&(this._iScale=n.DomUtil.create("div",e+"-line",i))},_update:function(){var t=this._map.getBounds(),e=t.getCenter().lat,i=6378137*Math.PI*Math.cos(e*Math.PI/180),n=i*(t.getNorthEast().lng-t.getSouthWest().lng)/180,o=this._map.getSize(),s=this.options,a=0;o.x>0&&(a=n*(s.maxWidth/o.x)),this._updateScales(s,a)},_updateScales:function(t,e){t.metric&&e&&this._updateMetric(e),t.imperial&&e&&this._updateImperial(e)},_updateMetric:function(t){var e=this._getRoundNum(t);this._mScale.style.width=this._getScaleWidth(e/t)+"px",this._mScale.innerHTML=1e3>e?e+" m":e/1e3+" km"},_updateImperial:function(t){var e,i,n,o=3.2808399*t,s=this._iScale;o>5280?(e=o/5280,i=this._getRoundNum(e),s.style.width=this._getScaleWidth(i/e)+"px",s.innerHTML=i+" mi"):(n=this._getRoundNum(o),s.style.width=this._getScaleWidth(n/o)+"px",s.innerHTML=n+" ft")},_getScaleWidth:function(t){return Math.round(this.options.maxWidth*t)-10},_getRoundNum:function(t){var e=Math.pow(10,(Math.floor(t)+"").length-1),i=t/e;return i=i>=10?10:i>=5?5:i>=3?3:i>=2?2:1,e*i}}),n.control.scale=function(t){return new n.Control.Scale(t)},n.Control.Layers=n.Control.extend({options:{collapsed:!0,position:"topright",autoZIndex:!0},initialize:function(t,e,i){n.setOptions(this,i),this._layers={},this._lastZIndex=0,this._handlingClick=!1;for(var o in t)t.hasOwnProperty(o)&&this._addLayer(t[o],o);for(o in e)e.hasOwnProperty(o)&&this._addLayer(e[o],o,!0)},onAdd:function(t){return this._initLayout(),this._update(),t.on("layeradd",this._onLayerChange,this).on("layerremove",this._onLayerChange,this),this._container},onRemove:function(t){t.off("layeradd",this._onLayerChange).off("layerremove",this._onLayerChange)},addBaseLayer:function(t,e){return this._addLayer(t,e),this._update(),this},addOverlay:function(t,e){return this._addLayer(t,e,!0),this._update(),this},removeLayer:function(t){var e=n.stamp(t);return delete this._layers[e],this._update(),this},_initLayout:function(){var t="leaflet-control-layers",e=this._container=n.DomUtil.create("div",t);n.Browser.touch?n.DomEvent.on(e,"click",n.DomEvent.stopPropagation):(n.DomEvent.disableClickPropagation(e),n.DomEvent.on(e,"mousewheel",n.DomEvent.stopPropagation));var i=this._form=n.DomUtil.create("form",t+"-list");if(this.options.collapsed){n.DomEvent.on(e,"mouseover",this._expand,this).on(e,"mouseout",this._collapse,this);var o=this._layersLink=n.DomUtil.create("a",t+"-toggle",e);o.href="#",o.title="Layers",n.Browser.touch?n.DomEvent.on(o,"click",n.DomEvent.stopPropagation).on(o,"click",n.DomEvent.preventDefault).on(o,"click",this._expand,this):n.DomEvent.on(o,"focus",this._expand,this),this._map.on("movestart",this._collapse,this)}else this._expand();this._baseLayersList=n.DomUtil.create("div",t+"-base",i),this._separator=n.DomUtil.create("div",t+"-separator",i),this._overlaysList=n.DomUtil.create("div",t+"-overlays",i),e.appendChild(i)},_addLayer:function(t,e,i){var o=n.stamp(t);this._layers[o]={layer:t,name:e,overlay:i},this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex))},_update:function(){if(this._container){this._baseLayersList.innerHTML="",this._overlaysList.innerHTML="";var t=!1,e=!1;for(var i in this._layers)if(this._layers.hasOwnProperty(i)){var n=this._layers[i];this._addItem(n),e=e||n.overlay,t=t||!n.overlay}this._separator.style.display=e&&t?"":"none"}},_onLayerChange:function(t){var e=n.stamp(t.layer);this._layers[e]&&!this._handlingClick&&this._update()},_createRadioElement:function(t,i){var n='t;t++)e=o[t],i=this._layers[e.layerId],e.checked&&!this._map.hasLayer(i.layer)?(this._map.addLayer(i.layer),i.overlay||(n=i.layer)):!e.checked&&this._map.hasLayer(i.layer)&&this._map.removeLayer(i.layer);n&&(this._map.setZoom(this._map.getZoom()),this._map.fire("baselayerchange",{layer:n})),this._handlingClick=!1},_expand:function(){n.DomUtil.addClass(this._container,"leaflet-control-layers-expanded")},_collapse:function(){this._container.className=this._container.className.replace(" leaflet-control-layers-expanded","")}}),n.control.layers=function(t,e,i){return new n.Control.Layers(t,e,i)},n.PosAnimation=n.Class.extend({includes:n.Mixin.Events,run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this.fire("start"),t.style[n.DomUtil.TRANSITION]="all "+(i||.25)+"s cubic-bezier(0,0,"+(o||.5)+",1)",n.DomEvent.on(t,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),n.DomUtil.setPosition(t,e),n.Util.falseFn(t.offsetWidth),this._stepTimer=setInterval(n.bind(this.fire,this,"step"),50)},stop:function(){this._inProgress&&(n.DomUtil.setPosition(this._el,this._getPos()),this._onTransitionEnd(),n.Util.falseFn(this._el.offsetWidth))},_transformRe:/(-?[\d\.]+), (-?[\d\.]+)\)/,_getPos:function(){var e,i,o,s=this._el,a=t.getComputedStyle(s);return n.Browser.any3d?(o=a[n.DomUtil.TRANSFORM].match(this._transformRe),e=parseFloat(o[1]),i=parseFloat(o[2])):(e=parseFloat(a.left),i=parseFloat(a.top)),new n.Point(e,i,!0)},_onTransitionEnd:function(){n.DomEvent.off(this._el,n.DomUtil.TRANSITION_END,this._onTransitionEnd,this),this._inProgress&&(this._inProgress=!1,this._el.style[n.DomUtil.TRANSITION]="",clearInterval(this._stepTimer),this.fire("step").fire("end"))}}),n.Map.include({setView:function(t,e,i){e=this._limitZoom(e);var n=this._zoom!==e;if(this._loaded&&!i&&this._layers){this._panAnim&&this._panAnim.stop();var o=n?this._zoomToIfClose&&this._zoomToIfClose(t,e):this._panByIfClose(t);if(o)return clearTimeout(this._sizeTimer),this}return this._resetView(t,e),this},panBy:function(t,e,i){if(t=n.point(t),!t.x&&!t.y)return this;this._panAnim||(this._panAnim=new n.PosAnimation,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),this.fire("movestart"),n.DomUtil.addClass(this._mapPane,"leaflet-pan-anim");var o=n.DomUtil.getPosition(this._mapPane).subtract(t)._round();return this._panAnim.run(this._mapPane,o,e||.25,i),this},_onPanTransitionStep:function(){this.fire("move")},_onPanTransitionEnd:function(){n.DomUtil.removeClass(this._mapPane,"leaflet-pan-anim"),this.fire("moveend")},_panByIfClose:function(t){var e=this._getCenterOffset(t)._floor();return this._offsetIsWithinView(e)?(this.panBy(e),!0):!1},_offsetIsWithinView:function(t,e){var i=e||1,n=this.getSize();return Math.abs(t.x)<=n.x*i&&Math.abs(t.y)<=n.y*i}}),n.PosAnimation=n.DomUtil.TRANSITION?n.PosAnimation:n.PosAnimation.extend({run:function(t,e,i,o){this.stop(),this._el=t,this._inProgress=!0,this._duration=i||.25,this._easeOutPower=1/Math.max(o||.5,.2),this._startPos=n.DomUtil.getPosition(t),this._offset=e.subtract(this._startPos),this._startTime=+new Date,this.fire("start"),this._animate()},stop:function(){this._inProgress&&(this._step(),this._complete())},_animate:function(){this._animId=n.Util.requestAnimFrame(this._animate,this),this._step()},_step:function(){var t=+new Date-this._startTime,e=1e3*this._duration;e>t?this._runFrame(this._easeOut(t/e)):(this._runFrame(1),this._complete())},_runFrame:function(t){var e=this._startPos.add(this._offset.multiplyBy(t));n.DomUtil.setPosition(this._el,e),this.fire("step")},_complete:function(){n.Util.cancelAnimFrame(this._animId),this._inProgress=!1,this.fire("end")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),n.Map.mergeOptions({zoomAnimation:n.DomUtil.TRANSITION&&!n.Browser.android23&&!n.Browser.mobileOpera}),n.DomUtil.TRANSITION&&n.Map.addInitHook(function(){n.DomEvent.on(this._mapPane,n.DomUtil.TRANSITION_END,this._catchTransitionEnd,this)}),n.Map.include(n.DomUtil.TRANSITION?{_zoomToIfClose:function(t,e){if(this._animatingZoom)return!0;if(!this.options.zoomAnimation)return!1;var i=this.getZoomScale(e),o=this._getCenterOffset(t)._divideBy(1-1/i);if(!this._offsetIsWithinView(o,1))return!1;n.DomUtil.addClass(this._mapPane,"leaflet-zoom-anim"),this.fire("movestart").fire("zoomstart"),this.fire("zoomanim",{center:t,zoom:e});var s=this._getCenterLayerPoint().add(o);return this._prepareTileBg(),this._runAnimation(t,e,i,s),!0},_catchTransitionEnd:function(){this._animatingZoom&&this._onZoomTransitionEnd()},_runAnimation:function(t,e,i,o,s){this._animateToCenter=t,this._animateToZoom=e,this._animatingZoom=!0,n.Draggable&&(n.Draggable._disabled=!0);var a=n.DomUtil.TRANSFORM,r=this._tileBg;clearTimeout(this._clearTileBgTimer),n.Util.falseFn(r.offsetWidth);var h=n.DomUtil.getScaleString(i,o),l=r.style[a];r.style[a]=s?l+" "+h:h+" "+l},_prepareTileBg:function(){var t=this._tilePane,e=this._tileBg;if(e&&this._getLoadedTilesPercentage(e)>.5&&.5>this._getLoadedTilesPercentage(t))return t.style.visibility="hidden",t.empty=!0,this._stopLoadingImages(t),i;e||(e=this._tileBg=this._createPane("leaflet-tile-pane",this._mapPane),e.style.zIndex=1),e.style[n.DomUtil.TRANSFORM]="",e.style.visibility="hidden",e.empty=!0,t.empty=!1,this._tilePane=this._panes.tilePane=e;var o=this._tileBg=t;n.DomUtil.addClass(o,"leaflet-zoom-animated"),this._stopLoadingImages(o)},_getLoadedTilesPercentage:function(t){var e,i,n=t.getElementsByTagName("img"),o=0;for(e=0,i=n.length;i>e;e++)n[e].complete&&o++;return o/i},_stopLoadingImages:function(t){var e,i,o,s=Array.prototype.slice.call(t.getElementsByTagName("img"));for(e=0,i=s.length;i>e;e++)o=s[e],o.complete||(o.onload=n.Util.falseFn,o.onerror=n.Util.falseFn,o.src=n.Util.emptyImageUrl,o.parentNode.removeChild(o))},_onZoomTransitionEnd:function(){this._restoreTileFront(),n.DomUtil.removeClass(this._mapPane,"leaflet-zoom-anim"),n.Util.falseFn(this._tileBg.offsetWidth),this._animatingZoom=!1,this._resetView(this._animateToCenter,this._animateToZoom,!0,!0),n.Draggable&&(n.Draggable._disabled=!1)},_restoreTileFront:function(){this._tilePane.innerHTML="",this._tilePane.style.visibility="",this._tilePane.style.zIndex=2,this._tileBg.style.zIndex=1},_clearTileBg:function(){this._animatingZoom||this.touchZoom._zooming||(this._tileBg.innerHTML="")}}:{}),n.Map.include({_defaultLocateOptions:{watch:!1,setView:!1,maxZoom:1/0,timeout:1e4,maximumAge:0,enableHighAccuracy:!1},locate:function(t){if(t=this._locationOptions=n.extend(this._defaultLocateOptions,t),!navigator.geolocation)return this._handleGeolocationError({code:0,message:"Geolocation not supported."}),this;var e=n.bind(this._handleGeolocationResponse,this),i=n.bind(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(e,i,t):navigator.geolocation.getCurrentPosition(e,i,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch(this._locationWatchId),this},_handleGeolocationError:function(t){var e=t.code,i=t.message||(1===e?"permission denied":2===e?"position unavailable":"timeout");this._locationOptions.setView&&!this._loaded&&this.fitWorld(),this.fire("locationerror",{code:e,message:"Geolocation error: "+i+"."})},_handleGeolocationResponse:function(t){var e=180*t.coords.accuracy/4e7,i=2*e,o=t.coords.latitude,s=t.coords.longitude,a=new n.LatLng(o,s),r=new n.LatLng(o-e,s-i),h=new n.LatLng(o+e,s+i),l=new n.LatLngBounds(r,h),u=this._locationOptions;if(u.setView){var c=Math.min(this.getBoundsZoom(l),u.maxZoom);this.setView(a,c)}this.fire("locationfound",{latlng:a,bounds:l,accuracy:t.coords.accuracy})}})})(this,document); // modified version of https://github.com/shramov/leaflet-plugins. Also // contains the default Ingress map style. -var LEAFLETGOOGLE = 'http://breunigs.github.com/ingress-intel-total-conversion/dist/leaflet_google.js'; +/* + * L.TileLayer is used for standard xyz-numbered tile layers. + */ +L.Google = L.Class.extend({ + includes: L.Mixin.Events, + + options: { + minZoom: 0, + maxZoom: 18, + tileSize: 256, + subdomains: 'abc', + errorTileUrl: '', + attribution: '', + opacity: 1, + continuousWorld: false, + noWrap: false, + }, + + // Possible types: SATELLITE, ROADMAP, HYBRID, INGRESS + initialize: function(type, options, styles) { + L.Util.setOptions(this, options); + if(type === 'INGRESS') { + type = 'ROADMAP'; + this._styles = [{featureType:"all", elementType:"all", stylers:[{visibility:"on"}, {hue:"#0091ff"}, {invert_lightness:true}]}, {featureType:"water", elementType:"all", stylers:[{visibility:"on"}, {hue:"#005eff"}, {invert_lightness:true}]}, {featureType:"poi", stylers:[{visibility:"off"}]}, {featureType:"transit", elementType:"all", stylers:[{visibility:"off"}]}]; + } else { + this._styles = null; + } + this._type = google.maps.MapTypeId[type || 'SATELLITE']; + }, + + onAdd: function(map, insertAtTheBottom) { + this._map = map; + this._insertAtTheBottom = insertAtTheBottom; + + // create a container div for tiles + this._initContainer(); + this._initMapObject(); + + // set up events + map.on('viewreset', this._resetCallback, this); + + this._limitedUpdate = L.Util.limitExecByInterval(this._update, 150, this); + map.on('move', this._update, this); + //map.on('moveend', this._update, this); + + this._reset(); + this._update(); + }, + + onRemove: function(map) { + this._map._container.removeChild(this._container); + //this._container = null; + + this._map.off('viewreset', this._resetCallback, this); + + this._map.off('move', this._update, this); + //this._map.off('moveend', this._update, this); + }, + + getAttribution: function() { + return this.options.attribution; + }, + + setOpacity: function(opacity) { + this.options.opacity = opacity; + if (opacity < 1) { + L.DomUtil.setOpacity(this._container, opacity); + } + }, + + _initContainer: function() { + var tilePane = this._map._container + first = tilePane.firstChild; + + if (!this._container) { + this._container = L.DomUtil.create('div', 'leaflet-google-layer leaflet-top leaflet-left'); + this._container.id = "_GMapContainer"; + } + + if (true) { + tilePane.insertBefore(this._container, first); + + this.setOpacity(this.options.opacity); + var size = this._map.getSize(); + this._container.style.width = size.x + 'px'; + this._container.style.height = size.y + 'px'; + } + }, + + _initMapObject: function() { + this._google_center = new google.maps.LatLng(0, 0); + var map = new google.maps.Map(this._container, { + center: this._google_center, + zoom: 0, + styles: this._styles, + mapTypeId: this._type, + disableDefaultUI: true, + keyboardShortcuts: false, + draggable: false, + disableDoubleClickZoom: true, + scrollwheel: false, + streetViewControl: false + }); + + var _this = this; + this._reposition = google.maps.event.addListenerOnce(map, "center_changed", + function() { _this.onReposition(); }); + + map.backgroundColor = '#ff0000'; + this._google = map; + }, + + _resetCallback: function(e) { + this._reset(e.hard); + }, + + _reset: function(clearOldContainer) { + this._initContainer(); + }, + + _update: function() { + this._resize(); + + var bounds = this._map.getBounds(); + var ne = bounds.getNorthEast(); + var sw = bounds.getSouthWest(); + var google_bounds = new google.maps.LatLngBounds( + new google.maps.LatLng(sw.lat, sw.lng), + new google.maps.LatLng(ne.lat, ne.lng) + ); + var center = this._map.getCenter(); + var _center = new google.maps.LatLng(center.lat, center.lng); + + this._google.setCenter(_center); + this._google.setZoom(this._map.getZoom()); + //this._google.fitBounds(google_bounds); + }, + + _resize: function() { + var size = this._map.getSize(); + if (this._container.style.width == size.x && + this._container.style.height == size.y) + return; + this._container.style.width = size.x + 'px'; + this._container.style.height = size.y + 'px'; + google.maps.event.trigger(this._google, "resize"); + }, + + onReposition: function() { + //google.maps.event.trigger(this._google, "resize"); + } +}); + +// Generated by CoffeeScript 1.4.0 +(function() { + var autoLink, + __slice = [].slice; + + autoLink = function() { + var callbackThunk, key, link_attributes, option, options, url_pattern, value; + options = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + link_attributes = ''; + option = options[0]; + url_pattern = /(^|\s)(\b(https?|ftp):\/\/[\-A-Z0-9+\u0026@#\/%?=~_|!:,.;]*[\-A-Z0-9+\u0026@#\/%=~_|])/gi; + if (!(options.length > 0)) { + return this.replace(url_pattern, "$1$2"); + } + if ((option['callback'] != null) && typeof option['callback'] === 'function') { + callbackThunk = option['callback']; + delete option['callback']; + } + for (key in option) { + value = option[key]; + link_attributes += " " + key + "='" + value + "'"; + } + return this.replace(url_pattern, function(match, space, url) { + var link, returnCallback; + returnCallback = callbackThunk && callbackThunk(url); + link = returnCallback || ("" + url + ""); + return "" + space + link; + }); + }; + + String.prototype['autoLink'] = autoLink; + +}).call(this); + +(function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;da||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]= +0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c= +j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount- +b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0g;g++)if(null==this.modules[b][i-g]){var n=!1;f>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a, +c),b=new t,e=0;e8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d= +0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+ +a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;dc)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+ +a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256), +LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d +this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b>>7-a%8&1)},put:function(a,c){for(var d=0;d>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1, +correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e").css("height",b+"px").appendTo(c);for(i=0;i").css("width", +d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery); + +try { console.log('done loading included JS'); } catch(e) {} + var JQUERY = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'; -var JQUERYUI = 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min.js'; -var LEAFLET = 'http://cdn.leafletjs.com/leaflet-0.5/leaflet.js'; -var AUTOLINK = 'http://breunigs.github.com/ingress-intel-total-conversion/dist/autolink.js'; -var EMPTY = 'data:text/javascript;base64,'; - -// don’t download resources which have been injected already -var ir = window && window.internalResources ? window.internalResources : []; -if(ir.indexOf('jquery') !== -1) JQUERY = EMPTY; -if(ir.indexOf('jqueryui') !== -1) JQUERYUI = EMPTY; -if(ir.indexOf('leaflet') !== -1) LEAFLET = EMPTY; -if(ir.indexOf('autolink') !== -1) AUTOLINK = EMPTY; -if(ir.indexOf('leafletgoogle') !== -1) LEAFLETGOOGLE = EMPTY; - +var JQUERYUI = 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min.js'; // after all scripts have loaded, boot the actual app -load(JQUERY, LEAFLET, AUTOLINK).then(LEAFLETGOOGLE, JQUERYUI).onError(function (err) { - alert('Could not all resources, the script likely won’t work.\n\nIf this happend the first time for you, it’s probably a temporary issue. Just wait a bit and try again.\n\nIf you installed the script for the first time and this happens:\n– try disabling NoScript if you have it installed\n– press CTRL+SHIFT+K in Firefox or CTRL+SHIFT+I in Chrome/Opera and reload the page. Additional info may be available in the console.\n– Open an issue at https://github.com/breunigs/ingress-intel-total-conversion/issues'); -}).thenRun(boot); +load(JQUERY).then(JQUERYUI).thenRun(boot); window.chat = function() {}; @@ -2443,7 +2592,7 @@ window.updateGameScore = function(data) { var es = ' '+Math.round(ep)+'%'; $('#gamestat').html(rs+es).one('click', function() { window.updateGameScore() }); // help cursor via “#gamestat span” - $('#gamestat').attr('title', 'Resistance:\t'+r+' MindUnits\nEnlightenment:\t'+e+' MindUnits'); + $('#gamestat').attr('title', 'Resistance:\t'+r+' MindUnits\nEnlightened:\t'+e+' MindUnits'); window.setTimeout('window.updateGameScore', REFRESH_GAME_SCORE*1000); } @@ -2654,7 +2803,10 @@ window.renderPortalDetails = function(guid) { : null; var playerText = player ? ['owner', player] : null; - var time = d.captured ? unixTimeToString(d.captured.capturedTime) : null; + var time = d.captured + ? '' + + unixTimeToString(d.captured.capturedTime) + '' + : null; var sinceText = time ? ['since', time] : null; var linkedFields = ['fields', d.portalV2.linkedFields.length]; @@ -2675,7 +2827,7 @@ window.renderPortalDetails = function(guid) { var lng = d.locationE6.lngE6; var perma = 'http://ingress.com/intel?latE6='+lat+'&lngE6='+lng+'&z=17&pguid='+guid; var imgTitle = 'title="'+getPortalDescriptionFromDetails(d)+'\n\nClick to show full image."'; - var gmaps = 'https://maps.google.com/?q='+lat/1E6+','+lng/1E6; + var poslinks = 'window.showPortalPosLinks('+lat/1E6+','+lng/1E6+')'; var postcard = 'Send in a postcard. Will put it online after receiving. Address:\\n\\nStefan Breunig\\nINF 305 – R045\\n69120 Heidelberg\\nGermany'; $('#portaldetails') @@ -2691,7 +2843,7 @@ window.renderPortalDetails = function(guid) { + randDetails + resoDetails + '
'+ '' - + '' + + '' + '' + '' + '
' diff --git a/main.js b/main.js index 3396f14f..12c73b29 100644 --- a/main.js +++ b/main.js @@ -1,7 +1,7 @@ // ==UserScript== // @id ingress-intel-total-conversion@breunigs // @name intel map total conversion -// @version 0.7.1-@@BUILDDATE@@ +// @version 0.7.5-@@BUILDDATE@@ // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js diff --git a/pack-release.sh b/pack-release.sh deleted file mode 100755 index 60594871..00000000 --- a/pack-release.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -./build.py -cp iitc-debug.user.js dist/total-conversion-build.user.js -cp style.css dist/style.css -cp external/* dist/ -rm -r dist/images/ -cp -r images/ dist/images/ - -echo 'Change path of style.css to dist/style.css' From 01796f2aa2482683a43e67ea34561116fd5194cd Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 01:12:51 +0100 Subject: [PATCH 54/74] bump version number for all plugins since their match/include URL has been updated --- plugins/compute-ap-stats.user.js | 2 +- plugins/draw-tools.user.js | 2 +- plugins/guess-player-levels.user.js | 2 +- plugins/player-tracker.user.js | 2 +- plugins/render-limit-increase.user.js | 2 +- plugins/reso-energy-pct-in-portal-detail.user.js | 2 +- plugins/resonator-display-zoom-level-decrease.user.js | 2 +- plugins/show-address.user.js | 2 +- plugins/show-portal-weakness.user.js | 10 +++++----- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/plugins/compute-ap-stats.user.js b/plugins/compute-ap-stats.user.js index 4ef6bffb..3c727f68 100644 --- a/plugins/compute-ap-stats.user.js +++ b/plugins/compute-ap-stats.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-compute-ap-stats@Hollow011 // @name iitc: Compute AP statistics -// @version 0.2 +// @version 0.2.1 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/compute-ap-stats.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/compute-ap-stats.user.js diff --git a/plugins/draw-tools.user.js b/plugins/draw-tools.user.js index b12e30af..2ed3f2f4 100644 --- a/plugins/draw-tools.user.js +++ b/plugins/draw-tools.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-draw-tools@breunigs // @name iitc: draw tools -// @version 0.2 +// @version 0.2.1 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/draw-tools.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/draw-tools.user.js diff --git a/plugins/guess-player-levels.user.js b/plugins/guess-player-levels.user.js index f31f5961..c220a76d 100644 --- a/plugins/guess-player-levels.user.js +++ b/plugins/guess-player-levels.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-guess-player-levels@breunigs // @name iitc: guess player level -// @version 0.2 +// @version 0.2.1 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/guess-player-levels.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/guess-player-levels.user.js diff --git a/plugins/player-tracker.user.js b/plugins/player-tracker.user.js index cda0ed98..f52f4347 100644 --- a/plugins/player-tracker.user.js +++ b/plugins/player-tracker.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-player-tracker@breunigs // @name iitc: player tracker -// @version 0.6 +// @version 0.6.1 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/player-tracker.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/player-tracker.user.js diff --git a/plugins/render-limit-increase.user.js b/plugins/render-limit-increase.user.js index d6441f8c..bc248886 100644 --- a/plugins/render-limit-increase.user.js +++ b/plugins/render-limit-increase.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-render-limit-increase@jonatkins // @name iitc: render limit increase -// @version 0.1 +// @version 0.1.1 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/render-limit-increase.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/render-limit-increase.user.js diff --git a/plugins/reso-energy-pct-in-portal-detail.user.js b/plugins/reso-energy-pct-in-portal-detail.user.js index d60c8119..64fffd00 100644 --- a/plugins/reso-energy-pct-in-portal-detail.user.js +++ b/plugins/reso-energy-pct-in-portal-detail.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-reso-energy-pct-in-portal-detail@xelio // @name iitc: reso energy pct in portal detail -// @version 0.1 +// @version 0.1.1 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/reso-energy-pct-in-portal-detail.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/reso-energy-pct-in-portal-detail.user.js diff --git a/plugins/resonator-display-zoom-level-decrease.user.js b/plugins/resonator-display-zoom-level-decrease.user.js index b5b2874b..133123d1 100644 --- a/plugins/resonator-display-zoom-level-decrease.user.js +++ b/plugins/resonator-display-zoom-level-decrease.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-resonator-display-zoom-level-decrease@xelio // @name iitc: resonator display zoom level decrease -// @version 1.0 +// @version 1.0.1 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/resonator-display-zoom-level-decrease.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/resonator-display-zoom-level-decrease.user.js diff --git a/plugins/show-address.user.js b/plugins/show-address.user.js index 504317cb..652eb7cb 100644 --- a/plugins/show-address.user.js +++ b/plugins/show-address.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-show-address@vita10gy // @name iitc: show portal address in sidebar -// @version 0.2 +// @version 0.2.1 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-address.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-address.user.js diff --git a/plugins/show-portal-weakness.user.js b/plugins/show-portal-weakness.user.js index 7ba421f5..c01d1e64 100644 --- a/plugins/show-portal-weakness.user.js +++ b/plugins/show-portal-weakness.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-show-portal-weakness@vita10gy // @name iitc: show portal weakness -// @version 0.3 +// @version 0.3.1 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-portal-weakness.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-portal-weakness.user.js @@ -21,7 +21,7 @@ if(typeof window.plugin !== 'function') window.plugin = function() {}; window.plugin.portalWeakness = function() {}; window.plugin.portalWeakness.portalAdded = function(data) { - + var d = data.portal.options.details; var portal_weakness = 0; if(getTeam(d) !== 0) { @@ -31,7 +31,7 @@ window.plugin.portalWeakness.portalAdded = function(data) { portal_weakness = 1 - (window.getCurrentPortalEnergy(d)/window.getTotalPortalEnergy(d)); only_shields = false; } - //Ding the portal for every missing sheild. + //Ding the portal for every missing sheild. $.each(d.portalV2.linkedModArray, function(ind, mod) { if(mod === null) { missing_shields++; @@ -53,8 +53,8 @@ window.plugin.portalWeakness.portalAdded = function(data) { } if(portal_weakness > 1) { portal_weakness = 1; - } - + } + if(portal_weakness > 0) { var fill_opacity = portal_weakness*.7 + .3; var color = 'orange'; From 4b3348e5d4784adb7ac7ad079fbb60bf4a1c8255 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 01:37:52 +0100 Subject: [PATCH 55/74] release 0.7.6 as hotfix for 0.7.5. --- NEWS.md | 5 ++- README.md | 2 +- code/boot.js | 7 ++- dist/total-conversion-build.user.js | 67 ++++++++++++++++------------- main.js | 2 +- 5 files changed, 47 insertions(+), 36 deletions(-) diff --git a/NEWS.md b/NEWS.md index 658922ec..9da7eb9f 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,5 @@ -CHANGES IN 0.7.5 -================ +CHANGES IN 0.7.5 / 0.7.6 +======================== This is an emergency release to keep IITC working with Niantic’s switch to HTTPS. It appears they will roll it out for everyone soon, so IITC now requires HTTPS for everyone; support for HTTP was dropped to keep things sane. Additionally, the following things were changed from 0.7.1: @@ -8,6 +8,7 @@ This is an emergency release to keep IITC working with Niantic’s switch to HTT - Change: most scripts are now included in the UserScript directly. Was the easiest solution to the HTTPS issue. - Change: minor improvements when render limit is about to be hit. - Bugfix: map base layer wasn’t always remembered in Chrome +- Bugfix: QR Code rendering broken (in 0.7.5, fixed in 0.7.6) CHANGES IN 0.7 / 0.7.1 diff --git a/README.md b/README.md index 4e2e03b1..731752aa 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ IITC can be [extended with the use of plugins](https://github.com/breunigs/ingre Install ------- -Current version is 0.7.5. [See NEWS.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/NEWS.md). +Current version is 0.7.6. [See NEWS.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/NEWS.md). [**INSTALL**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js) diff --git a/code/boot.js b/code/boot.js index f14e7015..f5057163 100644 --- a/code/boot.js +++ b/code/boot.js @@ -231,6 +231,10 @@ window.setupDialogs = function() { } +window.setupQRLoadLib = function() { + @@INCLUDERAW:external/jquery.qrcode.min.js@@ +} + // BOOTING /////////////////////////////////////////////////////////// @@ -259,6 +263,7 @@ function boot() { window.setupPlayerStat(); window.setupTooltips(); window.chat.setup(); + window.setupQRLoadLib(); // read here ONCE, so the URL is only evaluated one time after the // necessary data has been loaded. urlPortal = getURLParam('pguid'); @@ -297,7 +302,7 @@ try { console.log('Loading included JS now'); } catch(e) {} // contains the default Ingress map style. @@INCLUDERAW:external/leaflet_google.js@@ @@INCLUDERAW:external/autolink.js@@ -@@INCLUDERAW:external/jquery.qrcode.min.js@@ + try { console.log('done loading included JS'); } catch(e) {} var JQUERY = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'; diff --git a/dist/total-conversion-build.user.js b/dist/total-conversion-build.user.js index dba0c24d..0593f3f0 100644 --- a/dist/total-conversion-build.user.js +++ b/dist/total-conversion-build.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id ingress-intel-total-conversion@breunigs // @name intel map total conversion -// @version 0.7.5-2013-02-26-005819 +// @version 0.7.6-2013-02-26-013736 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js @@ -15,7 +15,7 @@ if(document.getElementsByTagName('html')[0].getAttribute('itemscope') != null) throw('Ingress Intel Website is down, not a userscript issue.'); -window.iitcBuildDate = '2013-02-26-005819'; +window.iitcBuildDate = '2013-02-26-013736'; // disable vanilla JS window.onload = function() {}; @@ -1529,13 +1529,45 @@ window.setupDialogs = function() { } +window.setupQRLoadLib = function() { + (function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;da||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]= +0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c= +j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount- +b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0g;g++)if(null==this.modules[b][i-g]){var n=!1;f>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a, +c),b=new t,e=0;e8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d= +0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+ +a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;dc)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+ +a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256), +LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d +this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b>>7-a%8&1)},put:function(a,c){for(var d=0;d>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1, +correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e").css("height",b+"px").appendTo(c);for(i=0;i").css("width", +d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery); + +} + // BOOTING /////////////////////////////////////////////////////////// function boot() { window.debug.console.overwriteNativeIfRequired(); - console.log('loading done, booting. Built: 2013-02-26-005819'); + console.log('loading done, booting. Built: 2013-02-26-013736'); if(window.deviceID) console.log('Your device ID: ' + window.deviceID); window.runOnSmartphonesBeforeBoot(); @@ -1557,6 +1589,7 @@ function boot() { window.setupPlayerStat(); window.setupTooltips(); window.chat.setup(); + window.setupQRLoadLib(); // read here ONCE, so the URL is only evaluated one time after the // necessary data has been loaded. urlPortal = getURLParam('pguid'); @@ -1787,34 +1820,6 @@ L.Google = L.Class.extend({ }).call(this); -(function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;da||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]= -0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c= -j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount- -b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0g;g++)if(null==this.modules[b][i-g]){var n=!1;f>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a, -c),b=new t,e=0;e8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d= -0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+ -a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;dc)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+ -a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256), -LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d -this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b>>7-a%8&1)},put:function(a,c){for(var d=0;d>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1, -correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e").css("height",b+"px").appendTo(c);for(i=0;i").css("width", -d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery); try { console.log('done loading included JS'); } catch(e) {} diff --git a/main.js b/main.js index 12c73b29..4523e8b4 100644 --- a/main.js +++ b/main.js @@ -1,7 +1,7 @@ // ==UserScript== // @id ingress-intel-total-conversion@breunigs // @name intel map total conversion -// @version 0.7.5-@@BUILDDATE@@ +// @version 0.7.6-@@BUILDDATE@@ // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js From a86c6714ac38e4fa681875175767c64bab80ec37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Cheng=20=28=E9=84=AD=E9=83=81=E9=82=A6=29?= Date: Mon, 25 Feb 2013 21:13:51 +0800 Subject: [PATCH 56/74] Report portal links to "Contact Us" directly --- code/utils_misc.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/utils_misc.js b/code/utils_misc.js index 8600a0ed..c646aef3 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -97,7 +97,7 @@ window.rangeLinkClick = function() { } window.reportPortalIssue = function(info) { - var t = 'Redirecting you to a Google Help Page. Once there, click on “Contact Us” in the upper right corner.\n\nThe text box contains all necessary information. Press CTRL+C to copy it.'; + var t = 'Redirecting you to a Google Help Page.\n\nThe text box contains all necessary information. Press CTRL+C to copy it.'; var d = window.portals[window.selectedPortal].options.details; var info = 'Your Nick: ' + PLAYER.nickname + ' ' @@ -107,7 +107,7 @@ window.reportPortalIssue = function(info) { //codename, approx addr, portalname if(prompt(t, info) !== null) - location.href = 'https://support.google.com/ingress?hl=en'; + location.href = 'https://support.google.com/ingress?hl=en&contact=1'; } window._storedPaddedBounds = undefined; From 9eef88673bce7e536d28ec03ab833f8de36452dd Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 07:40:12 +0100 Subject: [PATCH 57/74] =?UTF-8?q?-=20fix=20redirecting=20on=20some=20syste?= =?UTF-8?q?ms=20-=20more=20restrictive=20match=20rules,=20shouldn=E2=80=99?= =?UTF-8?q?t=20match=20anymore=20on=20Google=20Login=20(fix=20#314)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/main.js b/main.js index 4523e8b4..a5e166ff 100644 --- a/main.js +++ b/main.js @@ -6,22 +6,24 @@ // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @description total conversion for the ingress intel map. -// @include *://www.ingress.com/intel* -// @match *://www.ingress.com/intel* +// @include http://www.ingress.com/intel* +// @include https://www.ingress.com/intel* +// @match http://www.ingress.com/intel* +// @match https://www.ingress.com/intel* // ==/UserScript== // REPLACE ORIG SITE /////////////////////////////////////////////////// if(document.getElementsByTagName('html')[0].getAttribute('itemscope') != null) throw('Ingress Intel Website is down, not a userscript issue.'); - window.iitcBuildDate = '@@BUILDDATE@@'; // disable vanilla JS window.onload = function() {}; if(window.location.protocol !== 'https:') { - window.location.protocol = 'https:'; + var redir = window.location.href.replace(/^http:/, 'https:'); + window.location = redir; throw('Need to load HTTPS version.'); } From 3bcb30cc0e996b232f2e5def75b4f3616eeff478 Mon Sep 17 00:00:00 2001 From: Patrick Huy Date: Tue, 26 Feb 2013 10:27:59 +0100 Subject: [PATCH 58/74] add resonator energy in portal detail plugin link --- plugins/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/README.md b/plugins/README.md index db11bac2..e343cafe 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -16,6 +16,7 @@ Available Plugins - [**Player Tracker**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/player-tracker.user.js) Draws trails for user actions in the last hour. At the last known location there’s a tooltip that shows the data in a table. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_player_tracker.png). - [**Render Limit Increase**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/render-limit-increase.user.js) increases render limits. Good for high density areas (e.g. London, UK) and faster PCs. - [**Resonator Display Zoom Level Decrease**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/resonator-display-zoom-level-decrease.user.js) Resonator start displaying earlier. +- [**Resonator Energy in Portal Detail**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/reso-energy-pct-in-portal-detail.user.js) Resonator energy in percent is displayed in the portal detals. - [**Show Portal Address**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-address.user.js) Shows portal address in the side panel. ### available only with the development version From 1bc0896781c069d9e7c784ab0ebe1c4e63336de3 Mon Sep 17 00:00:00 2001 From: Axel Wagner Date: Tue, 26 Feb 2013 13:28:33 +0100 Subject: [PATCH 59/74] Updated userguide to reflect QR-Code change --- USERGUIDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/USERGUIDE.md b/USERGUIDE.md index a1ffd673..568368d0 100644 --- a/USERGUIDE.md +++ b/USERGUIDE.md @@ -139,7 +139,7 @@ The nickname to the left and right show who deployed this resonator. The bars in - Portal link: use it show others a portal. IITC users will automatically zoomed to the location and shown portal details as soon as they’re available. Vanilla map users will only be zoomed to location. - Report issue: redirects you to Niantic report issue page. Allows you to copy all required information before going there. -- GMaps: shows you the portal’s location in Google Maps for routing and similar purposes. +- poslinks: Shows you a QR-Code containing the geolocation of the portal as well as a link for Google Maps and Openstreetmap. If your QR-Code App supports GEO-codes (most do) you can scan it and pass the portal location directly to a routing-app. #### Redeeming, General Links and functions - Redeem code: allows you to redeem codes to receive goodies. If you copied them from the Internet, they are probably invalid already. From ef4a659d9263f7cdab4f96d56ca1eb1949672141 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 15:57:08 +0100 Subject: [PATCH 60/74] add jquery qr code attribution --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e0271e79..383b782d 100644 --- a/README.md +++ b/README.md @@ -102,5 +102,6 @@ This project is licensed under the permissive ISC license. Parts imported from o - [leaflet.js; custom license (but appears free)](http://leafletjs.com/) - [leaflet.draw.js; by jacobtoye; MIT](https://github.com/Leaflet/Leaflet.draw) - [`leaflet_google.js` by Pavel Shramov; same as Leaftlet](https://github.com/shramov/leaflet-plugins) (modified, though) +- [`jquery.qrcode.js` by Jerome Etienne; MIT](https://github.com/jeromeetienne/jquery-qrcode) - StackOverflow-CopyPasta is attributed in the source; [CC-Wiki](https://creativecommons.org/licenses/by-sa/3.0/) - all Ingress/Niantic related stuff obviously remains non-free and is still copyrighted by Niantic/Google From 80147b246ab36f159411875cb9a650f08e33cdb7 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 15:57:29 +0100 Subject: [PATCH 61/74] style fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 383b782d..0866fc1a 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,6 @@ This project is licensed under the permissive ISC license. Parts imported from o - [leaflet.js; custom license (but appears free)](http://leafletjs.com/) - [leaflet.draw.js; by jacobtoye; MIT](https://github.com/Leaflet/Leaflet.draw) - [`leaflet_google.js` by Pavel Shramov; same as Leaftlet](https://github.com/shramov/leaflet-plugins) (modified, though) -- [`jquery.qrcode.js` by Jerome Etienne; MIT](https://github.com/jeromeetienne/jquery-qrcode) +- [jquery.qrcode.js by Jerome Etienne; MIT](https://github.com/jeromeetienne/jquery-qrcode) - StackOverflow-CopyPasta is attributed in the source; [CC-Wiki](https://creativecommons.org/licenses/by-sa/3.0/) - all Ingress/Niantic related stuff obviously remains non-free and is still copyrighted by Niantic/Google From 3ca0d806a866e09a2bfcd4305e451cba3b1ad1f8 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 16:10:59 +0100 Subject: [PATCH 62/74] ask for help on triaging in main readme --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0866fc1a..5ace1f10 100644 --- a/README.md +++ b/README.md @@ -60,12 +60,14 @@ Reporting Issues [tutorial / guide / please read / **free candy**](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/HACKING.md#how-do-i-report-bugs) -Contributing ------------- +How can I help? // Contribution +------------------------------- -Please do! - -(Obviously, Resistance folks must send in complete patches while Enlightened gals and guys may just open feature request ☺). If you want to hack the source, please [read HACKING.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/HACKING.md) . +First of all, it’s very nice you want to help. There are several equally important ways you can. Some require a technical background and some don’t: +- **answering help requests:** often people are asking how to do specific things in bug reports or are asking for things that already exist. Kindly point them to what they’re looking for and maybe consider updating the user guide, if it lacks on that topic. +- **asking for more information:** Sometimes a bug report contains barely enough information to grasp what’s going on. Ask the reporter for the parts that you believe might be helpful, like the browser used. Similarily, if someone requests a feature make sure the description is accurate. Depending on the request, a concrete proposal on how to display this to the user might be helpful. +- **finding bugs / regressions:** If you are closer to the development of IITC, it’s usually easier for you to spot misbehaviours or bugs that have been recently introduces. Opening tickets for those, ideally with a step by step guide to reproduce the issue is very helpful. +- **hacking / sending patches:** Of course, if you want to contribute source code to the project that’s fine as well. Please [read HACKING.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/HACKING.md). **So far, these people have contributed:** From 06b9c4ba89a02732b84133b95a151e6e2a7369ec Mon Sep 17 00:00:00 2001 From: Axel Wagner Date: Tue, 26 Feb 2013 16:32:28 +0100 Subject: [PATCH 63/74] Remove trailing whitespaces --- USERGUIDE.md | 2 +- plugins/max-links.user.js | 40 +++++++++++++++++++-------------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/USERGUIDE.md b/USERGUIDE.md index 568368d0..089d78b5 100644 --- a/USERGUIDE.md +++ b/USERGUIDE.md @@ -124,7 +124,7 @@ Starting from the top, the sidebar shows this information: - reso dist: shows the average distance the resonators have to the portal. - fields: how many fields are connected to this portal - AP Gain: estimate of how many AP you gain if you take down this portal and deploy resonators of your own faction. Tooltip breaks this number down into parts. - + ##### Resonators The nickname to the left and right show who deployed this resonator. The bars in the middle indicate the charge of each resonator. The color depends on the level, which is also shown in the bar. The tooltip repeats some of that data along with other details. The top left resonator is the north one, top right is north east and so on. They are roughly ordered like they appear on a normal map: diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index f2af8e20..4c423e5f 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -12,14 +12,14 @@ function wrapper() { // ensure plugin framework is there, even if iitc is not yet loaded -if(typeof window.plugin !== 'function') +if(typeof window.plugin !== 'function') window.plugin = function() {}; // PLUGIN START //////////////////////////////////////////////////////// // use own namespace for plugin window.plugin.maxLinks = function() {}; - + // const values window.plugin.maxLinks.MAX_DRAWN_LINKS = 400; window.plugin.maxLinks.MAX_DRAWN_LINKS_INCREASED_LIMIT = 1000; @@ -38,27 +38,27 @@ window.plugin.maxLinks._updating = false; window.plugin.maxLinks._renderLimitReached = false; window.plugin.maxLinks.updateLayer = function() { - if (window.plugin.maxLinks._updating || - window.plugin.maxLinks.layer === null || + if (window.plugin.maxLinks._updating || + window.plugin.maxLinks.layer === null || !window.map.hasLayer(window.plugin.maxLinks.layer)) return; window.plugin.maxLinks._updating = true; window.plugin.maxLinks.layer.clearLayers(); - + var locations = []; var minX = 0; var minY = 0; - + $.each(window.portals, function(guid, portal) { var loc = portal.options.details.locationE6; var nloc = { x: loc.lngE6, y: loc.latE6 }; - if (nloc.x < minX) + if (nloc.x < minX) minX = nloc.x; - if (nloc.y < minY) + if (nloc.y < minY) minY = nloc.y; locations.push(nloc); }); - + $.each(locations, function(idx, nloc) { nloc.x += Math.abs(minX); nloc.y += Math.abs(minY); @@ -67,8 +67,8 @@ window.plugin.maxLinks.updateLayer = function() { var triangles = window.delaunay.triangulate(locations); var drawnLinks = 0; window.plugin.maxLinks._renderLimitReached = false; - var renderlimit = window.USE_INCREASED_RENDER_LIMIT ? - window.plugin.maxLinks.MAX_DRAWN_LINKS_INCREASED_LIMIT : + var renderlimit = window.USE_INCREASED_RENDER_LIMIT ? + window.plugin.maxLinks.MAX_DRAWN_LINKS_INCREASED_LIMIT : window.plugin.maxLinks.MAX_DRAWN_LINKS; $.each(triangles, function(idx, triangle) { if (drawnLinks <= renderlimit) { @@ -81,29 +81,29 @@ window.plugin.maxLinks.updateLayer = function() { window.plugin.maxLinks._updating = false; window.renderUpdateStatus(); } - + window.plugin.maxLinks.setup = function() { load(window.plugin.maxLinks._delaunayScriptLocation).thenRun(function() { window.delaunay.Triangle.prototype.draw = function(layer, divX, divY) { var drawLine = function(src, dest) { - var poly = L.polyline([[(src.y + divY)/1E6, (src.x + divX)/1E6], [(dest.y + divY)/1E6, (dest.x + divX)/1E6]], window.plugin.maxLinks.STROKE_STYLE); + var poly = L.polyline([[(src.y + divY)/1E6, (src.x + divX)/1E6], [(dest.y + divY)/1E6, (dest.x + divX)/1E6]], window.plugin.maxLinks.STROKE_STYLE); poly.addTo(layer); }; - + drawLine(this.a, this.b); drawLine(this.b, this.c); drawLine(this.c, this.a); } - + window.plugin.maxLinks.layer = L.layerGroup([]); - + window.addHook('checkRenderLimit', function(e) { - if (window.map.hasLayer(window.plugin.maxLinks.layer) && + if (window.map.hasLayer(window.plugin.maxLinks.layer) && window.plugin.maxLinks._renderLimitReached) - e.reached = true; + e.reached = true; }); - + window.addHook('portalDataLoaded', function(e) { if (window.map.hasLayer(window.plugin.maxLinks.layer)) window.plugin.maxLinks.updateLayer(); @@ -113,7 +113,7 @@ window.plugin.maxLinks.setup = function() { if (e.layer === window.plugin.maxLinks.layer) window.plugin.maxLinks.updateLayer(); }); - window.map.on('zoomend moveend', window.plugin.maxLinks.updateLayer); + window.map.on('zoomend moveend', window.plugin.maxLinks.updateLayer); window.layerChooser.addOverlay(window.plugin.maxLinks.layer, 'Maximum Links'); }); } From 827e2681b1132d286c79c937f20ae9ecfda5b01d Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 16:45:05 +0100 Subject: [PATCH 64/74] direct users to nightly version, shun trailing whitespaces --- HACKING.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/HACKING.md b/HACKING.md index fbd7c943..8bc10f94 100644 --- a/HACKING.md +++ b/HACKING.md @@ -32,6 +32,7 @@ Please follow the these guidelines. Some are just preference, others are good pr - comments: `// this is a comment` - quotes: Use single-quotes for JavaScript and double-quotes for HTML content. Example: `$('body').append('
Soup!
');`. - there is no length limit on lines, but try to keep them short where suitable +- ensure you remove *all* trailing whitespace before submitting your patch. If you editor doesn’t detect those for you, try `grep -nE "[[:space:]]+$" «filename»` Sending patches @@ -63,11 +64,14 @@ How do I report bugs? --------------------- **Try this first**: -- update the user script and all its plugins. Even if you think there is no update. +- update the user script and all its plugins. - after updating, go to the intel page. - press `SHIFT+F5` (or shift-click the reload button). Wait for the page to load. - press `CTRL+F5`, same as above. +You can also try to [install the most recent developer version (“nightly”)] +(https://www.dropbox.com/sh/lt9p0s40kt3cs6m/3xzpyiVBnF) and repeat the steps above. Maybe your issue has already been fixed? The nightly versions will update to the next stable release, so you don’t need to worry about that. + If your issue persists, continue. The next step is to look for existing issues, maybe someone else has a similar problem. You can look [through the existing issues](https://github.com/breunigs/ingress-intel-total-conversion/issues?sort=updated&state=open) or use the search function on the top right. If your issue persists, open a new issue and provide **all** of the information below, even if you don’t think this is necessary. - a descriptive title From 536b0e0fb5e0d3a20e601f8264e016b4d19a810a Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 16:47:25 +0100 Subject: [PATCH 65/74] port max links plugin to https --- plugins/max-links.user.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index 4c423e5f..465903cc 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -1,12 +1,12 @@ // ==UserScript== // @id max-links@boombuler // @name iitc: Max-Links-Plugin -// @version 0.1 +// @version 0.2 // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/max-links.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/max-links.user.js // @description Calculates how to link the portals to create the maximum number of fields. -// @include http://www.ingress.com/intel* -// @match http://www.ingress.com/intel* +// @include https://www.ingress.com/intel* +// @match https://www.ingress.com/intel* // ==/UserScript== function wrapper() { @@ -134,4 +134,4 @@ if(window.iitcLoaded && typeof setup === 'function') { // inject code into site context var script = document.createElement('script'); script.appendChild(document.createTextNode('('+ wrapper +')();')); -(document.body || document.head || document.documentElement).appendChild(script); \ No newline at end of file +(document.body || document.head || document.documentElement).appendChild(script); From 14c0971fe855113f240e304df1bd66e5af6f0dca Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 16:51:48 +0100 Subject: [PATCH 66/74] release 0.7.7. This is another hotfix because 0.7.6 was sometimes broken in Firefox. --- NEWS.md | 5 +++-- README.md | 2 +- dist/total-conversion-build.user.js | 15 +++++++++------ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/NEWS.md b/NEWS.md index 9da7eb9f..78edd27d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,5 @@ -CHANGES IN 0.7.5 / 0.7.6 -======================== +CHANGES IN 0.7.5 / 0.7.6 / 0.7.7 +================================ This is an emergency release to keep IITC working with Niantic’s switch to HTTPS. It appears they will roll it out for everyone soon, so IITC now requires HTTPS for everyone; support for HTTP was dropped to keep things sane. Additionally, the following things were changed from 0.7.1: @@ -9,6 +9,7 @@ This is an emergency release to keep IITC working with Niantic’s switch to HTT - Change: minor improvements when render limit is about to be hit. - Bugfix: map base layer wasn’t always remembered in Chrome - Bugfix: QR Code rendering broken (in 0.7.5, fixed in 0.7.6) +- Bugfix: Script broken in Firefox sometimes (fixed in 0.7.7) CHANGES IN 0.7 / 0.7.1 diff --git a/README.md b/README.md index 5ace1f10..42ce61af 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ IITC can be [extended with the use of plugins](https://github.com/breunigs/ingre Install ------- -Current version is 0.7.6. [See NEWS.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/NEWS.md). +Current version is 0.7.7. [See NEWS.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/NEWS.md). [**INSTALL**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js) diff --git a/dist/total-conversion-build.user.js b/dist/total-conversion-build.user.js index 0593f3f0..5e40bf6d 100644 --- a/dist/total-conversion-build.user.js +++ b/dist/total-conversion-build.user.js @@ -1,13 +1,15 @@ // ==UserScript== // @id ingress-intel-total-conversion@breunigs // @name intel map total conversion -// @version 0.7.6-2013-02-26-013736 +// @version 0.7.7-2013-02-26-164913 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @description total conversion for the ingress intel map. -// @include *://www.ingress.com/intel* -// @match *://www.ingress.com/intel* +// @include http://www.ingress.com/intel* +// @include https://www.ingress.com/intel* +// @match http://www.ingress.com/intel* +// @match https://www.ingress.com/intel* // ==/UserScript== @@ -15,13 +17,14 @@ if(document.getElementsByTagName('html')[0].getAttribute('itemscope') != null) throw('Ingress Intel Website is down, not a userscript issue.'); -window.iitcBuildDate = '2013-02-26-013736'; +window.iitcBuildDate = '2013-02-26-164913'; // disable vanilla JS window.onload = function() {}; if(window.location.protocol !== 'https:') { - window.location.protocol = 'https:'; + var redir = window.location.href.replace(/^http:/, 'https:'); + window.location = redir; throw('Need to load HTTPS version.'); } @@ -1567,7 +1570,7 @@ d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo function boot() { window.debug.console.overwriteNativeIfRequired(); - console.log('loading done, booting. Built: 2013-02-26-013736'); + console.log('loading done, booting. Built: 2013-02-26-164913'); if(window.deviceID) console.log('Your device ID: ' + window.deviceID); window.runOnSmartphonesBeforeBoot(); From 9dd4d9cd99e47dbf9a9817a1408857b2154240bb Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 16:52:35 +0100 Subject: [PATCH 67/74] also bump version number on main.js --- main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.js b/main.js index a5e166ff..b81d601d 100644 --- a/main.js +++ b/main.js @@ -1,7 +1,7 @@ // ==UserScript== // @id ingress-intel-total-conversion@breunigs // @name intel map total conversion -// @version 0.7.6-@@BUILDDATE@@ +// @version 0.7.7-@@BUILDDATE@@ // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js From b5d2db6761771d7765308a90d67dc94783ab2637 Mon Sep 17 00:00:00 2001 From: Bananeweizen Date: Tue, 26 Feb 2013 18:05:03 +0100 Subject: [PATCH 68/74] Update plugins/README.md link to "max-links" plugin does not work (minor typo) --- plugins/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/README.md b/plugins/README.md index 5a4ce03f..c90ab10e 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -13,7 +13,7 @@ Available Plugins - [**Draw Tools**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/draw-tools.user.js) allows to draw circles and lines on the map to aid you with planning your next big field. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_draw_tools.png) - [**Guess Player Level**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/guess-player-levels.user.js) looks for the highest placed resonator per player in the current view to guess the player level. - [**Highlight Weakened Portals**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/show-portal-weakness.user.js) fill portals with red to indicate portal's state of disrepair. The brighter the color the more attention needed (recharge, shields, resonators). A dashed portal means a resonator is missing. Red, needs energy and shields. Orange, only needs energy (either recharge or resonators). Yellow, only needs shields. -- [**Max-Links**]((https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/max-links.user.js) Calculates how to link the portals to create the maximum number of fields. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_max_links.png) +- [**Max-Links**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/max-links.user.js) Calculates how to link the portals to create the maximum number of fields. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_max_links.png) - [**Player Tracker**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/player-tracker.user.js) Draws trails for user actions in the last hour. At the last known location there’s a tooltip that shows the data in a table. [View screenshot](http://breunigs.github.com/ingress-intel-total-conversion/screenshots/plugin_player_tracker.png). - [**Render Limit Increase**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/render-limit-increase.user.js) increases render limits. Good for high density areas (e.g. London, UK) and faster PCs. - [**Resonator Display Zoom Level Decrease**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/resonator-display-zoom-level-decrease.user.js) Resonator start displaying earlier. From c8f74a1fe6d5b79392620f29f7a875cacf038e68 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 20:08:13 +0100 Subject: [PATCH 69/74] use correct base url for draw plugin --- plugins/draw-tools.user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/draw-tools.user.js b/plugins/draw-tools.user.js index 2ed3f2f4..1784c415 100644 --- a/plugins/draw-tools.user.js +++ b/plugins/draw-tools.user.js @@ -29,7 +29,7 @@ var DRAW_TOOLS_SHAPE_OPTIONS = { window.plugin.drawTools = function() {}; window.plugin.drawTools.loadExternals = function() { - var base = 'https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/external'; + var base = 'https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist'; //~ var base = 'http://0.0.0.0:8000/dist'; load(base+'/leaflet.draw.0.1.6.js').thenRun(window.plugin.drawTools.boot); // overwrite default Leaflet Marker icon. From 2cb0623c82329db2348bd89b4a17f01bda7288f0 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 20:57:34 +0100 Subject: [PATCH 70/74] fetch portal image via https --- code/portal_detail_display.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/portal_detail_display.js b/code/portal_detail_display.js index 7d02d424..c47a4eee 100644 --- a/code/portal_detail_display.js +++ b/code/portal_detail_display.js @@ -44,7 +44,9 @@ window.renderPortalDetails = function(guid) { var resoDetails = '' + getResonatorDetails(d) + '
'; setPortalIndicators(d); - var img = d.imageByUrl && d.imageByUrl.imageUrl ? d.imageByUrl.imageUrl : DEFAULT_PORTAL_IMG; + var img = d.imageByUrl && d.imageByUrl.imageUrl + ? d.imageByUrl.imageUrl.replace(/^http:/, 'https:') + : DEFAULT_PORTAL_IMG; var lat = d.locationE6.latE6; var lng = d.locationE6.lngE6; From 34cc9a4fb6c92a6a9b389b2e9267fe7bc4b771ef Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 21:09:08 +0100 Subject: [PATCH 71/74] show users how to enable HTTPS UserJS in Opera --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 42ce61af..101bea78 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,9 @@ Current version is 0.7.7. [See NEWS.md for details](https://github.com/breunigs/ ### Opera - Download the script: [download](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js) - put it into your user_js folder (that’s `~/.opera/user_js` on Unix). If you can’t find it [see Opera’s docs](http://www.opera.com/docs/userjs/using/#writingscripts). -- reload the page +- [visit `opera:config` and check `UserJavaScriptonHTTPS` or click here to take you there](opera:config#UserPrefs|UserJavaScriptonHTTPS). +- click save on the bottom of the settings page +- reload the Intel Map, no need to restart Opera *Note*: You need to update the scripts manually. From cba504e55c83d0598c38f368869888d7ac0fbd48 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 22:26:00 +0100 Subject: [PATCH 72/74] remove URL to image files for draw tools; that path is set in main now --- plugins/draw-tools.user.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/draw-tools.user.js b/plugins/draw-tools.user.js index 1784c415..4a2923f1 100644 --- a/plugins/draw-tools.user.js +++ b/plugins/draw-tools.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id iitc-plugin-draw-tools@breunigs // @name iitc: draw tools -// @version 0.2.1 +// @version 0.2.2 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/draw-tools.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/plugins/draw-tools.user.js @@ -32,8 +32,6 @@ window.plugin.drawTools.loadExternals = function() { var base = 'https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist'; //~ var base = 'http://0.0.0.0:8000/dist'; load(base+'/leaflet.draw.0.1.6.js').thenRun(window.plugin.drawTools.boot); - // overwrite default Leaflet Marker icon. - L.Icon.Default.imagePath = base + '/images'; // FIXME: this is currently manually included from // external/leaflet.draw.0.1.6.css. It should either be loaded remotely From d5199572836efe35d4b743aa0710c1ab5056989d Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 22:26:25 +0100 Subject: [PATCH 73/74] =?UTF-8?q?use=20GitHub=20pages=20path=20again,=20le?= =?UTF-8?q?t=E2=80=99s=20see=20if=20their=20rate=20limit=20and=20caching?= =?UTF-8?q?=20behaviour=20is=20better?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/boot.js b/code/boot.js index f5057163..d75d1914 100644 --- a/code/boot.js +++ b/code/boot.js @@ -246,7 +246,7 @@ function boot() { window.runOnSmartphonesBeforeBoot(); // overwrite default Leaflet Marker icon to be a neutral color - var base = 'https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/images/'; + var base = 'http://breunigs.github.com/ingress-intel-total-conversion/dist/images/'; L.Icon.Default.imagePath = base; window.iconEnl = L.Icon.Default.extend({options: { iconUrl: base + 'marker-green.png' } }); From 9f044a5ff3bfc9c5301c0ff6a5854c1327f169d1 Mon Sep 17 00:00:00 2001 From: Stefan Breunig Date: Tue, 26 Feb 2013 22:41:40 +0100 Subject: [PATCH 74/74] =?UTF-8?q?release=200.7.8=20to=20avoid=20hammering?= =?UTF-8?q?=20GitHub=E2=80=99s=20servers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NEWS.md | 5 +++-- README.md | 2 +- dist/total-conversion-build.user.js | 8 ++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/NEWS.md b/NEWS.md index 78edd27d..81e55b06 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,5 @@ -CHANGES IN 0.7.5 / 0.7.6 / 0.7.7 -================================ +CHANGES IN 0.7.5 – 0.7.8 +======================== This is an emergency release to keep IITC working with Niantic’s switch to HTTPS. It appears they will roll it out for everyone soon, so IITC now requires HTTPS for everyone; support for HTTP was dropped to keep things sane. Additionally, the following things were changed from 0.7.1: @@ -10,6 +10,7 @@ This is an emergency release to keep IITC working with Niantic’s switch to HTT - Bugfix: map base layer wasn’t always remembered in Chrome - Bugfix: QR Code rendering broken (in 0.7.5, fixed in 0.7.6) - Bugfix: Script broken in Firefox sometimes (fixed in 0.7.7) +- Bugfix: some graphics were not available due to GitHub’s limits. Affected plugins: draw tools and player tracker. Need to update IITC and both plugins for the fix to come into effect. (fixed in 0.7.8) CHANGES IN 0.7 / 0.7.1 diff --git a/README.md b/README.md index 101bea78..8bd6ebb4 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ IITC can be [extended with the use of plugins](https://github.com/breunigs/ingre Install ------- -Current version is 0.7.7. [See NEWS.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/NEWS.md). +Current version is 0.7.8. [See NEWS.md for details](https://github.com/breunigs/ingress-intel-total-conversion/blob/gh-pages/NEWS.md). [**INSTALL**](https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js) diff --git a/dist/total-conversion-build.user.js b/dist/total-conversion-build.user.js index 5e40bf6d..d13e49a1 100644 --- a/dist/total-conversion-build.user.js +++ b/dist/total-conversion-build.user.js @@ -1,7 +1,7 @@ // ==UserScript== // @id ingress-intel-total-conversion@breunigs // @name intel map total conversion -// @version 0.7.7-2013-02-26-164913 +// @version 0.7.8-2013-02-26-223742 // @namespace https://github.com/breunigs/ingress-intel-total-conversion // @updateURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js // @downloadURL https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/total-conversion-build.user.js @@ -17,7 +17,7 @@ if(document.getElementsByTagName('html')[0].getAttribute('itemscope') != null) throw('Ingress Intel Website is down, not a userscript issue.'); -window.iitcBuildDate = '2013-02-26-164913'; +window.iitcBuildDate = '2013-02-26-223742'; // disable vanilla JS window.onload = function() {}; @@ -1570,12 +1570,12 @@ d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo function boot() { window.debug.console.overwriteNativeIfRequired(); - console.log('loading done, booting. Built: 2013-02-26-164913'); + console.log('loading done, booting. Built: 2013-02-26-223742'); if(window.deviceID) console.log('Your device ID: ' + window.deviceID); window.runOnSmartphonesBeforeBoot(); // overwrite default Leaflet Marker icon to be a neutral color - var base = 'https://raw.github.com/breunigs/ingress-intel-total-conversion/gh-pages/dist/images/'; + var base = 'http://breunigs.github.com/ingress-intel-total-conversion/dist/images/'; L.Icon.Default.imagePath = base; window.iconEnl = L.Icon.Default.extend({options: { iconUrl: base + 'marker-green.png' } });