2 var version = "4.13.0";
4 function ascending(a, b) {
5 return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
8 function bisector(compare) {
9 if (compare.length === 1) compare = ascendingComparator(compare);
11 left: function(a, x, lo, hi) {
12 if (lo == null) lo = 0;
13 if (hi == null) hi = a.length;
15 var mid = lo + hi >>> 1;
16 if (compare(a[mid], x) < 0) lo = mid + 1;
21 right: function(a, x, lo, hi) {
22 if (lo == null) lo = 0;
23 if (hi == null) hi = a.length;
25 var mid = lo + hi >>> 1;
26 if (compare(a[mid], x) > 0) hi = mid;
34 function ascendingComparator(f) {
35 return function(d, x) {
36 return ascending(f(d), x);
40 var ascendingBisect = bisector(ascending);
41 var bisectRight = ascendingBisect.right;
42 var bisectLeft = ascendingBisect.left;
44 function pairs(array, f) {
45 if (f == null) f = pair;
46 var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
47 while (i < n) pairs[i] = f(p, p = array[++i]);
55 function cross(values0, values1, reduce) {
56 var n0 = values0.length,
58 values = new Array(n0 * n1),
64 if (reduce == null) reduce = pair;
66 for (i0 = i = 0; i0 < n0; ++i0) {
67 for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
68 values[i] = reduce(value0, values1[i1]);
75 function d3_descending(a, b) {
76 return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
80 return x === null ? NaN : +x;
83 function variance(values, valueof) {
84 var n = values.length,
92 if (valueof == null) {
94 if (!isNaN(value = number(values[i]))) {
97 sum += delta * (value - mean);
104 if (!isNaN(value = number(valueof(values[i], i, values)))) {
105 delta = value - mean;
107 sum += delta * (value - mean);
112 if (m > 1) return sum / (m - 1);
115 function deviation(array, f) {
116 var v = variance(array, f);
117 return v ? Math.sqrt(v) : v;
120 function extent(values, valueof) {
121 var n = values.length,
127 if (valueof == null) {
128 while (++i < n) { // Find the first comparable value.
129 if ((value = values[i]) != null && value >= value) {
131 while (++i < n) { // Compare the remaining values.
132 if ((value = values[i]) != null) {
133 if (min > value) min = value;
134 if (max < value) max = value;
142 while (++i < n) { // Find the first comparable value.
143 if ((value = valueof(values[i], i, values)) != null && value >= value) {
145 while (++i < n) { // Compare the remaining values.
146 if ((value = valueof(values[i], i, values)) != null) {
147 if (min > value) min = value;
148 if (max < value) max = value;
158 var array = Array.prototype;
160 var slice = array.slice;
163 function constant(x) {
169 function identity(x) {
173 function range(start, stop, step) {
174 start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
177 n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
178 range = new Array(n);
181 range[i] = start + i * step;
187 var e10 = Math.sqrt(50),
191 function ticks(start, stop, count) {
198 stop = +stop, start = +start, count = +count;
199 if (start === stop && count > 0) return [start];
200 if (reverse = stop < start) n = start, start = stop, stop = n;
201 if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
204 start = Math.ceil(start / step);
205 stop = Math.floor(stop / step);
206 ticks = new Array(n = Math.ceil(stop - start + 1));
207 while (++i < n) ticks[i] = (start + i) * step;
209 start = Math.floor(start * step);
210 stop = Math.ceil(stop * step);
211 ticks = new Array(n = Math.ceil(start - stop + 1));
212 while (++i < n) ticks[i] = (start - i) / step;
215 if (reverse) ticks.reverse();
220 function tickIncrement(start, stop, count) {
221 var step = (stop - start) / Math.max(0, count),
222 power = Math.floor(Math.log(step) / Math.LN10),
223 error = step / Math.pow(10, power);
225 ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
226 : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
229 function tickStep(start, stop, count) {
230 var step0 = Math.abs(stop - start) / Math.max(0, count),
231 step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
232 error = step0 / step1;
233 if (error >= e10) step1 *= 10;
234 else if (error >= e5) step1 *= 5;
235 else if (error >= e2) step1 *= 2;
236 return stop < start ? -step1 : step1;
239 function sturges(values) {
240 return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
243 function histogram() {
244 var value = identity,
248 function histogram(data) {
252 values = new Array(n);
254 for (i = 0; i < n; ++i) {
255 values[i] = value(data[i], i, data);
258 var xz = domain(values),
261 tz = threshold(values, x0, x1);
263 // Convert number of thresholds into uniform thresholds.
264 if (!Array.isArray(tz)) {
265 tz = tickStep(x0, x1, tz);
266 tz = range(Math.ceil(x0 / tz) * tz, Math.floor(x1 / tz) * tz, tz); // exclusive
269 // Remove any thresholds outside the domain.
271 while (tz[0] <= x0) tz.shift(), --m;
272 while (tz[m - 1] > x1) tz.pop(), --m;
274 var bins = new Array(m + 1),
278 for (i = 0; i <= m; ++i) {
280 bin.x0 = i > 0 ? tz[i - 1] : x0;
281 bin.x1 = i < m ? tz[i] : x1;
284 // Assign data to bins by value, ignoring any outside the domain.
285 for (i = 0; i < n; ++i) {
287 if (x0 <= x && x <= x1) {
288 bins[bisectRight(tz, x, 0, m)].push(data[i]);
295 histogram.value = function(_) {
296 return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
299 histogram.domain = function(_) {
300 return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
303 histogram.thresholds = function(_) {
304 return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;
310 function quantile(values, p, valueof) {
311 if (valueof == null) valueof = number;
312 if (!(n = values.length)) return;
313 if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
314 if (p >= 1) return +valueof(values[n - 1], n - 1, values);
318 value0 = +valueof(values[i0], i0, values),
319 value1 = +valueof(values[i0 + 1], i0 + 1, values);
320 return value0 + (value1 - value0) * (i - i0);
323 function freedmanDiaconis(values, min, max) {
324 values = map.call(values, number).sort(ascending);
325 return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));
328 function scott(values, min, max) {
329 return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
332 function max(values, valueof) {
333 var n = values.length,
338 if (valueof == null) {
339 while (++i < n) { // Find the first comparable value.
340 if ((value = values[i]) != null && value >= value) {
342 while (++i < n) { // Compare the remaining values.
343 if ((value = values[i]) != null && value > max) {
352 while (++i < n) { // Find the first comparable value.
353 if ((value = valueof(values[i], i, values)) != null && value >= value) {
355 while (++i < n) { // Compare the remaining values.
356 if ((value = valueof(values[i], i, values)) != null && value > max) {
367 function mean(values, valueof) {
368 var n = values.length,
374 if (valueof == null) {
376 if (!isNaN(value = number(values[i]))) sum += value;
383 if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
388 if (m) return sum / m;
391 function d3_median(values, valueof) {
392 var n = values.length,
397 if (valueof == null) {
399 if (!isNaN(value = number(values[i]))) {
407 if (!isNaN(value = number(valueof(values[i], i, values)))) {
413 return quantile(numbers.sort(ascending), 0.5);
416 function merge(arrays) {
417 var n = arrays.length,
424 while (++i < n) j += arrays[i].length;
425 merged = new Array(j);
431 merged[--j] = array[m];
438 function min(values, valueof) {
439 var n = values.length,
444 if (valueof == null) {
445 while (++i < n) { // Find the first comparable value.
446 if ((value = values[i]) != null && value >= value) {
448 while (++i < n) { // Compare the remaining values.
449 if ((value = values[i]) != null && min > value) {
458 while (++i < n) { // Find the first comparable value.
459 if ((value = valueof(values[i], i, values)) != null && value >= value) {
461 while (++i < n) { // Compare the remaining values.
462 if ((value = valueof(values[i], i, values)) != null && min > value) {
473 function permute(array, indexes) {
474 var i = indexes.length, permutes = new Array(i);
475 while (i--) permutes[i] = array[indexes[i]];
479 function scan(values, compare) {
480 if (!(n = values.length)) return;
487 if (compare == null) compare = ascending;
490 if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
495 if (compare(xj, xj) === 0) return j;
498 function shuffle(array, i0, i1) {
499 var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
504 i = Math.random() * m-- | 0;
506 array[m + i0] = array[i + i0];
513 function sum(values, valueof) {
514 var n = values.length,
519 if (valueof == null) {
521 if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
527 if (value = +valueof(values[i], i, values)) sum += value;
534 function transpose(matrix) {
535 if (!(n = matrix.length)) return [];
536 for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
537 for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
538 row[j] = matrix[j][i];
549 return transpose(arguments);
552 var slice$1 = Array.prototype.slice;
554 function identity$1(x) {
564 function translateX(x) {
565 return "translate(" + (x + 0.5) + ",0)";
568 function translateY(y) {
569 return "translate(0," + (y + 0.5) + ")";
572 function number$1(scale) {
578 function center(scale) {
579 var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.
580 if (scale.round()) offset = Math.round(offset);
582 return +scale(d) + offset;
586 function entering() {
590 function axis(orient, scale) {
591 var tickArguments = [],
597 k = orient === top || orient === left ? -1 : 1,
598 x = orient === left || orient === right ? "x" : "y",
599 transform = orient === top || orient === bottom ? translateX : translateY;
601 function axis(context) {
602 var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
603 format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat,
604 spacing = Math.max(tickSizeInner, 0) + tickPadding,
605 range = scale.range(),
606 range0 = +range[0] + 0.5,
607 range1 = +range[range.length - 1] + 0.5,
608 position = (scale.bandwidth ? center : number$1)(scale.copy()),
609 selection = context.selection ? context.selection() : context,
610 path = selection.selectAll(".domain").data([null]),
611 tick = selection.selectAll(".tick").data(values, scale).order(),
612 tickExit = tick.exit(),
613 tickEnter = tick.enter().append("g").attr("class", "tick"),
614 line = tick.select("line"),
615 text = tick.select("text");
617 path = path.merge(path.enter().insert("path", ".tick")
618 .attr("class", "domain")
619 .attr("stroke", "#000"));
621 tick = tick.merge(tickEnter);
623 line = line.merge(tickEnter.append("line")
624 .attr("stroke", "#000")
625 .attr(x + "2", k * tickSizeInner));
627 text = text.merge(tickEnter.append("text")
628 .attr("fill", "#000")
629 .attr(x, k * spacing)
630 .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
632 if (context !== selection) {
633 path = path.transition(context);
634 tick = tick.transition(context);
635 line = line.transition(context);
636 text = text.transition(context);
638 tickExit = tickExit.transition(context)
639 .attr("opacity", epsilon)
640 .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
643 .attr("opacity", epsilon)
644 .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
650 .attr("d", orient === left || orient == right
651 ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter
652 : "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter);
656 .attr("transform", function(d) { return transform(position(d)); });
659 .attr(x + "2", k * tickSizeInner);
662 .attr(x, k * spacing)
665 selection.filter(entering)
666 .attr("fill", "none")
667 .attr("font-size", 10)
668 .attr("font-family", "sans-serif")
669 .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
672 .each(function() { this.__axis = position; });
675 axis.scale = function(_) {
676 return arguments.length ? (scale = _, axis) : scale;
679 axis.ticks = function() {
680 return tickArguments = slice$1.call(arguments), axis;
683 axis.tickArguments = function(_) {
684 return arguments.length ? (tickArguments = _ == null ? [] : slice$1.call(_), axis) : tickArguments.slice();
687 axis.tickValues = function(_) {
688 return arguments.length ? (tickValues = _ == null ? null : slice$1.call(_), axis) : tickValues && tickValues.slice();
691 axis.tickFormat = function(_) {
692 return arguments.length ? (tickFormat = _, axis) : tickFormat;
695 axis.tickSize = function(_) {
696 return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
699 axis.tickSizeInner = function(_) {
700 return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
703 axis.tickSizeOuter = function(_) {
704 return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
707 axis.tickPadding = function(_) {
708 return arguments.length ? (tickPadding = +_, axis) : tickPadding;
714 function axisTop(scale) {
715 return axis(top, scale);
718 function axisRight(scale) {
719 return axis(right, scale);
722 function axisBottom(scale) {
723 return axis(bottom, scale);
726 function axisLeft(scale) {
727 return axis(left, scale);
730 var noop = {value: function() {}};
732 function dispatch() {
733 for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
734 if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
737 return new Dispatch(_);
740 function Dispatch(_) {
744 function parseTypenames(typenames, types) {
745 return typenames.trim().split(/^|\s+/).map(function(t) {
746 var name = "", i = t.indexOf(".");
747 if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
748 if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
749 return {type: t, name: name};
753 Dispatch.prototype = dispatch.prototype = {
754 constructor: Dispatch,
755 on: function(typename, callback) {
757 T = parseTypenames(typename + "", _),
762 // If no callback was specified, return the callback of the given type and name.
763 if (arguments.length < 2) {
764 while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;
768 // If a type was specified, set the callback for the given type and name.
769 // Otherwise, if a null callback was specified, remove callbacks of the given name.
770 if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
772 if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
773 else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
779 var copy = {}, _ = this._;
780 for (var t in _) copy[t] = _[t].slice();
781 return new Dispatch(copy);
783 call: function(type, that) {
784 if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
785 if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
786 for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
788 apply: function(type, that, args) {
789 if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
790 for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
794 function get(type, name) {
795 for (var i = 0, n = type.length, c; i < n; ++i) {
796 if ((c = type[i]).name === name) {
802 function set(type, name, callback) {
803 for (var i = 0, n = type.length; i < n; ++i) {
804 if (type[i].name === name) {
805 type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
809 if (callback != null) type.push({name: name, value: callback});
813 var xhtml = "http://www.w3.org/1999/xhtml";
816 svg: "http://www.w3.org/2000/svg",
818 xlink: "http://www.w3.org/1999/xlink",
819 xml: "http://www.w3.org/XML/1998/namespace",
820 xmlns: "http://www.w3.org/2000/xmlns/"
823 function namespace(name) {
824 var prefix = name += "", i = prefix.indexOf(":");
825 if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
826 return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
829 function creatorInherit(name) {
831 var document = this.ownerDocument,
832 uri = this.namespaceURI;
833 return uri === xhtml && document.documentElement.namespaceURI === xhtml
834 ? document.createElement(name)
835 : document.createElementNS(uri, name);
839 function creatorFixed(fullname) {
841 return this.ownerDocument.createElementNS(fullname.space, fullname.local);
845 function creator(name) {
846 var fullname = namespace(name);
847 return (fullname.local
849 : creatorInherit)(fullname);
854 function selector(selector) {
855 return selector == null ? none : function() {
856 return this.querySelector(selector);
860 function selection_select(select) {
861 if (typeof select !== "function") select = selector(select);
863 for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
864 for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
865 if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
866 if ("__data__" in node) subnode.__data__ = node.__data__;
867 subgroup[i] = subnode;
872 return new Selection(subgroups, this._parents);
879 function selectorAll(selector) {
880 return selector == null ? empty : function() {
881 return this.querySelectorAll(selector);
885 function selection_selectAll(select) {
886 if (typeof select !== "function") select = selectorAll(select);
888 for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
889 for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
890 if (node = group[i]) {
891 subgroups.push(select.call(node, node.__data__, i, group));
897 return new Selection(subgroups, parents);
900 var matcher = function(selector) {
902 return this.matches(selector);
906 if (typeof document !== "undefined") {
907 var element = document.documentElement;
908 if (!element.matches) {
909 var vendorMatches = element.webkitMatchesSelector
910 || element.msMatchesSelector
911 || element.mozMatchesSelector
912 || element.oMatchesSelector;
913 matcher = function(selector) {
915 return vendorMatches.call(this, selector);
921 var matcher$1 = matcher;
923 function selection_filter(match) {
924 if (typeof match !== "function") match = matcher$1(match);
926 for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
927 for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
928 if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
934 return new Selection(subgroups, this._parents);
937 function sparse(update) {
938 return new Array(update.length);
941 function selection_enter() {
942 return new Selection(this._enter || this._groups.map(sparse), this._parents);
945 function EnterNode(parent, datum) {
946 this.ownerDocument = parent.ownerDocument;
947 this.namespaceURI = parent.namespaceURI;
949 this._parent = parent;
950 this.__data__ = datum;
953 EnterNode.prototype = {
954 constructor: EnterNode,
955 appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
956 insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
957 querySelector: function(selector) { return this._parent.querySelector(selector); },
958 querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
961 function constant$1(x) {
967 var keyPrefix = "$"; // Protect against keys like “__proto__”.
969 function bindIndex(parent, group, enter, update, exit, data) {
972 groupLength = group.length,
973 dataLength = data.length;
975 // Put any non-null nodes that fit into update.
976 // Put any null nodes into enter.
977 // Put any remaining data into enter.
978 for (; i < dataLength; ++i) {
979 if (node = group[i]) {
980 node.__data__ = data[i];
983 enter[i] = new EnterNode(parent, data[i]);
987 // Put any non-null nodes that don’t fit into exit.
988 for (; i < groupLength; ++i) {
989 if (node = group[i]) {
995 function bindKey(parent, group, enter, update, exit, data, key) {
999 groupLength = group.length,
1000 dataLength = data.length,
1001 keyValues = new Array(groupLength),
1004 // Compute the key for each node.
1005 // If multiple nodes have the same key, the duplicates are added to exit.
1006 for (i = 0; i < groupLength; ++i) {
1007 if (node = group[i]) {
1008 keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
1009 if (keyValue in nodeByKeyValue) {
1012 nodeByKeyValue[keyValue] = node;
1017 // Compute the key for each datum.
1018 // If there a node associated with this key, join and add it to update.
1019 // If there is not (or the key is a duplicate), add it to enter.
1020 for (i = 0; i < dataLength; ++i) {
1021 keyValue = keyPrefix + key.call(parent, data[i], i, data);
1022 if (node = nodeByKeyValue[keyValue]) {
1024 node.__data__ = data[i];
1025 nodeByKeyValue[keyValue] = null;
1027 enter[i] = new EnterNode(parent, data[i]);
1031 // Add any remaining nodes that were not bound to data to exit.
1032 for (i = 0; i < groupLength; ++i) {
1033 if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
1039 function selection_data(value, key) {
1041 data = new Array(this.size()), j = -1;
1042 this.each(function(d) { data[++j] = d; });
1046 var bind = key ? bindKey : bindIndex,
1047 parents = this._parents,
1048 groups = this._groups;
1050 if (typeof value !== "function") value = constant$1(value);
1052 for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
1053 var parent = parents[j],
1055 groupLength = group.length,
1056 data = value.call(parent, parent && parent.__data__, j, parents),
1057 dataLength = data.length,
1058 enterGroup = enter[j] = new Array(dataLength),
1059 updateGroup = update[j] = new Array(dataLength),
1060 exitGroup = exit[j] = new Array(groupLength);
1062 bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
1064 // Now connect the enter nodes to their following update node, such that
1065 // appendChild can insert the materialized enter node before this node,
1066 // rather than at the end of the parent node.
1067 for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
1068 if (previous = enterGroup[i0]) {
1069 if (i0 >= i1) i1 = i0 + 1;
1070 while (!(next = updateGroup[i1]) && ++i1 < dataLength);
1071 previous._next = next || null;
1076 update = new Selection(update, parents);
1077 update._enter = enter;
1078 update._exit = exit;
1082 function selection_exit() {
1083 return new Selection(this._exit || this._groups.map(sparse), this._parents);
1086 function selection_merge(selection$$1) {
1088 for (var groups0 = this._groups, groups1 = selection$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
1089 for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
1090 if (node = group0[i] || group1[i]) {
1096 for (; j < m0; ++j) {
1097 merges[j] = groups0[j];
1100 return new Selection(merges, this._parents);
1103 function selection_order() {
1105 for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
1106 for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
1107 if (node = group[i]) {
1108 if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
1117 function selection_sort(compare) {
1118 if (!compare) compare = ascending$1;
1120 function compareNode(a, b) {
1121 return a && b ? compare(a.__data__, b.__data__) : !a - !b;
1124 for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
1125 for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
1126 if (node = group[i]) {
1127 sortgroup[i] = node;
1130 sortgroup.sort(compareNode);
1133 return new Selection(sortgroups, this._parents).order();
1136 function ascending$1(a, b) {
1137 return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
1140 function selection_call() {
1141 var callback = arguments[0];
1142 arguments[0] = this;
1143 callback.apply(null, arguments);
1147 function selection_nodes() {
1148 var nodes = new Array(this.size()), i = -1;
1149 this.each(function() { nodes[++i] = this; });
1153 function selection_node() {
1155 for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1156 for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
1157 var node = group[i];
1158 if (node) return node;
1165 function selection_size() {
1167 this.each(function() { ++size; });
1171 function selection_empty() {
1172 return !this.node();
1175 function selection_each(callback) {
1177 for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
1178 for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
1179 if (node = group[i]) callback.call(node, node.__data__, i, group);
1186 function attrRemove(name) {
1188 this.removeAttribute(name);
1192 function attrRemoveNS(fullname) {
1194 this.removeAttributeNS(fullname.space, fullname.local);
1198 function attrConstant(name, value) {
1200 this.setAttribute(name, value);
1204 function attrConstantNS(fullname, value) {
1206 this.setAttributeNS(fullname.space, fullname.local, value);
1210 function attrFunction(name, value) {
1212 var v = value.apply(this, arguments);
1213 if (v == null) this.removeAttribute(name);
1214 else this.setAttribute(name, v);
1218 function attrFunctionNS(fullname, value) {
1220 var v = value.apply(this, arguments);
1221 if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
1222 else this.setAttributeNS(fullname.space, fullname.local, v);
1226 function selection_attr(name, value) {
1227 var fullname = namespace(name);
1229 if (arguments.length < 2) {
1230 var node = this.node();
1231 return fullname.local
1232 ? node.getAttributeNS(fullname.space, fullname.local)
1233 : node.getAttribute(fullname);
1236 return this.each((value == null
1237 ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
1238 ? (fullname.local ? attrFunctionNS : attrFunction)
1239 : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
1242 function defaultView(node) {
1243 return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
1244 || (node.document && node) // node is a Window
1245 || node.defaultView; // node is a Document
1248 function styleRemove(name) {
1250 this.style.removeProperty(name);
1254 function styleConstant(name, value, priority) {
1256 this.style.setProperty(name, value, priority);
1260 function styleFunction(name, value, priority) {
1262 var v = value.apply(this, arguments);
1263 if (v == null) this.style.removeProperty(name);
1264 else this.style.setProperty(name, v, priority);
1268 function selection_style(name, value, priority) {
1269 return arguments.length > 1
1270 ? this.each((value == null
1271 ? styleRemove : typeof value === "function"
1273 : styleConstant)(name, value, priority == null ? "" : priority))
1274 : styleValue(this.node(), name);
1277 function styleValue(node, name) {
1278 return node.style.getPropertyValue(name)
1279 || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
1282 function propertyRemove(name) {
1288 function propertyConstant(name, value) {
1294 function propertyFunction(name, value) {
1296 var v = value.apply(this, arguments);
1297 if (v == null) delete this[name];
1298 else this[name] = v;
1302 function selection_property(name, value) {
1303 return arguments.length > 1
1304 ? this.each((value == null
1305 ? propertyRemove : typeof value === "function"
1307 : propertyConstant)(name, value))
1308 : this.node()[name];
1311 function classArray(string) {
1312 return string.trim().split(/^|\s+/);
1315 function classList(node) {
1316 return node.classList || new ClassList(node);
1319 function ClassList(node) {
1321 this._names = classArray(node.getAttribute("class") || "");
1324 ClassList.prototype = {
1325 add: function(name) {
1326 var i = this._names.indexOf(name);
1328 this._names.push(name);
1329 this._node.setAttribute("class", this._names.join(" "));
1332 remove: function(name) {
1333 var i = this._names.indexOf(name);
1335 this._names.splice(i, 1);
1336 this._node.setAttribute("class", this._names.join(" "));
1339 contains: function(name) {
1340 return this._names.indexOf(name) >= 0;
1344 function classedAdd(node, names) {
1345 var list = classList(node), i = -1, n = names.length;
1346 while (++i < n) list.add(names[i]);
1349 function classedRemove(node, names) {
1350 var list = classList(node), i = -1, n = names.length;
1351 while (++i < n) list.remove(names[i]);
1354 function classedTrue(names) {
1356 classedAdd(this, names);
1360 function classedFalse(names) {
1362 classedRemove(this, names);
1366 function classedFunction(names, value) {
1368 (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
1372 function selection_classed(name, value) {
1373 var names = classArray(name + "");
1375 if (arguments.length < 2) {
1376 var list = classList(this.node()), i = -1, n = names.length;
1377 while (++i < n) if (!list.contains(names[i])) return false;
1381 return this.each((typeof value === "function"
1382 ? classedFunction : value
1384 : classedFalse)(names, value));
1387 function textRemove() {
1388 this.textContent = "";
1391 function textConstant(value) {
1393 this.textContent = value;
1397 function textFunction(value) {
1399 var v = value.apply(this, arguments);
1400 this.textContent = v == null ? "" : v;
1404 function selection_text(value) {
1405 return arguments.length
1406 ? this.each(value == null
1407 ? textRemove : (typeof value === "function"
1409 : textConstant)(value))
1410 : this.node().textContent;
1413 function htmlRemove() {
1414 this.innerHTML = "";
1417 function htmlConstant(value) {
1419 this.innerHTML = value;
1423 function htmlFunction(value) {
1425 var v = value.apply(this, arguments);
1426 this.innerHTML = v == null ? "" : v;
1430 function selection_html(value) {
1431 return arguments.length
1432 ? this.each(value == null
1433 ? htmlRemove : (typeof value === "function"
1435 : htmlConstant)(value))
1436 : this.node().innerHTML;
1440 if (this.nextSibling) this.parentNode.appendChild(this);
1443 function selection_raise() {
1444 return this.each(raise);
1448 if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
1451 function selection_lower() {
1452 return this.each(lower);
1455 function selection_append(name) {
1456 var create = typeof name === "function" ? name : creator(name);
1457 return this.select(function() {
1458 return this.appendChild(create.apply(this, arguments));
1462 function constantNull() {
1466 function selection_insert(name, before) {
1467 var create = typeof name === "function" ? name : creator(name),
1468 select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
1469 return this.select(function() {
1470 return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
1475 var parent = this.parentNode;
1476 if (parent) parent.removeChild(this);
1479 function selection_remove() {
1480 return this.each(remove);
1483 function selection_cloneShallow() {
1484 return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
1487 function selection_cloneDeep() {
1488 return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
1491 function selection_clone(deep) {
1492 return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
1495 function selection_datum(value) {
1496 return arguments.length
1497 ? this.property("__data__", value)
1498 : this.node().__data__;
1501 var filterEvents = {};
1505 if (typeof document !== "undefined") {
1506 var element$1 = document.documentElement;
1507 if (!("onmouseenter" in element$1)) {
1508 filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
1512 function filterContextListener(listener, index, group) {
1513 listener = contextListener(listener, index, group);
1514 return function(event) {
1515 var related = event.relatedTarget;
1516 if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
1517 listener.call(this, event);
1522 function contextListener(listener, index, group) {
1523 return function(event1) {
1524 var event0 = event; // Events can be reentrant (e.g., focus).
1527 listener.call(this, this.__data__, index, group);
1534 function parseTypenames$1(typenames) {
1535 return typenames.trim().split(/^|\s+/).map(function(t) {
1536 var name = "", i = t.indexOf(".");
1537 if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
1538 return {type: t, name: name};
1542 function onRemove(typename) {
1546 for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
1547 if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
1548 this.removeEventListener(o.type, o.listener, o.capture);
1553 if (++i) on.length = i;
1554 else delete this.__on;
1558 function onAdd(typename, value, capture) {
1559 var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
1560 return function(d, i, group) {
1561 var on = this.__on, o, listener = wrap(value, i, group);
1562 if (on) for (var j = 0, m = on.length; j < m; ++j) {
1563 if ((o = on[j]).type === typename.type && o.name === typename.name) {
1564 this.removeEventListener(o.type, o.listener, o.capture);
1565 this.addEventListener(o.type, o.listener = listener, o.capture = capture);
1570 this.addEventListener(typename.type, listener, capture);
1571 o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
1572 if (!on) this.__on = [o];
1577 function selection_on(typename, value, capture) {
1578 var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
1580 if (arguments.length < 2) {
1581 var on = this.node().__on;
1582 if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
1583 for (i = 0, o = on[j]; i < n; ++i) {
1584 if ((t = typenames[i]).type === o.type && t.name === o.name) {
1592 on = value ? onAdd : onRemove;
1593 if (capture == null) capture = false;
1594 for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
1598 function customEvent(event1, listener, that, args) {
1600 event1.sourceEvent = event;
1603 return listener.apply(that, args);
1609 function dispatchEvent(node, type, params) {
1610 var window = defaultView(node),
1611 event = window.CustomEvent;
1613 if (typeof event === "function") {
1614 event = new event(type, params);
1616 event = window.document.createEvent("Event");
1617 if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
1618 else event.initEvent(type, false, false);
1621 node.dispatchEvent(event);
1624 function dispatchConstant(type, params) {
1626 return dispatchEvent(this, type, params);
1630 function dispatchFunction(type, params) {
1632 return dispatchEvent(this, type, params.apply(this, arguments));
1636 function selection_dispatch(type, params) {
1637 return this.each((typeof params === "function"
1639 : dispatchConstant)(type, params));
1644 function Selection(groups, parents) {
1645 this._groups = groups;
1646 this._parents = parents;
1649 function selection() {
1650 return new Selection([[document.documentElement]], root);
1653 Selection.prototype = selection.prototype = {
1654 constructor: Selection,
1655 select: selection_select,
1656 selectAll: selection_selectAll,
1657 filter: selection_filter,
1658 data: selection_data,
1659 enter: selection_enter,
1660 exit: selection_exit,
1661 merge: selection_merge,
1662 order: selection_order,
1663 sort: selection_sort,
1664 call: selection_call,
1665 nodes: selection_nodes,
1666 node: selection_node,
1667 size: selection_size,
1668 empty: selection_empty,
1669 each: selection_each,
1670 attr: selection_attr,
1671 style: selection_style,
1672 property: selection_property,
1673 classed: selection_classed,
1674 text: selection_text,
1675 html: selection_html,
1676 raise: selection_raise,
1677 lower: selection_lower,
1678 append: selection_append,
1679 insert: selection_insert,
1680 remove: selection_remove,
1681 clone: selection_clone,
1682 datum: selection_datum,
1684 dispatch: selection_dispatch
1687 function select(selector) {
1688 return typeof selector === "string"
1689 ? new Selection([[document.querySelector(selector)]], [document.documentElement])
1690 : new Selection([[selector]], root);
1693 function create(name) {
1694 return select(creator(name).call(document.documentElement));
1704 this._ = "@" + (++nextId).toString(36);
1707 Local.prototype = local.prototype = {
1709 get: function(node) {
1711 while (!(id in node)) if (!(node = node.parentNode)) return;
1714 set: function(node, value) {
1715 return node[this._] = value;
1717 remove: function(node) {
1718 return this._ in node && delete node[this._];
1720 toString: function() {
1725 function sourceEvent() {
1726 var current = event, source;
1727 while (source = current.sourceEvent) current = source;
1731 function point(node, event) {
1732 var svg = node.ownerSVGElement || node;
1734 if (svg.createSVGPoint) {
1735 var point = svg.createSVGPoint();
1736 point.x = event.clientX, point.y = event.clientY;
1737 point = point.matrixTransform(node.getScreenCTM().inverse());
1738 return [point.x, point.y];
1741 var rect = node.getBoundingClientRect();
1742 return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
1745 function mouse(node) {
1746 var event = sourceEvent();
1747 if (event.changedTouches) event = event.changedTouches[0];
1748 return point(node, event);
1751 function d3_selectAll(selector) {
1752 return typeof selector === "string"
1753 ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
1754 : new Selection([selector == null ? [] : selector], root);
1757 function touch(node, touches, identifier) {
1758 if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
1760 for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
1761 if ((touch = touches[i]).identifier === identifier) {
1762 return point(node, touch);
1769 function d3_touches(node, touches) {
1770 if (touches == null) touches = sourceEvent().touches;
1772 for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
1773 points[i] = point(node, touches[i]);
1779 function nopropagation() {
1780 event.stopImmediatePropagation();
1783 function noevent() {
1784 event.preventDefault();
1785 event.stopImmediatePropagation();
1788 function nodrag(view) {
1789 var root = view.document.documentElement,
1790 selection$$1 = select(view).on("dragstart.drag", noevent, true);
1791 if ("onselectstart" in root) {
1792 selection$$1.on("selectstart.drag", noevent, true);
1794 root.__noselect = root.style.MozUserSelect;
1795 root.style.MozUserSelect = "none";
1799 function yesdrag(view, noclick) {
1800 var root = view.document.documentElement,
1801 selection$$1 = select(view).on("dragstart.drag", null);
1803 selection$$1.on("click.drag", noevent, true);
1804 setTimeout(function() { selection$$1.on("click.drag", null); }, 0);
1806 if ("onselectstart" in root) {
1807 selection$$1.on("selectstart.drag", null);
1809 root.style.MozUserSelect = root.__noselect;
1810 delete root.__noselect;
1814 function constant$2(x) {
1820 function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
1821 this.target = target;
1823 this.subject = subject;
1824 this.identifier = id;
1825 this.active = active;
1833 DragEvent.prototype.on = function() {
1834 var value = this._.on.apply(this._, arguments);
1835 return value === this._ ? this : value;
1838 // Ignore right-click, since that should open the context menu.
1839 function defaultFilter() {
1840 return !event.button;
1843 function defaultContainer() {
1844 return this.parentNode;
1847 function defaultSubject(d) {
1848 return d == null ? {x: event.x, y: event.y} : d;
1851 function defaultTouchable() {
1852 return "ontouchstart" in this;
1856 var filter = defaultFilter,
1857 container = defaultContainer,
1858 subject = defaultSubject,
1859 touchable = defaultTouchable,
1861 listeners = dispatch("start", "drag", "end"),
1869 function drag(selection$$1) {
1871 .on("mousedown.drag", mousedowned)
1873 .on("touchstart.drag", touchstarted)
1874 .on("touchmove.drag", touchmoved)
1875 .on("touchend.drag touchcancel.drag", touchended)
1876 .style("touch-action", "none")
1877 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
1880 function mousedowned() {
1881 if (touchending || !filter.apply(this, arguments)) return;
1882 var gesture = beforestart("mouse", container.apply(this, arguments), mouse, this, arguments);
1883 if (!gesture) return;
1884 select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
1887 mousemoving = false;
1888 mousedownx = event.clientX;
1889 mousedowny = event.clientY;
1893 function mousemoved() {
1896 var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
1897 mousemoving = dx * dx + dy * dy > clickDistance2;
1899 gestures.mouse("drag");
1902 function mouseupped() {
1903 select(event.view).on("mousemove.drag mouseup.drag", null);
1904 yesdrag(event.view, mousemoving);
1906 gestures.mouse("end");
1909 function touchstarted() {
1910 if (!filter.apply(this, arguments)) return;
1911 var touches = event.changedTouches,
1912 c = container.apply(this, arguments),
1913 n = touches.length, i, gesture;
1915 for (i = 0; i < n; ++i) {
1916 if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
1923 function touchmoved() {
1924 var touches = event.changedTouches,
1925 n = touches.length, i, gesture;
1927 for (i = 0; i < n; ++i) {
1928 if (gesture = gestures[touches[i].identifier]) {
1935 function touchended() {
1936 var touches = event.changedTouches,
1937 n = touches.length, i, gesture;
1939 if (touchending) clearTimeout(touchending);
1940 touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
1941 for (i = 0; i < n; ++i) {
1942 if (gesture = gestures[touches[i].identifier]) {
1949 function beforestart(id, container, point$$1, that, args) {
1950 var p = point$$1(container, id), s, dx, dy,
1951 sublisteners = listeners.copy();
1953 if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
1954 if ((event.subject = s = subject.apply(that, args)) == null) return false;
1955 dx = s.x - p[0] || 0;
1956 dy = s.y - p[1] || 0;
1960 return function gesture(type) {
1963 case "start": gestures[id] = gesture, n = active++; break;
1964 case "end": delete gestures[id], --active; // nobreak
1965 case "drag": p = point$$1(container, id), n = active; break;
1967 customEvent(new DragEvent(drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);
1971 drag.filter = function(_) {
1972 return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
1975 drag.container = function(_) {
1976 return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
1979 drag.subject = function(_) {
1980 return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
1983 drag.touchable = function(_) {
1984 return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
1987 drag.on = function() {
1988 var value = listeners.on.apply(listeners, arguments);
1989 return value === listeners ? drag : value;
1992 drag.clickDistance = function(_) {
1993 return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
1999 function define(constructor, factory, prototype) {
2000 constructor.prototype = factory.prototype = prototype;
2001 prototype.constructor = constructor;
2004 function extend(parent, definition) {
2005 var prototype = Object.create(parent.prototype);
2006 for (var key in definition) prototype[key] = definition[key];
2013 var brighter = 1 / darker;
2015 var reI = "\\s*([+-]?\\d+)\\s*",
2016 reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
2017 reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
2018 reHex3 = /^#([0-9a-f]{3})$/,
2019 reHex6 = /^#([0-9a-f]{6})$/,
2020 reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
2021 reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
2022 reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
2023 reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
2024 reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
2025 reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
2028 aliceblue: 0xf0f8ff,
2029 antiquewhite: 0xfaebd7,
2031 aquamarine: 0x7fffd4,
2036 blanchedalmond: 0xffebcd,
2038 blueviolet: 0x8a2be2,
2040 burlywood: 0xdeb887,
2041 cadetblue: 0x5f9ea0,
2042 chartreuse: 0x7fff00,
2043 chocolate: 0xd2691e,
2045 cornflowerblue: 0x6495ed,
2051 darkgoldenrod: 0xb8860b,
2053 darkgreen: 0x006400,
2055 darkkhaki: 0xbdb76b,
2056 darkmagenta: 0x8b008b,
2057 darkolivegreen: 0x556b2f,
2058 darkorange: 0xff8c00,
2059 darkorchid: 0x9932cc,
2061 darksalmon: 0xe9967a,
2062 darkseagreen: 0x8fbc8f,
2063 darkslateblue: 0x483d8b,
2064 darkslategray: 0x2f4f4f,
2065 darkslategrey: 0x2f4f4f,
2066 darkturquoise: 0x00ced1,
2067 darkviolet: 0x9400d3,
2069 deepskyblue: 0x00bfff,
2072 dodgerblue: 0x1e90ff,
2073 firebrick: 0xb22222,
2074 floralwhite: 0xfffaf0,
2075 forestgreen: 0x228b22,
2077 gainsboro: 0xdcdcdc,
2078 ghostwhite: 0xf8f8ff,
2080 goldenrod: 0xdaa520,
2083 greenyellow: 0xadff2f,
2087 indianred: 0xcd5c5c,
2092 lavenderblush: 0xfff0f5,
2093 lawngreen: 0x7cfc00,
2094 lemonchiffon: 0xfffacd,
2095 lightblue: 0xadd8e6,
2096 lightcoral: 0xf08080,
2097 lightcyan: 0xe0ffff,
2098 lightgoldenrodyellow: 0xfafad2,
2099 lightgray: 0xd3d3d3,
2100 lightgreen: 0x90ee90,
2101 lightgrey: 0xd3d3d3,
2102 lightpink: 0xffb6c1,
2103 lightsalmon: 0xffa07a,
2104 lightseagreen: 0x20b2aa,
2105 lightskyblue: 0x87cefa,
2106 lightslategray: 0x778899,
2107 lightslategrey: 0x778899,
2108 lightsteelblue: 0xb0c4de,
2109 lightyellow: 0xffffe0,
2111 limegreen: 0x32cd32,
2115 mediumaquamarine: 0x66cdaa,
2116 mediumblue: 0x0000cd,
2117 mediumorchid: 0xba55d3,
2118 mediumpurple: 0x9370db,
2119 mediumseagreen: 0x3cb371,
2120 mediumslateblue: 0x7b68ee,
2121 mediumspringgreen: 0x00fa9a,
2122 mediumturquoise: 0x48d1cc,
2123 mediumvioletred: 0xc71585,
2124 midnightblue: 0x191970,
2125 mintcream: 0xf5fffa,
2126 mistyrose: 0xffe4e1,
2128 navajowhite: 0xffdead,
2132 olivedrab: 0x6b8e23,
2134 orangered: 0xff4500,
2136 palegoldenrod: 0xeee8aa,
2137 palegreen: 0x98fb98,
2138 paleturquoise: 0xafeeee,
2139 palevioletred: 0xdb7093,
2140 papayawhip: 0xffefd5,
2141 peachpuff: 0xffdab9,
2145 powderblue: 0xb0e0e6,
2147 rebeccapurple: 0x663399,
2149 rosybrown: 0xbc8f8f,
2150 royalblue: 0x4169e1,
2151 saddlebrown: 0x8b4513,
2153 sandybrown: 0xf4a460,
2159 slateblue: 0x6a5acd,
2160 slategray: 0x708090,
2161 slategrey: 0x708090,
2163 springgreen: 0x00ff7f,
2164 steelblue: 0x4682b4,
2169 turquoise: 0x40e0d0,
2173 whitesmoke: 0xf5f5f5,
2175 yellowgreen: 0x9acd32
2178 define(Color, color, {
2179 displayable: function() {
2180 return this.rgb().displayable();
2182 toString: function() {
2183 return this.rgb() + "";
2187 function color(format) {
2189 format = (format + "").trim().toLowerCase();
2190 return (m = reHex3.exec(format)) ? (m = parseInt(m[1], 16), new Rgb((m >> 8 & 0xf) | (m >> 4 & 0x0f0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1)) // #f00
2191 : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
2192 : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
2193 : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
2194 : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
2195 : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
2196 : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
2197 : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
2198 : named.hasOwnProperty(format) ? rgbn(named[format])
2199 : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
2204 return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
2207 function rgba(r, g, b, a) {
2208 if (a <= 0) r = g = b = NaN;
2209 return new Rgb(r, g, b, a);
2212 function rgbConvert(o) {
2213 if (!(o instanceof Color)) o = color(o);
2214 if (!o) return new Rgb;
2216 return new Rgb(o.r, o.g, o.b, o.opacity);
2219 function rgb(r, g, b, opacity) {
2220 return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
2223 function Rgb(r, g, b, opacity) {
2227 this.opacity = +opacity;
2230 define(Rgb, rgb, extend(Color, {
2231 brighter: function(k) {
2232 k = k == null ? brighter : Math.pow(brighter, k);
2233 return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2235 darker: function(k) {
2236 k = k == null ? darker : Math.pow(darker, k);
2237 return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
2242 displayable: function() {
2243 return (0 <= this.r && this.r <= 255)
2244 && (0 <= this.g && this.g <= 255)
2245 && (0 <= this.b && this.b <= 255)
2246 && (0 <= this.opacity && this.opacity <= 1);
2248 toString: function() {
2249 var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
2250 return (a === 1 ? "rgb(" : "rgba(")
2251 + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
2252 + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
2253 + Math.max(0, Math.min(255, Math.round(this.b) || 0))
2254 + (a === 1 ? ")" : ", " + a + ")");
2258 function hsla(h, s, l, a) {
2259 if (a <= 0) h = s = l = NaN;
2260 else if (l <= 0 || l >= 1) h = s = NaN;
2261 else if (s <= 0) h = NaN;
2262 return new Hsl(h, s, l, a);
2265 function hslConvert(o) {
2266 if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
2267 if (!(o instanceof Color)) o = color(o);
2268 if (!o) return new Hsl;
2269 if (o instanceof Hsl) return o;
2274 min = Math.min(r, g, b),
2275 max = Math.max(r, g, b),
2278 l = (max + min) / 2;
2280 if (r === max) h = (g - b) / s + (g < b) * 6;
2281 else if (g === max) h = (b - r) / s + 2;
2282 else h = (r - g) / s + 4;
2283 s /= l < 0.5 ? max + min : 2 - max - min;
2286 s = l > 0 && l < 1 ? 0 : h;
2288 return new Hsl(h, s, l, o.opacity);
2291 function hsl(h, s, l, opacity) {
2292 return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
2295 function Hsl(h, s, l, opacity) {
2299 this.opacity = +opacity;
2302 define(Hsl, hsl, extend(Color, {
2303 brighter: function(k) {
2304 k = k == null ? brighter : Math.pow(brighter, k);
2305 return new Hsl(this.h, this.s, this.l * k, this.opacity);
2307 darker: function(k) {
2308 k = k == null ? darker : Math.pow(darker, k);
2309 return new Hsl(this.h, this.s, this.l * k, this.opacity);
2312 var h = this.h % 360 + (this.h < 0) * 360,
2313 s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
2315 m2 = l + (l < 0.5 ? l : 1 - l) * s,
2318 hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
2320 hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
2324 displayable: function() {
2325 return (0 <= this.s && this.s <= 1 || isNaN(this.s))
2326 && (0 <= this.l && this.l <= 1)
2327 && (0 <= this.opacity && this.opacity <= 1);
2331 /* From FvD 13.37, CSS Color Module Level 3 */
2332 function hsl2rgb(h, m1, m2) {
2333 return (h < 60 ? m1 + (m2 - m1) * h / 60
2335 : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
2339 var deg2rad = Math.PI / 180;
2340 var rad2deg = 180 / Math.PI;
2343 Xn = 0.950470, // D65 standard referent
2351 function labConvert(o) {
2352 if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
2353 if (o instanceof Hcl) {
2354 var h = o.h * deg2rad;
2355 return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
2357 if (!(o instanceof Rgb)) o = rgbConvert(o);
2358 var b = rgb2xyz(o.r),
2361 x = xyz2lab((0.4124564 * b + 0.3575761 * a + 0.1804375 * l) / Xn),
2362 y = xyz2lab((0.2126729 * b + 0.7151522 * a + 0.0721750 * l) / Yn),
2363 z = xyz2lab((0.0193339 * b + 0.1191920 * a + 0.9503041 * l) / Zn);
2364 return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
2367 function lab(l, a, b, opacity) {
2368 return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
2371 function Lab(l, a, b, opacity) {
2375 this.opacity = +opacity;
2378 define(Lab, lab, extend(Color, {
2379 brighter: function(k) {
2380 return new Lab(this.l + Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2382 darker: function(k) {
2383 return new Lab(this.l - Kn * (k == null ? 1 : k), this.a, this.b, this.opacity);
2386 var y = (this.l + 16) / 116,
2387 x = isNaN(this.a) ? y : y + this.a / 500,
2388 z = isNaN(this.b) ? y : y - this.b / 200;
2389 y = Yn * lab2xyz(y);
2390 x = Xn * lab2xyz(x);
2391 z = Zn * lab2xyz(z);
2393 xyz2rgb( 3.2404542 * x - 1.5371385 * y - 0.4985314 * z), // D65 -> sRGB
2394 xyz2rgb(-0.9692660 * x + 1.8760108 * y + 0.0415560 * z),
2395 xyz2rgb( 0.0556434 * x - 0.2040259 * y + 1.0572252 * z),
2401 function xyz2lab(t) {
2402 return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
2405 function lab2xyz(t) {
2406 return t > t1 ? t * t * t : t2 * (t - t0);
2409 function xyz2rgb(x) {
2410 return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
2413 function rgb2xyz(x) {
2414 return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
2417 function hclConvert(o) {
2418 if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
2419 if (!(o instanceof Lab)) o = labConvert(o);
2420 var h = Math.atan2(o.b, o.a) * rad2deg;
2421 return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
2424 function hcl(h, c, l, opacity) {
2425 return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
2428 function Hcl(h, c, l, opacity) {
2432 this.opacity = +opacity;
2435 define(Hcl, hcl, extend(Color, {
2436 brighter: function(k) {
2437 return new Hcl(this.h, this.c, this.l + Kn * (k == null ? 1 : k), this.opacity);
2439 darker: function(k) {
2440 return new Hcl(this.h, this.c, this.l - Kn * (k == null ? 1 : k), this.opacity);
2443 return labConvert(this).rgb();
2454 BC_DA = B * C - D * A;
2456 function cubehelixConvert(o) {
2457 if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
2458 if (!(o instanceof Rgb)) o = rgbConvert(o);
2462 l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
2464 k = (E * (g - l) - C * bl) / D,
2465 s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
2466 h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
2467 return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
2470 function cubehelix(h, s, l, opacity) {
2471 return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
2474 function Cubehelix(h, s, l, opacity) {
2478 this.opacity = +opacity;
2481 define(Cubehelix, cubehelix, extend(Color, {
2482 brighter: function(k) {
2483 k = k == null ? brighter : Math.pow(brighter, k);
2484 return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2486 darker: function(k) {
2487 k = k == null ? darker : Math.pow(darker, k);
2488 return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
2491 var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
2493 a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
2497 255 * (l + a * (A * cosh + B * sinh)),
2498 255 * (l + a * (C * cosh + D * sinh)),
2499 255 * (l + a * (E * cosh)),
2505 function basis(t1, v0, v1, v2, v3) {
2506 var t2 = t1 * t1, t3 = t2 * t1;
2507 return ((1 - 3 * t1 + 3 * t2 - t3) * v0
2508 + (4 - 6 * t2 + 3 * t3) * v1
2509 + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
2513 function basis$1(values) {
2514 var n = values.length - 1;
2515 return function(t) {
2516 var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
2519 v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
2520 v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
2521 return basis((t - i / n) * n, v0, v1, v2, v3);
2525 function basisClosed(values) {
2526 var n = values.length;
2527 return function(t) {
2528 var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
2529 v0 = values[(i + n - 1) % n],
2531 v2 = values[(i + 1) % n],
2532 v3 = values[(i + 2) % n];
2533 return basis((t - i / n) * n, v0, v1, v2, v3);
2537 function constant$3(x) {
2543 function linear(a, d) {
2544 return function(t) {
2549 function exponential(a, b, y) {
2550 return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
2551 return Math.pow(a + t * b, y);
2555 function hue(a, b) {
2557 return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
2561 return (y = +y) === 1 ? nogamma : function(a, b) {
2562 return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
2566 function nogamma(a, b) {
2568 return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
2571 var interpolateRgb = (function rgbGamma(y) {
2572 var color$$1 = gamma(y);
2574 function rgb$$1(start, end) {
2575 var r = color$$1((start = rgb(start)).r, (end = rgb(end)).r),
2576 g = color$$1(start.g, end.g),
2577 b = color$$1(start.b, end.b),
2578 opacity = nogamma(start.opacity, end.opacity);
2579 return function(t) {
2583 start.opacity = opacity(t);
2588 rgb$$1.gamma = rgbGamma;
2593 function rgbSpline(spline) {
2594 return function(colors) {
2595 var n = colors.length,
2600 for (i = 0; i < n; ++i) {
2601 color$$1 = rgb(colors[i]);
2602 r[i] = color$$1.r || 0;
2603 g[i] = color$$1.g || 0;
2604 b[i] = color$$1.b || 0;
2609 color$$1.opacity = 1;
2610 return function(t) {
2614 return color$$1 + "";
2619 var rgbBasis = rgbSpline(basis$1);
2620 var rgbBasisClosed = rgbSpline(basisClosed);
2622 function array$1(a, b) {
2623 var nb = b ? b.length : 0,
2624 na = a ? Math.min(nb, a.length) : 0,
2629 for (i = 0; i < na; ++i) x[i] = interpolate(a[i], b[i]);
2630 for (; i < nb; ++i) c[i] = b[i];
2632 return function(t) {
2633 for (i = 0; i < na; ++i) c[i] = x[i](t);
2638 function date(a, b) {
2640 return a = +a, b -= a, function(t) {
2641 return d.setTime(a + b * t), d;
2645 function interpolateNumber(a, b) {
2646 return a = +a, b -= a, function(t) {
2651 function object(a, b) {
2656 if (a === null || typeof a !== "object") a = {};
2657 if (b === null || typeof b !== "object") b = {};
2661 i[k] = interpolate(a[k], b[k]);
2667 return function(t) {
2668 for (k in i) c[k] = i[k](t);
2673 var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
2674 reB = new RegExp(reA.source, "g");
2683 return function(t) {
2688 function interpolateString(a, b) {
2689 var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
2690 am, // current match in a
2691 bm, // current match in b
2692 bs, // string preceding current number in b, if any
2693 i = -1, // index in s
2694 s = [], // string constants and placeholders
2695 q = []; // number interpolators
2697 // Coerce inputs to strings.
2698 a = a + "", b = b + "";
2700 // Interpolate pairs of numbers in a & b.
2701 while ((am = reA.exec(a))
2702 && (bm = reB.exec(b))) {
2703 if ((bs = bm.index) > bi) { // a string precedes the next number in b
2704 bs = b.slice(bi, bs);
2705 if (s[i]) s[i] += bs; // coalesce with previous string
2708 if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
2709 if (s[i]) s[i] += bm; // coalesce with previous string
2711 } else { // interpolate non-matching numbers
2713 q.push({i: i, x: interpolateNumber(am, bm)});
2718 // Add remains of b.
2719 if (bi < b.length) {
2721 if (s[i]) s[i] += bs; // coalesce with previous string
2725 // Special optimization for only a single match.
2726 // Otherwise, interpolate each of the numbers and rejoin the string.
2727 return s.length < 2 ? (q[0]
2730 : (b = q.length, function(t) {
2731 for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
2736 function interpolate(a, b) {
2737 var t = typeof b, c;
2738 return b == null || t === "boolean" ? constant$3(b)
2739 : (t === "number" ? interpolateNumber
2740 : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString)
2741 : b instanceof color ? interpolateRgb
2742 : b instanceof Date ? date
2743 : Array.isArray(b) ? array$1
2744 : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
2745 : interpolateNumber)(a, b);
2748 function interpolateRound(a, b) {
2749 return a = +a, b -= a, function(t) {
2750 return Math.round(a + b * t);
2754 var degrees = 180 / Math.PI;
2765 function decompose(a, b, c, d, e, f) {
2766 var scaleX, scaleY, skewX;
2767 if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
2768 if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
2769 if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
2770 if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
2774 rotate: Math.atan2(b, a) * degrees,
2775 skewX: Math.atan(skewX) * degrees,
2786 function parseCss(value) {
2787 if (value === "none") return identity$2;
2788 if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
2789 cssNode.style.transform = value;
2790 value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
2791 cssRoot.removeChild(cssNode);
2792 value = value.slice(7, -1).split(",");
2793 return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
2796 function parseSvg(value) {
2797 if (value == null) return identity$2;
2798 if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
2799 svgNode.setAttribute("transform", value);
2800 if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
2801 value = value.matrix;
2802 return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
2805 function interpolateTransform(parse, pxComma, pxParen, degParen) {
2808 return s.length ? s.pop() + " " : "";
2811 function translate(xa, ya, xb, yb, s, q) {
2812 if (xa !== xb || ya !== yb) {
2813 var i = s.push("translate(", null, pxComma, null, pxParen);
2814 q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
2815 } else if (xb || yb) {
2816 s.push("translate(" + xb + pxComma + yb + pxParen);
2820 function rotate(a, b, s, q) {
2822 if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
2823 q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: interpolateNumber(a, b)});
2825 s.push(pop(s) + "rotate(" + b + degParen);
2829 function skewX(a, b, s, q) {
2831 q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: interpolateNumber(a, b)});
2833 s.push(pop(s) + "skewX(" + b + degParen);
2837 function scale(xa, ya, xb, yb, s, q) {
2838 if (xa !== xb || ya !== yb) {
2839 var i = s.push(pop(s) + "scale(", null, ",", null, ")");
2840 q.push({i: i - 4, x: interpolateNumber(xa, xb)}, {i: i - 2, x: interpolateNumber(ya, yb)});
2841 } else if (xb !== 1 || yb !== 1) {
2842 s.push(pop(s) + "scale(" + xb + "," + yb + ")");
2846 return function(a, b) {
2847 var s = [], // string constants and placeholders
2848 q = []; // number interpolators
2849 a = parse(a), b = parse(b);
2850 translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
2851 rotate(a.rotate, b.rotate, s, q);
2852 skewX(a.skewX, b.skewX, s, q);
2853 scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
2855 return function(t) {
2856 var i = -1, n = q.length, o;
2857 while (++i < n) s[(o = q[i]).i] = o.x(t);
2863 var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
2864 var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
2866 var rho = Math.SQRT2,
2872 return ((x = Math.exp(x)) + 1 / x) / 2;
2876 return ((x = Math.exp(x)) - 1 / x) / 2;
2880 return ((x = Math.exp(2 * x)) - 1) / (x + 1);
2883 // p0 = [ux0, uy0, w0]
2884 // p1 = [ux1, uy1, w1]
2885 function interpolateZoom(p0, p1) {
2886 var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
2887 ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
2890 d2 = dx * dx + dy * dy,
2894 // Special case for u0 ≅ u1.
2895 if (d2 < epsilon2) {
2896 S = Math.log(w1 / w0) / rho;
2901 w0 * Math.exp(rho * t * S)
2908 var d1 = Math.sqrt(d2),
2909 b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
2910 b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
2911 r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
2912 r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
2913 S = (r1 - r0) / rho;
2917 u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
2921 w0 * coshr0 / cosh(rho * s + r0)
2926 i.duration = S * 1000;
2931 function hsl$1(hue$$1) {
2932 return function(start, end) {
2933 var h = hue$$1((start = hsl(start)).h, (end = hsl(end)).h),
2934 s = nogamma(start.s, end.s),
2935 l = nogamma(start.l, end.l),
2936 opacity = nogamma(start.opacity, end.opacity);
2937 return function(t) {
2941 start.opacity = opacity(t);
2947 var hsl$2 = hsl$1(hue);
2948 var hslLong = hsl$1(nogamma);
2950 function lab$1(start, end) {
2951 var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
2952 a = nogamma(start.a, end.a),
2953 b = nogamma(start.b, end.b),
2954 opacity = nogamma(start.opacity, end.opacity);
2955 return function(t) {
2959 start.opacity = opacity(t);
2964 function hcl$1(hue$$1) {
2965 return function(start, end) {
2966 var h = hue$$1((start = hcl(start)).h, (end = hcl(end)).h),
2967 c = nogamma(start.c, end.c),
2968 l = nogamma(start.l, end.l),
2969 opacity = nogamma(start.opacity, end.opacity);
2970 return function(t) {
2974 start.opacity = opacity(t);
2980 var hcl$2 = hcl$1(hue);
2981 var hclLong = hcl$1(nogamma);
2983 function cubehelix$1(hue$$1) {
2984 return (function cubehelixGamma(y) {
2987 function cubehelix$$1(start, end) {
2988 var h = hue$$1((start = cubehelix(start)).h, (end = cubehelix(end)).h),
2989 s = nogamma(start.s, end.s),
2990 l = nogamma(start.l, end.l),
2991 opacity = nogamma(start.opacity, end.opacity);
2992 return function(t) {
2995 start.l = l(Math.pow(t, y));
2996 start.opacity = opacity(t);
3001 cubehelix$$1.gamma = cubehelixGamma;
3003 return cubehelix$$1;
3007 var cubehelix$2 = cubehelix$1(hue);
3008 var cubehelixLong = cubehelix$1(nogamma);
3010 function d3_quantize(interpolator, n) {
3011 var samples = new Array(n);
3012 for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
3016 var frame = 0, // is an animation frame pending?
3017 timeout = 0, // is a timeout pending?
3018 interval = 0, // are any timers active?
3019 pokeDelay = 1000, // how frequently we check for clock skew
3025 clock = typeof performance === "object" && performance.now ? performance : Date,
3026 setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
3029 return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
3032 function clearNow() {
3042 Timer.prototype = timer.prototype = {
3044 restart: function(callback, delay, time) {
3045 if (typeof callback !== "function") throw new TypeError("callback is not a function");
3046 time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
3047 if (!this._next && taskTail !== this) {
3048 if (taskTail) taskTail._next = this;
3049 else taskHead = this;
3052 this._call = callback;
3059 this._time = Infinity;
3065 function timer(callback, delay, time) {
3067 t.restart(callback, delay, time);
3071 function timerFlush() {
3072 now(); // Get the current time, if not already set.
3073 ++frame; // Pretend we’ve set an alarm, if we haven’t already.
3074 var t = taskHead, e;
3076 if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
3083 clockNow = (clockLast = clock.now()) + clockSkew;
3084 frame = timeout = 0;
3095 var now = clock.now(), delay = now - clockLast;
3096 if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
3100 var t0, t1 = taskHead, t2, time = Infinity;
3103 if (time > t1._time) time = t1._time;
3104 t0 = t1, t1 = t1._next;
3106 t2 = t1._next, t1._next = null;
3107 t1 = t0 ? t0._next = t2 : taskHead = t2;
3114 function sleep(time) {
3115 if (frame) return; // Soonest alarm already set, or will be.
3116 if (timeout) timeout = clearTimeout(timeout);
3117 var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
3119 if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
3120 if (interval) interval = clearInterval(interval);
3122 if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
3123 frame = 1, setFrame(wake);
3127 function timeout$1(callback, delay, time) {
3129 delay = delay == null ? 0 : +delay;
3130 t.restart(function(elapsed) {
3132 callback(elapsed + delay);
3137 function interval$1(callback, delay, time) {
3138 var t = new Timer, total = delay;
3139 if (delay == null) return t.restart(callback, delay, time), t;
3140 delay = +delay, time = time == null ? now() : +time;
3141 t.restart(function tick(elapsed) {
3143 t.restart(tick, total += delay, time);
3149 var emptyOn = dispatch("start", "end", "interrupt");
3150 var emptyTween = [];
3160 function schedule(node, name, id, index, group, timing) {
3161 var schedules = node.__transition;
3162 if (!schedules) node.__transition = {};
3163 else if (id in schedules) return;
3164 create$1(node, id, {
3166 index: index, // For context during callback.
3167 group: group, // For context during callback.
3171 delay: timing.delay,
3172 duration: timing.duration,
3179 function init(node, id) {
3180 var schedule = get$1(node, id);
3181 if (schedule.state > CREATED) throw new Error("too late; already scheduled");
3185 function set$1(node, id) {
3186 var schedule = get$1(node, id);
3187 if (schedule.state > STARTING) throw new Error("too late; already started");
3191 function get$1(node, id) {
3192 var schedule = node.__transition;
3193 if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
3197 function create$1(node, id, self) {
3198 var schedules = node.__transition,
3201 // Initialize the self timer when the transition is created.
3202 // Note the actual delay is not known until the first callback!
3203 schedules[id] = self;
3204 self.timer = timer(schedule, 0, self.time);
3206 function schedule(elapsed) {
3207 self.state = SCHEDULED;
3208 self.timer.restart(start, self.delay, self.time);
3210 // If the elapsed delay is less than our first sleep, start immediately.
3211 if (self.delay <= elapsed) start(elapsed - self.delay);
3214 function start(elapsed) {
3217 // If the state is not SCHEDULED, then we previously errored on start.
3218 if (self.state !== SCHEDULED) return stop();
3220 for (i in schedules) {
3222 if (o.name !== self.name) continue;
3224 // While this element already has a starting transition during this frame,
3225 // defer starting an interrupting transition until that transition has a
3226 // chance to tick (and possibly end); see d3/d3-transition#54!
3227 if (o.state === STARTED) return timeout$1(start);
3229 // Interrupt the active transition, if any.
3230 // Dispatch the interrupt event.
3231 if (o.state === RUNNING) {
3234 o.on.call("interrupt", node, node.__data__, o.index, o.group);
3235 delete schedules[i];
3238 // Cancel any pre-empted transitions. No interrupt event is dispatched
3239 // because the cancelled transitions never started. Note that this also
3240 // removes this transition from the pending list!
3244 delete schedules[i];
3248 // Defer the first tick to end of the current frame; see d3/d3#1576.
3249 // Note the transition may be canceled after start and before the first tick!
3250 // Note this must be scheduled before the start event; see d3/d3-transition#16!
3251 // Assuming this is successful, subsequent callbacks go straight to tick.
3252 timeout$1(function() {
3253 if (self.state === STARTED) {
3254 self.state = RUNNING;
3255 self.timer.restart(tick, self.delay, self.time);
3260 // Dispatch the start event.
3261 // Note this must be done before the tween are initialized.
3262 self.state = STARTING;
3263 self.on.call("start", node, node.__data__, self.index, self.group);
3264 if (self.state !== STARTING) return; // interrupted
3265 self.state = STARTED;
3267 // Initialize the tween, deleting null tween.
3268 tween = new Array(n = self.tween.length);
3269 for (i = 0, j = -1; i < n; ++i) {
3270 if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
3274 tween.length = j + 1;
3277 function tick(elapsed) {
3278 var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
3283 tween[i].call(null, t);
3286 // Dispatch the end event.
3287 if (self.state === ENDING) {
3288 self.on.call("end", node, node.__data__, self.index, self.group);
3296 delete schedules[id];
3297 for (var i in schedules) return; // eslint-disable-line no-unused-vars
3298 delete node.__transition;
3302 function interrupt(node, name) {
3303 var schedules = node.__transition,
3309 if (!schedules) return;
3311 name = name == null ? null : name + "";
3313 for (i in schedules) {
3314 if ((schedule$$1 = schedules[i]).name !== name) { empty = false; continue; }
3315 active = schedule$$1.state > STARTING && schedule$$1.state < ENDING;
3316 schedule$$1.state = ENDED;
3317 schedule$$1.timer.stop();
3318 if (active) schedule$$1.on.call("interrupt", node, node.__data__, schedule$$1.index, schedule$$1.group);
3319 delete schedules[i];
3322 if (empty) delete node.__transition;
3325 function selection_interrupt(name) {
3326 return this.each(function() {
3327 interrupt(this, name);
3331 function tweenRemove(id, name) {
3334 var schedule$$1 = set$1(this, id),
3335 tween = schedule$$1.tween;
3337 // If this node shared tween with the previous node,
3338 // just assign the updated shared tween and we’re done!
3339 // Otherwise, copy-on-write.
3340 if (tween !== tween0) {
3341 tween1 = tween0 = tween;
3342 for (var i = 0, n = tween1.length; i < n; ++i) {
3343 if (tween1[i].name === name) {
3344 tween1 = tween1.slice();
3345 tween1.splice(i, 1);
3351 schedule$$1.tween = tween1;
3355 function tweenFunction(id, name, value) {
3357 if (typeof value !== "function") throw new Error;
3359 var schedule$$1 = set$1(this, id),
3360 tween = schedule$$1.tween;
3362 // If this node shared tween with the previous node,
3363 // just assign the updated shared tween and we’re done!
3364 // Otherwise, copy-on-write.
3365 if (tween !== tween0) {
3366 tween1 = (tween0 = tween).slice();
3367 for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
3368 if (tween1[i].name === name) {
3373 if (i === n) tween1.push(t);
3376 schedule$$1.tween = tween1;
3380 function transition_tween(name, value) {
3385 if (arguments.length < 2) {
3386 var tween = get$1(this.node(), id).tween;
3387 for (var i = 0, n = tween.length, t; i < n; ++i) {
3388 if ((t = tween[i]).name === name) {
3395 return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
3398 function tweenValue(transition, name, value) {
3399 var id = transition._id;
3401 transition.each(function() {
3402 var schedule$$1 = set$1(this, id);
3403 (schedule$$1.value || (schedule$$1.value = {}))[name] = value.apply(this, arguments);
3406 return function(node) {
3407 return get$1(node, id).value[name];
3411 function interpolate$1(a, b) {
3413 return (typeof b === "number" ? interpolateNumber
3414 : b instanceof color ? interpolateRgb
3415 : (c = color(b)) ? (b = c, interpolateRgb)
3416 : interpolateString)(a, b);
3419 function attrRemove$1(name) {
3421 this.removeAttribute(name);
3425 function attrRemoveNS$1(fullname) {
3427 this.removeAttributeNS(fullname.space, fullname.local);
3431 function attrConstant$1(name, interpolate$$1, value1) {
3435 var value0 = this.getAttribute(name);
3436 return value0 === value1 ? null
3437 : value0 === value00 ? interpolate0
3438 : interpolate0 = interpolate$$1(value00 = value0, value1);
3442 function attrConstantNS$1(fullname, interpolate$$1, value1) {
3446 var value0 = this.getAttributeNS(fullname.space, fullname.local);
3447 return value0 === value1 ? null
3448 : value0 === value00 ? interpolate0
3449 : interpolate0 = interpolate$$1(value00 = value0, value1);
3453 function attrFunction$1(name, interpolate$$1, value) {
3458 var value0, value1 = value(this);
3459 if (value1 == null) return void this.removeAttribute(name);
3460 value0 = this.getAttribute(name);
3461 return value0 === value1 ? null
3462 : value0 === value00 && value1 === value10 ? interpolate0
3463 : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3467 function attrFunctionNS$1(fullname, interpolate$$1, value) {
3472 var value0, value1 = value(this);
3473 if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
3474 value0 = this.getAttributeNS(fullname.space, fullname.local);
3475 return value0 === value1 ? null
3476 : value0 === value00 && value1 === value10 ? interpolate0
3477 : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3481 function transition_attr(name, value) {
3482 var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate$1;
3483 return this.attrTween(name, typeof value === "function"
3484 ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
3485 : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
3486 : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value + ""));
3489 function attrTweenNS(fullname, value) {
3491 var node = this, i = value.apply(node, arguments);
3492 return i && function(t) {
3493 node.setAttributeNS(fullname.space, fullname.local, i(t));
3496 tween._value = value;
3500 function attrTween(name, value) {
3502 var node = this, i = value.apply(node, arguments);
3503 return i && function(t) {
3504 node.setAttribute(name, i(t));
3507 tween._value = value;
3511 function transition_attrTween(name, value) {
3512 var key = "attr." + name;
3513 if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3514 if (value == null) return this.tween(key, null);
3515 if (typeof value !== "function") throw new Error;
3516 var fullname = namespace(name);
3517 return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
3520 function delayFunction(id, value) {
3522 init(this, id).delay = +value.apply(this, arguments);
3526 function delayConstant(id, value) {
3527 return value = +value, function() {
3528 init(this, id).delay = value;
3532 function transition_delay(value) {
3535 return arguments.length
3536 ? this.each((typeof value === "function"
3538 : delayConstant)(id, value))
3539 : get$1(this.node(), id).delay;
3542 function durationFunction(id, value) {
3544 set$1(this, id).duration = +value.apply(this, arguments);
3548 function durationConstant(id, value) {
3549 return value = +value, function() {
3550 set$1(this, id).duration = value;
3554 function transition_duration(value) {
3557 return arguments.length
3558 ? this.each((typeof value === "function"
3560 : durationConstant)(id, value))
3561 : get$1(this.node(), id).duration;
3564 function easeConstant(id, value) {
3565 if (typeof value !== "function") throw new Error;
3567 set$1(this, id).ease = value;
3571 function transition_ease(value) {
3574 return arguments.length
3575 ? this.each(easeConstant(id, value))
3576 : get$1(this.node(), id).ease;
3579 function transition_filter(match) {
3580 if (typeof match !== "function") match = matcher$1(match);
3582 for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3583 for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
3584 if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
3585 subgroup.push(node);
3590 return new Transition(subgroups, this._parents, this._name, this._id);
3593 function transition_merge(transition$$1) {
3594 if (transition$$1._id !== this._id) throw new Error;
3596 for (var groups0 = this._groups, groups1 = transition$$1._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
3597 for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
3598 if (node = group0[i] || group1[i]) {
3604 for (; j < m0; ++j) {
3605 merges[j] = groups0[j];
3608 return new Transition(merges, this._parents, this._name, this._id);
3611 function start(name) {
3612 return (name + "").trim().split(/^|\s+/).every(function(t) {
3613 var i = t.indexOf(".");
3614 if (i >= 0) t = t.slice(0, i);
3615 return !t || t === "start";
3619 function onFunction(id, name, listener) {
3620 var on0, on1, sit = start(name) ? init : set$1;
3622 var schedule$$1 = sit(this, id),
3623 on = schedule$$1.on;
3625 // If this node shared a dispatch with the previous node,
3626 // just assign the updated shared dispatch and we’re done!
3627 // Otherwise, copy-on-write.
3628 if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
3630 schedule$$1.on = on1;
3634 function transition_on(name, listener) {
3637 return arguments.length < 2
3638 ? get$1(this.node(), id).on.on(name)
3639 : this.each(onFunction(id, name, listener));
3642 function removeFunction(id) {
3644 var parent = this.parentNode;
3645 for (var i in this.__transition) if (+i !== id) return;
3646 if (parent) parent.removeChild(this);
3650 function transition_remove() {
3651 return this.on("end.remove", removeFunction(this._id));
3654 function transition_select(select$$1) {
3655 var name = this._name,
3658 if (typeof select$$1 !== "function") select$$1 = selector(select$$1);
3660 for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
3661 for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
3662 if ((node = group[i]) && (subnode = select$$1.call(node, node.__data__, i, group))) {
3663 if ("__data__" in node) subnode.__data__ = node.__data__;
3664 subgroup[i] = subnode;
3665 schedule(subgroup[i], name, id, i, subgroup, get$1(node, id));
3670 return new Transition(subgroups, this._parents, name, id);
3673 function transition_selectAll(select$$1) {
3674 var name = this._name,
3677 if (typeof select$$1 !== "function") select$$1 = selectorAll(select$$1);
3679 for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
3680 for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3681 if (node = group[i]) {
3682 for (var children = select$$1.call(node, node.__data__, i, group), child, inherit = get$1(node, id), k = 0, l = children.length; k < l; ++k) {
3683 if (child = children[k]) {
3684 schedule(child, name, id, k, children, inherit);
3687 subgroups.push(children);
3693 return new Transition(subgroups, parents, name, id);
3696 var Selection$1 = selection.prototype.constructor;
3698 function transition_selection() {
3699 return new Selection$1(this._groups, this._parents);
3702 function styleRemove$1(name, interpolate$$1) {
3707 var value0 = styleValue(this, name),
3708 value1 = (this.style.removeProperty(name), styleValue(this, name));
3709 return value0 === value1 ? null
3710 : value0 === value00 && value1 === value10 ? interpolate0
3711 : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3715 function styleRemoveEnd(name) {
3717 this.style.removeProperty(name);
3721 function styleConstant$1(name, interpolate$$1, value1) {
3725 var value0 = styleValue(this, name);
3726 return value0 === value1 ? null
3727 : value0 === value00 ? interpolate0
3728 : interpolate0 = interpolate$$1(value00 = value0, value1);
3732 function styleFunction$1(name, interpolate$$1, value) {
3737 var value0 = styleValue(this, name),
3738 value1 = value(this);
3739 if (value1 == null) value1 = (this.style.removeProperty(name), styleValue(this, name));
3740 return value0 === value1 ? null
3741 : value0 === value00 && value1 === value10 ? interpolate0
3742 : interpolate0 = interpolate$$1(value00 = value0, value10 = value1);
3746 function transition_style(name, value, priority) {
3747 var i = (name += "") === "transform" ? interpolateTransformCss : interpolate$1;
3748 return value == null ? this
3749 .styleTween(name, styleRemove$1(name, i))
3750 .on("end.style." + name, styleRemoveEnd(name))
3751 : this.styleTween(name, typeof value === "function"
3752 ? styleFunction$1(name, i, tweenValue(this, "style." + name, value))
3753 : styleConstant$1(name, i, value + ""), priority);
3756 function styleTween(name, value, priority) {
3758 var node = this, i = value.apply(node, arguments);
3759 return i && function(t) {
3760 node.style.setProperty(name, i(t), priority);
3763 tween._value = value;
3767 function transition_styleTween(name, value, priority) {
3768 var key = "style." + (name += "");
3769 if (arguments.length < 2) return (key = this.tween(key)) && key._value;
3770 if (value == null) return this.tween(key, null);
3771 if (typeof value !== "function") throw new Error;
3772 return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
3775 function textConstant$1(value) {
3777 this.textContent = value;
3781 function textFunction$1(value) {
3783 var value1 = value(this);
3784 this.textContent = value1 == null ? "" : value1;
3788 function transition_text(value) {
3789 return this.tween("text", typeof value === "function"
3790 ? textFunction$1(tweenValue(this, "text", value))
3791 : textConstant$1(value == null ? "" : value + ""));
3794 function transition_transition() {
3795 var name = this._name,
3799 for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
3800 for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
3801 if (node = group[i]) {
3802 var inherit = get$1(node, id0);
3803 schedule(node, name, id1, i, group, {
3804 time: inherit.time + inherit.delay + inherit.duration,
3806 duration: inherit.duration,
3813 return new Transition(groups, this._parents, name, id1);
3818 function Transition(groups, parents, name, id) {
3819 this._groups = groups;
3820 this._parents = parents;
3825 function transition(name) {
3826 return selection().transition(name);
3833 var selection_prototype = selection.prototype;
3835 Transition.prototype = transition.prototype = {
3836 constructor: Transition,
3837 select: transition_select,
3838 selectAll: transition_selectAll,
3839 filter: transition_filter,
3840 merge: transition_merge,
3841 selection: transition_selection,
3842 transition: transition_transition,
3843 call: selection_prototype.call,
3844 nodes: selection_prototype.nodes,
3845 node: selection_prototype.node,
3846 size: selection_prototype.size,
3847 empty: selection_prototype.empty,
3848 each: selection_prototype.each,
3850 attr: transition_attr,
3851 attrTween: transition_attrTween,
3852 style: transition_style,
3853 styleTween: transition_styleTween,
3854 text: transition_text,
3855 remove: transition_remove,
3856 tween: transition_tween,
3857 delay: transition_delay,
3858 duration: transition_duration,
3859 ease: transition_ease
3862 function linear$1(t) {
3866 function quadIn(t) {
3870 function quadOut(t) {
3874 function quadInOut(t) {
3875 return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
3878 function cubicIn(t) {
3882 function cubicOut(t) {
3883 return --t * t * t + 1;
3886 function cubicInOut(t) {
3887 return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
3892 var polyIn = (function custom(e) {
3895 function polyIn(t) {
3896 return Math.pow(t, e);
3899 polyIn.exponent = custom;
3904 var polyOut = (function custom(e) {
3907 function polyOut(t) {
3908 return 1 - Math.pow(1 - t, e);
3911 polyOut.exponent = custom;
3916 var polyInOut = (function custom(e) {
3919 function polyInOut(t) {
3920 return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
3923 polyInOut.exponent = custom;
3932 return 1 - Math.cos(t * halfPi);
3935 function sinOut(t) {
3936 return Math.sin(t * halfPi);
3939 function sinInOut(t) {
3940 return (1 - Math.cos(pi * t)) / 2;
3944 return Math.pow(2, 10 * t - 10);
3947 function expOut(t) {
3948 return 1 - Math.pow(2, -10 * t);
3951 function expInOut(t) {
3952 return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
3955 function circleIn(t) {
3956 return 1 - Math.sqrt(1 - t * t);
3959 function circleOut(t) {
3960 return Math.sqrt(1 - --t * t);
3963 function circleInOut(t) {
3964 return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
3978 function bounceIn(t) {
3979 return 1 - bounceOut(1 - t);
3982 function bounceOut(t) {
3983 return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;
3986 function bounceInOut(t) {
3987 return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
3990 var overshoot = 1.70158;
3992 var backIn = (function custom(s) {
3995 function backIn(t) {
3996 return t * t * ((s + 1) * t - s);
3999 backIn.overshoot = custom;
4004 var backOut = (function custom(s) {
4007 function backOut(t) {
4008 return --t * t * ((s + 1) * t + s) + 1;
4011 backOut.overshoot = custom;
4016 var backInOut = (function custom(s) {
4019 function backInOut(t) {
4020 return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
4023 backInOut.overshoot = custom;
4028 var tau = 2 * Math.PI,
4032 var elasticIn = (function custom(a, p) {
4033 var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4035 function elasticIn(t) {
4036 return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
4039 elasticIn.amplitude = function(a) { return custom(a, p * tau); };
4040 elasticIn.period = function(p) { return custom(a, p); };
4043 })(amplitude, period);
4045 var elasticOut = (function custom(a, p) {
4046 var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4048 function elasticOut(t) {
4049 return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
4052 elasticOut.amplitude = function(a) { return custom(a, p * tau); };
4053 elasticOut.period = function(p) { return custom(a, p); };
4056 })(amplitude, period);
4058 var elasticInOut = (function custom(a, p) {
4059 var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
4061 function elasticInOut(t) {
4062 return ((t = t * 2 - 1) < 0
4063 ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
4064 : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
4067 elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
4068 elasticInOut.period = function(p) { return custom(a, p); };
4070 return elasticInOut;
4071 })(amplitude, period);
4073 var defaultTiming = {
4074 time: null, // Set on use.
4080 function inherit(node, id) {
4082 while (!(timing = node.__transition) || !(timing = timing[id])) {
4083 if (!(node = node.parentNode)) {
4084 return defaultTiming.time = now(), defaultTiming;
4090 function selection_transition(name) {
4094 if (name instanceof Transition) {
4095 id = name._id, name = name._name;
4097 id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
4100 for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
4101 for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
4102 if (node = group[i]) {
4103 schedule(node, name, id, i, group, timing || inherit(node, id));
4108 return new Transition(groups, this._parents, name, id);
4111 selection.prototype.interrupt = selection_interrupt;
4112 selection.prototype.transition = selection_transition;
4114 var root$1 = [null];
4116 function active(node, name) {
4117 var schedules = node.__transition,
4122 name = name == null ? null : name + "";
4123 for (i in schedules) {
4124 if ((schedule$$1 = schedules[i]).state > SCHEDULED && schedule$$1.name === name) {
4125 return new Transition([[node]], root$1, name, +i);
4133 function constant$4(x) {
4139 function BrushEvent(target, type, selection) {
4140 this.target = target;
4142 this.selection = selection;
4145 function nopropagation$1() {
4146 event.stopImmediatePropagation();
4149 function noevent$1() {
4150 event.preventDefault();
4151 event.stopImmediatePropagation();
4154 var MODE_DRAG = {name: "drag"},
4155 MODE_SPACE = {name: "space"},
4156 MODE_HANDLE = {name: "handle"},
4157 MODE_CENTER = {name: "center"};
4161 handles: ["e", "w"].map(type),
4162 input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
4163 output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
4168 handles: ["n", "s"].map(type),
4169 input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
4170 output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
4175 handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
4176 input: function(xy) { return xy; },
4177 output: function(xy) { return xy; }
4181 overlay: "crosshair",
4241 // Ignore right-click, since that should open the context menu.
4242 function defaultFilter$1() {
4243 return !event.button;
4246 function defaultExtent() {
4247 var svg = this.ownerSVGElement || this;
4248 return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
4251 // Like d3.local, but with the name “__brush” rather than auto-generated.
4252 function local$1(node) {
4253 while (!node.__brush) if (!(node = node.parentNode)) return;
4254 return node.__brush;
4257 function empty$1(extent) {
4258 return extent[0][0] === extent[1][0]
4259 || extent[0][1] === extent[1][1];
4262 function brushSelection(node) {
4263 var state = node.__brush;
4264 return state ? state.dim.output(state.selection) : null;
4279 function brush$1(dim) {
4280 var extent = defaultExtent,
4281 filter = defaultFilter$1,
4282 listeners = dispatch(brush, "start", "brush", "end"),
4286 function brush(group) {
4288 .property("__brush", initialize)
4289 .selectAll(".overlay")
4290 .data([type("overlay")]);
4292 overlay.enter().append("rect")
4293 .attr("class", "overlay")
4294 .attr("pointer-events", "all")
4295 .attr("cursor", cursors.overlay)
4298 var extent = local$1(this).extent;
4300 .attr("x", extent[0][0])
4301 .attr("y", extent[0][1])
4302 .attr("width", extent[1][0] - extent[0][0])
4303 .attr("height", extent[1][1] - extent[0][1]);
4306 group.selectAll(".selection")
4307 .data([type("selection")])
4308 .enter().append("rect")
4309 .attr("class", "selection")
4310 .attr("cursor", cursors.selection)
4311 .attr("fill", "#777")
4312 .attr("fill-opacity", 0.3)
4313 .attr("stroke", "#fff")
4314 .attr("shape-rendering", "crispEdges");
4316 var handle = group.selectAll(".handle")
4317 .data(dim.handles, function(d) { return d.type; });
4319 handle.exit().remove();
4321 handle.enter().append("rect")
4322 .attr("class", function(d) { return "handle handle--" + d.type; })
4323 .attr("cursor", function(d) { return cursors[d.type]; });
4327 .attr("fill", "none")
4328 .attr("pointer-events", "all")
4329 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
4330 .on("mousedown.brush touchstart.brush", started);
4333 brush.move = function(group, selection$$1) {
4334 if (group.selection) {
4336 .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
4337 .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
4338 .tween("brush", function() {
4340 state = that.__brush,
4341 emit = emitter(that, arguments),
4342 selection0 = state.selection,
4343 selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(this, arguments) : selection$$1, state.extent),
4344 i = interpolate(selection0, selection1);
4347 state.selection = t === 1 && empty$1(selection1) ? null : i(t);
4352 return selection0 && selection1 ? tween : tween(1);
4359 state = that.__brush,
4360 selection1 = dim.input(typeof selection$$1 === "function" ? selection$$1.apply(that, args) : selection$$1, state.extent),
4361 emit = emitter(that, args).beforestart();
4364 state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
4366 emit.start().brush().end();
4372 var group = select(this),
4373 selection$$1 = local$1(this).selection;
4376 group.selectAll(".selection")
4377 .style("display", null)
4378 .attr("x", selection$$1[0][0])
4379 .attr("y", selection$$1[0][1])
4380 .attr("width", selection$$1[1][0] - selection$$1[0][0])
4381 .attr("height", selection$$1[1][1] - selection$$1[0][1]);
4383 group.selectAll(".handle")
4384 .style("display", null)
4385 .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection$$1[1][0] - handleSize / 2 : selection$$1[0][0] - handleSize / 2; })
4386 .attr("y", function(d) { return d.type[0] === "s" ? selection$$1[1][1] - handleSize / 2 : selection$$1[0][1] - handleSize / 2; })
4387 .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection$$1[1][0] - selection$$1[0][0] + handleSize : handleSize; })
4388 .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection$$1[1][1] - selection$$1[0][1] + handleSize : handleSize; });
4392 group.selectAll(".selection,.handle")
4393 .style("display", "none")
4396 .attr("width", null)
4397 .attr("height", null);
4401 function emitter(that, args) {
4402 return that.__brush.emitter || new Emitter(that, args);
4405 function Emitter(that, args) {
4408 this.state = that.__brush;
4412 Emitter.prototype = {
4413 beforestart: function() {
4414 if (++this.active === 1) this.state.emitter = this, this.starting = true;
4418 if (this.starting) this.starting = false, this.emit("start");
4426 if (--this.active === 0) delete this.state.emitter, this.emit("end");
4429 emit: function(type) {
4430 customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
4434 function started() {
4435 if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent$1(); }
4436 else if (touchending) return;
4437 if (!filter.apply(this, arguments)) return;
4440 type = event.target.__data__.type,
4441 mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
4442 signX = dim === Y ? null : signsX[type],
4443 signY = dim === X ? null : signsY[type],
4444 state = local$1(that),
4445 extent = state.extent,
4446 selection$$1 = state.selection,
4447 W = extent[0][0], w0, w1,
4448 N = extent[0][1], n0, n1,
4449 E = extent[1][0], e0, e1,
4450 S = extent[1][1], s0, s1,
4454 shifting = signX && signY && event.shiftKey,
4457 point0 = mouse(that),
4459 emit = emitter(that, arguments).beforestart();
4461 if (type === "overlay") {
4462 state.selection = selection$$1 = [
4463 [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
4464 [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
4467 w0 = selection$$1[0][0];
4468 n0 = selection$$1[0][1];
4469 e0 = selection$$1[1][0];
4470 s0 = selection$$1[1][1];
4478 var group = select(that)
4479 .attr("pointer-events", "none");
4481 var overlay = group.selectAll(".overlay")
4482 .attr("cursor", cursors[type]);
4484 if (event.touches) {
4486 .on("touchmove.brush", moved, true)
4487 .on("touchend.brush touchcancel.brush", ended, true);
4489 var view = select(event.view)
4490 .on("keydown.brush", keydowned, true)
4491 .on("keyup.brush", keyupped, true)
4492 .on("mousemove.brush", moved, true)
4493 .on("mouseup.brush", ended, true);
4504 var point1 = mouse(that);
4505 if (shifting && !lockX && !lockY) {
4506 if (Math.abs(point1[0] - point$$1[0]) > Math.abs(point1[1] - point$$1[1])) lockY = true;
4518 dx = point$$1[0] - point0[0];
4519 dy = point$$1[1] - point0[1];
4524 if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
4525 if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
4529 if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
4530 else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
4531 if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
4532 else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
4536 if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
4537 if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
4544 t = w0, w0 = e0, e0 = t;
4545 t = w1, w1 = e1, e1 = t;
4546 if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
4551 t = n0, n0 = s0, s0 = t;
4552 t = n1, n1 = s1, s1 = t;
4553 if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
4556 if (state.selection) selection$$1 = state.selection; // May be set by brush.move!
4557 if (lockX) w1 = selection$$1[0][0], e1 = selection$$1[1][0];
4558 if (lockY) n1 = selection$$1[0][1], s1 = selection$$1[1][1];
4560 if (selection$$1[0][0] !== w1
4561 || selection$$1[0][1] !== n1
4562 || selection$$1[1][0] !== e1
4563 || selection$$1[1][1] !== s1) {
4564 state.selection = [[w1, n1], [e1, s1]];
4572 if (event.touches) {
4573 if (event.touches.length) return;
4574 if (touchending) clearTimeout(touchending);
4575 touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
4576 group.on("touchmove.brush touchend.brush touchcancel.brush", null);
4578 yesdrag(event.view, moving);
4579 view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
4581 group.attr("pointer-events", "all");
4582 overlay.attr("cursor", cursors.overlay);
4583 if (state.selection) selection$$1 = state.selection; // May be set by brush.move (on start)!
4584 if (empty$1(selection$$1)) state.selection = null, redraw.call(that);
4588 function keydowned() {
4589 switch (event.keyCode) {
4591 shifting = signX && signY;
4595 if (mode === MODE_HANDLE) {
4596 if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4597 if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4603 case 32: { // SPACE; takes priority over ALT
4604 if (mode === MODE_HANDLE || mode === MODE_CENTER) {
4605 if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
4606 if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
4608 overlay.attr("cursor", cursors.selection);
4618 function keyupped() {
4619 switch (event.keyCode) {
4622 lockX = lockY = shifting = false;
4628 if (mode === MODE_CENTER) {
4629 if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4630 if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4637 if (mode === MODE_SPACE) {
4639 if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
4640 if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
4643 if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
4644 if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
4647 overlay.attr("cursor", cursors[type]);
4658 function initialize() {
4659 var state = this.__brush || {selection: null};
4660 state.extent = extent.apply(this, arguments);
4665 brush.extent = function(_) {
4666 return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
4669 brush.filter = function(_) {
4670 return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
4673 brush.handleSize = function(_) {
4674 return arguments.length ? (handleSize = +_, brush) : handleSize;
4677 brush.on = function() {
4678 var value = listeners.on.apply(listeners, arguments);
4679 return value === listeners ? brush : value;
4688 var halfPi$1 = pi$1 / 2;
4689 var tau$1 = pi$1 * 2;
4690 var max$1 = Math.max;
4692 function compareValue(compare) {
4693 return function(a, b) {
4695 a.source.value + a.target.value,
4696 b.source.value + b.target.value
4704 sortSubgroups = null,
4707 function chord(matrix) {
4708 var n = matrix.length,
4710 groupIndex = range(n),
4713 groups = chords.groups = new Array(n),
4714 subgroups = new Array(n * n),
4723 k = 0, i = -1; while (++i < n) {
4724 x = 0, j = -1; while (++j < n) {
4728 subgroupIndex.push(range(n));
4733 if (sortGroups) groupIndex.sort(function(a, b) {
4734 return sortGroups(groupSums[a], groupSums[b]);
4738 if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
4739 d.sort(function(a, b) {
4740 return sortSubgroups(matrix[i][a], matrix[i][b]);
4744 // Convert the sum to scaling factor for [0, 2pi].
4745 // TODO Allow start and end angle to be specified?
4746 // TODO Allow padding to be specified as percentage?
4747 k = max$1(0, tau$1 - padAngle * n) / k;
4748 dx = k ? padAngle : tau$1 / n;
4750 // Compute the start and end angle for each group and subgroup.
4751 // Note: Opera has a bug reordering object literal properties!
4752 x = 0, i = -1; while (++i < n) {
4753 x0 = x, j = -1; while (++j < n) {
4754 var di = groupIndex[i],
4755 dj = subgroupIndex[di][j],
4759 subgroups[dj * n + di] = {
4771 value: groupSums[di]
4776 // Generate chords for each (non-empty) subgroup-subgroup link.
4777 i = -1; while (++i < n) {
4778 j = i - 1; while (++j < n) {
4779 var source = subgroups[j * n + i],
4780 target = subgroups[i * n + j];
4781 if (source.value || target.value) {
4782 chords.push(source.value < target.value
4783 ? {source: target, target: source}
4784 : {source: source, target: target});
4789 return sortChords ? chords.sort(sortChords) : chords;
4792 chord.padAngle = function(_) {
4793 return arguments.length ? (padAngle = max$1(0, _), chord) : padAngle;
4796 chord.sortGroups = function(_) {
4797 return arguments.length ? (sortGroups = _, chord) : sortGroups;
4800 chord.sortSubgroups = function(_) {
4801 return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
4804 chord.sortChords = function(_) {
4805 return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
4811 var slice$2 = Array.prototype.slice;
4813 function constant$5(x) {
4822 tauEpsilon = tau$2 - epsilon$1;
4825 this._x0 = this._y0 = // start of current subpath
4826 this._x1 = this._y1 = null; // end of current subpath
4834 Path.prototype = path.prototype = {
4836 moveTo: function(x, y) {
4837 this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
4839 closePath: function() {
4840 if (this._x1 !== null) {
4841 this._x1 = this._x0, this._y1 = this._y0;
4845 lineTo: function(x, y) {
4846 this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
4848 quadraticCurveTo: function(x1, y1, x, y) {
4849 this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4851 bezierCurveTo: function(x1, y1, x2, y2, x, y) {
4852 this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
4854 arcTo: function(x1, y1, x2, y2, r) {
4855 x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
4862 l01_2 = x01 * x01 + y01 * y01;
4864 // Is the radius negative? Error.
4865 if (r < 0) throw new Error("negative radius: " + r);
4867 // Is this path empty? Move to (x1,y1).
4868 if (this._x1 === null) {
4869 this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
4872 // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
4873 else if (!(l01_2 > epsilon$1)) ;
4875 // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
4876 // Equivalently, is (x1,y1) coincident with (x2,y2)?
4877 // Or, is the radius zero? Line to (x1,y1).
4878 else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) {
4879 this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
4882 // Otherwise, draw an arc!
4886 l21_2 = x21 * x21 + y21 * y21,
4887 l20_2 = x20 * x20 + y20 * y20,
4888 l21 = Math.sqrt(l21_2),
4889 l01 = Math.sqrt(l01_2),
4890 l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
4894 // If the start tangent is not coincident with (x0,y0), line to.
4895 if (Math.abs(t01 - 1) > epsilon$1) {
4896 this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
4899 this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
4902 arc: function(x, y, r, a0, a1, ccw) {
4903 x = +x, y = +y, r = +r;
4904 var dx = r * Math.cos(a0),
4905 dy = r * Math.sin(a0),
4909 da = ccw ? a0 - a1 : a1 - a0;
4911 // Is the radius negative? Error.
4912 if (r < 0) throw new Error("negative radius: " + r);
4914 // Is this path empty? Move to (x0,y0).
4915 if (this._x1 === null) {
4916 this._ += "M" + x0 + "," + y0;
4919 // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
4920 else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) {
4921 this._ += "L" + x0 + "," + y0;
4924 // Is this arc empty? We’re done.
4927 // Does the angle go the wrong way? Flip the direction.
4928 if (da < 0) da = da % tau$2 + tau$2;
4930 // Is this a complete circle? Draw two arcs to complete the circle.
4931 if (da > tauEpsilon) {
4932 this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
4935 // Is this arc non-empty? Draw an arc!
4936 else if (da > epsilon$1) {
4937 this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
4940 rect: function(x, y, w, h) {
4941 this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
4943 toString: function() {
4948 function defaultSource(d) {
4952 function defaultTarget(d) {
4956 function defaultRadius(d) {
4960 function defaultStartAngle(d) {
4961 return d.startAngle;
4964 function defaultEndAngle(d) {
4969 var source = defaultSource,
4970 target = defaultTarget,
4971 radius = defaultRadius,
4972 startAngle = defaultStartAngle,
4973 endAngle = defaultEndAngle,
4978 argv = slice$2.call(arguments),
4979 s = source.apply(this, argv),
4980 t = target.apply(this, argv),
4981 sr = +radius.apply(this, (argv[0] = s, argv)),
4982 sa0 = startAngle.apply(this, argv) - halfPi$1,
4983 sa1 = endAngle.apply(this, argv) - halfPi$1,
4984 sx0 = sr * cos(sa0),
4985 sy0 = sr * sin(sa0),
4986 tr = +radius.apply(this, (argv[0] = t, argv)),
4987 ta0 = startAngle.apply(this, argv) - halfPi$1,
4988 ta1 = endAngle.apply(this, argv) - halfPi$1;
4990 if (!context) context = buffer = path();
4992 context.moveTo(sx0, sy0);
4993 context.arc(0, 0, sr, sa0, sa1);
4994 if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
4995 context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));
4996 context.arc(0, 0, tr, ta0, ta1);
4998 context.quadraticCurveTo(0, 0, sx0, sy0);
4999 context.closePath();
5001 if (buffer) return context = null, buffer + "" || null;
5004 ribbon.radius = function(_) {
5005 return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
5008 ribbon.startAngle = function(_) {
5009 return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
5012 ribbon.endAngle = function(_) {
5013 return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
5016 ribbon.source = function(_) {
5017 return arguments.length ? (source = _, ribbon) : source;
5020 ribbon.target = function(_) {
5021 return arguments.length ? (target = _, ribbon) : target;
5024 ribbon.context = function(_) {
5025 return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
5035 Map.prototype = map$1.prototype = {
5037 has: function(key) {
5038 return (prefix + key) in this;
5040 get: function(key) {
5041 return this[prefix + key];
5043 set: function(key, value) {
5044 this[prefix + key] = value;
5047 remove: function(key) {
5048 var property = prefix + key;
5049 return property in this && delete this[property];
5052 for (var property in this) if (property[0] === prefix) delete this[property];
5056 for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
5059 values: function() {
5061 for (var property in this) if (property[0] === prefix) values.push(this[property]);
5064 entries: function() {
5066 for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
5071 for (var property in this) if (property[0] === prefix) ++size;
5075 for (var property in this) if (property[0] === prefix) return false;
5079 for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
5083 function map$1(object, f) {
5086 // Copy constructor.
5087 if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
5089 // Index array by numeric index or specified key function.
5090 else if (Array.isArray(object)) {
5095 if (f == null) while (++i < n) map.set(i, object[i]);
5096 else while (++i < n) map.set(f(o = object[i], i, object), o);
5099 // Convert object to map.
5100 else if (object) for (var key in object) map.set(key, object[key]);
5112 function apply(array, depth, createResult, setResult) {
5113 if (depth >= keys.length) {
5114 if (sortValues != null) array.sort(sortValues);
5115 return rollup != null ? rollup(array) : array;
5120 key = keys[depth++],
5123 valuesByKey = map$1(),
5125 result = createResult();
5128 if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
5131 valuesByKey.set(keyValue, [value]);
5135 valuesByKey.each(function(values, key) {
5136 setResult(result, key, apply(values, depth, createResult, setResult));
5142 function entries(map, depth) {
5143 if (++depth > keys.length) return map;
5144 var array, sortKey = sortKeys[depth - 1];
5145 if (rollup != null && depth >= keys.length) array = map.entries();
5146 else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
5147 return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
5151 object: function(array) { return apply(array, 0, createObject, setObject); },
5152 map: function(array) { return apply(array, 0, createMap, setMap); },
5153 entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
5154 key: function(d) { keys.push(d); return nest; },
5155 sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
5156 sortValues: function(order) { sortValues = order; return nest; },
5157 rollup: function(f) { rollup = f; return nest; }
5161 function createObject() {
5165 function setObject(object, key, value) {
5166 object[key] = value;
5169 function createMap() {
5173 function setMap(map, key, value) {
5174 map.set(key, value);
5179 var proto = map$1.prototype;
5181 Set.prototype = set$2.prototype = {
5184 add: function(value) {
5186 this[prefix + value] = value;
5189 remove: proto.remove,
5197 function set$2(object, f) {
5200 // Copy constructor.
5201 if (object instanceof Set) object.each(function(value) { set.add(value); });
5203 // Otherwise, assume it’s an array.
5205 var i = -1, n = object.length;
5206 if (f == null) while (++i < n) set.add(object[i]);
5207 else while (++i < n) set.add(f(object[i], i, object));
5213 function keys(map) {
5215 for (var key in map) keys.push(key);
5219 function values(map) {
5221 for (var key in map) values.push(map[key]);
5225 function entries(map) {
5227 for (var key in map) entries.push({key: key, value: map[key]});
5237 function objectConverter(columns) {
5238 return new Function("d", "return {" + columns.map(function(name, i) {
5239 return JSON.stringify(name) + ": d[" + i + "]";
5240 }).join(",") + "}");
5243 function customConverter(columns, f) {
5244 var object = objectConverter(columns);
5245 return function(row, i) {
5246 return f(object(row), i, columns);
5250 // Compute unique columns in order of discovery.
5251 function inferColumns(rows) {
5252 var columnSet = Object.create(null),
5255 rows.forEach(function(row) {
5256 for (var column in row) {
5257 if (!(column in columnSet)) {
5258 columns.push(columnSet[column] = column);
5266 function dsv(delimiter) {
5267 var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
5268 DELIMITER = delimiter.charCodeAt(0);
5270 function parse(text, f) {
5271 var convert, columns, rows = parseRows(text, function(row, i) {
5272 if (convert) return convert(row, i - 1);
5273 columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
5275 rows.columns = columns || [];
5279 function parseRows(text, f) {
5280 var rows = [], // output rows
5282 I = 0, // current character index
5283 n = 0, // current line number
5285 eof = N <= 0, // current token followed by EOF?
5286 eol = false; // current token followed by EOL?
5288 // Strip the trailing newline.
5289 if (text.charCodeAt(N - 1) === NEWLINE) --N;
5290 if (text.charCodeAt(N - 1) === RETURN) --N;
5293 if (eof) return EOF;
5294 if (eol) return eol = false, EOL;
5298 if (text.charCodeAt(j) === QUOTE) {
5299 while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
5300 if ((i = I) >= N) eof = true;
5301 else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
5302 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5303 return text.slice(j + 1, i - 1).replace(/""/g, "\"");
5306 // Find next delimiter or newline.
5308 if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
5309 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
5310 else if (c !== DELIMITER) continue;
5311 return text.slice(j, i);
5314 // Return last token before EOF.
5315 return eof = true, text.slice(j, N);
5318 while ((t = token()) !== EOF) {
5320 while (t !== EOL && t !== EOF) row.push(t), t = token();
5321 if (f && (row = f(row, n++)) == null) continue;
5328 function format(rows, columns) {
5329 if (columns == null) columns = inferColumns(rows);
5330 return [columns.map(formatValue).join(delimiter)].concat(rows.map(function(row) {
5331 return columns.map(function(column) {
5332 return formatValue(row[column]);
5337 function formatRows(rows) {
5338 return rows.map(formatRow).join("\n");
5341 function formatRow(row) {
5342 return row.map(formatValue).join(delimiter);
5345 function formatValue(text) {
5346 return text == null ? ""
5347 : reFormat.test(text += "") ? "\"" + text.replace(/"/g, "\"\"") + "\""
5353 parseRows: parseRows,
5355 formatRows: formatRows
5361 var csvParse = csv.parse;
5362 var csvParseRows = csv.parseRows;
5363 var csvFormat = csv.format;
5364 var csvFormatRows = csv.formatRows;
5366 var tsv = dsv("\t");
5368 var tsvParse = tsv.parse;
5369 var tsvParseRows = tsv.parseRows;
5370 var tsvFormat = tsv.format;
5371 var tsvFormatRows = tsv.formatRows;
5373 function center$1(x, y) {
5376 if (x == null) x = 0;
5377 if (y == null) y = 0;
5386 for (i = 0; i < n; ++i) {
5387 node = nodes[i], sx += node.x, sy += node.y;
5390 for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
5391 node = nodes[i], node.x -= sx, node.y -= sy;
5395 force.initialize = function(_) {
5399 force.x = function(_) {
5400 return arguments.length ? (x = +_, force) : x;
5403 force.y = function(_) {
5404 return arguments.length ? (y = +_, force) : y;
5410 function constant$6(x) {
5417 return (Math.random() - 0.5) * 1e-6;
5420 function tree_add(d) {
5421 var x = +this._x.call(null, d),
5422 y = +this._y.call(null, d);
5423 return add(this.cover(x, y), x, y, d);
5426 function add(tree, x, y, d) {
5427 if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
5445 // If the tree is empty, initialize the root as a leaf.
5446 if (!node) return tree._root = leaf, tree;
5448 // Find the existing leaf for the new point, or add it.
5449 while (node.length) {
5450 if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5451 if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5452 if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
5455 // Is the new point is exactly coincident with the existing point?
5456 xp = +tree._x.call(null, node.data);
5457 yp = +tree._y.call(null, node.data);
5458 if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
5460 // Otherwise, split the leaf node until the old and new point are separated.
5462 parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
5463 if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5464 if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5465 } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
5466 return parent[j] = node, parent[i] = leaf, tree;
5469 function addAll(data) {
5470 var d, i, n = data.length,
5480 // Compute the points and their extent.
5481 for (i = 0; i < n; ++i) {
5482 if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
5491 // If there were no (valid) points, inherit the existing extent.
5492 if (x1 < x0) x0 = this._x0, x1 = this._x1;
5493 if (y1 < y0) y0 = this._y0, y1 = this._y1;
5495 // Expand the tree to cover the new points.
5496 this.cover(x0, y0).cover(x1, y1);
5498 // Add the new points.
5499 for (i = 0; i < n; ++i) {
5500 add(this, xz[i], yz[i], data[i]);
5506 function tree_cover(x, y) {
5507 if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
5514 // If the quadtree has no extent, initialize them.
5515 // Integer extent are necessary so that if we later double the extent,
5516 // the existing quadrant boundaries don’t change due to floating point error!
5518 x1 = (x0 = Math.floor(x)) + 1;
5519 y1 = (y0 = Math.floor(y)) + 1;
5522 // Otherwise, double repeatedly to cover.
5523 else if (x0 > x || x > x1 || y0 > y || y > y1) {
5529 switch (i = (y < (y0 + y1) / 2) << 1 | (x < (x0 + x1) / 2)) {
5531 do parent = new Array(4), parent[i] = node, node = parent;
5532 while (z *= 2, x1 = x0 + z, y1 = y0 + z, x > x1 || y > y1);
5536 do parent = new Array(4), parent[i] = node, node = parent;
5537 while (z *= 2, x0 = x1 - z, y1 = y0 + z, x0 > x || y > y1);
5541 do parent = new Array(4), parent[i] = node, node = parent;
5542 while (z *= 2, x1 = x0 + z, y0 = y1 - z, x > x1 || y0 > y);
5546 do parent = new Array(4), parent[i] = node, node = parent;
5547 while (z *= 2, x0 = x1 - z, y0 = y1 - z, x0 > x || y0 > y);
5552 if (this._root && this._root.length) this._root = node;
5555 // If the quadtree covers the point already, just return.
5565 function tree_data() {
5567 this.visit(function(node) {
5568 if (!node.length) do data.push(node.data); while (node = node.next)
5573 function tree_extent(_) {
5574 return arguments.length
5575 ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
5576 : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
5579 function Quad(node, x0, y0, x1, y1) {
5587 function tree_find(x, y, radius) {
5602 if (node) quads.push(new Quad(node, x0, y0, x3, y3));
5603 if (radius == null) radius = Infinity;
5605 x0 = x - radius, y0 = y - radius;
5606 x3 = x + radius, y3 = y + radius;
5610 while (q = quads.pop()) {
5612 // Stop searching if this quadrant can’t contain a closer node.
5613 if (!(node = q.node)
5617 || (y2 = q.y1) < y0) continue;
5619 // Bisect the current quadrant.
5621 var xm = (x1 + x2) / 2,
5625 new Quad(node[3], xm, ym, x2, y2),
5626 new Quad(node[2], x1, ym, xm, y2),
5627 new Quad(node[1], xm, y1, x2, ym),
5628 new Quad(node[0], x1, y1, xm, ym)
5631 // Visit the closest quadrant first.
5632 if (i = (y >= ym) << 1 | (x >= xm)) {
5633 q = quads[quads.length - 1];
5634 quads[quads.length - 1] = quads[quads.length - 1 - i];
5635 quads[quads.length - 1 - i] = q;
5639 // Visit this point. (Visiting coincident points isn’t necessary!)
5641 var dx = x - +this._x.call(null, node.data),
5642 dy = y - +this._y.call(null, node.data),
5643 d2 = dx * dx + dy * dy;
5645 var d = Math.sqrt(radius = d2);
5646 x0 = x - d, y0 = y - d;
5647 x3 = x + d, y3 = y + d;
5656 function tree_remove(d) {
5657 if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
5677 // If the tree is empty, initialize the root as a leaf.
5678 if (!node) return this;
5680 // Find the leaf node for the point.
5681 // While descending, also retain the deepest parent with a non-removed sibling.
5682 if (node.length) while (true) {
5683 if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
5684 if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
5685 if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
5686 if (!node.length) break;
5687 if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
5690 // Find the point to remove.
5691 while (node.data !== d) if (!(previous = node, node = node.next)) return this;
5692 if (next = node.next) delete node.next;
5694 // If there are multiple coincident points, remove just the point.
5695 if (previous) return (next ? previous.next = next : delete previous.next), this;
5697 // If this is the root point, remove it.
5698 if (!parent) return this._root = next, this;
5700 // Remove this leaf.
5701 next ? parent[i] = next : delete parent[i];
5703 // If the parent now contains exactly one leaf, collapse superfluous parents.
5704 if ((node = parent[0] || parent[1] || parent[2] || parent[3])
5705 && node === (parent[3] || parent[2] || parent[1] || parent[0])
5707 if (retainer) retainer[j] = node;
5708 else this._root = node;
5714 function removeAll(data) {
5715 for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
5719 function tree_root() {
5723 function tree_size() {
5725 this.visit(function(node) {
5726 if (!node.length) do ++size; while (node = node.next)
5731 function tree_visit(callback) {
5732 var quads = [], q, node = this._root, child, x0, y0, x1, y1;
5733 if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
5734 while (q = quads.pop()) {
5735 if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
5736 var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5737 if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5738 if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5739 if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5740 if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5746 function tree_visitAfter(callback) {
5747 var quads = [], next = [], q;
5748 if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
5749 while (q = quads.pop()) {
5752 var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
5753 if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
5754 if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
5755 if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
5756 if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
5760 while (q = next.pop()) {
5761 callback(q.node, q.x0, q.y0, q.x1, q.y1);
5766 function defaultX(d) {
5770 function tree_x(_) {
5771 return arguments.length ? (this._x = _, this) : this._x;
5774 function defaultY(d) {
5778 function tree_y(_) {
5779 return arguments.length ? (this._y = _, this) : this._y;
5782 function quadtree(nodes, x, y) {
5783 var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN);
5784 return nodes == null ? tree : tree.addAll(nodes);
5787 function Quadtree(x, y, x0, y0, x1, y1) {
5794 this._root = undefined;
5797 function leaf_copy(leaf) {
5798 var copy = {data: leaf.data}, next = copy;
5799 while (leaf = leaf.next) next = next.next = {data: leaf.data};
5803 var treeProto = quadtree.prototype = Quadtree.prototype;
5805 treeProto.copy = function() {
5806 var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
5811 if (!node) return copy;
5813 if (!node.length) return copy._root = leaf_copy(node), copy;
5815 nodes = [{source: node, target: copy._root = new Array(4)}];
5816 while (node = nodes.pop()) {
5817 for (var i = 0; i < 4; ++i) {
5818 if (child = node.source[i]) {
5819 if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
5820 else node.target[i] = leaf_copy(child);
5828 treeProto.add = tree_add;
5829 treeProto.addAll = addAll;
5830 treeProto.cover = tree_cover;
5831 treeProto.data = tree_data;
5832 treeProto.extent = tree_extent;
5833 treeProto.find = tree_find;
5834 treeProto.remove = tree_remove;
5835 treeProto.removeAll = removeAll;
5836 treeProto.root = tree_root;
5837 treeProto.size = tree_size;
5838 treeProto.visit = tree_visit;
5839 treeProto.visitAfter = tree_visitAfter;
5840 treeProto.x = tree_x;
5841 treeProto.y = tree_y;
5851 function collide(radius) {
5857 if (typeof radius !== "function") radius = constant$6(radius == null ? 1 : +radius);
5860 var i, n = nodes.length,
5868 for (var k = 0; k < iterations; ++k) {
5869 tree = quadtree(nodes, x, y).visitAfter(prepare);
5870 for (i = 0; i < n; ++i) {
5872 ri = radii[node.index], ri2 = ri * ri;
5873 xi = node.x + node.vx;
5874 yi = node.y + node.vy;
5879 function apply(quad, x0, y0, x1, y1) {
5880 var data = quad.data, rj = quad.r, r = ri + rj;
5882 if (data.index > node.index) {
5883 var x = xi - data.x - data.vx,
5884 y = yi - data.y - data.vy,
5887 if (x === 0) x = jiggle(), l += x * x;
5888 if (y === 0) y = jiggle(), l += y * y;
5889 l = (r - (l = Math.sqrt(l))) / l * strength;
5890 node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
5891 node.vy += (y *= l) * r;
5892 data.vx -= x * (r = 1 - r);
5898 return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
5902 function prepare(quad) {
5903 if (quad.data) return quad.r = radii[quad.data.index];
5904 for (var i = quad.r = 0; i < 4; ++i) {
5905 if (quad[i] && quad[i].r > quad.r) {
5911 function initialize() {
5913 var i, n = nodes.length, node;
5914 radii = new Array(n);
5915 for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
5918 force.initialize = function(_) {
5923 force.iterations = function(_) {
5924 return arguments.length ? (iterations = +_, force) : iterations;
5927 force.strength = function(_) {
5928 return arguments.length ? (strength = +_, force) : strength;
5931 force.radius = function(_) {
5932 return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
5942 function find(nodeById, nodeId) {
5943 var node = nodeById.get(nodeId);
5944 if (!node) throw new Error("missing: " + nodeId);
5948 function link(links) {
5950 strength = defaultStrength,
5952 distance = constant$6(30),
5959 if (links == null) links = [];
5961 function defaultStrength(link) {
5962 return 1 / Math.min(count[link.source.index], count[link.target.index]);
5965 function force(alpha) {
5966 for (var k = 0, n = links.length; k < iterations; ++k) {
5967 for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
5968 link = links[i], source = link.source, target = link.target;
5969 x = target.x + target.vx - source.x - source.vx || jiggle();
5970 y = target.y + target.vy - source.y - source.vy || jiggle();
5971 l = Math.sqrt(x * x + y * y);
5972 l = (l - distances[i]) / l * alpha * strengths[i];
5974 target.vx -= x * (b = bias[i]);
5976 source.vx += x * (b = 1 - b);
5982 function initialize() {
5988 nodeById = map$1(nodes, id),
5991 for (i = 0, count = new Array(n); i < m; ++i) {
5992 link = links[i], link.index = i;
5993 if (typeof link.source !== "object") link.source = find(nodeById, link.source);
5994 if (typeof link.target !== "object") link.target = find(nodeById, link.target);
5995 count[link.source.index] = (count[link.source.index] || 0) + 1;
5996 count[link.target.index] = (count[link.target.index] || 0) + 1;
5999 for (i = 0, bias = new Array(m); i < m; ++i) {
6000 link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
6003 strengths = new Array(m), initializeStrength();
6004 distances = new Array(m), initializeDistance();
6007 function initializeStrength() {
6010 for (var i = 0, n = links.length; i < n; ++i) {
6011 strengths[i] = +strength(links[i], i, links);
6015 function initializeDistance() {
6018 for (var i = 0, n = links.length; i < n; ++i) {
6019 distances[i] = +distance(links[i], i, links);
6023 force.initialize = function(_) {
6028 force.links = function(_) {
6029 return arguments.length ? (links = _, initialize(), force) : links;
6032 force.id = function(_) {
6033 return arguments.length ? (id = _, force) : id;
6036 force.iterations = function(_) {
6037 return arguments.length ? (iterations = +_, force) : iterations;
6040 force.strength = function(_) {
6041 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initializeStrength(), force) : strength;
6044 force.distance = function(_) {
6045 return arguments.length ? (distance = typeof _ === "function" ? _ : constant$6(+_), initializeDistance(), force) : distance;
6059 var initialRadius = 10,
6060 initialAngle = Math.PI * (3 - Math.sqrt(5));
6062 function simulation(nodes) {
6066 alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
6068 velocityDecay = 0.6,
6070 stepper = timer(step),
6071 event = dispatch("tick", "end");
6073 if (nodes == null) nodes = [];
6077 event.call("tick", simulation);
6078 if (alpha < alphaMin) {
6080 event.call("end", simulation);
6085 var i, n = nodes.length, node;
6087 alpha += (alphaTarget - alpha) * alphaDecay;
6089 forces.each(function(force) {
6093 for (i = 0; i < n; ++i) {
6095 if (node.fx == null) node.x += node.vx *= velocityDecay;
6096 else node.x = node.fx, node.vx = 0;
6097 if (node.fy == null) node.y += node.vy *= velocityDecay;
6098 else node.y = node.fy, node.vy = 0;
6102 function initializeNodes() {
6103 for (var i = 0, n = nodes.length, node; i < n; ++i) {
6104 node = nodes[i], node.index = i;
6105 if (isNaN(node.x) || isNaN(node.y)) {
6106 var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
6107 node.x = radius * Math.cos(angle);
6108 node.y = radius * Math.sin(angle);
6110 if (isNaN(node.vx) || isNaN(node.vy)) {
6111 node.vx = node.vy = 0;
6116 function initializeForce(force) {
6117 if (force.initialize) force.initialize(nodes);
6123 return simulation = {
6126 restart: function() {
6127 return stepper.restart(step), simulation;
6131 return stepper.stop(), simulation;
6134 nodes: function(_) {
6135 return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
6138 alpha: function(_) {
6139 return arguments.length ? (alpha = +_, simulation) : alpha;
6142 alphaMin: function(_) {
6143 return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
6146 alphaDecay: function(_) {
6147 return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
6150 alphaTarget: function(_) {
6151 return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
6154 velocityDecay: function(_) {
6155 return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
6158 force: function(name, _) {
6159 return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
6162 find: function(x, y, radius) {
6171 if (radius == null) radius = Infinity;
6172 else radius *= radius;
6174 for (i = 0; i < n; ++i) {
6178 d2 = dx * dx + dy * dy;
6179 if (d2 < radius) closest = node, radius = d2;
6185 on: function(name, _) {
6186 return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
6191 function manyBody() {
6195 strength = constant$6(-30),
6198 distanceMax2 = Infinity,
6202 var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
6203 for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
6206 function initialize() {
6208 var i, n = nodes.length, node;
6209 strengths = new Array(n);
6210 for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
6213 function accumulate(quad) {
6214 var strength = 0, q, c, weight = 0, x, y, i;
6216 // For internal nodes, accumulate forces from child quadrants.
6218 for (x = y = i = 0; i < 4; ++i) {
6219 if ((q = quad[i]) && (c = Math.abs(q.value))) {
6220 strength += q.value, weight += c, x += c * q.x, y += c * q.y;
6223 quad.x = x / weight;
6224 quad.y = y / weight;
6227 // For leaf nodes, accumulate forces from coincident quadrants.
6232 do strength += strengths[q.data.index];
6236 quad.value = strength;
6239 function apply(quad, x1, _, x2) {
6240 if (!quad.value) return true;
6242 var x = quad.x - node.x,
6243 y = quad.y - node.y,
6247 // Apply the Barnes-Hut approximation if possible.
6248 // Limit forces for very close nodes; randomize direction if coincident.
6249 if (w * w / theta2 < l) {
6250 if (l < distanceMax2) {
6251 if (x === 0) x = jiggle(), l += x * x;
6252 if (y === 0) y = jiggle(), l += y * y;
6253 if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6254 node.vx += x * quad.value * alpha / l;
6255 node.vy += y * quad.value * alpha / l;
6260 // Otherwise, process points directly.
6261 else if (quad.length || l >= distanceMax2) return;
6263 // Limit forces for very close nodes; randomize direction if coincident.
6264 if (quad.data !== node || quad.next) {
6265 if (x === 0) x = jiggle(), l += x * x;
6266 if (y === 0) y = jiggle(), l += y * y;
6267 if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
6270 do if (quad.data !== node) {
6271 w = strengths[quad.data.index] * alpha / l;
6274 } while (quad = quad.next);
6277 force.initialize = function(_) {
6282 force.strength = function(_) {
6283 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6286 force.distanceMin = function(_) {
6287 return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
6290 force.distanceMax = function(_) {
6291 return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
6294 force.theta = function(_) {
6295 return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
6301 function radial(radius, x, y) {
6303 strength = constant$6(0.1),
6307 if (typeof radius !== "function") radius = constant$6(+radius);
6308 if (x == null) x = 0;
6309 if (y == null) y = 0;
6311 function force(alpha) {
6312 for (var i = 0, n = nodes.length; i < n; ++i) {
6313 var node = nodes[i],
6314 dx = node.x - x || 1e-6,
6315 dy = node.y - y || 1e-6,
6316 r = Math.sqrt(dx * dx + dy * dy),
6317 k = (radiuses[i] - r) * strengths[i] * alpha / r;
6323 function initialize() {
6325 var i, n = nodes.length;
6326 strengths = new Array(n);
6327 radiuses = new Array(n);
6328 for (i = 0; i < n; ++i) {
6329 radiuses[i] = +radius(nodes[i], i, nodes);
6330 strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
6334 force.initialize = function(_) {
6335 nodes = _, initialize();
6338 force.strength = function(_) {
6339 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6342 force.radius = function(_) {
6343 return arguments.length ? (radius = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : radius;
6346 force.x = function(_) {
6347 return arguments.length ? (x = +_, force) : x;
6350 force.y = function(_) {
6351 return arguments.length ? (y = +_, force) : y;
6358 var strength = constant$6(0.1),
6363 if (typeof x !== "function") x = constant$6(x == null ? 0 : +x);
6365 function force(alpha) {
6366 for (var i = 0, n = nodes.length, node; i < n; ++i) {
6367 node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
6371 function initialize() {
6373 var i, n = nodes.length;
6374 strengths = new Array(n);
6376 for (i = 0; i < n; ++i) {
6377 strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6381 force.initialize = function(_) {
6386 force.strength = function(_) {
6387 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6390 force.x = function(_) {
6391 return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : x;
6398 var strength = constant$6(0.1),
6403 if (typeof y !== "function") y = constant$6(y == null ? 0 : +y);
6405 function force(alpha) {
6406 for (var i = 0, n = nodes.length, node; i < n; ++i) {
6407 node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
6411 function initialize() {
6413 var i, n = nodes.length;
6414 strengths = new Array(n);
6416 for (i = 0; i < n; ++i) {
6417 strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
6421 force.initialize = function(_) {
6426 force.strength = function(_) {
6427 return arguments.length ? (strength = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : strength;
6430 force.y = function(_) {
6431 return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), initialize(), force) : y;
6437 // Computes the decimal coefficient and exponent of the specified number x with
6438 // significant digits p, where x is positive and p is in [1, 21] or undefined.
6439 // For example, formatDecimal(1.23) returns ["123", 0].
6440 function formatDecimal(x, p) {
6441 if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
6442 var i, coefficient = x.slice(0, i);
6444 // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
6445 // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
6447 coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
6452 function exponent$1(x) {
6453 return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
6456 function formatGroup(grouping, thousands) {
6457 return function(value, width) {
6458 var i = value.length,
6464 while (i > 0 && g > 0) {
6465 if (length + g + 1 > width) g = Math.max(1, width - length);
6466 t.push(value.substring(i -= g, i + g));
6467 if ((length += g + 1) > width) break;
6468 g = grouping[j = (j + 1) % grouping.length];
6471 return t.reverse().join(thousands);
6475 function formatNumerals(numerals) {
6476 return function(value) {
6477 return value.replace(/[0-9]/g, function(i) {
6478 return numerals[+i];
6483 function formatDefault(x, p) {
6484 x = x.toPrecision(p);
6486 out: for (var n = x.length, i = 1, i0 = -1, i1; i < n; ++i) {
6488 case ".": i0 = i1 = i; break;
6489 case "0": if (i0 === 0) i0 = i; i1 = i; break;
6490 case "e": break out;
6491 default: if (i0 > 0) i0 = 0; break;
6495 return i0 > 0 ? x.slice(0, i0) + x.slice(i1 + 1) : x;
6500 function formatPrefixAuto(x, p) {
6501 var d = formatDecimal(x, p);
6502 if (!d) return x + "";
6503 var coefficient = d[0],
6505 i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
6506 n = coefficient.length;
6507 return i === n ? coefficient
6508 : i > n ? coefficient + new Array(i - n + 1).join("0")
6509 : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
6510 : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
6513 function formatRounded(x, p) {
6514 var d = formatDecimal(x, p);
6515 if (!d) return x + "";
6516 var coefficient = d[0],
6518 return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
6519 : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
6520 : coefficient + new Array(exponent - coefficient.length + 2).join("0");
6525 "%": function(x, p) { return (x * 100).toFixed(p); },
6526 "b": function(x) { return Math.round(x).toString(2); },
6527 "c": function(x) { return x + ""; },
6528 "d": function(x) { return Math.round(x).toString(10); },
6529 "e": function(x, p) { return x.toExponential(p); },
6530 "f": function(x, p) { return x.toFixed(p); },
6531 "g": function(x, p) { return x.toPrecision(p); },
6532 "o": function(x) { return Math.round(x).toString(8); },
6533 "p": function(x, p) { return formatRounded(x * 100, p); },
6535 "s": formatPrefixAuto,
6536 "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
6537 "x": function(x) { return Math.round(x).toString(16); }
6540 // [[fill]align][sign][symbol][0][width][,][.precision][type]
6541 var re = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i;
6543 function formatSpecifier(specifier) {
6544 return new FormatSpecifier(specifier);
6547 formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
6549 function FormatSpecifier(specifier) {
6550 if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
6553 fill = match[1] || " ",
6554 align = match[2] || ">",
6555 sign = match[3] || "-",
6556 symbol = match[4] || "",
6558 width = match[6] && +match[6],
6560 precision = match[8] && +match[8].slice(1),
6561 type = match[9] || "";
6563 // The "n" type is an alias for ",g".
6564 if (type === "n") comma = true, type = "g";
6566 // Map invalid types to the default format.
6567 else if (!formatTypes[type]) type = "";
6569 // If zero fill is specified, padding goes after sign and before digits.
6570 if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
6575 this.symbol = symbol;
6579 this.precision = precision;
6583 FormatSpecifier.prototype.toString = function() {
6588 + (this.zero ? "0" : "")
6589 + (this.width == null ? "" : Math.max(1, this.width | 0))
6590 + (this.comma ? "," : "")
6591 + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
6595 function identity$3(x) {
6599 var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
6601 function formatLocale(locale) {
6602 var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
6603 currency = locale.currency,
6604 decimal = locale.decimal,
6605 numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3,
6606 percent = locale.percent || "%";
6608 function newFormat(specifier) {
6609 specifier = formatSpecifier(specifier);
6611 var fill = specifier.fill,
6612 align = specifier.align,
6613 sign = specifier.sign,
6614 symbol = specifier.symbol,
6615 zero = specifier.zero,
6616 width = specifier.width,
6617 comma = specifier.comma,
6618 precision = specifier.precision,
6619 type = specifier.type;
6621 // Compute the prefix and suffix.
6622 // For SI-prefix, the suffix is lazily computed.
6623 var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
6624 suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : "";
6626 // What format function should we use?
6627 // Is this an integer type?
6628 // Can this type generate exponential notation?
6629 var formatType = formatTypes[type],
6630 maybeSuffix = !type || /[defgprs%]/.test(type);
6632 // Set the default precision if not specified,
6633 // or clamp the specified precision to the supported range.
6634 // For significant precision, it must be in [1, 21].
6635 // For fixed precision, it must be in [0, 20].
6636 precision = precision == null ? (type ? 6 : 12)
6637 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
6638 : Math.max(0, Math.min(20, precision));
6640 function format(value) {
6641 var valuePrefix = prefix,
6642 valueSuffix = suffix,
6646 valueSuffix = formatType(value) + valueSuffix;
6651 // Perform the initial formatting.
6652 var valueNegative = value < 0;
6653 value = formatType(Math.abs(value), precision);
6655 // If a negative value rounds to zero during formatting, treat as positive.
6656 if (valueNegative && +value === 0) valueNegative = false;
6658 // Compute the prefix and suffix.
6659 valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
6660 valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
6662 // Break the formatted value into the integer “value” part that can be
6663 // grouped, and fractional or exponential “suffix” part that is not.
6665 i = -1, n = value.length;
6667 if (c = value.charCodeAt(i), 48 > c || c > 57) {
6668 valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
6669 value = value.slice(0, i);
6676 // If the fill character is not "0", grouping is applied before padding.
6677 if (comma && !zero) value = group(value, Infinity);
6679 // Compute the padding.
6680 var length = valuePrefix.length + value.length + valueSuffix.length,
6681 padding = length < width ? new Array(width - length + 1).join(fill) : "";
6683 // If the fill character is "0", grouping is applied after padding.
6684 if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
6686 // Reconstruct the final output based on the desired alignment.
6688 case "<": value = valuePrefix + value + valueSuffix + padding; break;
6689 case "=": value = valuePrefix + padding + value + valueSuffix; break;
6690 case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
6691 default: value = padding + valuePrefix + value + valueSuffix; break;
6694 return numerals(value);
6697 format.toString = function() {
6698 return specifier + "";
6704 function formatPrefix(specifier, value) {
6705 var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
6706 e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
6707 k = Math.pow(10, -e),
6708 prefix = prefixes[8 + e / 3];
6709 return function(value) {
6710 return f(k * value) + prefix;
6716 formatPrefix: formatPrefix
6731 function defaultLocale(definition) {
6732 locale = formatLocale(definition);
6733 format = locale.format;
6734 formatPrefix = locale.formatPrefix;
6738 function precisionFixed(step) {
6739 return Math.max(0, -exponent$1(Math.abs(step)));
6742 function precisionPrefix(step, value) {
6743 return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
6746 function precisionRound(step, max) {
6747 step = Math.abs(step), max = Math.abs(max) - step;
6748 return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
6751 // Adds floating point numbers with twice the normal precision.
6752 // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
6753 // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
6755 // Code adapted from GeographicLib by Charles F. F. Karney,
6756 // http://geographiclib.sourceforge.net/
6769 this.s = // rounded value
6770 this.t = 0; // exact error
6773 add$1(temp, y, this.t);
6774 add$1(this, temp.s, this.s);
6775 if (this.s) this.t += temp.t;
6776 else this.s = temp.t;
6778 valueOf: function() {
6783 var temp = new Adder;
6785 function add$1(adder, a, b) {
6786 var x = adder.s = a + b,
6789 adder.t = (a - av) + (b - bv);
6792 var epsilon$2 = 1e-6;
6793 var epsilon2$1 = 1e-12;
6795 var halfPi$2 = pi$3 / 2;
6796 var quarterPi = pi$3 / 4;
6797 var tau$3 = pi$3 * 2;
6799 var degrees$1 = 180 / pi$3;
6800 var radians = pi$3 / 180;
6803 var atan = Math.atan;
6804 var atan2 = Math.atan2;
6805 var cos$1 = Math.cos;
6806 var ceil = Math.ceil;
6810 var sin$1 = Math.sin;
6811 var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
6812 var sqrt = Math.sqrt;
6816 return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
6820 return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
6823 function haversin(x) {
6824 return (x = sin$1(x / 2)) * x;
6827 function noop$1() {}
6829 function streamGeometry(geometry, stream) {
6830 if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
6831 streamGeometryType[geometry.type](geometry, stream);
6835 var streamObjectType = {
6836 Feature: function(object, stream) {
6837 streamGeometry(object.geometry, stream);
6839 FeatureCollection: function(object, stream) {
6840 var features = object.features, i = -1, n = features.length;
6841 while (++i < n) streamGeometry(features[i].geometry, stream);
6845 var streamGeometryType = {
6846 Sphere: function(object, stream) {
6849 Point: function(object, stream) {
6850 object = object.coordinates;
6851 stream.point(object[0], object[1], object[2]);
6853 MultiPoint: function(object, stream) {
6854 var coordinates = object.coordinates, i = -1, n = coordinates.length;
6855 while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
6857 LineString: function(object, stream) {
6858 streamLine(object.coordinates, stream, 0);
6860 MultiLineString: function(object, stream) {
6861 var coordinates = object.coordinates, i = -1, n = coordinates.length;
6862 while (++i < n) streamLine(coordinates[i], stream, 0);
6864 Polygon: function(object, stream) {
6865 streamPolygon(object.coordinates, stream);
6867 MultiPolygon: function(object, stream) {
6868 var coordinates = object.coordinates, i = -1, n = coordinates.length;
6869 while (++i < n) streamPolygon(coordinates[i], stream);
6871 GeometryCollection: function(object, stream) {
6872 var geometries = object.geometries, i = -1, n = geometries.length;
6873 while (++i < n) streamGeometry(geometries[i], stream);
6877 function streamLine(coordinates, stream, closed) {
6878 var i = -1, n = coordinates.length - closed, coordinate;
6880 while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
6884 function streamPolygon(coordinates, stream) {
6885 var i = -1, n = coordinates.length;
6886 stream.polygonStart();
6887 while (++i < n) streamLine(coordinates[i], stream, 1);
6888 stream.polygonEnd();
6891 function geoStream(object, stream) {
6892 if (object && streamObjectType.hasOwnProperty(object.type)) {
6893 streamObjectType[object.type](object, stream);
6895 streamGeometry(object, stream);
6899 var areaRingSum = adder();
6901 var areaSum = adder(),
6912 polygonStart: function() {
6913 areaRingSum.reset();
6914 areaStream.lineStart = areaRingStart;
6915 areaStream.lineEnd = areaRingEnd;
6917 polygonEnd: function() {
6918 var areaRing = +areaRingSum;
6919 areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
6920 this.lineStart = this.lineEnd = this.point = noop$1;
6922 sphere: function() {
6927 function areaRingStart() {
6928 areaStream.point = areaPointFirst;
6931 function areaRingEnd() {
6932 areaPoint(lambda00, phi00);
6935 function areaPointFirst(lambda, phi) {
6936 areaStream.point = areaPoint;
6937 lambda00 = lambda, phi00 = phi;
6938 lambda *= radians, phi *= radians;
6939 lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
6942 function areaPoint(lambda, phi) {
6943 lambda *= radians, phi *= radians;
6944 phi = phi / 2 + quarterPi; // half the angular distance from south pole
6946 // Spherical excess E for a spherical triangle with vertices: south pole,
6947 // previous point, current point. Uses a formula derived from Cagnoli’s
6948 // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
6949 var dLambda = lambda - lambda0,
6950 sdLambda = dLambda >= 0 ? 1 : -1,
6951 adLambda = sdLambda * dLambda,
6952 cosPhi = cos$1(phi),
6953 sinPhi = sin$1(phi),
6954 k = sinPhi0 * sinPhi,
6955 u = cosPhi0 * cosPhi + k * cos$1(adLambda),
6956 v = k * sdLambda * sin$1(adLambda);
6957 areaRingSum.add(atan2(v, u));
6959 // Advance the previous points.
6960 lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
6963 function d3_geoArea(object) {
6965 geoStream(object, areaStream);
6969 function spherical(cartesian) {
6970 return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
6973 function cartesian(spherical) {
6974 var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
6975 return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)];
6978 function cartesianDot(a, b) {
6979 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
6982 function cartesianCross(a, b) {
6983 return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
6987 function cartesianAddInPlace(a, b) {
6988 a[0] += b[0], a[1] += b[1], a[2] += b[2];
6991 function cartesianScale(vector, k) {
6992 return [vector[0] * k, vector[1] * k, vector[2] * k];
6996 function cartesianNormalizeInPlace(d) {
6997 var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
6998 d[0] /= l, d[1] /= l, d[2] /= l;
7001 var lambda0$1, phi0, lambda1, phi1, // bounds
7002 lambda2, // previous lambda-coordinate
7003 lambda00$1, phi00$1, // first point
7004 p0, // previous 3D point
7009 var boundsStream = {
7011 lineStart: boundsLineStart,
7012 lineEnd: boundsLineEnd,
7013 polygonStart: function() {
7014 boundsStream.point = boundsRingPoint;
7015 boundsStream.lineStart = boundsRingStart;
7016 boundsStream.lineEnd = boundsRingEnd;
7018 areaStream.polygonStart();
7020 polygonEnd: function() {
7021 areaStream.polygonEnd();
7022 boundsStream.point = boundsPoint;
7023 boundsStream.lineStart = boundsLineStart;
7024 boundsStream.lineEnd = boundsLineEnd;
7025 if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
7026 else if (deltaSum > epsilon$2) phi1 = 90;
7027 else if (deltaSum < -epsilon$2) phi0 = -90;
7028 range$1[0] = lambda0$1, range$1[1] = lambda1;
7032 function boundsPoint(lambda, phi) {
7033 ranges.push(range$1 = [lambda0$1 = lambda, lambda1 = lambda]);
7034 if (phi < phi0) phi0 = phi;
7035 if (phi > phi1) phi1 = phi;
7038 function linePoint(lambda, phi) {
7039 var p = cartesian([lambda * radians, phi * radians]);
7041 var normal = cartesianCross(p0, p),
7042 equatorial = [normal[1], -normal[0], 0],
7043 inflection = cartesianCross(equatorial, normal);
7044 cartesianNormalizeInPlace(inflection);
7045 inflection = spherical(inflection);
7046 var delta = lambda - lambda2,
7047 sign$$1 = delta > 0 ? 1 : -1,
7048 lambdai = inflection[0] * degrees$1 * sign$$1,
7050 antimeridian = abs(delta) > 180;
7051 if (antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7052 phii = inflection[1] * degrees$1;
7053 if (phii > phi1) phi1 = phii;
7054 } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign$$1 * lambda2 < lambdai && lambdai < sign$$1 * lambda)) {
7055 phii = -inflection[1] * degrees$1;
7056 if (phii < phi0) phi0 = phii;
7058 if (phi < phi0) phi0 = phi;
7059 if (phi > phi1) phi1 = phi;
7062 if (lambda < lambda2) {
7063 if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7065 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7068 if (lambda1 >= lambda0$1) {
7069 if (lambda < lambda0$1) lambda0$1 = lambda;
7070 if (lambda > lambda1) lambda1 = lambda;
7072 if (lambda > lambda2) {
7073 if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
7075 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
7080 ranges.push(range$1 = [lambda0$1 = lambda, lambda1 = lambda]);
7082 if (phi < phi0) phi0 = phi;
7083 if (phi > phi1) phi1 = phi;
7084 p0 = p, lambda2 = lambda;
7087 function boundsLineStart() {
7088 boundsStream.point = linePoint;
7091 function boundsLineEnd() {
7092 range$1[0] = lambda0$1, range$1[1] = lambda1;
7093 boundsStream.point = boundsPoint;
7097 function boundsRingPoint(lambda, phi) {
7099 var delta = lambda - lambda2;
7100 deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
7102 lambda00$1 = lambda, phi00$1 = phi;
7104 areaStream.point(lambda, phi);
7105 linePoint(lambda, phi);
7108 function boundsRingStart() {
7109 areaStream.lineStart();
7112 function boundsRingEnd() {
7113 boundsRingPoint(lambda00$1, phi00$1);
7114 areaStream.lineEnd();
7115 if (abs(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180);
7116 range$1[0] = lambda0$1, range$1[1] = lambda1;
7120 // Finds the left-right distance between two longitudes.
7121 // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
7122 // the distance between ±180° to be 360°.
7123 function angle(lambda0, lambda1) {
7124 return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
7127 function rangeCompare(a, b) {
7131 function rangeContains(range, x) {
7132 return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
7135 function d3_geoBounds(feature) {
7136 var i, n, a, b, merged, deltaMax, delta;
7138 phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
7140 geoStream(feature, boundsStream);
7142 // First, sort ranges by their minimum longitudes.
7143 if (n = ranges.length) {
7144 ranges.sort(rangeCompare);
7146 // Then, merge any ranges that overlap.
7147 for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
7149 if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
7150 if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
7151 if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
7157 // Finally, find the largest gap between the merged ranges.
7158 // The final bounding box will be the inverse of this gap.
7159 for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
7161 if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
7165 ranges = range$1 = null;
7167 return lambda0$1 === Infinity || phi0 === Infinity
7168 ? [[NaN, NaN], [NaN, NaN]]
7169 : [[lambda0$1, phi0], [lambda1, phi1]];
7176 lambda00$2, phi00$2, // first point
7177 x0, y0, z0; // previous point
7179 var centroidStream = {
7181 point: centroidPoint,
7182 lineStart: centroidLineStart,
7183 lineEnd: centroidLineEnd,
7184 polygonStart: function() {
7185 centroidStream.lineStart = centroidRingStart;
7186 centroidStream.lineEnd = centroidRingEnd;
7188 polygonEnd: function() {
7189 centroidStream.lineStart = centroidLineStart;
7190 centroidStream.lineEnd = centroidLineEnd;
7194 // Arithmetic mean of Cartesian vectors.
7195 function centroidPoint(lambda, phi) {
7196 lambda *= radians, phi *= radians;
7197 var cosPhi = cos$1(phi);
7198 centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
7201 function centroidPointCartesian(x, y, z) {
7203 X0 += (x - X0) / W0;
7204 Y0 += (y - Y0) / W0;
7205 Z0 += (z - Z0) / W0;
7208 function centroidLineStart() {
7209 centroidStream.point = centroidLinePointFirst;
7212 function centroidLinePointFirst(lambda, phi) {
7213 lambda *= radians, phi *= radians;
7214 var cosPhi = cos$1(phi);
7215 x0 = cosPhi * cos$1(lambda);
7216 y0 = cosPhi * sin$1(lambda);
7218 centroidStream.point = centroidLinePoint;
7219 centroidPointCartesian(x0, y0, z0);
7222 function centroidLinePoint(lambda, phi) {
7223 lambda *= radians, phi *= radians;
7224 var cosPhi = cos$1(phi),
7225 x = cosPhi * cos$1(lambda),
7226 y = cosPhi * sin$1(lambda),
7228 w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
7230 X1 += w * (x0 + (x0 = x));
7231 Y1 += w * (y0 + (y0 = y));
7232 Z1 += w * (z0 + (z0 = z));
7233 centroidPointCartesian(x0, y0, z0);
7236 function centroidLineEnd() {
7237 centroidStream.point = centroidPoint;
7240 // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
7241 // J. Applied Mechanics 42, 239 (1975).
7242 function centroidRingStart() {
7243 centroidStream.point = centroidRingPointFirst;
7246 function centroidRingEnd() {
7247 centroidRingPoint(lambda00$2, phi00$2);
7248 centroidStream.point = centroidPoint;
7251 function centroidRingPointFirst(lambda, phi) {
7252 lambda00$2 = lambda, phi00$2 = phi;
7253 lambda *= radians, phi *= radians;
7254 centroidStream.point = centroidRingPoint;
7255 var cosPhi = cos$1(phi);
7256 x0 = cosPhi * cos$1(lambda);
7257 y0 = cosPhi * sin$1(lambda);
7259 centroidPointCartesian(x0, y0, z0);
7262 function centroidRingPoint(lambda, phi) {
7263 lambda *= radians, phi *= radians;
7264 var cosPhi = cos$1(phi),
7265 x = cosPhi * cos$1(lambda),
7266 y = cosPhi * sin$1(lambda),
7268 cx = y0 * z - z0 * y,
7269 cy = z0 * x - x0 * z,
7270 cz = x0 * y - y0 * x,
7271 m = sqrt(cx * cx + cy * cy + cz * cz),
7272 w = asin(m), // line weight = angle
7273 v = m && -w / m; // area weight multiplier
7278 X1 += w * (x0 + (x0 = x));
7279 Y1 += w * (y0 + (y0 = y));
7280 Z1 += w * (z0 + (z0 = z));
7281 centroidPointCartesian(x0, y0, z0);
7284 function d3_geoCentroid(object) {
7289 geoStream(object, centroidStream);
7294 m = x * x + y * y + z * z;
7296 // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
7297 if (m < epsilon2$1) {
7298 x = X1, y = Y1, z = Z1;
7299 // If the feature has zero length, fall back to arithmetic mean of point vectors.
7300 if (W1 < epsilon$2) x = X0, y = Y0, z = Z0;
7301 m = x * x + y * y + z * z;
7302 // If the feature still has an undefined ccentroid, then return.
7303 if (m < epsilon2$1) return [NaN, NaN];
7306 return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
7309 function constant$7(x) {
7315 function compose(a, b) {
7317 function compose(x, y) {
7318 return x = a(x, y), b(x[0], x[1]);
7321 if (a.invert && b.invert) compose.invert = function(x, y) {
7322 return x = b.invert(x, y), x && a.invert(x[0], x[1]);
7328 function rotationIdentity(lambda, phi) {
7329 return [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7332 rotationIdentity.invert = rotationIdentity;
7334 function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
7335 return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
7336 : rotationLambda(deltaLambda))
7337 : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
7338 : rotationIdentity);
7341 function forwardRotationLambda(deltaLambda) {
7342 return function(lambda, phi) {
7343 return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
7347 function rotationLambda(deltaLambda) {
7348 var rotation = forwardRotationLambda(deltaLambda);
7349 rotation.invert = forwardRotationLambda(-deltaLambda);
7353 function rotationPhiGamma(deltaPhi, deltaGamma) {
7354 var cosDeltaPhi = cos$1(deltaPhi),
7355 sinDeltaPhi = sin$1(deltaPhi),
7356 cosDeltaGamma = cos$1(deltaGamma),
7357 sinDeltaGamma = sin$1(deltaGamma);
7359 function rotation(lambda, phi) {
7360 var cosPhi = cos$1(phi),
7361 x = cos$1(lambda) * cosPhi,
7362 y = sin$1(lambda) * cosPhi,
7364 k = z * cosDeltaPhi + x * sinDeltaPhi;
7366 atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
7367 asin(k * cosDeltaGamma + y * sinDeltaGamma)
7371 rotation.invert = function(lambda, phi) {
7372 var cosPhi = cos$1(phi),
7373 x = cos$1(lambda) * cosPhi,
7374 y = sin$1(lambda) * cosPhi,
7376 k = z * cosDeltaGamma - y * sinDeltaGamma;
7378 atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
7379 asin(k * cosDeltaPhi - x * sinDeltaPhi)
7386 function rotation(rotate) {
7387 rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
7389 function forward(coordinates) {
7390 coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
7391 return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7394 forward.invert = function(coordinates) {
7395 coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
7396 return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
7402 // Generates a circle centered at [0°, 0°], with a given radius and precision.
7403 function circleStream(stream, radius, delta, direction, t0, t1) {
7405 var cosRadius = cos$1(radius),
7406 sinRadius = sin$1(radius),
7407 step = direction * delta;
7409 t0 = radius + direction * tau$3;
7410 t1 = radius - step / 2;
7412 t0 = circleRadius(cosRadius, t0);
7413 t1 = circleRadius(cosRadius, t1);
7414 if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
7416 for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
7417 point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);
7418 stream.point(point[0], point[1]);
7422 // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
7423 function circleRadius(cosRadius, point) {
7424 point = cartesian(point), point[0] -= cosRadius;
7425 cartesianNormalizeInPlace(point);
7426 var radius = acos(-point[1]);
7427 return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
7431 var center = constant$7([0, 0]),
7432 radius = constant$7(90),
7433 precision = constant$7(6),
7436 stream = {point: point};
7438 function point(x, y) {
7439 ring.push(x = rotate(x, y));
7440 x[0] *= degrees$1, x[1] *= degrees$1;
7444 var c = center.apply(this, arguments),
7445 r = radius.apply(this, arguments) * radians,
7446 p = precision.apply(this, arguments) * radians;
7448 rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
7449 circleStream(stream, r, p, 1);
7450 c = {type: "Polygon", coordinates: [ring]};
7451 ring = rotate = null;
7455 circle.center = function(_) {
7456 return arguments.length ? (center = typeof _ === "function" ? _ : constant$7([+_[0], +_[1]]), circle) : center;
7459 circle.radius = function(_) {
7460 return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), circle) : radius;
7463 circle.precision = function(_) {
7464 return arguments.length ? (precision = typeof _ === "function" ? _ : constant$7(+_), circle) : precision;
7470 function clipBuffer() {
7474 point: function(x, y) {
7477 lineStart: function() {
7478 lines.push(line = []);
7481 rejoin: function() {
7482 if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
7484 result: function() {
7493 function pointEqual(a, b) {
7494 return abs(a[0] - b[0]) < epsilon$2 && abs(a[1] - b[1]) < epsilon$2;
7497 function Intersection(point, points, other, entry) {
7500 this.o = other; // another intersection
7501 this.e = entry; // is an entry?
7502 this.v = false; // visited
7503 this.n = this.p = null; // next & previous
7506 // A generalized polygon clipping algorithm: given a polygon that has been cut
7507 // into its visible line segments, and rejoins the segments by interpolating
7508 // along the clip edge.
7509 function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) {
7515 segments.forEach(function(segment) {
7516 if ((n = segment.length - 1) <= 0) return;
7517 var n, p0 = segment[0], p1 = segment[n], x;
7519 // If the first and last points of a segment are coincident, then treat as a
7520 // closed ring. TODO if all rings are closed, then the winding order of the
7521 // exterior ring should be checked.
7522 if (pointEqual(p0, p1)) {
7524 for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
7529 subject.push(x = new Intersection(p0, segment, null, true));
7530 clip.push(x.o = new Intersection(p0, null, x, false));
7531 subject.push(x = new Intersection(p1, segment, null, false));
7532 clip.push(x.o = new Intersection(p1, null, x, true));
7535 if (!subject.length) return;
7537 clip.sort(compareIntersection);
7541 for (i = 0, n = clip.length; i < n; ++i) {
7542 clip[i].e = startInside = !startInside;
7545 var start = subject[0],
7550 // Find first unvisited intersection.
7551 var current = start,
7553 while (current.v) if ((current = current.n) === start) return;
7557 current.v = current.o.v = true;
7560 for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
7562 interpolate(current.x, current.n.x, 1, stream);
7564 current = current.n;
7567 points = current.p.z;
7568 for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
7570 interpolate(current.x, current.p.x, -1, stream);
7572 current = current.p;
7574 current = current.o;
7576 isSubject = !isSubject;
7577 } while (!current.v);
7582 function link$1(array) {
7583 if (!(n = array.length)) return;
7597 var sum$1 = adder();
7599 function polygonContains(polygon, point) {
7600 var lambda = point[0],
7602 normal = [sin$1(lambda), -cos$1(lambda), 0],
7608 for (var i = 0, n = polygon.length; i < n; ++i) {
7609 if (!(m = (ring = polygon[i]).length)) continue;
7612 point0 = ring[m - 1],
7613 lambda0 = point0[0],
7614 phi0 = point0[1] / 2 + quarterPi,
7615 sinPhi0 = sin$1(phi0),
7616 cosPhi0 = cos$1(phi0);
7618 for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
7619 var point1 = ring[j],
7620 lambda1 = point1[0],
7621 phi1 = point1[1] / 2 + quarterPi,
7622 sinPhi1 = sin$1(phi1),
7623 cosPhi1 = cos$1(phi1),
7624 delta = lambda1 - lambda0,
7625 sign$$1 = delta >= 0 ? 1 : -1,
7626 absDelta = sign$$1 * delta,
7627 antimeridian = absDelta > pi$3,
7628 k = sinPhi0 * sinPhi1;
7630 sum$1.add(atan2(k * sign$$1 * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
7631 angle += antimeridian ? delta + sign$$1 * tau$3 : delta;
7633 // Are the longitudes either side of the point’s meridian (lambda),
7634 // and are the latitudes smaller than the parallel (phi)?
7635 if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
7636 var arc = cartesianCross(cartesian(point0), cartesian(point1));
7637 cartesianNormalizeInPlace(arc);
7638 var intersection = cartesianCross(normal, arc);
7639 cartesianNormalizeInPlace(intersection);
7640 var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
7641 if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
7642 winding += antimeridian ^ delta >= 0 ? 1 : -1;
7648 // First, determine whether the South pole is inside or outside:
7651 // * the polygon winds around it in a clockwise direction.
7652 // * the polygon does not (cumulatively) wind around it, but has a negative
7653 // (counter-clockwise) area.
7655 // Second, count the (signed) number of times a segment crosses a lambda
7656 // from the point to the South pole. If it is zero, then the point is the
7657 // same side as the South pole.
7659 return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
7662 function clip(pointVisible, clipLine, interpolate, start) {
7663 return function(sink) {
7664 var line = clipLine(sink),
7665 ringBuffer = clipBuffer(),
7666 ringSink = clipLine(ringBuffer),
7667 polygonStarted = false,
7674 lineStart: lineStart,
7676 polygonStart: function() {
7677 clip.point = pointRing;
7678 clip.lineStart = ringStart;
7679 clip.lineEnd = ringEnd;
7683 polygonEnd: function() {
7685 clip.lineStart = lineStart;
7686 clip.lineEnd = lineEnd;
7687 segments = merge(segments);
7688 var startInside = polygonContains(polygon, start);
7689 if (segments.length) {
7690 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7691 clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
7692 } else if (startInside) {
7693 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7695 interpolate(null, null, 1, sink);
7698 if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
7699 segments = polygon = null;
7701 sphere: function() {
7702 sink.polygonStart();
7704 interpolate(null, null, 1, sink);
7710 function point(lambda, phi) {
7711 if (pointVisible(lambda, phi)) sink.point(lambda, phi);
7714 function pointLine(lambda, phi) {
7715 line.point(lambda, phi);
7718 function lineStart() {
7719 clip.point = pointLine;
7723 function lineEnd() {
7728 function pointRing(lambda, phi) {
7729 ring.push([lambda, phi]);
7730 ringSink.point(lambda, phi);
7733 function ringStart() {
7734 ringSink.lineStart();
7738 function ringEnd() {
7739 pointRing(ring[0][0], ring[0][1]);
7742 var clean = ringSink.clean(),
7743 ringSegments = ringBuffer.result(),
7744 i, n = ringSegments.length, m,
7754 // No intersections.
7756 segment = ringSegments[0];
7757 if ((m = segment.length - 1) > 0) {
7758 if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
7760 for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
7766 // Rejoin connected segments.
7767 // TODO reuse ringBuffer.rejoin()?
7768 if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
7770 segments.push(ringSegments.filter(validSegment));
7777 function validSegment(segment) {
7778 return segment.length > 1;
7781 // Intersections are sorted along the clip edge. For both antimeridian cutting
7782 // and circle clipping, the same comparison is used.
7783 function compareIntersection(a, b) {
7784 return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1])
7785 - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]);
7788 var clipAntimeridian = clip(
7789 function() { return true; },
7790 clipAntimeridianLine,
7791 clipAntimeridianInterpolate,
7795 // Takes a line and cuts into visible segments. Return values: 0 - there were
7796 // intersections or the line was empty; 1 - no intersections; 2 - there were
7797 // intersections, and the first and last segments should be rejoined.
7798 function clipAntimeridianLine(stream) {
7802 clean; // no intersections
7805 lineStart: function() {
7809 point: function(lambda1, phi1) {
7810 var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
7811 delta = abs(lambda1 - lambda0);
7812 if (abs(delta - pi$3) < epsilon$2) { // line crosses a pole
7813 stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
7814 stream.point(sign0, phi0);
7817 stream.point(sign1, phi0);
7818 stream.point(lambda1, phi0);
7820 } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
7821 if (abs(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies
7822 if (abs(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2;
7823 phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
7824 stream.point(sign0, phi0);
7827 stream.point(sign1, phi0);
7830 stream.point(lambda0 = lambda1, phi0 = phi1);
7833 lineEnd: function() {
7835 lambda0 = phi0 = NaN;
7838 return 2 - clean; // if intersections, rejoin first and last segments
7843 function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
7846 sinLambda0Lambda1 = sin$1(lambda0 - lambda1);
7847 return abs(sinLambda0Lambda1) > epsilon$2
7848 ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1)
7849 - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0))
7850 / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
7851 : (phi0 + phi1) / 2;
7854 function clipAntimeridianInterpolate(from, to, direction, stream) {
7857 phi = direction * halfPi$2;
7858 stream.point(-pi$3, phi);
7859 stream.point(0, phi);
7860 stream.point(pi$3, phi);
7861 stream.point(pi$3, 0);
7862 stream.point(pi$3, -phi);
7863 stream.point(0, -phi);
7864 stream.point(-pi$3, -phi);
7865 stream.point(-pi$3, 0);
7866 stream.point(-pi$3, phi);
7867 } else if (abs(from[0] - to[0]) > epsilon$2) {
7868 var lambda = from[0] < to[0] ? pi$3 : -pi$3;
7869 phi = direction * lambda / 2;
7870 stream.point(-lambda, phi);
7871 stream.point(0, phi);
7872 stream.point(lambda, phi);
7874 stream.point(to[0], to[1]);
7878 function clipCircle(radius) {
7879 var cr = cos$1(radius),
7880 delta = 6 * radians,
7881 smallRadius = cr > 0,
7882 notHemisphere = abs(cr) > epsilon$2; // TODO optimise for this common case
7884 function interpolate(from, to, direction, stream) {
7885 circleStream(stream, radius, delta, direction, from, to);
7888 function visible(lambda, phi) {
7889 return cos$1(lambda) * cos$1(phi) > cr;
7892 // Takes a line and cuts into visible segments. Return values used for polygon
7893 // clipping: 0 - there were intersections or the line was empty; 1 - no
7894 // intersections 2 - there were intersections, and the first and last segments
7895 // should be rejoined.
7896 function clipLine(stream) {
7897 var point0, // previous point
7898 c0, // code for previous point
7899 v0, // visibility of previous point
7900 v00, // visibility of first point
7901 clean; // no intersections
7903 lineStart: function() {
7907 point: function(lambda, phi) {
7908 var point1 = [lambda, phi],
7910 v = visible(lambda, phi),
7912 ? v ? 0 : code(lambda, phi)
7913 : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
7914 if (!point0 && (v00 = v0 = v)) stream.lineStart();
7915 // Handle degeneracies.
7916 // TODO ignore if not clipping polygons.
7918 point2 = intersect(point0, point1);
7919 if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {
7920 point1[0] += epsilon$2;
7921 point1[1] += epsilon$2;
7922 v = visible(point1[0], point1[1]);
7930 point2 = intersect(point1, point0);
7931 stream.point(point2[0], point2[1]);
7934 point2 = intersect(point0, point1);
7935 stream.point(point2[0], point2[1]);
7939 } else if (notHemisphere && point0 && smallRadius ^ v) {
7941 // If the codes for two points are different, or are both zero,
7942 // and there this segment intersects with the small circle.
7943 if (!(c & c0) && (t = intersect(point1, point0, true))) {
7947 stream.point(t[0][0], t[0][1]);
7948 stream.point(t[1][0], t[1][1]);
7951 stream.point(t[1][0], t[1][1]);
7954 stream.point(t[0][0], t[0][1]);
7958 if (v && (!point0 || !pointEqual(point0, point1))) {
7959 stream.point(point1[0], point1[1]);
7961 point0 = point1, v0 = v, c0 = c;
7963 lineEnd: function() {
7964 if (v0) stream.lineEnd();
7967 // Rejoin first and last segments if there were intersections and the first
7968 // and last points were visible.
7970 return clean | ((v00 && v0) << 1);
7975 // Intersects the great circle between a and b with the clip circle.
7976 function intersect(a, b, two) {
7977 var pa = cartesian(a),
7980 // We have two planes, n1.p = d1 and n2.p = d2.
7981 // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
7982 var n1 = [1, 0, 0], // normal
7983 n2 = cartesianCross(pa, pb),
7984 n2n2 = cartesianDot(n2, n2),
7985 n1n2 = n2[0], // cartesianDot(n1, n2),
7986 determinant = n2n2 - n1n2 * n1n2;
7988 // Two polar points.
7989 if (!determinant) return !two && a;
7991 var c1 = cr * n2n2 / determinant,
7992 c2 = -cr * n1n2 / determinant,
7993 n1xn2 = cartesianCross(n1, n2),
7994 A = cartesianScale(n1, c1),
7995 B = cartesianScale(n2, c2);
7996 cartesianAddInPlace(A, B);
7998 // Solve |p(t)|^2 = 1.
8000 w = cartesianDot(A, u),
8001 uu = cartesianDot(u, u),
8002 t2 = w * w - uu * (cartesianDot(A, A) - 1);
8007 q = cartesianScale(u, (-w - t) / uu);
8008 cartesianAddInPlace(q, A);
8013 // Two intersection points.
8020 if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
8022 var delta = lambda1 - lambda0,
8023 polar = abs(delta - pi$3) < epsilon$2,
8024 meridian = polar || delta < epsilon$2;
8026 if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
8028 // Check that the first point is between a and b.
8031 ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon$2 ? phi0 : phi1)
8032 : phi0 <= q[1] && q[1] <= phi1
8033 : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
8034 var q1 = cartesianScale(u, (-w + t) / uu);
8035 cartesianAddInPlace(q1, A);
8036 return [q, spherical(q1)];
8040 // Generates a 4-bit vector representing the location of a point relative to
8041 // the small circle's bounding box.
8042 function code(lambda, phi) {
8043 var r = smallRadius ? radius : pi$3 - radius,
8045 if (lambda < -r) code |= 1; // left
8046 else if (lambda > r) code |= 2; // right
8047 if (phi < -r) code |= 4; // below
8048 else if (phi > r) code |= 8; // above
8052 return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
8055 function clipLine(a, b, x0, y0, x1, y1) {
8067 if (!dx && r > 0) return;
8072 } else if (dx > 0) {
8078 if (!dx && r < 0) return;
8083 } else if (dx > 0) {
8089 if (!dy && r > 0) return;
8094 } else if (dy > 0) {
8100 if (!dy && r < 0) return;
8105 } else if (dy > 0) {
8110 if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
8111 if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
8115 var clipMax = 1e9, clipMin = -clipMax;
8117 // TODO Use d3-polygon’s polygonContains here for the ring check?
8118 // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
8120 function clipRectangle(x0, y0, x1, y1) {
8122 function visible(x, y) {
8123 return x0 <= x && x <= x1 && y0 <= y && y <= y1;
8126 function interpolate(from, to, direction, stream) {
8129 || (a = corner(from, direction)) !== (a1 = corner(to, direction))
8130 || comparePoint(from, to) < 0 ^ direction > 0) {
8131 do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
8132 while ((a = (a + direction + 4) % 4) !== a1);
8134 stream.point(to[0], to[1]);
8138 function corner(p, direction) {
8139 return abs(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3
8140 : abs(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1
8141 : abs(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0
8142 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
8145 function compareIntersection(a, b) {
8146 return comparePoint(a.x, b.x);
8149 function comparePoint(a, b) {
8150 var ca = corner(a, 1),
8152 return ca !== cb ? ca - cb
8153 : ca === 0 ? b[1] - a[1]
8154 : ca === 1 ? a[0] - b[0]
8155 : ca === 2 ? a[1] - b[1]
8159 return function(stream) {
8160 var activeStream = stream,
8161 bufferStream = clipBuffer(),
8165 x__, y__, v__, // first point
8166 x_, y_, v_, // previous point
8172 lineStart: lineStart,
8174 polygonStart: polygonStart,
8175 polygonEnd: polygonEnd
8178 function point(x, y) {
8179 if (visible(x, y)) activeStream.point(x, y);
8182 function polygonInside() {
8185 for (var i = 0, n = polygon.length; i < n; ++i) {
8186 for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
8187 a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
8188 if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
8189 else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
8196 // Buffer geometry within a polygon and then clip it en masse.
8197 function polygonStart() {
8198 activeStream = bufferStream, segments = [], polygon = [], clean = true;
8201 function polygonEnd() {
8202 var startInside = polygonInside(),
8203 cleanInside = clean && startInside,
8204 visible = (segments = merge(segments)).length;
8205 if (cleanInside || visible) {
8206 stream.polygonStart();
8209 interpolate(null, null, 1, stream);
8213 clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
8215 stream.polygonEnd();
8217 activeStream = stream, segments = polygon = ring = null;
8220 function lineStart() {
8221 clipStream.point = linePoint;
8222 if (polygon) polygon.push(ring = []);
8228 // TODO rather than special-case polygons, simply handle them separately.
8229 // Ideally, coincident intersection points should be jittered to avoid
8231 function lineEnd() {
8233 linePoint(x__, y__);
8234 if (v__ && v_) bufferStream.rejoin();
8235 segments.push(bufferStream.result());
8237 clipStream.point = point;
8238 if (v_) activeStream.lineEnd();
8241 function linePoint(x, y) {
8242 var v = visible(x, y);
8243 if (polygon) ring.push([x, y]);
8245 x__ = x, y__ = y, v__ = v;
8248 activeStream.lineStart();
8249 activeStream.point(x, y);
8252 if (v && v_) activeStream.point(x, y);
8254 var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
8255 b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
8256 if (clipLine(a, b, x0, y0, x1, y1)) {
8258 activeStream.lineStart();
8259 activeStream.point(a[0], a[1]);
8261 activeStream.point(b[0], b[1]);
8262 if (!v) activeStream.lineEnd();
8265 activeStream.lineStart();
8266 activeStream.point(x, y);
8271 x_ = x, y_ = y, v_ = v;
8278 function extent$1() {
8288 stream: function(stream) {
8289 return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
8291 extent: function(_) {
8292 return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
8297 var lengthSum = adder(),
8302 var lengthStream = {
8305 lineStart: lengthLineStart,
8307 polygonStart: noop$1,
8311 function lengthLineStart() {
8312 lengthStream.point = lengthPointFirst;
8313 lengthStream.lineEnd = lengthLineEnd;
8316 function lengthLineEnd() {
8317 lengthStream.point = lengthStream.lineEnd = noop$1;
8320 function lengthPointFirst(lambda, phi) {
8321 lambda *= radians, phi *= radians;
8322 lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi);
8323 lengthStream.point = lengthPoint;
8326 function lengthPoint(lambda, phi) {
8327 lambda *= radians, phi *= radians;
8328 var sinPhi = sin$1(phi),
8329 cosPhi = cos$1(phi),
8330 delta = abs(lambda - lambda0$2),
8331 cosDelta = cos$1(delta),
8332 sinDelta = sin$1(delta),
8333 x = cosPhi * sinDelta,
8334 y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
8335 z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
8336 lengthSum.add(atan2(sqrt(x * x + y * y), z));
8337 lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
8340 function length$1(object) {
8342 geoStream(object, lengthStream);
8346 var coordinates = [null, null],
8347 object$1 = {type: "LineString", coordinates: coordinates};
8349 function distance(a, b) {
8352 return length$1(object$1);
8355 var containsObjectType = {
8356 Feature: function(object, point) {
8357 return containsGeometry(object.geometry, point);
8359 FeatureCollection: function(object, point) {
8360 var features = object.features, i = -1, n = features.length;
8361 while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
8366 var containsGeometryType = {
8367 Sphere: function() {
8370 Point: function(object, point) {
8371 return containsPoint(object.coordinates, point);
8373 MultiPoint: function(object, point) {
8374 var coordinates = object.coordinates, i = -1, n = coordinates.length;
8375 while (++i < n) if (containsPoint(coordinates[i], point)) return true;
8378 LineString: function(object, point) {
8379 return containsLine(object.coordinates, point);
8381 MultiLineString: function(object, point) {
8382 var coordinates = object.coordinates, i = -1, n = coordinates.length;
8383 while (++i < n) if (containsLine(coordinates[i], point)) return true;
8386 Polygon: function(object, point) {
8387 return containsPolygon(object.coordinates, point);
8389 MultiPolygon: function(object, point) {
8390 var coordinates = object.coordinates, i = -1, n = coordinates.length;
8391 while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
8394 GeometryCollection: function(object, point) {
8395 var geometries = object.geometries, i = -1, n = geometries.length;
8396 while (++i < n) if (containsGeometry(geometries[i], point)) return true;
8401 function containsGeometry(geometry, point) {
8402 return geometry && containsGeometryType.hasOwnProperty(geometry.type)
8403 ? containsGeometryType[geometry.type](geometry, point)
8407 function containsPoint(coordinates, point) {
8408 return distance(coordinates, point) === 0;
8411 function containsLine(coordinates, point) {
8412 var ab = distance(coordinates[0], coordinates[1]),
8413 ao = distance(coordinates[0], point),
8414 ob = distance(point, coordinates[1]);
8415 return ao + ob <= ab + epsilon$2;
8418 function containsPolygon(coordinates, point) {
8419 return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
8422 function ringRadians(ring) {
8423 return ring = ring.map(pointRadians), ring.pop(), ring;
8426 function pointRadians(point) {
8427 return [point[0] * radians, point[1] * radians];
8430 function contains(object, point) {
8431 return (object && containsObjectType.hasOwnProperty(object.type)
8432 ? containsObjectType[object.type]
8433 : containsGeometry)(object, point);
8436 function graticuleX(y0, y1, dy) {
8437 var y = range(y0, y1 - epsilon$2, dy).concat(y1);
8438 return function(x) { return y.map(function(y) { return [x, y]; }); };
8441 function graticuleY(x0, x1, dx) {
8442 var x = range(x0, x1 - epsilon$2, dx).concat(x1);
8443 return function(y) { return x.map(function(x) { return [x, y]; }); };
8446 function graticule() {
8449 dx = 10, dy = dx, DX = 90, DY = 360,
8453 function graticule() {
8454 return {type: "MultiLineString", coordinates: lines()};
8458 return range(ceil(X0 / DX) * DX, X1, DX).map(X)
8459 .concat(range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
8460 .concat(range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x))
8461 .concat(range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon$2; }).map(y));
8464 graticule.lines = function() {
8465 return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
8468 graticule.outline = function() {
8474 X(X1).reverse().slice(1),
8475 Y(Y0).reverse().slice(1))
8480 graticule.extent = function(_) {
8481 if (!arguments.length) return graticule.extentMinor();
8482 return graticule.extentMajor(_).extentMinor(_);
8485 graticule.extentMajor = function(_) {
8486 if (!arguments.length) return [[X0, Y0], [X1, Y1]];
8487 X0 = +_[0][0], X1 = +_[1][0];
8488 Y0 = +_[0][1], Y1 = +_[1][1];
8489 if (X0 > X1) _ = X0, X0 = X1, X1 = _;
8490 if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
8491 return graticule.precision(precision);
8494 graticule.extentMinor = function(_) {
8495 if (!arguments.length) return [[x0, y0], [x1, y1]];
8496 x0 = +_[0][0], x1 = +_[1][0];
8497 y0 = +_[0][1], y1 = +_[1][1];
8498 if (x0 > x1) _ = x0, x0 = x1, x1 = _;
8499 if (y0 > y1) _ = y0, y0 = y1, y1 = _;
8500 return graticule.precision(precision);
8503 graticule.step = function(_) {
8504 if (!arguments.length) return graticule.stepMinor();
8505 return graticule.stepMajor(_).stepMinor(_);
8508 graticule.stepMajor = function(_) {
8509 if (!arguments.length) return [DX, DY];
8510 DX = +_[0], DY = +_[1];
8514 graticule.stepMinor = function(_) {
8515 if (!arguments.length) return [dx, dy];
8516 dx = +_[0], dy = +_[1];
8520 graticule.precision = function(_) {
8521 if (!arguments.length) return precision;
8523 x = graticuleX(y0, y1, 90);
8524 y = graticuleY(x0, x1, precision);
8525 X = graticuleX(Y0, Y1, 90);
8526 Y = graticuleY(X0, X1, precision);
8531 .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
8532 .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
8535 function graticule10() {
8536 return graticule()();
8539 function interpolate$2(a, b) {
8540 var x0 = a[0] * radians,
8541 y0 = a[1] * radians,
8542 x1 = b[0] * radians,
8543 y1 = b[1] * radians,
8548 kx0 = cy0 * cos$1(x0),
8549 ky0 = cy0 * sin$1(x0),
8550 kx1 = cy1 * cos$1(x1),
8551 ky1 = cy1 * sin$1(x1),
8552 d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
8555 var interpolate = d ? function(t) {
8556 var B = sin$1(t *= d) / k,
8557 A = sin$1(d - t) / k,
8558 x = A * kx0 + B * kx1,
8559 y = A * ky0 + B * ky1,
8560 z = A * sy0 + B * sy1;
8562 atan2(y, x) * degrees$1,
8563 atan2(z, sqrt(x * x + y * y)) * degrees$1
8566 return [x0 * degrees$1, y0 * degrees$1];
8569 interpolate.distance = d;
8574 function identity$4(x) {
8578 var areaSum$1 = adder(),
8579 areaRingSum$1 = adder(),
8585 var areaStream$1 = {
8589 polygonStart: function() {
8590 areaStream$1.lineStart = areaRingStart$1;
8591 areaStream$1.lineEnd = areaRingEnd$1;
8593 polygonEnd: function() {
8594 areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$1;
8595 areaSum$1.add(abs(areaRingSum$1));
8596 areaRingSum$1.reset();
8598 result: function() {
8599 var area = areaSum$1 / 2;
8605 function areaRingStart$1() {
8606 areaStream$1.point = areaPointFirst$1;
8609 function areaPointFirst$1(x, y) {
8610 areaStream$1.point = areaPoint$1;
8611 x00 = x0$1 = x, y00 = y0$1 = y;
8614 function areaPoint$1(x, y) {
8615 areaRingSum$1.add(y0$1 * x - x0$1 * y);
8619 function areaRingEnd$1() {
8620 areaPoint$1(x00, y00);
8623 var x0$2 = Infinity,
8628 var boundsStream$1 = {
8629 point: boundsPoint$1,
8632 polygonStart: noop$1,
8634 result: function() {
8635 var bounds = [[x0$2, y0$2], [x1, y1]];
8636 x1 = y1 = -(y0$2 = x0$2 = Infinity);
8641 function boundsPoint$1(x, y) {
8642 if (x < x0$2) x0$2 = x;
8644 if (y < y0$2) y0$2 = y;
8648 // TODO Enforce positive area for exterior, negative area for interior?
8664 var centroidStream$1 = {
8665 point: centroidPoint$1,
8666 lineStart: centroidLineStart$1,
8667 lineEnd: centroidLineEnd$1,
8668 polygonStart: function() {
8669 centroidStream$1.lineStart = centroidRingStart$1;
8670 centroidStream$1.lineEnd = centroidRingEnd$1;
8672 polygonEnd: function() {
8673 centroidStream$1.point = centroidPoint$1;
8674 centroidStream$1.lineStart = centroidLineStart$1;
8675 centroidStream$1.lineEnd = centroidLineEnd$1;
8677 result: function() {
8678 var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
8679 : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
8680 : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
8682 X0$1 = Y0$1 = Z0$1 =
8683 X1$1 = Y1$1 = Z1$1 =
8684 X2$1 = Y2$1 = Z2$1 = 0;
8689 function centroidPoint$1(x, y) {
8695 function centroidLineStart$1() {
8696 centroidStream$1.point = centroidPointFirstLine;
8699 function centroidPointFirstLine(x, y) {
8700 centroidStream$1.point = centroidPointLine;
8701 centroidPoint$1(x0$3 = x, y0$3 = y);
8704 function centroidPointLine(x, y) {
8705 var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
8706 X1$1 += z * (x0$3 + x) / 2;
8707 Y1$1 += z * (y0$3 + y) / 2;
8709 centroidPoint$1(x0$3 = x, y0$3 = y);
8712 function centroidLineEnd$1() {
8713 centroidStream$1.point = centroidPoint$1;
8716 function centroidRingStart$1() {
8717 centroidStream$1.point = centroidPointFirstRing;
8720 function centroidRingEnd$1() {
8721 centroidPointRing(x00$1, y00$1);
8724 function centroidPointFirstRing(x, y) {
8725 centroidStream$1.point = centroidPointRing;
8726 centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
8729 function centroidPointRing(x, y) {
8732 z = sqrt(dx * dx + dy * dy);
8734 X1$1 += z * (x0$3 + x) / 2;
8735 Y1$1 += z * (y0$3 + y) / 2;
8738 z = y0$3 * x - x0$3 * y;
8739 X2$1 += z * (x0$3 + x);
8740 Y2$1 += z * (y0$3 + y);
8742 centroidPoint$1(x0$3 = x, y0$3 = y);
8745 function PathContext(context) {
8746 this._context = context;
8749 PathContext.prototype = {
8751 pointRadius: function(_) {
8752 return this._radius = _, this;
8754 polygonStart: function() {
8757 polygonEnd: function() {
8760 lineStart: function() {
8763 lineEnd: function() {
8764 if (this._line === 0) this._context.closePath();
8767 point: function(x, y) {
8768 switch (this._point) {
8770 this._context.moveTo(x, y);
8775 this._context.lineTo(x, y);
8779 this._context.moveTo(x + this._radius, y);
8780 this._context.arc(x, y, this._radius, 0, tau$3);
8788 var lengthSum$1 = adder(),
8795 var lengthStream$1 = {
8797 lineStart: function() {
8798 lengthStream$1.point = lengthPointFirst$1;
8800 lineEnd: function() {
8801 if (lengthRing) lengthPoint$1(x00$2, y00$2);
8802 lengthStream$1.point = noop$1;
8804 polygonStart: function() {
8807 polygonEnd: function() {
8810 result: function() {
8811 var length = +lengthSum$1;
8812 lengthSum$1.reset();
8817 function lengthPointFirst$1(x, y) {
8818 lengthStream$1.point = lengthPoint$1;
8819 x00$2 = x0$4 = x, y00$2 = y0$4 = y;
8822 function lengthPoint$1(x, y) {
8823 x0$4 -= x, y0$4 -= y;
8824 lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4));
8828 function PathString() {
8832 PathString.prototype = {
8834 _circle: circle$1(4.5),
8835 pointRadius: function(_) {
8836 if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
8839 polygonStart: function() {
8842 polygonEnd: function() {
8845 lineStart: function() {
8848 lineEnd: function() {
8849 if (this._line === 0) this._string.push("Z");
8852 point: function(x, y) {
8853 switch (this._point) {
8855 this._string.push("M", x, ",", y);
8860 this._string.push("L", x, ",", y);
8864 if (this._circle == null) this._circle = circle$1(this._radius);
8865 this._string.push("M", x, ",", y, this._circle);
8870 result: function() {
8871 if (this._string.length) {
8872 var result = this._string.join("");
8881 function circle$1(radius) {
8882 return "m0," + radius
8883 + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
8884 + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
8888 function d3_geoPath(projection, context) {
8889 var pointRadius = 4.5,
8893 function path(object) {
8895 if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
8896 geoStream(object, projectionStream(contextStream));
8898 return contextStream.result();
8901 path.area = function(object) {
8902 geoStream(object, projectionStream(areaStream$1));
8903 return areaStream$1.result();
8906 path.measure = function(object) {
8907 geoStream(object, projectionStream(lengthStream$1));
8908 return lengthStream$1.result();
8911 path.bounds = function(object) {
8912 geoStream(object, projectionStream(boundsStream$1));
8913 return boundsStream$1.result();
8916 path.centroid = function(object) {
8917 geoStream(object, projectionStream(centroidStream$1));
8918 return centroidStream$1.result();
8921 path.projection = function(_) {
8922 return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
8925 path.context = function(_) {
8926 if (!arguments.length) return context;
8927 contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
8928 if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
8932 path.pointRadius = function(_) {
8933 if (!arguments.length) return pointRadius;
8934 pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
8938 return path.projection(projection).context(context);
8941 function d3_geoTransform(methods) {
8943 stream: transformer(methods)
8947 function transformer(methods) {
8948 return function(stream) {
8949 var s = new TransformStream;
8950 for (var key in methods) s[key] = methods[key];
8956 function TransformStream() {}
8958 TransformStream.prototype = {
8959 constructor: TransformStream,
8960 point: function(x, y) { this.stream.point(x, y); },
8961 sphere: function() { this.stream.sphere(); },
8962 lineStart: function() { this.stream.lineStart(); },
8963 lineEnd: function() { this.stream.lineEnd(); },
8964 polygonStart: function() { this.stream.polygonStart(); },
8965 polygonEnd: function() { this.stream.polygonEnd(); }
8968 function fit(projection, fitBounds, object) {
8969 var clip = projection.clipExtent && projection.clipExtent();
8970 projection.scale(150).translate([0, 0]);
8971 if (clip != null) projection.clipExtent(null);
8972 geoStream(object, projection.stream(boundsStream$1));
8973 fitBounds(boundsStream$1.result());
8974 if (clip != null) projection.clipExtent(clip);
8978 function fitExtent(projection, extent, object) {
8979 return fit(projection, function(b) {
8980 var w = extent[1][0] - extent[0][0],
8981 h = extent[1][1] - extent[0][1],
8982 k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
8983 x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
8984 y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
8985 projection.scale(150 * k).translate([x, y]);
8989 function fitSize(projection, size, object) {
8990 return fitExtent(projection, [[0, 0], size], object);
8993 function fitWidth(projection, width, object) {
8994 return fit(projection, function(b) {
8996 k = w / (b[1][0] - b[0][0]),
8997 x = (w - k * (b[1][0] + b[0][0])) / 2,
8999 projection.scale(150 * k).translate([x, y]);
9003 function fitHeight(projection, height, object) {
9004 return fit(projection, function(b) {
9006 k = h / (b[1][1] - b[0][1]),
9008 y = (h - k * (b[1][1] + b[0][1])) / 2;
9009 projection.scale(150 * k).translate([x, y]);
9013 var maxDepth = 16, // maximum depth of subdivision
9014 cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
9016 function resample(project, delta2) {
9017 return +delta2 ? resample$1(project, delta2) : resampleNone(project);
9020 function resampleNone(project) {
9021 return transformer({
9022 point: function(x, y) {
9024 this.stream.point(x[0], x[1]);
9029 function resample$1(project, delta2) {
9031 function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
9034 d2 = dx * dx + dy * dy;
9035 if (d2 > 4 * delta2 && depth--) {
9039 m = sqrt(a * a + b * b + c * c),
9040 phi2 = asin(c /= m),
9041 lambda2 = abs(abs(c) - 1) < epsilon$2 || abs(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a),
9042 p = project(lambda2, phi2),
9047 dz = dy * dx2 - dx * dy2;
9048 if (dz * dz / d2 > delta2 // perpendicular projected distance
9049 || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
9050 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
9051 resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
9052 stream.point(x2, y2);
9053 resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
9057 return function(stream) {
9058 var lambda00, x00, y00, a00, b00, c00, // first point
9059 lambda0, x0, y0, a0, b0, c0; // previous point
9061 var resampleStream = {
9063 lineStart: lineStart,
9065 polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
9066 polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
9069 function point(x, y) {
9071 stream.point(x[0], x[1]);
9074 function lineStart() {
9076 resampleStream.point = linePoint;
9080 function linePoint(lambda, phi) {
9081 var c = cartesian([lambda, phi]), p = project(lambda, phi);
9082 resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
9083 stream.point(x0, y0);
9086 function lineEnd() {
9087 resampleStream.point = point;
9091 function ringStart() {
9093 resampleStream.point = ringPoint;
9094 resampleStream.lineEnd = ringEnd;
9097 function ringPoint(lambda, phi) {
9098 linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
9099 resampleStream.point = linePoint;
9102 function ringEnd() {
9103 resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
9104 resampleStream.lineEnd = lineEnd;
9108 return resampleStream;
9112 var transformRadians = transformer({
9113 point: function(x, y) {
9114 this.stream.point(x * radians, y * radians);
9118 function transformRotate(rotate) {
9119 return transformer({
9120 point: function(x, y) {
9121 var r = rotate(x, y);
9122 return this.stream.point(r[0], r[1]);
9127 function projection(project) {
9128 return projectionMutator(function() { return project; })();
9131 function projectionMutator(projectAt) {
9134 x = 480, y = 250, // translate
9135 dx, dy, lambda = 0, phi = 0, // center
9136 deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, projectRotate, // rotate
9137 theta = null, preclip = clipAntimeridian, // clip angle
9138 x0 = null, y0, x1, y1, postclip = identity$4, // clip extent
9139 delta2 = 0.5, projectResample = resample(projectTransform, delta2), // precision
9143 function projection(point) {
9144 point = projectRotate(point[0] * radians, point[1] * radians);
9145 return [point[0] * k + dx, dy - point[1] * k];
9148 function invert(point) {
9149 point = projectRotate.invert((point[0] - dx) / k, (dy - point[1]) / k);
9150 return point && [point[0] * degrees$1, point[1] * degrees$1];
9153 function projectTransform(x, y) {
9154 return x = project(x, y), [x[0] * k + dx, dy - x[1] * k];
9157 projection.stream = function(stream) {
9158 return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
9161 projection.preclip = function(_) {
9162 return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
9165 projection.postclip = function(_) {
9166 return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9169 projection.clipAngle = function(_) {
9170 return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
9173 projection.clipExtent = function(_) {
9174 return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9177 projection.scale = function(_) {
9178 return arguments.length ? (k = +_, recenter()) : k;
9181 projection.translate = function(_) {
9182 return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
9185 projection.center = function(_) {
9186 return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
9189 projection.rotate = function(_) {
9190 return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees$1, deltaPhi * degrees$1, deltaGamma * degrees$1];
9193 projection.precision = function(_) {
9194 return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
9197 projection.fitExtent = function(extent, object) {
9198 return fitExtent(projection, extent, object);
9201 projection.fitSize = function(size, object) {
9202 return fitSize(projection, size, object);
9205 projection.fitWidth = function(width, object) {
9206 return fitWidth(projection, width, object);
9209 projection.fitHeight = function(height, object) {
9210 return fitHeight(projection, height, object);
9213 function recenter() {
9214 projectRotate = compose(rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma), project);
9215 var center = project(lambda, phi);
9216 dx = x - center[0] * k;
9217 dy = y + center[1] * k;
9222 cache = cacheStream = null;
9227 project = projectAt.apply(this, arguments);
9228 projection.invert = project.invert && invert;
9233 function conicProjection(projectAt) {
9236 m = projectionMutator(projectAt),
9239 p.parallels = function(_) {
9240 return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
9246 function cylindricalEqualAreaRaw(phi0) {
9247 var cosPhi0 = cos$1(phi0);
9249 function forward(lambda, phi) {
9250 return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
9253 forward.invert = function(x, y) {
9254 return [x / cosPhi0, asin(y * cosPhi0)];
9260 function conicEqualAreaRaw(y0, y1) {
9261 var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
9263 // Are the parallels symmetrical around the Equator?
9264 if (abs(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
9266 var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
9268 function project(x, y) {
9269 var r = sqrt(c - 2 * n * sin$1(y)) / n;
9270 return [r * sin$1(x *= n), r0 - r * cos$1(x)];
9273 project.invert = function(x, y) {
9275 return [atan2(x, abs(r0y)) / n * sign(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
9281 function conicEqualArea() {
9282 return conicProjection(conicEqualAreaRaw)
9284 .center([0, 33.6442]);
9288 return conicEqualArea()
9289 .parallels([29.5, 45.5])
9291 .translate([480, 250])
9293 .center([-0.6, 38.7]);
9296 // The projections must have mutually exclusive clip regions on the sphere,
9297 // as this will avoid emitting interleaving lines and polygons.
9298 function multiplex(streams) {
9299 var n = streams.length;
9301 point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
9302 sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
9303 lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
9304 lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
9305 polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
9306 polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
9310 // A composite projection for the United States, configured by default for
9311 // 960×500. The projection also works quite well at 960×600 if you change the
9312 // scale to 1285 and adjust the translate accordingly. The set of standard
9313 // parallels for each region comes from USGS, which is published here:
9314 // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
9315 function albersUsa() {
9318 lower48 = albers(), lower48Point,
9319 alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
9320 hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
9321 point, pointStream = {point: function(x, y) { point = [x, y]; }};
9323 function albersUsa(coordinates) {
9324 var x = coordinates[0], y = coordinates[1];
9325 return point = null,
9326 (lower48Point.point(x, y), point)
9327 || (alaskaPoint.point(x, y), point)
9328 || (hawaiiPoint.point(x, y), point);
9331 albersUsa.invert = function(coordinates) {
9332 var k = lower48.scale(),
9333 t = lower48.translate(),
9334 x = (coordinates[0] - t[0]) / k,
9335 y = (coordinates[1] - t[1]) / k;
9336 return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
9337 : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
9338 : lower48).invert(coordinates);
9341 albersUsa.stream = function(stream) {
9342 return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
9345 albersUsa.precision = function(_) {
9346 if (!arguments.length) return lower48.precision();
9347 lower48.precision(_), alaska.precision(_), hawaii.precision(_);
9351 albersUsa.scale = function(_) {
9352 if (!arguments.length) return lower48.scale();
9353 lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
9354 return albersUsa.translate(lower48.translate());
9357 albersUsa.translate = function(_) {
9358 if (!arguments.length) return lower48.translate();
9359 var k = lower48.scale(), x = +_[0], y = +_[1];
9361 lower48Point = lower48
9363 .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
9364 .stream(pointStream);
9366 alaskaPoint = alaska
9367 .translate([x - 0.307 * k, y + 0.201 * k])
9368 .clipExtent([[x - 0.425 * k + epsilon$2, y + 0.120 * k + epsilon$2], [x - 0.214 * k - epsilon$2, y + 0.234 * k - epsilon$2]])
9369 .stream(pointStream);
9371 hawaiiPoint = hawaii
9372 .translate([x - 0.205 * k, y + 0.212 * k])
9373 .clipExtent([[x - 0.214 * k + epsilon$2, y + 0.166 * k + epsilon$2], [x - 0.115 * k - epsilon$2, y + 0.234 * k - epsilon$2]])
9374 .stream(pointStream);
9379 albersUsa.fitExtent = function(extent, object) {
9380 return fitExtent(albersUsa, extent, object);
9383 albersUsa.fitSize = function(size, object) {
9384 return fitSize(albersUsa, size, object);
9387 albersUsa.fitWidth = function(width, object) {
9388 return fitWidth(albersUsa, width, object);
9391 albersUsa.fitHeight = function(height, object) {
9392 return fitHeight(albersUsa, height, object);
9396 cache = cacheStream = null;
9400 return albersUsa.scale(1070);
9403 function azimuthalRaw(scale) {
9404 return function(x, y) {
9415 function azimuthalInvert(angle) {
9416 return function(x, y) {
9417 var z = sqrt(x * x + y * y),
9422 atan2(x * sc, z * cc),
9423 asin(z && y * sc / z)
9428 var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
9429 return sqrt(2 / (1 + cxcy));
9432 azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
9433 return 2 * asin(z / 2);
9436 function azimuthalEqualArea() {
9437 return projection(azimuthalEqualAreaRaw)
9439 .clipAngle(180 - 1e-3);
9442 var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
9443 return (c = acos(c)) && c / sin$1(c);
9446 azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
9450 function azimuthalEquidistant() {
9451 return projection(azimuthalEquidistantRaw)
9453 .clipAngle(180 - 1e-3);
9456 function mercatorRaw(lambda, phi) {
9457 return [lambda, log(tan((halfPi$2 + phi) / 2))];
9460 mercatorRaw.invert = function(x, y) {
9461 return [x, 2 * atan(exp(y)) - halfPi$2];
9464 function mercator() {
9465 return mercatorProjection(mercatorRaw)
9466 .scale(961 / tau$3);
9469 function mercatorProjection(project) {
9470 var m = projection(project),
9473 translate = m.translate,
9474 clipExtent = m.clipExtent,
9475 x0 = null, y0, x1, y1; // clip extent
9477 m.scale = function(_) {
9478 return arguments.length ? (scale(_), reclip()) : scale();
9481 m.translate = function(_) {
9482 return arguments.length ? (translate(_), reclip()) : translate();
9485 m.center = function(_) {
9486 return arguments.length ? (center(_), reclip()) : center();
9489 m.clipExtent = function(_) {
9490 return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9494 var k = pi$3 * scale(),
9495 t = m(rotation(m.rotate()).invert([0, 0]));
9496 return clipExtent(x0 == null
9497 ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
9498 ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
9499 : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
9506 return tan((halfPi$2 + y) / 2);
9509 function conicConformalRaw(y0, y1) {
9510 var cy0 = cos$1(y0),
9511 n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
9512 f = cy0 * pow(tany(y0), n) / n;
9514 if (!n) return mercatorRaw;
9516 function project(x, y) {
9517 if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
9518 else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
9519 var r = f / pow(tany(y), n);
9520 return [r * sin$1(n * x), f - r * cos$1(n * x)];
9523 project.invert = function(x, y) {
9524 var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy);
9525 return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
9531 function conicConformal() {
9532 return conicProjection(conicConformalRaw)
9534 .parallels([30, 30]);
9537 function equirectangularRaw(lambda, phi) {
9538 return [lambda, phi];
9541 equirectangularRaw.invert = equirectangularRaw;
9543 function equirectangular() {
9544 return projection(equirectangularRaw)
9548 function conicEquidistantRaw(y0, y1) {
9549 var cy0 = cos$1(y0),
9550 n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
9553 if (abs(n) < epsilon$2) return equirectangularRaw;
9555 function project(x, y) {
9556 var gy = g - y, nx = n * x;
9557 return [gy * sin$1(nx), g - gy * cos$1(nx)];
9560 project.invert = function(x, y) {
9562 return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];
9568 function conicEquidistant() {
9569 return conicProjection(conicEquidistantRaw)
9571 .center([0, 13.9389]);
9574 function gnomonicRaw(x, y) {
9575 var cy = cos$1(y), k = cos$1(x) * cy;
9576 return [cy * sin$1(x) / k, sin$1(y) / k];
9579 gnomonicRaw.invert = azimuthalInvert(atan);
9581 function gnomonic() {
9582 return projection(gnomonicRaw)
9587 function scaleTranslate(kx, ky, tx, ty) {
9588 return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
9589 point: function(x, y) {
9590 this.stream.point(x * kx + tx, y * ky + ty);
9595 function d3_geoIdentity() {
9596 var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
9597 x0 = null, y0, x1, y1, // clip extent
9598 postclip = identity$4,
9604 cache = cacheStream = null;
9608 return projection = {
9609 stream: function(stream) {
9610 return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
9612 postclip: function(_) {
9613 return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9615 clipExtent: function(_) {
9616 return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity$4) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
9618 scale: function(_) {
9619 return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
9621 translate: function(_) {
9622 return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
9624 reflectX: function(_) {
9625 return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
9627 reflectY: function(_) {
9628 return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
9630 fitExtent: function(extent, object) {
9631 return fitExtent(projection, extent, object);
9633 fitSize: function(size, object) {
9634 return fitSize(projection, size, object);
9636 fitWidth: function(width, object) {
9637 return fitWidth(projection, width, object);
9639 fitHeight: function(height, object) {
9640 return fitHeight(projection, height, object);
9645 function naturalEarth1Raw(lambda, phi) {
9646 var phi2 = phi * phi, phi4 = phi2 * phi2;
9648 lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
9649 phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
9653 naturalEarth1Raw.invert = function(x, y) {
9654 var phi = y, i = 25, delta;
9656 var phi2 = phi * phi, phi4 = phi2 * phi2;
9657 phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
9658 (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
9659 } while (abs(delta) > epsilon$2 && --i > 0);
9661 x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
9666 function naturalEarth1() {
9667 return projection(naturalEarth1Raw)
9671 function orthographicRaw(x, y) {
9672 return [cos$1(y) * sin$1(x), sin$1(y)];
9675 orthographicRaw.invert = azimuthalInvert(asin);
9677 function orthographic() {
9678 return projection(orthographicRaw)
9680 .clipAngle(90 + epsilon$2);
9683 function stereographicRaw(x, y) {
9684 var cy = cos$1(y), k = 1 + cos$1(x) * cy;
9685 return [cy * sin$1(x) / k, sin$1(y) / k];
9688 stereographicRaw.invert = azimuthalInvert(function(z) {
9692 function stereographic() {
9693 return projection(stereographicRaw)
9698 function transverseMercatorRaw(lambda, phi) {
9699 return [log(tan((halfPi$2 + phi) / 2)), -lambda];
9702 transverseMercatorRaw.invert = function(x, y) {
9703 return [-y, 2 * atan(exp(x)) - halfPi$2];
9706 function transverseMercator() {
9707 var m = mercatorProjection(transverseMercatorRaw),
9711 m.center = function(_) {
9712 return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
9715 m.rotate = function(_) {
9716 return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
9719 return rotate([0, 0, 90])
9723 function defaultSeparation(a, b) {
9724 return a.parent === b.parent ? 1 : 2;
9727 function meanX(children) {
9728 return children.reduce(meanXReduce, 0) / children.length;
9731 function meanXReduce(x, c) {
9735 function maxY(children) {
9736 return 1 + children.reduce(maxYReduce, 0);
9739 function maxYReduce(y, c) {
9740 return Math.max(y, c.y);
9743 function leafLeft(node) {
9745 while (children = node.children) node = children[0];
9749 function leafRight(node) {
9751 while (children = node.children) node = children[children.length - 1];
9755 function cluster() {
9756 var separation = defaultSeparation,
9761 function cluster(root) {
9765 // First walk, computing the initial x & y values.
9766 root.eachAfter(function(node) {
9767 var children = node.children;
9769 node.x = meanX(children);
9770 node.y = maxY(children);
9772 node.x = previousNode ? x += separation(node, previousNode) : 0;
9774 previousNode = node;
9778 var left = leafLeft(root),
9779 right = leafRight(root),
9780 x0 = left.x - separation(left, right) / 2,
9781 x1 = right.x + separation(right, left) / 2;
9783 // Second walk, normalizing x & y to the desired size.
9784 return root.eachAfter(nodeSize ? function(node) {
9785 node.x = (node.x - root.x) * dx;
9786 node.y = (root.y - node.y) * dy;
9787 } : function(node) {
9788 node.x = (node.x - x0) / (x1 - x0) * dx;
9789 node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
9793 cluster.separation = function(x) {
9794 return arguments.length ? (separation = x, cluster) : separation;
9797 cluster.size = function(x) {
9798 return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
9801 cluster.nodeSize = function(x) {
9802 return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
9808 function count(node) {
9810 children = node.children,
9811 i = children && children.length;
9813 else while (--i >= 0) sum += children[i].value;
9817 function node_count() {
9818 return this.eachAfter(count);
9821 function node_each(callback) {
9822 var node = this, current, next = [node], children, i, n;
9824 current = next.reverse(), next = [];
9825 while (node = current.pop()) {
9826 callback(node), children = node.children;
9827 if (children) for (i = 0, n = children.length; i < n; ++i) {
9828 next.push(children[i]);
9831 } while (next.length);
9835 function node_eachBefore(callback) {
9836 var node = this, nodes = [node], children, i;
9837 while (node = nodes.pop()) {
9838 callback(node), children = node.children;
9839 if (children) for (i = children.length - 1; i >= 0; --i) {
9840 nodes.push(children[i]);
9846 function node_eachAfter(callback) {
9847 var node = this, nodes = [node], next = [], children, i, n;
9848 while (node = nodes.pop()) {
9849 next.push(node), children = node.children;
9850 if (children) for (i = 0, n = children.length; i < n; ++i) {
9851 nodes.push(children[i]);
9854 while (node = next.pop()) {
9860 function node_sum(value) {
9861 return this.eachAfter(function(node) {
9862 var sum = +value(node.data) || 0,
9863 children = node.children,
9864 i = children && children.length;
9865 while (--i >= 0) sum += children[i].value;
9870 function node_sort(compare) {
9871 return this.eachBefore(function(node) {
9872 if (node.children) {
9873 node.children.sort(compare);
9878 function node_path(end) {
9880 ancestor = leastCommonAncestor(start, end),
9882 while (start !== ancestor) {
9883 start = start.parent;
9886 var k = nodes.length;
9887 while (end !== ancestor) {
9888 nodes.splice(k, 0, end);
9894 function leastCommonAncestor(a, b) {
9895 if (a === b) return a;
9896 var aNodes = a.ancestors(),
9897 bNodes = b.ancestors(),
9909 function node_ancestors() {
9910 var node = this, nodes = [node];
9911 while (node = node.parent) {
9917 function node_descendants() {
9919 this.each(function(node) {
9925 function node_leaves() {
9927 this.eachBefore(function(node) {
9928 if (!node.children) {
9935 function node_links() {
9936 var root = this, links = [];
9937 root.each(function(node) {
9938 if (node !== root) { // Don’t include the root’s parent, if any.
9939 links.push({source: node.parent, target: node});
9945 function hierarchy(data, children) {
9946 var root = new Node(data),
9947 valued = +data.value && (root.value = data.value),
9955 if (children == null) children = defaultChildren;
9957 while (node = nodes.pop()) {
9958 if (valued) node.value = +node.data.value;
9959 if ((childs = children(node.data)) && (n = childs.length)) {
9960 node.children = new Array(n);
9961 for (i = n - 1; i >= 0; --i) {
9962 nodes.push(child = node.children[i] = new Node(childs[i]));
9963 child.parent = node;
9964 child.depth = node.depth + 1;
9969 return root.eachBefore(computeHeight);
9972 function node_copy() {
9973 return hierarchy(this).eachBefore(copyData);
9976 function defaultChildren(d) {
9980 function copyData(node) {
9981 node.data = node.data.data;
9984 function computeHeight(node) {
9986 do node.height = height;
9987 while ((node = node.parent) && (node.height < ++height));
9990 function Node(data) {
9997 Node.prototype = hierarchy.prototype = {
10001 eachAfter: node_eachAfter,
10002 eachBefore: node_eachBefore,
10006 ancestors: node_ancestors,
10007 descendants: node_descendants,
10008 leaves: node_leaves,
10013 var slice$3 = Array.prototype.slice;
10015 function shuffle$1(array) {
10016 var m = array.length,
10021 i = Math.random() * m-- | 0;
10023 array[m] = array[i];
10030 function enclose(circles) {
10031 var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
10035 if (e && enclosesWeak(e, p)) ++i;
10036 else e = encloseBasis(B = extendBasis(B, p)), i = 0;
10042 function extendBasis(B, p) {
10045 if (enclosesWeakAll(p, B)) return [p];
10047 // If we get here then B must have at least one element.
10048 for (i = 0; i < B.length; ++i) {
10049 if (enclosesNot(p, B[i])
10050 && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
10055 // If we get here then B must have at least two elements.
10056 for (i = 0; i < B.length - 1; ++i) {
10057 for (j = i + 1; j < B.length; ++j) {
10058 if (enclosesNot(encloseBasis2(B[i], B[j]), p)
10059 && enclosesNot(encloseBasis2(B[i], p), B[j])
10060 && enclosesNot(encloseBasis2(B[j], p), B[i])
10061 && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
10062 return [B[i], B[j], p];
10067 // If we get here then something is very wrong.
10071 function enclosesNot(a, b) {
10072 var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
10073 return dr < 0 || dr * dr < dx * dx + dy * dy;
10076 function enclosesWeak(a, b) {
10077 var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
10078 return dr > 0 && dr * dr > dx * dx + dy * dy;
10081 function enclosesWeakAll(a, B) {
10082 for (var i = 0; i < B.length; ++i) {
10083 if (!enclosesWeak(a, B[i])) {
10090 function encloseBasis(B) {
10091 switch (B.length) {
10092 case 1: return encloseBasis1(B[0]);
10093 case 2: return encloseBasis2(B[0], B[1]);
10094 case 3: return encloseBasis3(B[0], B[1], B[2]);
10098 function encloseBasis1(a) {
10106 function encloseBasis2(a, b) {
10107 var x1 = a.x, y1 = a.y, r1 = a.r,
10108 x2 = b.x, y2 = b.y, r2 = b.r,
10109 x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
10110 l = Math.sqrt(x21 * x21 + y21 * y21);
10112 x: (x1 + x2 + x21 / l * r21) / 2,
10113 y: (y1 + y2 + y21 / l * r21) / 2,
10114 r: (l + r1 + r2) / 2
10118 function encloseBasis3(a, b, c) {
10119 var x1 = a.x, y1 = a.y, r1 = a.r,
10120 x2 = b.x, y2 = b.y, r2 = b.r,
10121 x3 = c.x, y3 = c.y, r3 = c.r,
10128 d1 = x1 * x1 + y1 * y1 - r1 * r1,
10129 d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
10130 d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
10131 ab = a3 * b2 - a2 * b3,
10132 xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
10133 xb = (b3 * c2 - b2 * c3) / ab,
10134 ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
10135 yb = (a2 * c3 - a3 * c2) / ab,
10136 A = xb * xb + yb * yb - 1,
10137 B = 2 * (r1 + xa * xb + ya * yb),
10138 C = xa * xa + ya * ya - r1 * r1,
10139 r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
10141 x: x1 + xa + xb * r,
10142 y: y1 + ya + yb * r,
10147 function place(a, b, c) {
10154 dc = dx * dx + dy * dy;
10156 var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc),
10157 y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
10158 c.x = ax + x * dx + y * dy;
10159 c.y = ay + x * dy - y * dx;
10166 function intersects(a, b) {
10167 var dx = b.x - a.x,
10170 return dr * dr - 1e-6 > dx * dx + dy * dy;
10173 function score(node) {
10177 dx = (a.x * b.r + b.x * a.r) / ab,
10178 dy = (a.y * b.r + b.y * a.r) / ab;
10179 return dx * dx + dy * dy;
10182 function Node$1(circle) {
10185 this.previous = null;
10188 function packEnclose(circles) {
10189 if (!(n = circles.length)) return 0;
10191 var a, b, c, n, aa, ca, i, j, k, sj, sk;
10193 // Place the first circle.
10194 a = circles[0], a.x = 0, a.y = 0;
10195 if (!(n > 1)) return a.r;
10197 // Place the second circle.
10198 b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
10199 if (!(n > 2)) return a.r + b.r;
10201 // Place the third circle.
10202 place(b, a, c = circles[2]);
10204 // Initialize the front-chain using the first three circles a, b and c.
10205 a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
10206 a.next = c.previous = b;
10207 b.next = a.previous = c;
10208 c.next = b.previous = a;
10210 // Attempt to place each remaining circle…
10211 pack: for (i = 3; i < n; ++i) {
10212 place(a._, b._, c = circles[i]), c = new Node$1(c);
10214 // Find the closest intersecting circle on the front-chain, if any.
10215 // “Closeness” is determined by linear distance along the front-chain.
10216 // “Ahead” or “behind” is likewise determined by linear distance.
10217 j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
10220 if (intersects(j._, c._)) {
10221 b = j, a.next = b, b.previous = a, --i;
10224 sj += j._.r, j = j.next;
10226 if (intersects(k._, c._)) {
10227 a = k, a.next = b, b.previous = a, --i;
10230 sk += k._.r, k = k.previous;
10232 } while (j !== k.next);
10234 // Success! Insert the new circle c between a and b.
10235 c.previous = a, c.next = b, a.next = b.previous = b = c;
10237 // Compute the new closest circle pair to the centroid.
10239 while ((c = c.next) !== b) {
10240 if ((ca = score(c)) < aa) {
10247 // Compute the enclosing circle of the front chain.
10248 a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
10250 // Translate the circles to put the enclosing circle around the origin.
10251 for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
10256 function siblings(circles) {
10257 packEnclose(circles);
10261 function optional(f) {
10262 return f == null ? null : required(f);
10265 function required(f) {
10266 if (typeof f !== "function") throw new Error;
10270 function constantZero() {
10274 function constant$8(x) {
10275 return function() {
10280 function defaultRadius$1(d) {
10281 return Math.sqrt(d.value);
10284 function index$1() {
10288 padding = constantZero;
10290 function pack(root) {
10291 root.x = dx / 2, root.y = dy / 2;
10293 root.eachBefore(radiusLeaf(radius))
10294 .eachAfter(packChildren(padding, 0.5))
10295 .eachBefore(translateChild(1));
10297 root.eachBefore(radiusLeaf(defaultRadius$1))
10298 .eachAfter(packChildren(constantZero, 1))
10299 .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
10300 .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
10305 pack.radius = function(x) {
10306 return arguments.length ? (radius = optional(x), pack) : radius;
10309 pack.size = function(x) {
10310 return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
10313 pack.padding = function(x) {
10314 return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding;
10320 function radiusLeaf(radius) {
10321 return function(node) {
10322 if (!node.children) {
10323 node.r = Math.max(0, +radius(node) || 0);
10328 function packChildren(padding, k) {
10329 return function(node) {
10330 if (children = node.children) {
10333 n = children.length,
10334 r = padding(node) * k || 0,
10337 if (r) for (i = 0; i < n; ++i) children[i].r += r;
10338 e = packEnclose(children);
10339 if (r) for (i = 0; i < n; ++i) children[i].r -= r;
10345 function translateChild(k) {
10346 return function(node) {
10347 var parent = node.parent;
10350 node.x = parent.x + k * node.x;
10351 node.y = parent.y + k * node.y;
10356 function roundNode(node) {
10357 node.x0 = Math.round(node.x0);
10358 node.y0 = Math.round(node.y0);
10359 node.x1 = Math.round(node.x1);
10360 node.y1 = Math.round(node.y1);
10363 function treemapDice(parent, x0, y0, x1, y1) {
10364 var nodes = parent.children,
10368 k = parent.value && (x1 - x0) / parent.value;
10371 node = nodes[i], node.y0 = y0, node.y1 = y1;
10372 node.x0 = x0, node.x1 = x0 += node.value * k;
10376 function partition() {
10382 function partition(root) {
10383 var n = root.height + 1;
10388 root.eachBefore(positionNode(dy, n));
10389 if (round) root.eachBefore(roundNode);
10393 function positionNode(dy, n) {
10394 return function(node) {
10395 if (node.children) {
10396 treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
10400 x1 = node.x1 - padding,
10401 y1 = node.y1 - padding;
10402 if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10403 if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10411 partition.round = function(x) {
10412 return arguments.length ? (round = !!x, partition) : round;
10415 partition.size = function(x) {
10416 return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
10419 partition.padding = function(x) {
10420 return arguments.length ? (padding = +x, partition) : padding;
10426 var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
10427 preroot = {depth: -1},
10430 function defaultId(d) {
10434 function defaultParentId(d) {
10438 function stratify() {
10439 var id = defaultId,
10440 parentId = defaultParentId;
10442 function stratify(data) {
10449 nodes = new Array(n),
10454 for (i = 0; i < n; ++i) {
10455 d = data[i], node = nodes[i] = new Node(d);
10456 if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
10457 nodeKey = keyPrefix$1 + (node.id = nodeId);
10458 nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
10462 for (i = 0; i < n; ++i) {
10463 node = nodes[i], nodeId = parentId(data[i], i, data);
10464 if (nodeId == null || !(nodeId += "")) {
10465 if (root) throw new Error("multiple roots");
10468 parent = nodeByKey[keyPrefix$1 + nodeId];
10469 if (!parent) throw new Error("missing: " + nodeId);
10470 if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
10471 if (parent.children) parent.children.push(node);
10472 else parent.children = [node];
10473 node.parent = parent;
10477 if (!root) throw new Error("no root");
10478 root.parent = preroot;
10479 root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
10480 root.parent = null;
10481 if (n > 0) throw new Error("cycle");
10486 stratify.id = function(x) {
10487 return arguments.length ? (id = required(x), stratify) : id;
10490 stratify.parentId = function(x) {
10491 return arguments.length ? (parentId = required(x), stratify) : parentId;
10497 function defaultSeparation$1(a, b) {
10498 return a.parent === b.parent ? 1 : 2;
10501 // function radialSeparation(a, b) {
10502 // return (a.parent === b.parent ? 1 : 2) / a.depth;
10505 // This function is used to traverse the left contour of a subtree (or
10506 // subforest). It returns the successor of v on this contour. This successor is
10507 // either given by the leftmost child of v or by the thread of v. The function
10508 // returns null if and only if v is on the highest level of its subtree.
10509 function nextLeft(v) {
10510 var children = v.children;
10511 return children ? children[0] : v.t;
10514 // This function works analogously to nextLeft.
10515 function nextRight(v) {
10516 var children = v.children;
10517 return children ? children[children.length - 1] : v.t;
10520 // Shifts the current subtree rooted at w+. This is done by increasing
10521 // prelim(w+) and mod(w+) by shift.
10522 function moveSubtree(wm, wp, shift) {
10523 var change = shift / (wp.i - wm.i);
10531 // All other shifts, applied to the smaller subtrees between w- and w+, are
10532 // performed by this function. To prepare the shifts, we have to adjust
10533 // change(w+), shift(w+), and change(w-).
10534 function executeShifts(v) {
10537 children = v.children,
10538 i = children.length,
10544 shift += w.s + (change += w.c);
10548 // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
10549 // returns the specified (default) ancestor.
10550 function nextAncestor(vim, v, ancestor) {
10551 return vim.a.parent === v.parent ? vim.a : ancestor;
10554 function TreeNode(node, i) {
10556 this.parent = null;
10557 this.children = null;
10558 this.A = null; // default ancestor
10559 this.a = this; // ancestor
10560 this.z = 0; // prelim
10562 this.c = 0; // change
10563 this.s = 0; // shift
10564 this.t = null; // thread
10565 this.i = i; // number
10568 TreeNode.prototype = Object.create(Node.prototype);
10570 function treeRoot(root) {
10571 var tree = new TreeNode(root, 0),
10579 while (node = nodes.pop()) {
10580 if (children = node._.children) {
10581 node.children = new Array(n = children.length);
10582 for (i = n - 1; i >= 0; --i) {
10583 nodes.push(child = node.children[i] = new TreeNode(children[i], i));
10584 child.parent = node;
10589 (tree.parent = new TreeNode(null, 0)).children = [tree];
10593 // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
10595 var separation = defaultSeparation$1,
10600 function tree(root) {
10601 var t = treeRoot(root);
10603 // Compute the layout using Buchheim et al.’s algorithm.
10604 t.eachAfter(firstWalk), t.parent.m = -t.z;
10605 t.eachBefore(secondWalk);
10607 // If a fixed node size is specified, scale x and y.
10608 if (nodeSize) root.eachBefore(sizeNode);
10610 // If a fixed tree size is specified, scale x and y based on the extent.
10611 // Compute the left-most, right-most, and depth-most nodes for extents.
10616 root.eachBefore(function(node) {
10617 if (node.x < left.x) left = node;
10618 if (node.x > right.x) right = node;
10619 if (node.depth > bottom.depth) bottom = node;
10621 var s = left === right ? 1 : separation(left, right) / 2,
10623 kx = dx / (right.x + s + tx),
10624 ky = dy / (bottom.depth || 1);
10625 root.eachBefore(function(node) {
10626 node.x = (node.x + tx) * kx;
10627 node.y = node.depth * ky;
10634 // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
10635 // applied recursively to the children of v, as well as the function
10636 // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
10637 // node v is placed to the midpoint of its outermost children.
10638 function firstWalk(v) {
10639 var children = v.children,
10640 siblings = v.parent.children,
10641 w = v.i ? siblings[v.i - 1] : null;
10644 var midpoint = (children[0].z + children[children.length - 1].z) / 2;
10646 v.z = w.z + separation(v._, w._);
10647 v.m = v.z - midpoint;
10652 v.z = w.z + separation(v._, w._);
10654 v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
10657 // Computes all real x-coordinates by summing up the modifiers recursively.
10658 function secondWalk(v) {
10659 v._.x = v.z + v.parent.m;
10663 // The core of the algorithm. Here, a new subtree is combined with the
10664 // previous subtrees. Threads are used to traverse the inside and outside
10665 // contours of the left and right subtree up to the highest common level. The
10666 // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
10667 // superscript o means outside and i means inside, the subscript - means left
10668 // subtree and + means right subtree. For summing up the modifiers along the
10669 // contour, we use respective variables si+, si-, so-, and so+. Whenever two
10670 // nodes of the inside contours conflict, we compute the left one of the
10671 // greatest uncommon ancestors using the function ANCESTOR and call MOVE
10672 // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
10673 // Finally, we add a new thread (if necessary).
10674 function apportion(v, w, ancestor) {
10679 vom = vip.parent.children[0],
10685 while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
10686 vom = nextLeft(vom);
10687 vop = nextRight(vop);
10689 shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
10691 moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
10700 if (vim && !nextRight(vop)) {
10702 vop.m += sim - sop;
10704 if (vip && !nextLeft(vom)) {
10706 vom.m += sip - som;
10713 function sizeNode(node) {
10715 node.y = node.depth * dy;
10718 tree.separation = function(x) {
10719 return arguments.length ? (separation = x, tree) : separation;
10722 tree.size = function(x) {
10723 return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
10726 tree.nodeSize = function(x) {
10727 return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
10733 function treemapSlice(parent, x0, y0, x1, y1) {
10734 var nodes = parent.children,
10738 k = parent.value && (y1 - y0) / parent.value;
10741 node = nodes[i], node.x0 = x0, node.x1 = x1;
10742 node.y0 = y0, node.y1 = y0 += node.value * k;
10746 var phi = (1 + Math.sqrt(5)) / 2;
10748 function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
10750 nodes = parent.children,
10757 value = parent.value,
10767 dx = x1 - x0, dy = y1 - y0;
10769 // Find the next non-empty node.
10770 do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
10771 minValue = maxValue = sumValue;
10772 alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
10773 beta = sumValue * sumValue * alpha;
10774 minRatio = Math.max(maxValue / beta, beta / minValue);
10776 // Keep adding nodes while the aspect ratio maintains or improves.
10777 for (; i1 < n; ++i1) {
10778 sumValue += nodeValue = nodes[i1].value;
10779 if (nodeValue < minValue) minValue = nodeValue;
10780 if (nodeValue > maxValue) maxValue = nodeValue;
10781 beta = sumValue * sumValue * alpha;
10782 newRatio = Math.max(maxValue / beta, beta / minValue);
10783 if (newRatio > minRatio) { sumValue -= nodeValue; break; }
10784 minRatio = newRatio;
10787 // Position and record the row orientation.
10788 rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
10789 if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
10790 else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
10791 value -= sumValue, i0 = i1;
10797 var squarify = (function custom(ratio) {
10799 function squarify(parent, x0, y0, x1, y1) {
10800 squarifyRatio(ratio, parent, x0, y0, x1, y1);
10803 squarify.ratio = function(x) {
10804 return custom((x = +x) > 1 ? x : 1);
10810 function index$2() {
10811 var tile = squarify,
10815 paddingStack = [0],
10816 paddingInner = constantZero,
10817 paddingTop = constantZero,
10818 paddingRight = constantZero,
10819 paddingBottom = constantZero,
10820 paddingLeft = constantZero;
10822 function treemap(root) {
10827 root.eachBefore(positionNode);
10828 paddingStack = [0];
10829 if (round) root.eachBefore(roundNode);
10833 function positionNode(node) {
10834 var p = paddingStack[node.depth],
10839 if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10840 if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10845 if (node.children) {
10846 p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
10847 x0 += paddingLeft(node) - p;
10848 y0 += paddingTop(node) - p;
10849 x1 -= paddingRight(node) - p;
10850 y1 -= paddingBottom(node) - p;
10851 if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10852 if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10853 tile(node, x0, y0, x1, y1);
10857 treemap.round = function(x) {
10858 return arguments.length ? (round = !!x, treemap) : round;
10861 treemap.size = function(x) {
10862 return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
10865 treemap.tile = function(x) {
10866 return arguments.length ? (tile = required(x), treemap) : tile;
10869 treemap.padding = function(x) {
10870 return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
10873 treemap.paddingInner = function(x) {
10874 return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner;
10877 treemap.paddingOuter = function(x) {
10878 return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
10881 treemap.paddingTop = function(x) {
10882 return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop;
10885 treemap.paddingRight = function(x) {
10886 return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight;
10889 treemap.paddingBottom = function(x) {
10890 return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom;
10893 treemap.paddingLeft = function(x) {
10894 return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft;
10900 function binary(parent, x0, y0, x1, y1) {
10901 var nodes = parent.children,
10902 i, n = nodes.length,
10903 sum, sums = new Array(n + 1);
10905 for (sums[0] = sum = i = 0; i < n; ++i) {
10906 sums[i + 1] = sum += nodes[i].value;
10909 partition(0, n, parent.value, x0, y0, x1, y1);
10911 function partition(i, j, value, x0, y0, x1, y1) {
10913 var node = nodes[i];
10914 node.x0 = x0, node.y0 = y0;
10915 node.x1 = x1, node.y1 = y1;
10919 var valueOffset = sums[i],
10920 valueTarget = (value / 2) + valueOffset,
10925 var mid = k + hi >>> 1;
10926 if (sums[mid] < valueTarget) k = mid + 1;
10930 if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
10932 var valueLeft = sums[k] - valueOffset,
10933 valueRight = value - valueLeft;
10935 if ((x1 - x0) > (y1 - y0)) {
10936 var xk = (x0 * valueRight + x1 * valueLeft) / value;
10937 partition(i, k, valueLeft, x0, y0, xk, y1);
10938 partition(k, j, valueRight, xk, y0, x1, y1);
10940 var yk = (y0 * valueRight + y1 * valueLeft) / value;
10941 partition(i, k, valueLeft, x0, y0, x1, yk);
10942 partition(k, j, valueRight, x0, yk, x1, y1);
10947 function sliceDice(parent, x0, y0, x1, y1) {
10948 (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
10951 var resquarify = (function custom(ratio) {
10953 function resquarify(parent, x0, y0, x1, y1) {
10954 if ((rows = parent._squarify) && (rows.ratio === ratio)) {
10962 value = parent.value;
10965 row = rows[j], nodes = row.children;
10966 for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
10967 if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
10968 else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
10969 value -= row.value;
10972 parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
10973 rows.ratio = ratio;
10977 resquarify.ratio = function(x) {
10978 return custom((x = +x) > 1 ? x : 1);
10984 function d3_polygonArea(polygon) {
10986 n = polygon.length,
10988 b = polygon[n - 1],
10994 area += a[1] * b[0] - a[0] * b[1];
11000 function d3_polygonCentroid(polygon) {
11002 n = polygon.length,
11006 b = polygon[n - 1],
11013 k += c = a[0] * b[1] - b[0] * a[1];
11014 x += (a[0] + b[0]) * c;
11015 y += (a[1] + b[1]) * c;
11018 return k *= 3, [x / k, y / k];
11021 // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
11022 // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
11023 // right, +y is up). Returns a positive value if ABC is counter-clockwise,
11024 // negative if clockwise, and zero if the points are collinear.
11025 function cross$1(a, b, c) {
11026 return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
11029 function lexicographicOrder(a, b) {
11030 return a[0] - b[0] || a[1] - b[1];
11033 // Computes the upper convex hull per the monotone chain algorithm.
11034 // Assumes points.length >= 3, is sorted by x, unique in y.
11035 // Returns an array of indices into points in left-to-right order.
11036 function computeUpperHullIndexes(points) {
11037 var n = points.length,
11041 for (var i = 2; i < n; ++i) {
11042 while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
11043 indexes[size++] = i;
11046 return indexes.slice(0, size); // remove popped points
11049 function d3_polygonHull(points) {
11050 if ((n = points.length) < 3) return null;
11054 sortedPoints = new Array(n),
11055 flippedPoints = new Array(n);
11057 for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
11058 sortedPoints.sort(lexicographicOrder);
11059 for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
11061 var upperIndexes = computeUpperHullIndexes(sortedPoints),
11062 lowerIndexes = computeUpperHullIndexes(flippedPoints);
11064 // Construct the hull polygon, removing possible duplicate endpoints.
11065 var skipLeft = lowerIndexes[0] === upperIndexes[0],
11066 skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
11069 // Add upper hull in right-to-l order.
11070 // Then add lower hull in left-to-right order.
11071 for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
11072 for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
11077 function contains$1(polygon, point) {
11078 var n = polygon.length,
11079 p = polygon[n - 1],
11080 x = point[0], y = point[1],
11081 x0 = p[0], y0 = p[1],
11085 for (var i = 0; i < n; ++i) {
11086 p = polygon[i], x1 = p[0], y1 = p[1];
11087 if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
11094 function length$2(polygon) {
11096 n = polygon.length,
11097 b = polygon[n - 1],
11112 perimeter += Math.sqrt(xa * xa + ya * ya);
11118 var slice$4 = [].slice;
11122 function Queue(size) {
11125 this._error = null;
11131 this._start = 0; // inside a synchronous task callback?
11134 Queue.prototype = queue.prototype = {
11135 constructor: Queue,
11136 defer: function(callback) {
11137 if (typeof callback !== "function") throw new Error("invalid callback");
11138 if (this._call) throw new Error("defer after await");
11139 if (this._error != null) return this;
11140 var t = slice$4.call(arguments, 1);
11142 ++this._waiting, this._tasks.push(t);
11146 abort: function() {
11147 if (this._error == null) abort(this, new Error("abort"));
11150 await: function(callback) {
11151 if (typeof callback !== "function") throw new Error("invalid callback");
11152 if (this._call) throw new Error("multiple await");
11153 this._call = function(error, results) { callback.apply(null, [error].concat(results)); };
11157 awaitAll: function(callback) {
11158 if (typeof callback !== "function") throw new Error("invalid callback");
11159 if (this._call) throw new Error("multiple await");
11160 this._call = callback;
11166 function poke$1(q) {
11168 try { start$1(q); } // let the current task complete
11170 if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously
11171 else if (!q._data) throw e; // await callback errored synchronously
11176 function start$1(q) {
11177 while (q._start = q._waiting && q._active < q._size) {
11178 var i = q._ended + q._active,
11183 --q._waiting, ++q._active;
11184 t = c.apply(null, t);
11185 if (!q._tasks[i]) continue; // task finished synchronously
11186 q._tasks[i] = t || noabort;
11190 function end(q, i) {
11191 return function(e, r) {
11192 if (!q._tasks[i]) return; // ignore multiple callbacks
11193 --q._active, ++q._ended;
11194 q._tasks[i] = null;
11195 if (q._error != null) return; // ignore secondary errors
11200 if (q._waiting) poke$1(q);
11201 else maybeNotify(q);
11206 function abort(q, e) {
11207 var i = q._tasks.length, t;
11208 q._error = e; // ignore active callbacks
11209 q._data = undefined; // allow gc
11210 q._waiting = NaN; // prevent starting
11213 if (t = q._tasks[i]) {
11214 q._tasks[i] = null;
11217 catch (e) { /* ignore */ }
11222 q._active = NaN; // allow notification
11226 function maybeNotify(q) {
11227 if (!q._active && q._call) {
11229 q._data = undefined; // allow gc
11230 q._call(q._error, d);
11234 function queue(concurrency) {
11235 if (concurrency == null) concurrency = Infinity;
11236 else if (!((concurrency = +concurrency) >= 1)) throw new Error("invalid concurrency");
11237 return new Queue(concurrency);
11240 function defaultSource$1() {
11241 return Math.random();
11244 var uniform = (function sourceRandomUniform(source) {
11245 function randomUniform(min, max) {
11246 min = min == null ? 0 : +min;
11247 max = max == null ? 1 : +max;
11248 if (arguments.length === 1) max = min, min = 0;
11250 return function() {
11251 return source() * max + min;
11255 randomUniform.source = sourceRandomUniform;
11257 return randomUniform;
11258 })(defaultSource$1);
11260 var normal = (function sourceRandomNormal(source) {
11261 function randomNormal(mu, sigma) {
11263 mu = mu == null ? 0 : +mu;
11264 sigma = sigma == null ? 1 : +sigma;
11265 return function() {
11268 // If available, use the second previously-generated uniform random.
11269 if (x != null) y = x, x = null;
11271 // Otherwise, generate a new x and y.
11273 x = source() * 2 - 1;
11274 y = source() * 2 - 1;
11276 } while (!r || r > 1);
11278 return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
11282 randomNormal.source = sourceRandomNormal;
11284 return randomNormal;
11285 })(defaultSource$1);
11287 var logNormal = (function sourceRandomLogNormal(source) {
11288 function randomLogNormal() {
11289 var randomNormal = normal.source(source).apply(this, arguments);
11290 return function() {
11291 return Math.exp(randomNormal());
11295 randomLogNormal.source = sourceRandomLogNormal;
11297 return randomLogNormal;
11298 })(defaultSource$1);
11300 var irwinHall = (function sourceRandomIrwinHall(source) {
11301 function randomIrwinHall(n) {
11302 return function() {
11303 for (var sum = 0, i = 0; i < n; ++i) sum += source();
11308 randomIrwinHall.source = sourceRandomIrwinHall;
11310 return randomIrwinHall;
11311 })(defaultSource$1);
11313 var bates = (function sourceRandomBates(source) {
11314 function randomBates(n) {
11315 var randomIrwinHall = irwinHall.source(source)(n);
11316 return function() {
11317 return randomIrwinHall() / n;
11321 randomBates.source = sourceRandomBates;
11323 return randomBates;
11324 })(defaultSource$1);
11326 var exponential$1 = (function sourceRandomExponential(source) {
11327 function randomExponential(lambda) {
11328 return function() {
11329 return -Math.log(1 - source()) / lambda;
11333 randomExponential.source = sourceRandomExponential;
11335 return randomExponential;
11336 })(defaultSource$1);
11338 function request(url, callback) {
11340 event = dispatch("beforesend", "progress", "load", "error"),
11343 xhr = new XMLHttpRequest,
11350 // If IE does not support CORS, use XDomainRequest.
11351 if (typeof XDomainRequest !== "undefined"
11352 && !("withCredentials" in xhr)
11353 && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest;
11356 ? xhr.onload = xhr.onerror = xhr.ontimeout = respond
11357 : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
11359 function respond(o) {
11360 var status = xhr.status, result;
11361 if (!status && hasResponse(xhr)
11362 || status >= 200 && status < 300
11363 || status === 304) {
11366 result = response.call(request, xhr);
11368 event.call("error", request, e);
11374 event.call("load", request, result);
11376 event.call("error", request, o);
11380 xhr.onprogress = function(e) {
11381 event.call("progress", request, e);
11385 header: function(name, value) {
11386 name = (name + "").toLowerCase();
11387 if (arguments.length < 2) return headers.get(name);
11388 if (value == null) headers.remove(name);
11389 else headers.set(name, value + "");
11393 // If mimeType is non-null and no Accept header is set, a default is used.
11394 mimeType: function(value) {
11395 if (!arguments.length) return mimeType;
11396 mimeType = value == null ? null : value + "";
11400 // Specifies what type the response value should take;
11401 // for instance, arraybuffer, blob, document, or text.
11402 responseType: function(value) {
11403 if (!arguments.length) return responseType;
11404 responseType = value;
11408 timeout: function(value) {
11409 if (!arguments.length) return timeout;
11414 user: function(value) {
11415 return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
11418 password: function(value) {
11419 return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
11422 // Specify how to convert the response content to a specific type;
11423 // changes the callback value on "load" events.
11424 response: function(value) {
11429 // Alias for send("GET", …).
11430 get: function(data, callback) {
11431 return request.send("GET", data, callback);
11434 // Alias for send("POST", …).
11435 post: function(data, callback) {
11436 return request.send("POST", data, callback);
11439 // If callback is non-null, it will be used for error and load events.
11440 send: function(method, data, callback) {
11441 xhr.open(method, url, true, user, password);
11442 if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*");
11443 if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); });
11444 if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType);
11445 if (responseType != null) xhr.responseType = responseType;
11446 if (timeout > 0) xhr.timeout = timeout;
11447 if (callback == null && typeof data === "function") callback = data, data = null;
11448 if (callback != null && callback.length === 1) callback = fixCallback(callback);
11449 if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); });
11450 event.call("beforesend", request, xhr);
11451 xhr.send(data == null ? null : data);
11455 abort: function() {
11461 var value = event.on.apply(event, arguments);
11462 return value === event ? request : value;
11466 if (callback != null) {
11467 if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11468 return request.get(callback);
11474 function fixCallback(callback) {
11475 return function(error, xhr) {
11476 callback(error == null ? xhr : null);
11480 function hasResponse(xhr) {
11481 var type = xhr.responseType;
11482 return type && type !== "text"
11483 ? xhr.response // null on error
11484 : xhr.responseText; // "" on error
11487 function type$1(defaultMimeType, response) {
11488 return function(url, callback) {
11489 var r = request(url).mimeType(defaultMimeType).response(response);
11490 if (callback != null) {
11491 if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11492 return r.get(callback);
11498 var html = type$1("text/html", function(xhr) {
11499 return document.createRange().createContextualFragment(xhr.responseText);
11502 var d3_json = type$1("application/json", function(xhr) {
11503 return JSON.parse(xhr.responseText);
11506 var d3_text = type$1("text/plain", function(xhr) {
11507 return xhr.responseText;
11510 var d3_xml = type$1("application/xml", function(xhr) {
11511 var xml = xhr.responseXML;
11512 if (!xml) throw new Error("parse error");
11516 function dsv$1(defaultMimeType, parse) {
11517 return function(url, row, callback) {
11518 if (arguments.length < 3) callback = row, row = null;
11519 var r = request(url).mimeType(defaultMimeType);
11520 r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; };
11522 return callback ? r.get(callback) : r;
11526 function responseOf(parse, row) {
11527 return function(request$$1) {
11528 return parse(request$$1.responseText, row);
11532 var csv$1 = dsv$1("text/csv", csvParse);
11534 var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
11536 var array$2 = Array.prototype;
11538 var map$2 = array$2.map;
11539 var slice$5 = array$2.slice;
11541 var implicit = {name: "implicit"};
11543 function ordinal(range) {
11544 var index = map$1(),
11546 unknown = implicit;
11548 range = range == null ? [] : slice$5.call(range);
11550 function scale(d) {
11551 var key = d + "", i = index.get(key);
11553 if (unknown !== implicit) return unknown;
11554 index.set(key, i = domain.push(d));
11556 return range[(i - 1) % range.length];
11559 scale.domain = function(_) {
11560 if (!arguments.length) return domain.slice();
11561 domain = [], index = map$1();
11562 var i = -1, n = _.length, d, key;
11563 while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
11567 scale.range = function(_) {
11568 return arguments.length ? (range = slice$5.call(_), scale) : range.slice();
11571 scale.unknown = function(_) {
11572 return arguments.length ? (unknown = _, scale) : unknown;
11575 scale.copy = function() {
11586 var scale = ordinal().unknown(undefined),
11587 domain = scale.domain,
11588 ordinalRange = scale.range,
11597 delete scale.unknown;
11599 function rescale() {
11600 var n = domain().length,
11601 reverse = range$$1[1] < range$$1[0],
11602 start = range$$1[reverse - 0],
11603 stop = range$$1[1 - reverse];
11604 step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
11605 if (round) step = Math.floor(step);
11606 start += (stop - start - step * (n - paddingInner)) * align;
11607 bandwidth = step * (1 - paddingInner);
11608 if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
11609 var values = range(n).map(function(i) { return start + step * i; });
11610 return ordinalRange(reverse ? values.reverse() : values);
11613 scale.domain = function(_) {
11614 return arguments.length ? (domain(_), rescale()) : domain();
11617 scale.range = function(_) {
11618 return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice();
11621 scale.rangeRound = function(_) {
11622 return range$$1 = [+_[0], +_[1]], round = true, rescale();
11625 scale.bandwidth = function() {
11629 scale.step = function() {
11633 scale.round = function(_) {
11634 return arguments.length ? (round = !!_, rescale()) : round;
11637 scale.padding = function(_) {
11638 return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11641 scale.paddingInner = function(_) {
11642 return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11645 scale.paddingOuter = function(_) {
11646 return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
11649 scale.align = function(_) {
11650 return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
11653 scale.copy = function() {
11658 .paddingInner(paddingInner)
11659 .paddingOuter(paddingOuter)
11666 function pointish(scale) {
11667 var copy = scale.copy;
11669 scale.padding = scale.paddingOuter;
11670 delete scale.paddingInner;
11671 delete scale.paddingOuter;
11673 scale.copy = function() {
11674 return pointish(copy());
11680 function point$1() {
11681 return pointish(band().paddingInner(1));
11684 function constant$9(x) {
11685 return function() {
11690 function number$2(x) {
11696 function deinterpolateLinear(a, b) {
11697 return (b -= (a = +a))
11698 ? function(x) { return (x - a) / b; }
11702 function deinterpolateClamp(deinterpolate) {
11703 return function(a, b) {
11704 var d = deinterpolate(a = +a, b = +b);
11705 return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
11709 function reinterpolateClamp(reinterpolate) {
11710 return function(a, b) {
11711 var r = reinterpolate(a = +a, b = +b);
11712 return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
11716 function bimap(domain, range$$1, deinterpolate, reinterpolate) {
11717 var d0 = domain[0], d1 = domain[1], r0 = range$$1[0], r1 = range$$1[1];
11718 if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
11719 else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
11720 return function(x) { return r0(d0(x)); };
11723 function polymap(domain, range$$1, deinterpolate, reinterpolate) {
11724 var j = Math.min(domain.length, range$$1.length) - 1,
11729 // Reverse descending domains.
11730 if (domain[j] < domain[0]) {
11731 domain = domain.slice().reverse();
11732 range$$1 = range$$1.slice().reverse();
11736 d[i] = deinterpolate(domain[i], domain[i + 1]);
11737 r[i] = reinterpolate(range$$1[i], range$$1[i + 1]);
11740 return function(x) {
11741 var i = bisectRight(domain, x, 1, j) - 1;
11742 return r[i](d[i](x));
11746 function copy(source, target) {
11748 .domain(source.domain())
11749 .range(source.range())
11750 .interpolate(source.interpolate())
11751 .clamp(source.clamp());
11754 // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
11755 // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
11756 function continuous(deinterpolate, reinterpolate) {
11759 interpolate$$1 = interpolate,
11765 function rescale() {
11766 piecewise = Math.min(domain.length, range$$1.length) > 2 ? polymap : bimap;
11767 output = input = null;
11771 function scale(x) {
11772 return (output || (output = piecewise(domain, range$$1, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x);
11775 scale.invert = function(y) {
11776 return (input || (input = piecewise(range$$1, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
11779 scale.domain = function(_) {
11780 return arguments.length ? (domain = map$2.call(_, number$2), rescale()) : domain.slice();
11783 scale.range = function(_) {
11784 return arguments.length ? (range$$1 = slice$5.call(_), rescale()) : range$$1.slice();
11787 scale.rangeRound = function(_) {
11788 return range$$1 = slice$5.call(_), interpolate$$1 = interpolateRound, rescale();
11791 scale.clamp = function(_) {
11792 return arguments.length ? (clamp = !!_, rescale()) : clamp;
11795 scale.interpolate = function(_) {
11796 return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1;
11802 function tickFormat(domain, count, specifier) {
11803 var start = domain[0],
11804 stop = domain[domain.length - 1],
11805 step = tickStep(start, stop, count == null ? 10 : count),
11807 specifier = formatSpecifier(specifier == null ? ",f" : specifier);
11808 switch (specifier.type) {
11810 var value = Math.max(Math.abs(start), Math.abs(stop));
11811 if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
11812 return formatPrefix(specifier, value);
11819 if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
11824 if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
11828 return format(specifier);
11831 function linearish(scale) {
11832 var domain = scale.domain;
11834 scale.ticks = function(count) {
11836 return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
11839 scale.tickFormat = function(count, specifier) {
11840 return tickFormat(domain(), count, specifier);
11843 scale.nice = function(count) {
11844 if (count == null) count = 10;
11853 if (stop < start) {
11854 step = start, start = stop, stop = step;
11855 step = i0, i0 = i1, i1 = step;
11858 step = tickIncrement(start, stop, count);
11861 start = Math.floor(start / step) * step;
11862 stop = Math.ceil(stop / step) * step;
11863 step = tickIncrement(start, stop, count);
11864 } else if (step < 0) {
11865 start = Math.ceil(start * step) / step;
11866 stop = Math.floor(stop * step) / step;
11867 step = tickIncrement(start, stop, count);
11871 d[i0] = Math.floor(start / step) * step;
11872 d[i1] = Math.ceil(stop / step) * step;
11874 } else if (step < 0) {
11875 d[i0] = Math.ceil(start * step) / step;
11876 d[i1] = Math.floor(stop * step) / step;
11886 function linear$2() {
11887 var scale = continuous(deinterpolateLinear, interpolateNumber);
11889 scale.copy = function() {
11890 return copy(scale, linear$2());
11893 return linearish(scale);
11896 function identity$5() {
11897 var domain = [0, 1];
11899 function scale(x) {
11903 scale.invert = scale;
11905 scale.domain = scale.range = function(_) {
11906 return arguments.length ? (domain = map$2.call(_, number$2), scale) : domain.slice();
11909 scale.copy = function() {
11910 return identity$5().domain(domain);
11913 return linearish(scale);
11916 function nice(domain, interval) {
11917 domain = domain.slice();
11920 i1 = domain.length - 1,
11926 t = i0, i0 = i1, i1 = t;
11927 t = x0, x0 = x1, x1 = t;
11930 domain[i0] = interval.floor(x0);
11931 domain[i1] = interval.ceil(x1);
11935 function deinterpolate(a, b) {
11936 return (b = Math.log(b / a))
11937 ? function(x) { return Math.log(x / a) / b; }
11941 function reinterpolate(a, b) {
11943 ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
11944 : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
11947 function pow10(x) {
11948 return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
11951 function powp(base) {
11952 return base === 10 ? pow10
11953 : base === Math.E ? Math.exp
11954 : function(x) { return Math.pow(base, x); };
11957 function logp(base) {
11958 return base === Math.E ? Math.log
11959 : base === 10 && Math.log10
11960 || base === 2 && Math.log2
11961 || (base = Math.log(base), function(x) { return Math.log(x) / base; });
11964 function reflect(f) {
11965 return function(x) {
11971 var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
11972 domain = scale.domain,
11977 function rescale() {
11978 logs = logp(base), pows = powp(base);
11979 if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
11983 scale.base = function(_) {
11984 return arguments.length ? (base = +_, rescale()) : base;
11987 scale.domain = function(_) {
11988 return arguments.length ? (domain(_), rescale()) : domain();
11991 scale.ticks = function(count) {
11994 v = d[d.length - 1],
11997 if (r = v < u) i = u, u = v, v = i;
12004 n = count == null ? 10 : +count,
12007 if (!(base % 1) && j - i < n) {
12008 i = Math.round(i) - 1, j = Math.round(j) + 1;
12009 if (u > 0) for (; i < j; ++i) {
12010 for (k = 1, p = pows(i); k < base; ++k) {
12012 if (t < u) continue;
12016 } else for (; i < j; ++i) {
12017 for (k = base - 1, p = pows(i); k >= 1; --k) {
12019 if (t < u) continue;
12025 z = ticks(i, j, Math.min(j - i, n)).map(pows);
12028 return r ? z.reverse() : z;
12031 scale.tickFormat = function(count, specifier) {
12032 if (specifier == null) specifier = base === 10 ? ".0e" : ",";
12033 if (typeof specifier !== "function") specifier = format(specifier);
12034 if (count === Infinity) return specifier;
12035 if (count == null) count = 10;
12036 var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
12037 return function(d) {
12038 var i = d / pows(Math.round(logs(d)));
12039 if (i * base < base - 0.5) i *= base;
12040 return i <= k ? specifier(d) : "";
12044 scale.nice = function() {
12045 return domain(nice(domain(), {
12046 floor: function(x) { return pows(Math.floor(logs(x))); },
12047 ceil: function(x) { return pows(Math.ceil(logs(x))); }
12051 scale.copy = function() {
12052 return copy(scale, log$1().base(base));
12058 function raise$1(x, exponent) {
12059 return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
12064 scale = continuous(deinterpolate, reinterpolate),
12065 domain = scale.domain;
12067 function deinterpolate(a, b) {
12068 return (b = raise$1(b, exponent) - (a = raise$1(a, exponent)))
12069 ? function(x) { return (raise$1(x, exponent) - a) / b; }
12073 function reinterpolate(a, b) {
12074 b = raise$1(b, exponent) - (a = raise$1(a, exponent));
12075 return function(t) { return raise$1(a + b * t, 1 / exponent); };
12078 scale.exponent = function(_) {
12079 return arguments.length ? (exponent = +_, domain(domain())) : exponent;
12082 scale.copy = function() {
12083 return copy(scale, pow$1().exponent(exponent));
12086 return linearish(scale);
12089 function sqrt$1() {
12090 return pow$1().exponent(0.5);
12093 function quantile$1() {
12098 function rescale() {
12099 var i = 0, n = Math.max(1, range$$1.length);
12100 thresholds = new Array(n - 1);
12101 while (++i < n) thresholds[i - 1] = quantile(domain, i / n);
12105 function scale(x) {
12106 if (!isNaN(x = +x)) return range$$1[bisectRight(thresholds, x)];
12109 scale.invertExtent = function(y) {
12110 var i = range$$1.indexOf(y);
12111 return i < 0 ? [NaN, NaN] : [
12112 i > 0 ? thresholds[i - 1] : domain[0],
12113 i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
12117 scale.domain = function(_) {
12118 if (!arguments.length) return domain.slice();
12120 for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
12121 domain.sort(ascending);
12125 scale.range = function(_) {
12126 return arguments.length ? (range$$1 = slice$5.call(_), rescale()) : range$$1.slice();
12129 scale.quantiles = function() {
12130 return thresholds.slice();
12133 scale.copy = function() {
12134 return quantile$1()
12142 function quantize() {
12149 function scale(x) {
12150 if (x <= x) return range$$1[bisectRight(domain, x, 0, n)];
12153 function rescale() {
12155 domain = new Array(n);
12156 while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
12160 scale.domain = function(_) {
12161 return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
12164 scale.range = function(_) {
12165 return arguments.length ? (n = (range$$1 = slice$5.call(_)).length - 1, rescale()) : range$$1.slice();
12168 scale.invertExtent = function(y) {
12169 var i = range$$1.indexOf(y);
12170 return i < 0 ? [NaN, NaN]
12171 : i < 1 ? [x0, domain[0]]
12172 : i >= n ? [domain[n - 1], x1]
12173 : [domain[i - 1], domain[i]];
12176 scale.copy = function() {
12182 return linearish(scale);
12185 function threshold() {
12186 var domain = [0.5],
12190 function scale(x) {
12191 if (x <= x) return range$$1[bisectRight(domain, x, 0, n)];
12194 scale.domain = function(_) {
12195 return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : domain.slice();
12198 scale.range = function(_) {
12199 return arguments.length ? (range$$1 = slice$5.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : range$$1.slice();
12202 scale.invertExtent = function(y) {
12203 var i = range$$1.indexOf(y);
12204 return [domain[i - 1], domain[i]];
12207 scale.copy = function() {
12216 var t0$1 = new Date,
12219 function newInterval(floori, offseti, count, field) {
12221 function interval(date) {
12222 return floori(date = new Date(+date)), date;
12225 interval.floor = interval;
12227 interval.ceil = function(date) {
12228 return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
12231 interval.round = function(date) {
12232 var d0 = interval(date),
12233 d1 = interval.ceil(date);
12234 return date - d0 < d1 - date ? d0 : d1;
12237 interval.offset = function(date, step) {
12238 return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
12241 interval.range = function(start, stop, step) {
12242 var range = [], previous;
12243 start = interval.ceil(start);
12244 step = step == null ? 1 : Math.floor(step);
12245 if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
12246 do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
12247 while (previous < start && start < stop);
12251 interval.filter = function(test) {
12252 return newInterval(function(date) {
12253 if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
12254 }, function(date, step) {
12255 if (date >= date) {
12256 if (step < 0) while (++step <= 0) {
12257 while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
12258 } else while (--step >= 0) {
12259 while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
12266 interval.count = function(start, end) {
12267 t0$1.setTime(+start), t1$1.setTime(+end);
12268 floori(t0$1), floori(t1$1);
12269 return Math.floor(count(t0$1, t1$1));
12272 interval.every = function(step) {
12273 step = Math.floor(step);
12274 return !isFinite(step) || !(step > 0) ? null
12275 : !(step > 1) ? interval
12276 : interval.filter(field
12277 ? function(d) { return field(d) % step === 0; }
12278 : function(d) { return interval.count(0, d) % step === 0; });
12285 var millisecond = newInterval(function() {
12287 }, function(date, step) {
12288 date.setTime(+date + step);
12289 }, function(start, end) {
12290 return end - start;
12293 // An optimized implementation for this simple case.
12294 millisecond.every = function(k) {
12296 if (!isFinite(k) || !(k > 0)) return null;
12297 if (!(k > 1)) return millisecond;
12298 return newInterval(function(date) {
12299 date.setTime(Math.floor(date / k) * k);
12300 }, function(date, step) {
12301 date.setTime(+date + step * k);
12302 }, function(start, end) {
12303 return (end - start) / k;
12306 var milliseconds = millisecond.range;
12308 var durationSecond = 1e3;
12309 var durationMinute = 6e4;
12310 var durationHour = 36e5;
12311 var durationDay = 864e5;
12312 var durationWeek = 6048e5;
12314 var second = newInterval(function(date) {
12315 date.setTime(Math.floor(date / durationSecond) * durationSecond);
12316 }, function(date, step) {
12317 date.setTime(+date + step * durationSecond);
12318 }, function(start, end) {
12319 return (end - start) / durationSecond;
12320 }, function(date) {
12321 return date.getUTCSeconds();
12323 var seconds = second.range;
12325 var minute = newInterval(function(date) {
12326 date.setTime(Math.floor(date / durationMinute) * durationMinute);
12327 }, function(date, step) {
12328 date.setTime(+date + step * durationMinute);
12329 }, function(start, end) {
12330 return (end - start) / durationMinute;
12331 }, function(date) {
12332 return date.getMinutes();
12334 var minutes = minute.range;
12336 var hour = newInterval(function(date) {
12337 var offset = date.getTimezoneOffset() * durationMinute % durationHour;
12338 if (offset < 0) offset += durationHour;
12339 date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);
12340 }, function(date, step) {
12341 date.setTime(+date + step * durationHour);
12342 }, function(start, end) {
12343 return (end - start) / durationHour;
12344 }, function(date) {
12345 return date.getHours();
12347 var hours = hour.range;
12349 var day = newInterval(function(date) {
12350 date.setHours(0, 0, 0, 0);
12351 }, function(date, step) {
12352 date.setDate(date.getDate() + step);
12353 }, function(start, end) {
12354 return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
12355 }, function(date) {
12356 return date.getDate() - 1;
12358 var days = day.range;
12360 function weekday(i) {
12361 return newInterval(function(date) {
12362 date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
12363 date.setHours(0, 0, 0, 0);
12364 }, function(date, step) {
12365 date.setDate(date.getDate() + step * 7);
12366 }, function(start, end) {
12367 return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
12371 var sunday = weekday(0);
12372 var monday = weekday(1);
12373 var tuesday = weekday(2);
12374 var wednesday = weekday(3);
12375 var thursday = weekday(4);
12376 var friday = weekday(5);
12377 var saturday = weekday(6);
12379 var sundays = sunday.range;
12380 var mondays = monday.range;
12381 var tuesdays = tuesday.range;
12382 var wednesdays = wednesday.range;
12383 var thursdays = thursday.range;
12384 var fridays = friday.range;
12385 var saturdays = saturday.range;
12387 var month = newInterval(function(date) {
12389 date.setHours(0, 0, 0, 0);
12390 }, function(date, step) {
12391 date.setMonth(date.getMonth() + step);
12392 }, function(start, end) {
12393 return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
12394 }, function(date) {
12395 return date.getMonth();
12397 var months = month.range;
12399 var year = newInterval(function(date) {
12400 date.setMonth(0, 1);
12401 date.setHours(0, 0, 0, 0);
12402 }, function(date, step) {
12403 date.setFullYear(date.getFullYear() + step);
12404 }, function(start, end) {
12405 return end.getFullYear() - start.getFullYear();
12406 }, function(date) {
12407 return date.getFullYear();
12410 // An optimized implementation for this simple case.
12411 year.every = function(k) {
12412 return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12413 date.setFullYear(Math.floor(date.getFullYear() / k) * k);
12414 date.setMonth(0, 1);
12415 date.setHours(0, 0, 0, 0);
12416 }, function(date, step) {
12417 date.setFullYear(date.getFullYear() + step * k);
12420 var years = year.range;
12422 var utcMinute = newInterval(function(date) {
12423 date.setUTCSeconds(0, 0);
12424 }, function(date, step) {
12425 date.setTime(+date + step * durationMinute);
12426 }, function(start, end) {
12427 return (end - start) / durationMinute;
12428 }, function(date) {
12429 return date.getUTCMinutes();
12431 var utcMinutes = utcMinute.range;
12433 var utcHour = newInterval(function(date) {
12434 date.setUTCMinutes(0, 0, 0);
12435 }, function(date, step) {
12436 date.setTime(+date + step * durationHour);
12437 }, function(start, end) {
12438 return (end - start) / durationHour;
12439 }, function(date) {
12440 return date.getUTCHours();
12442 var utcHours = utcHour.range;
12444 var utcDay = newInterval(function(date) {
12445 date.setUTCHours(0, 0, 0, 0);
12446 }, function(date, step) {
12447 date.setUTCDate(date.getUTCDate() + step);
12448 }, function(start, end) {
12449 return (end - start) / durationDay;
12450 }, function(date) {
12451 return date.getUTCDate() - 1;
12453 var utcDays = utcDay.range;
12455 function utcWeekday(i) {
12456 return newInterval(function(date) {
12457 date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
12458 date.setUTCHours(0, 0, 0, 0);
12459 }, function(date, step) {
12460 date.setUTCDate(date.getUTCDate() + step * 7);
12461 }, function(start, end) {
12462 return (end - start) / durationWeek;
12466 var utcSunday = utcWeekday(0);
12467 var utcMonday = utcWeekday(1);
12468 var utcTuesday = utcWeekday(2);
12469 var utcWednesday = utcWeekday(3);
12470 var utcThursday = utcWeekday(4);
12471 var utcFriday = utcWeekday(5);
12472 var utcSaturday = utcWeekday(6);
12474 var utcSundays = utcSunday.range;
12475 var utcMondays = utcMonday.range;
12476 var utcTuesdays = utcTuesday.range;
12477 var utcWednesdays = utcWednesday.range;
12478 var utcThursdays = utcThursday.range;
12479 var utcFridays = utcFriday.range;
12480 var utcSaturdays = utcSaturday.range;
12482 var utcMonth = newInterval(function(date) {
12483 date.setUTCDate(1);
12484 date.setUTCHours(0, 0, 0, 0);
12485 }, function(date, step) {
12486 date.setUTCMonth(date.getUTCMonth() + step);
12487 }, function(start, end) {
12488 return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
12489 }, function(date) {
12490 return date.getUTCMonth();
12492 var utcMonths = utcMonth.range;
12494 var utcYear = newInterval(function(date) {
12495 date.setUTCMonth(0, 1);
12496 date.setUTCHours(0, 0, 0, 0);
12497 }, function(date, step) {
12498 date.setUTCFullYear(date.getUTCFullYear() + step);
12499 }, function(start, end) {
12500 return end.getUTCFullYear() - start.getUTCFullYear();
12501 }, function(date) {
12502 return date.getUTCFullYear();
12505 // An optimized implementation for this simple case.
12506 utcYear.every = function(k) {
12507 return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12508 date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
12509 date.setUTCMonth(0, 1);
12510 date.setUTCHours(0, 0, 0, 0);
12511 }, function(date, step) {
12512 date.setUTCFullYear(date.getUTCFullYear() + step * k);
12515 var utcYears = utcYear.range;
12517 function localDate(d) {
12518 if (0 <= d.y && d.y < 100) {
12519 var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
12520 date.setFullYear(d.y);
12523 return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
12526 function utcDate(d) {
12527 if (0 <= d.y && d.y < 100) {
12528 var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
12529 date.setUTCFullYear(d.y);
12532 return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
12535 function newYear(y) {
12536 return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
12539 function formatLocale$1(locale) {
12540 var locale_dateTime = locale.dateTime,
12541 locale_date = locale.date,
12542 locale_time = locale.time,
12543 locale_periods = locale.periods,
12544 locale_weekdays = locale.days,
12545 locale_shortWeekdays = locale.shortDays,
12546 locale_months = locale.months,
12547 locale_shortMonths = locale.shortMonths;
12549 var periodRe = formatRe(locale_periods),
12550 periodLookup = formatLookup(locale_periods),
12551 weekdayRe = formatRe(locale_weekdays),
12552 weekdayLookup = formatLookup(locale_weekdays),
12553 shortWeekdayRe = formatRe(locale_shortWeekdays),
12554 shortWeekdayLookup = formatLookup(locale_shortWeekdays),
12555 monthRe = formatRe(locale_months),
12556 monthLookup = formatLookup(locale_months),
12557 shortMonthRe = formatRe(locale_shortMonths),
12558 shortMonthLookup = formatLookup(locale_shortMonths);
12561 "a": formatShortWeekday,
12562 "A": formatWeekday,
12563 "b": formatShortMonth,
12566 "d": formatDayOfMonth,
12567 "e": formatDayOfMonth,
12568 "f": formatMicroseconds,
12571 "j": formatDayOfYear,
12572 "L": formatMilliseconds,
12573 "m": formatMonthNumber,
12574 "M": formatMinutes,
12576 "Q": formatUnixTimestamp,
12577 "s": formatUnixTimestampSeconds,
12578 "S": formatSeconds,
12579 "u": formatWeekdayNumberMonday,
12580 "U": formatWeekNumberSunday,
12581 "V": formatWeekNumberISO,
12582 "w": formatWeekdayNumberSunday,
12583 "W": formatWeekNumberMonday,
12587 "Y": formatFullYear,
12589 "%": formatLiteralPercent
12593 "a": formatUTCShortWeekday,
12594 "A": formatUTCWeekday,
12595 "b": formatUTCShortMonth,
12596 "B": formatUTCMonth,
12598 "d": formatUTCDayOfMonth,
12599 "e": formatUTCDayOfMonth,
12600 "f": formatUTCMicroseconds,
12601 "H": formatUTCHour24,
12602 "I": formatUTCHour12,
12603 "j": formatUTCDayOfYear,
12604 "L": formatUTCMilliseconds,
12605 "m": formatUTCMonthNumber,
12606 "M": formatUTCMinutes,
12607 "p": formatUTCPeriod,
12608 "Q": formatUnixTimestamp,
12609 "s": formatUnixTimestampSeconds,
12610 "S": formatUTCSeconds,
12611 "u": formatUTCWeekdayNumberMonday,
12612 "U": formatUTCWeekNumberSunday,
12613 "V": formatUTCWeekNumberISO,
12614 "w": formatUTCWeekdayNumberSunday,
12615 "W": formatUTCWeekNumberMonday,
12618 "y": formatUTCYear,
12619 "Y": formatUTCFullYear,
12620 "Z": formatUTCZone,
12621 "%": formatLiteralPercent
12625 "a": parseShortWeekday,
12627 "b": parseShortMonth,
12629 "c": parseLocaleDateTime,
12630 "d": parseDayOfMonth,
12631 "e": parseDayOfMonth,
12632 "f": parseMicroseconds,
12635 "j": parseDayOfYear,
12636 "L": parseMilliseconds,
12637 "m": parseMonthNumber,
12640 "Q": parseUnixTimestamp,
12641 "s": parseUnixTimestampSeconds,
12643 "u": parseWeekdayNumberMonday,
12644 "U": parseWeekNumberSunday,
12645 "V": parseWeekNumberISO,
12646 "w": parseWeekdayNumberSunday,
12647 "W": parseWeekNumberMonday,
12648 "x": parseLocaleDate,
12649 "X": parseLocaleTime,
12651 "Y": parseFullYear,
12653 "%": parseLiteralPercent
12656 // These recursive directive definitions must be deferred.
12657 formats.x = newFormat(locale_date, formats);
12658 formats.X = newFormat(locale_time, formats);
12659 formats.c = newFormat(locale_dateTime, formats);
12660 utcFormats.x = newFormat(locale_date, utcFormats);
12661 utcFormats.X = newFormat(locale_time, utcFormats);
12662 utcFormats.c = newFormat(locale_dateTime, utcFormats);
12664 function newFormat(specifier, formats) {
12665 return function(date) {
12669 n = specifier.length,
12674 if (!(date instanceof Date)) date = new Date(+date);
12677 if (specifier.charCodeAt(i) === 37) {
12678 string.push(specifier.slice(j, i));
12679 if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
12680 else pad = c === "e" ? " " : "0";
12681 if (format = formats[c]) c = format(date, pad);
12687 string.push(specifier.slice(j, i));
12688 return string.join("");
12692 function newParse(specifier, newDate) {
12693 return function(string) {
12694 var d = newYear(1900),
12695 i = parseSpecifier(d, specifier, string += "", 0),
12697 if (i != string.length) return null;
12699 // If a UNIX timestamp is specified, return it.
12700 if ("Q" in d) return new Date(d.Q);
12702 // The am-pm flag is 0 for AM, and 1 for PM.
12703 if ("p" in d) d.H = d.H % 12 + d.p * 12;
12705 // Convert day-of-week and week-of-year to day-of-year.
12707 if (d.V < 1 || d.V > 53) return null;
12708 if (!("w" in d)) d.w = 1;
12710 week = utcDate(newYear(d.y)), day$$1 = week.getUTCDay();
12711 week = day$$1 > 4 || day$$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
12712 week = utcDay.offset(week, (d.V - 1) * 7);
12713 d.y = week.getUTCFullYear();
12714 d.m = week.getUTCMonth();
12715 d.d = week.getUTCDate() + (d.w + 6) % 7;
12717 week = newDate(newYear(d.y)), day$$1 = week.getDay();
12718 week = day$$1 > 4 || day$$1 === 0 ? monday.ceil(week) : monday(week);
12719 week = day.offset(week, (d.V - 1) * 7);
12720 d.y = week.getFullYear();
12721 d.m = week.getMonth();
12722 d.d = week.getDate() + (d.w + 6) % 7;
12724 } else if ("W" in d || "U" in d) {
12725 if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
12726 day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
12728 d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day$$1 + 5) % 7 : d.w + d.U * 7 - (day$$1 + 6) % 7;
12731 // If a time zone is specified, all fields are interpreted as UTC and then
12732 // offset according to the specified time zone.
12734 d.H += d.Z / 100 | 0;
12739 // Otherwise, all fields are in local time.
12744 function parseSpecifier(d, specifier, string, j) {
12746 n = specifier.length,
12752 if (j >= m) return -1;
12753 c = specifier.charCodeAt(i++);
12755 c = specifier.charAt(i++);
12756 parse = parses[c in pads ? specifier.charAt(i++) : c];
12757 if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
12758 } else if (c != string.charCodeAt(j++)) {
12766 function parsePeriod(d, string, i) {
12767 var n = periodRe.exec(string.slice(i));
12768 return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12771 function parseShortWeekday(d, string, i) {
12772 var n = shortWeekdayRe.exec(string.slice(i));
12773 return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12776 function parseWeekday(d, string, i) {
12777 var n = weekdayRe.exec(string.slice(i));
12778 return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12781 function parseShortMonth(d, string, i) {
12782 var n = shortMonthRe.exec(string.slice(i));
12783 return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12786 function parseMonth(d, string, i) {
12787 var n = monthRe.exec(string.slice(i));
12788 return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12791 function parseLocaleDateTime(d, string, i) {
12792 return parseSpecifier(d, locale_dateTime, string, i);
12795 function parseLocaleDate(d, string, i) {
12796 return parseSpecifier(d, locale_date, string, i);
12799 function parseLocaleTime(d, string, i) {
12800 return parseSpecifier(d, locale_time, string, i);
12803 function formatShortWeekday(d) {
12804 return locale_shortWeekdays[d.getDay()];
12807 function formatWeekday(d) {
12808 return locale_weekdays[d.getDay()];
12811 function formatShortMonth(d) {
12812 return locale_shortMonths[d.getMonth()];
12815 function formatMonth(d) {
12816 return locale_months[d.getMonth()];
12819 function formatPeriod(d) {
12820 return locale_periods[+(d.getHours() >= 12)];
12823 function formatUTCShortWeekday(d) {
12824 return locale_shortWeekdays[d.getUTCDay()];
12827 function formatUTCWeekday(d) {
12828 return locale_weekdays[d.getUTCDay()];
12831 function formatUTCShortMonth(d) {
12832 return locale_shortMonths[d.getUTCMonth()];
12835 function formatUTCMonth(d) {
12836 return locale_months[d.getUTCMonth()];
12839 function formatUTCPeriod(d) {
12840 return locale_periods[+(d.getUTCHours() >= 12)];
12844 format: function(specifier) {
12845 var f = newFormat(specifier += "", formats);
12846 f.toString = function() { return specifier; };
12849 parse: function(specifier) {
12850 var p = newParse(specifier += "", localDate);
12851 p.toString = function() { return specifier; };
12854 utcFormat: function(specifier) {
12855 var f = newFormat(specifier += "", utcFormats);
12856 f.toString = function() { return specifier; };
12859 utcParse: function(specifier) {
12860 var p = newParse(specifier, utcDate);
12861 p.toString = function() { return specifier; };
12867 var pads = {"-": "", "_": " ", "0": "0"},
12868 numberRe = /^\s*\d+/, // note: ignores next directive
12870 requoteRe = /[\\^$*+?|[\]().{}]/g;
12872 function pad(value, fill, width) {
12873 var sign = value < 0 ? "-" : "",
12874 string = (sign ? -value : value) + "",
12875 length = string.length;
12876 return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
12879 function requote(s) {
12880 return s.replace(requoteRe, "\\$&");
12883 function formatRe(names) {
12884 return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
12887 function formatLookup(names) {
12888 var map = {}, i = -1, n = names.length;
12889 while (++i < n) map[names[i].toLowerCase()] = i;
12893 function parseWeekdayNumberSunday(d, string, i) {
12894 var n = numberRe.exec(string.slice(i, i + 1));
12895 return n ? (d.w = +n[0], i + n[0].length) : -1;
12898 function parseWeekdayNumberMonday(d, string, i) {
12899 var n = numberRe.exec(string.slice(i, i + 1));
12900 return n ? (d.u = +n[0], i + n[0].length) : -1;
12903 function parseWeekNumberSunday(d, string, i) {
12904 var n = numberRe.exec(string.slice(i, i + 2));
12905 return n ? (d.U = +n[0], i + n[0].length) : -1;
12908 function parseWeekNumberISO(d, string, i) {
12909 var n = numberRe.exec(string.slice(i, i + 2));
12910 return n ? (d.V = +n[0], i + n[0].length) : -1;
12913 function parseWeekNumberMonday(d, string, i) {
12914 var n = numberRe.exec(string.slice(i, i + 2));
12915 return n ? (d.W = +n[0], i + n[0].length) : -1;
12918 function parseFullYear(d, string, i) {
12919 var n = numberRe.exec(string.slice(i, i + 4));
12920 return n ? (d.y = +n[0], i + n[0].length) : -1;
12923 function parseYear(d, string, i) {
12924 var n = numberRe.exec(string.slice(i, i + 2));
12925 return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
12928 function parseZone(d, string, i) {
12929 var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
12930 return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
12933 function parseMonthNumber(d, string, i) {
12934 var n = numberRe.exec(string.slice(i, i + 2));
12935 return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
12938 function parseDayOfMonth(d, string, i) {
12939 var n = numberRe.exec(string.slice(i, i + 2));
12940 return n ? (d.d = +n[0], i + n[0].length) : -1;
12943 function parseDayOfYear(d, string, i) {
12944 var n = numberRe.exec(string.slice(i, i + 3));
12945 return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
12948 function parseHour24(d, string, i) {
12949 var n = numberRe.exec(string.slice(i, i + 2));
12950 return n ? (d.H = +n[0], i + n[0].length) : -1;
12953 function parseMinutes(d, string, i) {
12954 var n = numberRe.exec(string.slice(i, i + 2));
12955 return n ? (d.M = +n[0], i + n[0].length) : -1;
12958 function parseSeconds(d, string, i) {
12959 var n = numberRe.exec(string.slice(i, i + 2));
12960 return n ? (d.S = +n[0], i + n[0].length) : -1;
12963 function parseMilliseconds(d, string, i) {
12964 var n = numberRe.exec(string.slice(i, i + 3));
12965 return n ? (d.L = +n[0], i + n[0].length) : -1;
12968 function parseMicroseconds(d, string, i) {
12969 var n = numberRe.exec(string.slice(i, i + 6));
12970 return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
12973 function parseLiteralPercent(d, string, i) {
12974 var n = percentRe.exec(string.slice(i, i + 1));
12975 return n ? i + n[0].length : -1;
12978 function parseUnixTimestamp(d, string, i) {
12979 var n = numberRe.exec(string.slice(i));
12980 return n ? (d.Q = +n[0], i + n[0].length) : -1;
12983 function parseUnixTimestampSeconds(d, string, i) {
12984 var n = numberRe.exec(string.slice(i));
12985 return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
12988 function formatDayOfMonth(d, p) {
12989 return pad(d.getDate(), p, 2);
12992 function formatHour24(d, p) {
12993 return pad(d.getHours(), p, 2);
12996 function formatHour12(d, p) {
12997 return pad(d.getHours() % 12 || 12, p, 2);
13000 function formatDayOfYear(d, p) {
13001 return pad(1 + day.count(year(d), d), p, 3);
13004 function formatMilliseconds(d, p) {
13005 return pad(d.getMilliseconds(), p, 3);
13008 function formatMicroseconds(d, p) {
13009 return formatMilliseconds(d, p) + "000";
13012 function formatMonthNumber(d, p) {
13013 return pad(d.getMonth() + 1, p, 2);
13016 function formatMinutes(d, p) {
13017 return pad(d.getMinutes(), p, 2);
13020 function formatSeconds(d, p) {
13021 return pad(d.getSeconds(), p, 2);
13024 function formatWeekdayNumberMonday(d) {
13025 var day$$1 = d.getDay();
13026 return day$$1 === 0 ? 7 : day$$1;
13029 function formatWeekNumberSunday(d, p) {
13030 return pad(sunday.count(year(d), d), p, 2);
13033 function formatWeekNumberISO(d, p) {
13034 var day$$1 = d.getDay();
13035 d = (day$$1 >= 4 || day$$1 === 0) ? thursday(d) : thursday.ceil(d);
13036 return pad(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
13039 function formatWeekdayNumberSunday(d) {
13043 function formatWeekNumberMonday(d, p) {
13044 return pad(monday.count(year(d), d), p, 2);
13047 function formatYear(d, p) {
13048 return pad(d.getFullYear() % 100, p, 2);
13051 function formatFullYear(d, p) {
13052 return pad(d.getFullYear() % 10000, p, 4);
13055 function formatZone(d) {
13056 var z = d.getTimezoneOffset();
13057 return (z > 0 ? "-" : (z *= -1, "+"))
13058 + pad(z / 60 | 0, "0", 2)
13059 + pad(z % 60, "0", 2);
13062 function formatUTCDayOfMonth(d, p) {
13063 return pad(d.getUTCDate(), p, 2);
13066 function formatUTCHour24(d, p) {
13067 return pad(d.getUTCHours(), p, 2);
13070 function formatUTCHour12(d, p) {
13071 return pad(d.getUTCHours() % 12 || 12, p, 2);
13074 function formatUTCDayOfYear(d, p) {
13075 return pad(1 + utcDay.count(utcYear(d), d), p, 3);
13078 function formatUTCMilliseconds(d, p) {
13079 return pad(d.getUTCMilliseconds(), p, 3);
13082 function formatUTCMicroseconds(d, p) {
13083 return formatUTCMilliseconds(d, p) + "000";
13086 function formatUTCMonthNumber(d, p) {
13087 return pad(d.getUTCMonth() + 1, p, 2);
13090 function formatUTCMinutes(d, p) {
13091 return pad(d.getUTCMinutes(), p, 2);
13094 function formatUTCSeconds(d, p) {
13095 return pad(d.getUTCSeconds(), p, 2);
13098 function formatUTCWeekdayNumberMonday(d) {
13099 var dow = d.getUTCDay();
13100 return dow === 0 ? 7 : dow;
13103 function formatUTCWeekNumberSunday(d, p) {
13104 return pad(utcSunday.count(utcYear(d), d), p, 2);
13107 function formatUTCWeekNumberISO(d, p) {
13108 var day$$1 = d.getUTCDay();
13109 d = (day$$1 >= 4 || day$$1 === 0) ? utcThursday(d) : utcThursday.ceil(d);
13110 return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
13113 function formatUTCWeekdayNumberSunday(d) {
13114 return d.getUTCDay();
13117 function formatUTCWeekNumberMonday(d, p) {
13118 return pad(utcMonday.count(utcYear(d), d), p, 2);
13121 function formatUTCYear(d, p) {
13122 return pad(d.getUTCFullYear() % 100, p, 2);
13125 function formatUTCFullYear(d, p) {
13126 return pad(d.getUTCFullYear() % 10000, p, 4);
13129 function formatUTCZone() {
13133 function formatLiteralPercent() {
13137 function formatUnixTimestamp(d) {
13141 function formatUnixTimestampSeconds(d) {
13142 return Math.floor(+d / 1000);
13152 dateTime: "%x, %X",
13153 date: "%-m/%-d/%Y",
13154 time: "%-I:%M:%S %p",
13155 periods: ["AM", "PM"],
13156 days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
13157 shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
13158 months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
13159 shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
13162 function defaultLocale$1(definition) {
13163 locale$1 = formatLocale$1(definition);
13164 timeFormat = locale$1.format;
13165 timeParse = locale$1.parse;
13166 utcFormat = locale$1.utcFormat;
13167 utcParse = locale$1.utcParse;
13171 var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
13173 function formatIsoNative(date) {
13174 return date.toISOString();
13177 var formatIso = Date.prototype.toISOString
13179 : utcFormat(isoSpecifier);
13181 function parseIsoNative(string) {
13182 var date = new Date(string);
13183 return isNaN(date) ? null : date;
13186 var parseIso = +new Date("2000-01-01T00:00:00.000Z")
13188 : utcParse(isoSpecifier);
13190 var durationSecond$1 = 1000,
13191 durationMinute$1 = durationSecond$1 * 60,
13192 durationHour$1 = durationMinute$1 * 60,
13193 durationDay$1 = durationHour$1 * 24,
13194 durationWeek$1 = durationDay$1 * 7,
13195 durationMonth = durationDay$1 * 30,
13196 durationYear = durationDay$1 * 365;
13198 function date$1(t) {
13199 return new Date(t);
13202 function number$3(t) {
13203 return t instanceof Date ? +t : +new Date(+t);
13206 function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format) {
13207 var scale = continuous(deinterpolateLinear, interpolateNumber),
13208 invert = scale.invert,
13209 domain = scale.domain;
13211 var formatMillisecond = format(".%L"),
13212 formatSecond = format(":%S"),
13213 formatMinute = format("%I:%M"),
13214 formatHour = format("%I %p"),
13215 formatDay = format("%a %d"),
13216 formatWeek = format("%b %d"),
13217 formatMonth = format("%B"),
13218 formatYear = format("%Y");
13220 var tickIntervals = [
13221 [second$$1, 1, durationSecond$1],
13222 [second$$1, 5, 5 * durationSecond$1],
13223 [second$$1, 15, 15 * durationSecond$1],
13224 [second$$1, 30, 30 * durationSecond$1],
13225 [minute$$1, 1, durationMinute$1],
13226 [minute$$1, 5, 5 * durationMinute$1],
13227 [minute$$1, 15, 15 * durationMinute$1],
13228 [minute$$1, 30, 30 * durationMinute$1],
13229 [ hour$$1, 1, durationHour$1 ],
13230 [ hour$$1, 3, 3 * durationHour$1 ],
13231 [ hour$$1, 6, 6 * durationHour$1 ],
13232 [ hour$$1, 12, 12 * durationHour$1 ],
13233 [ day$$1, 1, durationDay$1 ],
13234 [ day$$1, 2, 2 * durationDay$1 ],
13235 [ week, 1, durationWeek$1 ],
13236 [ month$$1, 1, durationMonth ],
13237 [ month$$1, 3, 3 * durationMonth ],
13238 [ year$$1, 1, durationYear ]
13241 function tickFormat(date$$1) {
13242 return (second$$1(date$$1) < date$$1 ? formatMillisecond
13243 : minute$$1(date$$1) < date$$1 ? formatSecond
13244 : hour$$1(date$$1) < date$$1 ? formatMinute
13245 : day$$1(date$$1) < date$$1 ? formatHour
13246 : month$$1(date$$1) < date$$1 ? (week(date$$1) < date$$1 ? formatDay : formatWeek)
13247 : year$$1(date$$1) < date$$1 ? formatMonth
13248 : formatYear)(date$$1);
13251 function tickInterval(interval, start, stop, step) {
13252 if (interval == null) interval = 10;
13254 // If a desired tick count is specified, pick a reasonable tick interval
13255 // based on the extent of the domain and a rough estimate of tick size.
13256 // Otherwise, assume interval is already a time interval and use it.
13257 if (typeof interval === "number") {
13258 var target = Math.abs(stop - start) / interval,
13259 i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);
13260 if (i === tickIntervals.length) {
13261 step = tickStep(start / durationYear, stop / durationYear, interval);
13262 interval = year$$1;
13264 i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
13268 step = Math.max(tickStep(start, stop, interval), 1);
13269 interval = millisecond$$1;
13273 return step == null ? interval : interval.every(step);
13276 scale.invert = function(y) {
13277 return new Date(invert(y));
13280 scale.domain = function(_) {
13281 return arguments.length ? domain(map$2.call(_, number$3)) : domain().map(date$1);
13284 scale.ticks = function(interval, step) {
13287 t1 = d[d.length - 1],
13290 if (r) t = t0, t0 = t1, t1 = t;
13291 t = tickInterval(interval, t0, t1, step);
13292 t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
13293 return r ? t.reverse() : t;
13296 scale.tickFormat = function(count, specifier) {
13297 return specifier == null ? tickFormat : format(specifier);
13300 scale.nice = function(interval, step) {
13302 return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
13303 ? domain(nice(d, interval))
13307 scale.copy = function() {
13308 return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format));
13315 return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
13318 function utcTime() {
13319 return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
13322 function colors(s) {
13323 return s.match(/.{6}/g).map(function(x) {
13328 var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
13330 var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
13332 var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
13334 var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
13336 var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
13338 var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13340 var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13342 var rainbow = cubehelix();
13344 function rainbow$1(t) {
13345 if (t < 0 || t > 1) t -= Math.floor(t);
13346 var ts = Math.abs(t - 0.5);
13347 rainbow.h = 360 * t - 100;
13348 rainbow.s = 1.5 - 1.5 * ts;
13349 rainbow.l = 0.8 - 0.9 * ts;
13350 return rainbow + "";
13353 function ramp(range) {
13354 var n = range.length;
13355 return function(t) {
13356 return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
13360 var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
13362 var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
13364 var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
13366 var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
13368 function sequential(interpolator) {
13373 function scale(x) {
13374 var t = (x - x0) / (x1 - x0);
13375 return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
13378 scale.domain = function(_) {
13379 return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
13382 scale.clamp = function(_) {
13383 return arguments.length ? (clamp = !!_, scale) : clamp;
13386 scale.interpolator = function(_) {
13387 return arguments.length ? (interpolator = _, scale) : interpolator;
13390 scale.copy = function() {
13391 return sequential(interpolator).domain([x0, x1]).clamp(clamp);
13394 return linearish(scale);
13397 function constant$a(x) {
13398 return function constant() {
13403 var abs$1 = Math.abs;
13404 var atan2$1 = Math.atan2;
13405 var cos$2 = Math.cos;
13406 var max$2 = Math.max;
13407 var min$1 = Math.min;
13408 var sin$2 = Math.sin;
13409 var sqrt$2 = Math.sqrt;
13411 var epsilon$3 = 1e-12;
13412 var pi$4 = Math.PI;
13413 var halfPi$3 = pi$4 / 2;
13414 var tau$4 = 2 * pi$4;
13416 function acos$1(x) {
13417 return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
13420 function asin$1(x) {
13421 return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
13424 function arcInnerRadius(d) {
13425 return d.innerRadius;
13428 function arcOuterRadius(d) {
13429 return d.outerRadius;
13432 function arcStartAngle(d) {
13433 return d.startAngle;
13436 function arcEndAngle(d) {
13440 function arcPadAngle(d) {
13441 return d && d.padAngle; // Note: optional!
13444 function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
13445 var x10 = x1 - x0, y10 = y1 - y0,
13446 x32 = x3 - x2, y32 = y3 - y2,
13447 t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);
13448 return [x0 + t * x10, y0 + t * y10];
13451 // Compute perpendicular offset line of length rc.
13452 // http://mathworld.wolfram.com/Circle-LineIntersection.html
13453 function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
13456 lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
13463 x00 = (x11 + x10) / 2,
13464 y00 = (y11 + y10) / 2,
13467 d2 = dx * dx + dy * dy,
13469 D = x11 * y10 - x10 * y11,
13470 d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)),
13471 cx0 = (D * dy - dx * d) / d2,
13472 cy0 = (-D * dx - dy * d) / d2,
13473 cx1 = (D * dy + dx * d) / d2,
13474 cy1 = (-D * dx + dy * d) / d2,
13480 // Pick the closer of the two intersection points.
13481 // TODO Is there a faster way to determine which intersection to use?
13482 if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
13489 x11: cx0 * (r1 / r - 1),
13490 y11: cy0 * (r1 / r - 1)
13495 var innerRadius = arcInnerRadius,
13496 outerRadius = arcOuterRadius,
13497 cornerRadius = constant$a(0),
13499 startAngle = arcStartAngle,
13500 endAngle = arcEndAngle,
13501 padAngle = arcPadAngle,
13507 r0 = +innerRadius.apply(this, arguments),
13508 r1 = +outerRadius.apply(this, arguments),
13509 a0 = startAngle.apply(this, arguments) - halfPi$3,
13510 a1 = endAngle.apply(this, arguments) - halfPi$3,
13511 da = abs$1(a1 - a0),
13514 if (!context) context = buffer = path();
13516 // Ensure that the outer radius is always larger than the inner radius.
13517 if (r1 < r0) r = r1, r1 = r0, r0 = r;
13520 if (!(r1 > epsilon$3)) context.moveTo(0, 0);
13522 // Or is it a circle or annulus?
13523 else if (da > tau$4 - epsilon$3) {
13524 context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
13525 context.arc(0, 0, r1, a0, a1, !cw);
13526 if (r0 > epsilon$3) {
13527 context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
13528 context.arc(0, 0, r0, a1, a0, cw);
13532 // Or is it a circular or annular sector?
13540 ap = padAngle.apply(this, arguments) / 2,
13541 rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
13542 rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
13548 // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
13549 if (rp > epsilon$3) {
13550 var p0 = asin$1(rp / r0 * sin$2(ap)),
13551 p1 = asin$1(rp / r1 * sin$2(ap));
13552 if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
13553 else da0 = 0, a00 = a10 = (a0 + a1) / 2;
13554 if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
13555 else da1 = 0, a01 = a11 = (a0 + a1) / 2;
13558 var x01 = r1 * cos$2(a01),
13559 y01 = r1 * sin$2(a01),
13560 x10 = r0 * cos$2(a10),
13561 y10 = r0 * sin$2(a10);
13563 // Apply rounded corners?
13564 if (rc > epsilon$3) {
13565 var x11 = r1 * cos$2(a11),
13566 y11 = r1 * sin$2(a11),
13567 x00 = r0 * cos$2(a00),
13568 y00 = r0 * sin$2(a00);
13570 // Restrict the corner radius according to the sector angle.
13572 var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
13577 kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
13578 lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
13579 rc0 = min$1(rc, (r0 - lc) / (kc - 1));
13580 rc1 = min$1(rc, (r1 - lc) / (kc + 1));
13584 // Is the sector collapsed to a line?
13585 if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
13587 // Does the sector’s outer ring have rounded corners?
13588 else if (rc1 > epsilon$3) {
13589 t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
13590 t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
13592 context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
13594 // Have the corners merged?
13595 if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13597 // Otherwise, draw the two corners and the ring.
13599 context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13600 context.arc(0, 0, r1, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), !cw);
13601 context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13605 // Or is the outer ring just a circular arc?
13606 else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
13608 // Is there no inner ring, and it’s a circular sector?
13609 // Or perhaps it’s an annular sector collapsed due to padding?
13610 if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
13612 // Does the sector’s inner ring (or point) have rounded corners?
13613 else if (rc0 > epsilon$3) {
13614 t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
13615 t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
13617 context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
13619 // Have the corners merged?
13620 if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13622 // Otherwise, draw the two corners and the ring.
13624 context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13625 context.arc(0, 0, r0, atan2$1(t0.cy + t0.y11, t0.cx + t0.x11), atan2$1(t1.cy + t1.y11, t1.cx + t1.x11), cw);
13626 context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13630 // Or is the inner ring just a circular arc?
13631 else context.arc(0, 0, r0, a10, a00, cw);
13634 context.closePath();
13636 if (buffer) return context = null, buffer + "" || null;
13639 arc.centroid = function() {
13640 var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
13641 a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
13642 return [cos$2(a) * r, sin$2(a) * r];
13645 arc.innerRadius = function(_) {
13646 return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : innerRadius;
13649 arc.outerRadius = function(_) {
13650 return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : outerRadius;
13653 arc.cornerRadius = function(_) {
13654 return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : cornerRadius;
13657 arc.padRadius = function(_) {
13658 return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), arc) : padRadius;
13661 arc.startAngle = function(_) {
13662 return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : startAngle;
13665 arc.endAngle = function(_) {
13666 return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : endAngle;
13669 arc.padAngle = function(_) {
13670 return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : padAngle;
13673 arc.context = function(_) {
13674 return arguments.length ? ((context = _ == null ? null : _), arc) : context;
13680 function Linear(context) {
13681 this._context = context;
13684 Linear.prototype = {
13685 areaStart: function() {
13688 areaEnd: function() {
13691 lineStart: function() {
13694 lineEnd: function() {
13695 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
13696 this._line = 1 - this._line;
13698 point: function(x, y) {
13700 switch (this._point) {
13701 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
13702 case 1: this._point = 2; // proceed
13703 default: this._context.lineTo(x, y); break;
13708 function curveLinear(context) {
13709 return new Linear(context);
13723 defined = constant$a(true),
13725 curve = curveLinear,
13728 function line(data) {
13735 if (context == null) output = curve(buffer = path());
13737 for (i = 0; i <= n; ++i) {
13738 if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13739 if (defined0 = !defined0) output.lineStart();
13740 else output.lineEnd();
13742 if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data));
13745 if (buffer) return output = null, buffer + "" || null;
13748 line.x = function(_) {
13749 return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$a(+_), line) : x$$1;
13752 line.y = function(_) {
13753 return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$a(+_), line) : y$$1;
13756 line.defined = function(_) {
13757 return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), line) : defined;
13760 line.curve = function(_) {
13761 return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
13764 line.context = function(_) {
13765 return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
13774 y0 = constant$a(0),
13776 defined = constant$a(true),
13778 curve = curveLinear,
13781 function area(data) {
13789 x0z = new Array(n),
13790 y0z = new Array(n);
13792 if (context == null) output = curve(buffer = path());
13794 for (i = 0; i <= n; ++i) {
13795 if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13796 if (defined0 = !defined0) {
13798 output.areaStart();
13799 output.lineStart();
13802 output.lineStart();
13803 for (k = i - 1; k >= j; --k) {
13804 output.point(x0z[k], y0z[k]);
13811 x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
13812 output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
13816 if (buffer) return output = null, buffer + "" || null;
13819 function arealine() {
13820 return line().defined(defined).curve(curve).context(context);
13823 area.x = function(_) {
13824 return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), x1 = null, area) : x0;
13827 area.x0 = function(_) {
13828 return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), area) : x0;
13831 area.x1 = function(_) {
13832 return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : x1;
13835 area.y = function(_) {
13836 return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), y1 = null, area) : y0;
13839 area.y0 = function(_) {
13840 return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), area) : y0;
13843 area.y1 = function(_) {
13844 return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : y1;
13848 area.lineY0 = function() {
13849 return arealine().x(x0).y(y0);
13852 area.lineY1 = function() {
13853 return arealine().x(x0).y(y1);
13856 area.lineX1 = function() {
13857 return arealine().x(x1).y(y0);
13860 area.defined = function(_) {
13861 return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), area) : defined;
13864 area.curve = function(_) {
13865 return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
13868 area.context = function(_) {
13869 return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
13875 function descending(a, b) {
13876 return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
13879 function identity$6(d) {
13884 var value = identity$6,
13885 sortValues = descending,
13887 startAngle = constant$a(0),
13888 endAngle = constant$a(tau$4),
13889 padAngle = constant$a(0);
13891 function pie(data) {
13897 index = new Array(n),
13898 arcs = new Array(n),
13899 a0 = +startAngle.apply(this, arguments),
13900 da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
13902 p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
13903 pa = p * (da < 0 ? -1 : 1),
13906 for (i = 0; i < n; ++i) {
13907 if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
13912 // Optionally sort the arcs by previously-computed values or by data.
13913 if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
13914 else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
13916 // Compute the arcs! They are stored in the original data's order.
13917 for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
13918 j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
13931 pie.value = function(_) {
13932 return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), pie) : value;
13935 pie.sortValues = function(_) {
13936 return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
13939 pie.sort = function(_) {
13940 return arguments.length ? (sort = _, sortValues = null, pie) : sort;
13943 pie.startAngle = function(_) {
13944 return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : startAngle;
13947 pie.endAngle = function(_) {
13948 return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : endAngle;
13951 pie.padAngle = function(_) {
13952 return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : padAngle;
13958 var curveRadialLinear = curveRadial(curveLinear);
13960 function Radial(curve) {
13961 this._curve = curve;
13964 Radial.prototype = {
13965 areaStart: function() {
13966 this._curve.areaStart();
13968 areaEnd: function() {
13969 this._curve.areaEnd();
13971 lineStart: function() {
13972 this._curve.lineStart();
13974 lineEnd: function() {
13975 this._curve.lineEnd();
13977 point: function(a, r) {
13978 this._curve.point(r * Math.sin(a), r * -Math.cos(a));
13982 function curveRadial(curve) {
13984 function radial(context) {
13985 return new Radial(curve(context));
13988 radial._curve = curve;
13993 function lineRadial(l) {
13996 l.angle = l.x, delete l.x;
13997 l.radius = l.y, delete l.y;
13999 l.curve = function(_) {
14000 return arguments.length ? c(curveRadial(_)) : c()._curve;
14006 function lineRadial$1() {
14007 return lineRadial(line().curve(curveRadialLinear));
14010 function areaRadial() {
14011 var a = area().curve(curveRadialLinear),
14018 a.angle = a.x, delete a.x;
14019 a.startAngle = a.x0, delete a.x0;
14020 a.endAngle = a.x1, delete a.x1;
14021 a.radius = a.y, delete a.y;
14022 a.innerRadius = a.y0, delete a.y0;
14023 a.outerRadius = a.y1, delete a.y1;
14024 a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
14025 a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
14026 a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
14027 a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
14029 a.curve = function(_) {
14030 return arguments.length ? c(curveRadial(_)) : c()._curve;
14036 function pointRadial(x, y) {
14037 return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
14040 var slice$6 = Array.prototype.slice;
14042 function linkSource(d) {
14046 function linkTarget(d) {
14050 function link$2(curve) {
14051 var source = linkSource,
14052 target = linkTarget,
14058 var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
14059 if (!context) context = buffer = path();
14060 curve(context, +x$$1.apply(this, (argv[0] = s, argv)), +y$$1.apply(this, argv), +x$$1.apply(this, (argv[0] = t, argv)), +y$$1.apply(this, argv));
14061 if (buffer) return context = null, buffer + "" || null;
14064 link.source = function(_) {
14065 return arguments.length ? (source = _, link) : source;
14068 link.target = function(_) {
14069 return arguments.length ? (target = _, link) : target;
14072 link.x = function(_) {
14073 return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$a(+_), link) : x$$1;
14076 link.y = function(_) {
14077 return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$a(+_), link) : y$$1;
14080 link.context = function(_) {
14081 return arguments.length ? ((context = _ == null ? null : _), link) : context;
14087 function curveHorizontal(context, x0, y0, x1, y1) {
14088 context.moveTo(x0, y0);
14089 context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
14092 function curveVertical(context, x0, y0, x1, y1) {
14093 context.moveTo(x0, y0);
14094 context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
14097 function curveRadial$1(context, x0, y0, x1, y1) {
14098 var p0 = pointRadial(x0, y0),
14099 p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
14100 p2 = pointRadial(x1, y0),
14101 p3 = pointRadial(x1, y1);
14102 context.moveTo(p0[0], p0[1]);
14103 context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
14106 function linkHorizontal() {
14107 return link$2(curveHorizontal);
14110 function linkVertical() {
14111 return link$2(curveVertical);
14114 function linkRadial() {
14115 var l = link$2(curveRadial$1);
14116 l.angle = l.x, delete l.x;
14117 l.radius = l.y, delete l.y;
14122 draw: function(context, size) {
14123 var r = Math.sqrt(size / pi$4);
14124 context.moveTo(r, 0);
14125 context.arc(0, 0, r, 0, tau$4);
14130 draw: function(context, size) {
14131 var r = Math.sqrt(size / 5) / 2;
14132 context.moveTo(-3 * r, -r);
14133 context.lineTo(-r, -r);
14134 context.lineTo(-r, -3 * r);
14135 context.lineTo(r, -3 * r);
14136 context.lineTo(r, -r);
14137 context.lineTo(3 * r, -r);
14138 context.lineTo(3 * r, r);
14139 context.lineTo(r, r);
14140 context.lineTo(r, 3 * r);
14141 context.lineTo(-r, 3 * r);
14142 context.lineTo(-r, r);
14143 context.lineTo(-3 * r, r);
14144 context.closePath();
14148 var tan30 = Math.sqrt(1 / 3),
14149 tan30_2 = tan30 * 2;
14152 draw: function(context, size) {
14153 var y = Math.sqrt(size / tan30_2),
14155 context.moveTo(0, -y);
14156 context.lineTo(x, 0);
14157 context.lineTo(0, y);
14158 context.lineTo(-x, 0);
14159 context.closePath();
14163 var ka = 0.89081309152928522810,
14164 kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10),
14165 kx = Math.sin(tau$4 / 10) * kr,
14166 ky = -Math.cos(tau$4 / 10) * kr;
14169 draw: function(context, size) {
14170 var r = Math.sqrt(size * ka),
14173 context.moveTo(0, -r);
14174 context.lineTo(x, y);
14175 for (var i = 1; i < 5; ++i) {
14176 var a = tau$4 * i / 5,
14179 context.lineTo(s * r, -c * r);
14180 context.lineTo(c * x - s * y, s * x + c * y);
14182 context.closePath();
14187 draw: function(context, size) {
14188 var w = Math.sqrt(size),
14190 context.rect(x, x, w, w);
14194 var sqrt3 = Math.sqrt(3);
14197 draw: function(context, size) {
14198 var y = -Math.sqrt(size / (sqrt3 * 3));
14199 context.moveTo(0, y * 2);
14200 context.lineTo(-sqrt3 * y, -y);
14201 context.lineTo(sqrt3 * y, -y);
14202 context.closePath();
14207 s = Math.sqrt(3) / 2,
14208 k = 1 / Math.sqrt(12),
14209 a = (k / 2 + 1) * 3;
14212 draw: function(context, size) {
14213 var r = Math.sqrt(size / a),
14220 context.moveTo(x0, y0);
14221 context.lineTo(x1, y1);
14222 context.lineTo(x2, y2);
14223 context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
14224 context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
14225 context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
14226 context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
14227 context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
14228 context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
14229 context.closePath();
14243 function symbol() {
14244 var type = constant$a(circle$2),
14245 size = constant$a(64),
14248 function symbol() {
14250 if (!context) context = buffer = path();
14251 type.apply(this, arguments).draw(context, +size.apply(this, arguments));
14252 if (buffer) return context = null, buffer + "" || null;
14255 symbol.type = function(_) {
14256 return arguments.length ? (type = typeof _ === "function" ? _ : constant$a(_), symbol) : type;
14259 symbol.size = function(_) {
14260 return arguments.length ? (size = typeof _ === "function" ? _ : constant$a(+_), symbol) : size;
14263 symbol.context = function(_) {
14264 return arguments.length ? (context = _ == null ? null : _, symbol) : context;
14270 function noop$2() {}
14272 function point$2(that, x, y) {
14273 that._context.bezierCurveTo(
14274 (2 * that._x0 + that._x1) / 3,
14275 (2 * that._y0 + that._y1) / 3,
14276 (that._x0 + 2 * that._x1) / 3,
14277 (that._y0 + 2 * that._y1) / 3,
14278 (that._x0 + 4 * that._x1 + x) / 6,
14279 (that._y0 + 4 * that._y1 + y) / 6
14283 function Basis(context) {
14284 this._context = context;
14287 Basis.prototype = {
14288 areaStart: function() {
14291 areaEnd: function() {
14294 lineStart: function() {
14295 this._x0 = this._x1 =
14296 this._y0 = this._y1 = NaN;
14299 lineEnd: function() {
14300 switch (this._point) {
14301 case 3: point$2(this, this._x1, this._y1); // proceed
14302 case 2: this._context.lineTo(this._x1, this._y1); break;
14304 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14305 this._line = 1 - this._line;
14307 point: function(x, y) {
14309 switch (this._point) {
14310 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14311 case 1: this._point = 2; break;
14312 case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
14313 default: point$2(this, x, y); break;
14315 this._x0 = this._x1, this._x1 = x;
14316 this._y0 = this._y1, this._y1 = y;
14320 function basis$2(context) {
14321 return new Basis(context);
14324 function BasisClosed(context) {
14325 this._context = context;
14328 BasisClosed.prototype = {
14331 lineStart: function() {
14332 this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
14333 this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
14336 lineEnd: function() {
14337 switch (this._point) {
14339 this._context.moveTo(this._x2, this._y2);
14340 this._context.closePath();
14344 this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
14345 this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
14346 this._context.closePath();
14350 this.point(this._x2, this._y2);
14351 this.point(this._x3, this._y3);
14352 this.point(this._x4, this._y4);
14357 point: function(x, y) {
14359 switch (this._point) {
14360 case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
14361 case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
14362 case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;
14363 default: point$2(this, x, y); break;
14365 this._x0 = this._x1, this._x1 = x;
14366 this._y0 = this._y1, this._y1 = y;
14370 function basisClosed$1(context) {
14371 return new BasisClosed(context);
14374 function BasisOpen(context) {
14375 this._context = context;
14378 BasisOpen.prototype = {
14379 areaStart: function() {
14382 areaEnd: function() {
14385 lineStart: function() {
14386 this._x0 = this._x1 =
14387 this._y0 = this._y1 = NaN;
14390 lineEnd: function() {
14391 if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14392 this._line = 1 - this._line;
14394 point: function(x, y) {
14396 switch (this._point) {
14397 case 0: this._point = 1; break;
14398 case 1: this._point = 2; break;
14399 case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;
14400 case 3: this._point = 4; // proceed
14401 default: point$2(this, x, y); break;
14403 this._x0 = this._x1, this._x1 = x;
14404 this._y0 = this._y1, this._y1 = y;
14408 function basisOpen(context) {
14409 return new BasisOpen(context);
14412 function Bundle(context, beta) {
14413 this._basis = new Basis(context);
14417 Bundle.prototype = {
14418 lineStart: function() {
14421 this._basis.lineStart();
14423 lineEnd: function() {
14439 this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
14440 this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
14445 this._x = this._y = null;
14446 this._basis.lineEnd();
14448 point: function(x, y) {
14454 var bundle = (function custom(beta) {
14456 function bundle(context) {
14457 return beta === 1 ? new Basis(context) : new Bundle(context, beta);
14460 bundle.beta = function(beta) {
14461 return custom(+beta);
14467 function point$3(that, x, y) {
14468 that._context.bezierCurveTo(
14469 that._x1 + that._k * (that._x2 - that._x0),
14470 that._y1 + that._k * (that._y2 - that._y0),
14471 that._x2 + that._k * (that._x1 - x),
14472 that._y2 + that._k * (that._y1 - y),
14478 function Cardinal(context, tension) {
14479 this._context = context;
14480 this._k = (1 - tension) / 6;
14483 Cardinal.prototype = {
14484 areaStart: function() {
14487 areaEnd: function() {
14490 lineStart: function() {
14491 this._x0 = this._x1 = this._x2 =
14492 this._y0 = this._y1 = this._y2 = NaN;
14495 lineEnd: function() {
14496 switch (this._point) {
14497 case 2: this._context.lineTo(this._x2, this._y2); break;
14498 case 3: point$3(this, this._x1, this._y1); break;
14500 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14501 this._line = 1 - this._line;
14503 point: function(x, y) {
14505 switch (this._point) {
14506 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14507 case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
14508 case 2: this._point = 3; // proceed
14509 default: point$3(this, x, y); break;
14511 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14512 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14516 var cardinal = (function custom(tension) {
14518 function cardinal(context) {
14519 return new Cardinal(context, tension);
14522 cardinal.tension = function(tension) {
14523 return custom(+tension);
14529 function CardinalClosed(context, tension) {
14530 this._context = context;
14531 this._k = (1 - tension) / 6;
14534 CardinalClosed.prototype = {
14537 lineStart: function() {
14538 this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14539 this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14542 lineEnd: function() {
14543 switch (this._point) {
14545 this._context.moveTo(this._x3, this._y3);
14546 this._context.closePath();
14550 this._context.lineTo(this._x3, this._y3);
14551 this._context.closePath();
14555 this.point(this._x3, this._y3);
14556 this.point(this._x4, this._y4);
14557 this.point(this._x5, this._y5);
14562 point: function(x, y) {
14564 switch (this._point) {
14565 case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14566 case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14567 case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14568 default: point$3(this, x, y); break;
14570 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14571 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14575 var cardinalClosed = (function custom(tension) {
14577 function cardinal$$1(context) {
14578 return new CardinalClosed(context, tension);
14581 cardinal$$1.tension = function(tension) {
14582 return custom(+tension);
14585 return cardinal$$1;
14588 function CardinalOpen(context, tension) {
14589 this._context = context;
14590 this._k = (1 - tension) / 6;
14593 CardinalOpen.prototype = {
14594 areaStart: function() {
14597 areaEnd: function() {
14600 lineStart: function() {
14601 this._x0 = this._x1 = this._x2 =
14602 this._y0 = this._y1 = this._y2 = NaN;
14605 lineEnd: function() {
14606 if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14607 this._line = 1 - this._line;
14609 point: function(x, y) {
14611 switch (this._point) {
14612 case 0: this._point = 1; break;
14613 case 1: this._point = 2; break;
14614 case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14615 case 3: this._point = 4; // proceed
14616 default: point$3(this, x, y); break;
14618 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14619 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14623 var cardinalOpen = (function custom(tension) {
14625 function cardinal$$1(context) {
14626 return new CardinalOpen(context, tension);
14629 cardinal$$1.tension = function(tension) {
14630 return custom(+tension);
14633 return cardinal$$1;
14636 function point$4(that, x, y) {
14642 if (that._l01_a > epsilon$3) {
14643 var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
14644 n = 3 * that._l01_a * (that._l01_a + that._l12_a);
14645 x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
14646 y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
14649 if (that._l23_a > epsilon$3) {
14650 var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
14651 m = 3 * that._l23_a * (that._l23_a + that._l12_a);
14652 x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
14653 y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
14656 that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
14659 function CatmullRom(context, alpha) {
14660 this._context = context;
14661 this._alpha = alpha;
14664 CatmullRom.prototype = {
14665 areaStart: function() {
14668 areaEnd: function() {
14671 lineStart: function() {
14672 this._x0 = this._x1 = this._x2 =
14673 this._y0 = this._y1 = this._y2 = NaN;
14674 this._l01_a = this._l12_a = this._l23_a =
14675 this._l01_2a = this._l12_2a = this._l23_2a =
14678 lineEnd: function() {
14679 switch (this._point) {
14680 case 2: this._context.lineTo(this._x2, this._y2); break;
14681 case 3: this.point(this._x2, this._y2); break;
14683 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14684 this._line = 1 - this._line;
14686 point: function(x, y) {
14690 var x23 = this._x2 - x,
14691 y23 = this._y2 - y;
14692 this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14695 switch (this._point) {
14696 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14697 case 1: this._point = 2; break;
14698 case 2: this._point = 3; // proceed
14699 default: point$4(this, x, y); break;
14702 this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14703 this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14704 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14705 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14709 var catmullRom = (function custom(alpha) {
14711 function catmullRom(context) {
14712 return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
14715 catmullRom.alpha = function(alpha) {
14716 return custom(+alpha);
14722 function CatmullRomClosed(context, alpha) {
14723 this._context = context;
14724 this._alpha = alpha;
14727 CatmullRomClosed.prototype = {
14730 lineStart: function() {
14731 this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14732 this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14733 this._l01_a = this._l12_a = this._l23_a =
14734 this._l01_2a = this._l12_2a = this._l23_2a =
14737 lineEnd: function() {
14738 switch (this._point) {
14740 this._context.moveTo(this._x3, this._y3);
14741 this._context.closePath();
14745 this._context.lineTo(this._x3, this._y3);
14746 this._context.closePath();
14750 this.point(this._x3, this._y3);
14751 this.point(this._x4, this._y4);
14752 this.point(this._x5, this._y5);
14757 point: function(x, y) {
14761 var x23 = this._x2 - x,
14762 y23 = this._y2 - y;
14763 this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14766 switch (this._point) {
14767 case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14768 case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14769 case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14770 default: point$4(this, x, y); break;
14773 this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14774 this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14775 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14776 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14780 var catmullRomClosed = (function custom(alpha) {
14782 function catmullRom$$1(context) {
14783 return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14786 catmullRom$$1.alpha = function(alpha) {
14787 return custom(+alpha);
14790 return catmullRom$$1;
14793 function CatmullRomOpen(context, alpha) {
14794 this._context = context;
14795 this._alpha = alpha;
14798 CatmullRomOpen.prototype = {
14799 areaStart: function() {
14802 areaEnd: function() {
14805 lineStart: function() {
14806 this._x0 = this._x1 = this._x2 =
14807 this._y0 = this._y1 = this._y2 = NaN;
14808 this._l01_a = this._l12_a = this._l23_a =
14809 this._l01_2a = this._l12_2a = this._l23_2a =
14812 lineEnd: function() {
14813 if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14814 this._line = 1 - this._line;
14816 point: function(x, y) {
14820 var x23 = this._x2 - x,
14821 y23 = this._y2 - y;
14822 this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14825 switch (this._point) {
14826 case 0: this._point = 1; break;
14827 case 1: this._point = 2; break;
14828 case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14829 case 3: this._point = 4; // proceed
14830 default: point$4(this, x, y); break;
14833 this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14834 this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14835 this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14836 this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14840 var catmullRomOpen = (function custom(alpha) {
14842 function catmullRom$$1(context) {
14843 return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14846 catmullRom$$1.alpha = function(alpha) {
14847 return custom(+alpha);
14850 return catmullRom$$1;
14853 function LinearClosed(context) {
14854 this._context = context;
14857 LinearClosed.prototype = {
14860 lineStart: function() {
14863 lineEnd: function() {
14864 if (this._point) this._context.closePath();
14866 point: function(x, y) {
14868 if (this._point) this._context.lineTo(x, y);
14869 else this._point = 1, this._context.moveTo(x, y);
14873 function linearClosed(context) {
14874 return new LinearClosed(context);
14877 function sign$1(x) {
14878 return x < 0 ? -1 : 1;
14881 // Calculate the slopes of the tangents (Hermite-type interpolation) based on
14882 // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
14883 // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
14884 // NOV(II), P. 443, 1990.
14885 function slope3(that, x2, y2) {
14886 var h0 = that._x1 - that._x0,
14887 h1 = x2 - that._x1,
14888 s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
14889 s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
14890 p = (s0 * h1 + s1 * h0) / (h0 + h1);
14891 return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
14894 // Calculate a one-sided slope.
14895 function slope2(that, t) {
14896 var h = that._x1 - that._x0;
14897 return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
14900 // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
14901 // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
14902 // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
14903 function point$5(that, t0, t1) {
14908 dx = (x1 - x0) / 3;
14909 that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
14912 function MonotoneX(context) {
14913 this._context = context;
14916 MonotoneX.prototype = {
14917 areaStart: function() {
14920 areaEnd: function() {
14923 lineStart: function() {
14924 this._x0 = this._x1 =
14925 this._y0 = this._y1 =
14929 lineEnd: function() {
14930 switch (this._point) {
14931 case 2: this._context.lineTo(this._x1, this._y1); break;
14932 case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
14934 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14935 this._line = 1 - this._line;
14937 point: function(x, y) {
14941 if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
14942 switch (this._point) {
14943 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14944 case 1: this._point = 2; break;
14945 case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
14946 default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
14949 this._x0 = this._x1, this._x1 = x;
14950 this._y0 = this._y1, this._y1 = y;
14955 function MonotoneY(context) {
14956 this._context = new ReflectContext(context);
14959 (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
14960 MonotoneX.prototype.point.call(this, y, x);
14963 function ReflectContext(context) {
14964 this._context = context;
14967 ReflectContext.prototype = {
14968 moveTo: function(x, y) { this._context.moveTo(y, x); },
14969 closePath: function() { this._context.closePath(); },
14970 lineTo: function(x, y) { this._context.lineTo(y, x); },
14971 bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
14974 function monotoneX(context) {
14975 return new MonotoneX(context);
14978 function monotoneY(context) {
14979 return new MonotoneY(context);
14982 function Natural(context) {
14983 this._context = context;
14986 Natural.prototype = {
14987 areaStart: function() {
14990 areaEnd: function() {
14993 lineStart: function() {
14997 lineEnd: function() {
15003 this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
15005 this._context.lineTo(x[1], y[1]);
15007 var px = controlPoints(x),
15008 py = controlPoints(y);
15009 for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
15010 this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
15015 if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
15016 this._line = 1 - this._line;
15017 this._x = this._y = null;
15019 point: function(x, y) {
15025 // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
15026 function controlPoints(x) {
15033 a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
15034 for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
15035 a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
15036 for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
15037 a[n - 1] = r[n - 1] / b[n - 1];
15038 for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
15039 b[n - 1] = (x[n] + a[n - 1]) / 2;
15040 for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
15044 function natural(context) {
15045 return new Natural(context);
15048 function Step(context, t) {
15049 this._context = context;
15054 areaStart: function() {
15057 areaEnd: function() {
15060 lineStart: function() {
15061 this._x = this._y = NaN;
15064 lineEnd: function() {
15065 if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
15066 if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
15067 if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
15069 point: function(x, y) {
15071 switch (this._point) {
15072 case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
15073 case 1: this._point = 2; // proceed
15075 if (this._t <= 0) {
15076 this._context.lineTo(this._x, y);
15077 this._context.lineTo(x, y);
15079 var x1 = this._x * (1 - this._t) + x * this._t;
15080 this._context.lineTo(x1, this._y);
15081 this._context.lineTo(x1, y);
15086 this._x = x, this._y = y;
15090 function step(context) {
15091 return new Step(context, 0.5);
15094 function stepBefore(context) {
15095 return new Step(context, 0);
15098 function stepAfter(context) {
15099 return new Step(context, 1);
15102 function none$1(series, order) {
15103 if (!((n = series.length) > 1)) return;
15104 for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
15105 s0 = s1, s1 = series[order[i]];
15106 for (j = 0; j < m; ++j) {
15107 s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
15112 function none$2(series) {
15113 var n = series.length, o = new Array(n);
15114 while (--n >= 0) o[n] = n;
15118 function stackValue(d, key) {
15123 var keys = constant$a([]),
15126 value = stackValue;
15128 function stack(data) {
15129 var kz = keys.apply(this, arguments),
15136 for (i = 0; i < n; ++i) {
15137 for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
15138 si[j] = sij = [0, +value(data[j], ki, j, data)];
15139 sij.data = data[j];
15144 for (i = 0, oz = order(sz); i < n; ++i) {
15145 sz[oz[i]].index = i;
15152 stack.keys = function(_) {
15153 return arguments.length ? (keys = typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : keys;
15156 stack.value = function(_) {
15157 return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), stack) : value;
15160 stack.order = function(_) {
15161 return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : order;
15164 stack.offset = function(_) {
15165 return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
15171 function expand(series, order) {
15172 if (!((n = series.length) > 0)) return;
15173 for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
15174 for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
15175 if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
15177 none$1(series, order);
15180 function diverging(series, order) {
15181 if (!((n = series.length) > 1)) return;
15182 for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
15183 for (yp = yn = 0, i = 0; i < n; ++i) {
15184 if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
15185 d[0] = yp, d[1] = yp += dy;
15186 } else if (dy < 0) {
15187 d[1] = yn, d[0] = yn += dy;
15195 function silhouette(series, order) {
15196 if (!((n = series.length) > 0)) return;
15197 for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
15198 for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
15199 s0[j][1] += s0[j][0] = -y / 2;
15201 none$1(series, order);
15204 function wiggle(series, order) {
15205 if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
15206 for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
15207 for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
15208 var si = series[order[i]],
15209 sij0 = si[j][1] || 0,
15210 sij1 = si[j - 1][1] || 0,
15211 s3 = (sij0 - sij1) / 2;
15212 for (var k = 0; k < i; ++k) {
15213 var sk = series[order[k]],
15214 skj0 = sk[j][1] || 0,
15215 skj1 = sk[j - 1][1] || 0;
15218 s1 += sij0, s2 += s3 * sij0;
15220 s0[j - 1][1] += s0[j - 1][0] = y;
15221 if (s1) y -= s2 / s1;
15223 s0[j - 1][1] += s0[j - 1][0] = y;
15224 none$1(series, order);
15227 function ascending$2(series) {
15228 var sums = series.map(sum$2);
15229 return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
15232 function sum$2(series) {
15233 var s = 0, i = -1, n = series.length, v;
15234 while (++i < n) if (v = +series[i][1]) s += v;
15238 function descending$1(series) {
15239 return ascending$2(series).reverse();
15242 function insideOut(series) {
15243 var n = series.length,
15246 sums = series.map(sum$2),
15247 order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }),
15253 for (i = 0; i < n; ++i) {
15255 if (top < bottom) {
15264 return bottoms.reverse().concat(tops);
15267 function reverse(series) {
15268 return none$2(series).reverse();
15271 function constant$b(x) {
15272 return function() {
15285 function RedBlackTree() {
15286 this._ = null; // root node
15289 function RedBlackNode(node) {
15290 node.U = // parent node
15291 node.C = // color - true for red, false for black
15292 node.L = // left node
15293 node.R = // right node
15294 node.P = // previous node
15295 node.N = null; // next node
15298 RedBlackTree.prototype = {
15299 constructor: RedBlackTree,
15301 insert: function(after, node) {
15302 var parent, grandpa, uncle;
15307 if (after.N) after.N.P = node;
15311 while (after.L) after = after.L;
15317 } else if (this._) {
15318 after = RedBlackFirst(this._);
15321 after.P = after.L = node;
15324 node.P = node.N = null;
15328 node.L = node.R = null;
15333 while (parent && parent.C) {
15334 grandpa = parent.U;
15335 if (parent === grandpa.L) {
15337 if (uncle && uncle.C) {
15338 parent.C = uncle.C = false;
15342 if (after === parent.R) {
15343 RedBlackRotateLeft(this, parent);
15349 RedBlackRotateRight(this, grandpa);
15353 if (uncle && uncle.C) {
15354 parent.C = uncle.C = false;
15358 if (after === parent.L) {
15359 RedBlackRotateRight(this, parent);
15365 RedBlackRotateLeft(this, grandpa);
15373 remove: function(node) {
15374 if (node.N) node.N.P = node.P;
15375 if (node.P) node.P.N = node.N;
15376 node.N = node.P = null;
15378 var parent = node.U,
15385 if (!left) next = right;
15386 else if (!right) next = left;
15387 else next = RedBlackFirst(right);
15390 if (parent.L === node) parent.L = next;
15391 else parent.R = next;
15396 if (left && right) {
15401 if (next !== right) {
15418 if (node) node.U = parent;
15420 if (node && node.C) { node.C = false; return; }
15423 if (node === this._) break;
15424 if (node === parent.L) {
15425 sibling = parent.R;
15429 RedBlackRotateLeft(this, parent);
15430 sibling = parent.R;
15432 if ((sibling.L && sibling.L.C)
15433 || (sibling.R && sibling.R.C)) {
15434 if (!sibling.R || !sibling.R.C) {
15435 sibling.L.C = false;
15437 RedBlackRotateRight(this, sibling);
15438 sibling = parent.R;
15440 sibling.C = parent.C;
15441 parent.C = sibling.R.C = false;
15442 RedBlackRotateLeft(this, parent);
15447 sibling = parent.L;
15451 RedBlackRotateRight(this, parent);
15452 sibling = parent.L;
15454 if ((sibling.L && sibling.L.C)
15455 || (sibling.R && sibling.R.C)) {
15456 if (!sibling.L || !sibling.L.C) {
15457 sibling.R.C = false;
15459 RedBlackRotateLeft(this, sibling);
15460 sibling = parent.L;
15462 sibling.C = parent.C;
15463 parent.C = sibling.L.C = false;
15464 RedBlackRotateRight(this, parent);
15474 if (node) node.C = false;
15478 function RedBlackRotateLeft(tree, node) {
15484 if (parent.L === p) parent.L = q;
15493 if (p.R) p.R.U = p;
15497 function RedBlackRotateRight(tree, node) {
15503 if (parent.L === p) parent.L = q;
15512 if (p.L) p.L.U = p;
15516 function RedBlackFirst(node) {
15517 while (node.L) node = node.L;
15521 function createEdge(left, right, v0, v1) {
15522 var edge = [null, null],
15523 index = edges.push(edge) - 1;
15525 edge.right = right;
15526 if (v0) setEdgeEnd(edge, left, right, v0);
15527 if (v1) setEdgeEnd(edge, right, left, v1);
15528 cells[left.index].halfedges.push(index);
15529 cells[right.index].halfedges.push(index);
15533 function createBorderEdge(left, v0, v1) {
15534 var edge = [v0, v1];
15539 function setEdgeEnd(edge, left, right, vertex) {
15540 if (!edge[0] && !edge[1]) {
15543 edge.right = right;
15544 } else if (edge.left === right) {
15551 // Liang–Barsky line clipping.
15552 function clipEdge(edge, x0, y0, x1, y1) {
15566 if (!dx && r > 0) return;
15569 if (r < t0) return;
15570 if (r < t1) t1 = r;
15571 } else if (dx > 0) {
15572 if (r > t1) return;
15573 if (r > t0) t0 = r;
15577 if (!dx && r < 0) return;
15580 if (r > t1) return;
15581 if (r > t0) t0 = r;
15582 } else if (dx > 0) {
15583 if (r < t0) return;
15584 if (r < t1) t1 = r;
15588 if (!dy && r > 0) return;
15591 if (r < t0) return;
15592 if (r < t1) t1 = r;
15593 } else if (dy > 0) {
15594 if (r > t1) return;
15595 if (r > t0) t0 = r;
15599 if (!dy && r < 0) return;
15602 if (r > t1) return;
15603 if (r > t0) t0 = r;
15604 } else if (dy > 0) {
15605 if (r < t0) return;
15606 if (r < t1) t1 = r;
15609 if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
15611 if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
15612 if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
15616 function connectEdge(edge, x0, y0, x1, y1) {
15618 if (v1) return true;
15622 right = edge.right,
15627 fx = (lx + rx) / 2,
15628 fy = (ly + ry) / 2,
15633 if (fx < x0 || fx >= x1) return;
15635 if (!v0) v0 = [fx, y0];
15636 else if (v0[1] >= y1) return;
15639 if (!v0) v0 = [fx, y1];
15640 else if (v0[1] < y0) return;
15644 fm = (lx - rx) / (ry - ly);
15646 if (fm < -1 || fm > 1) {
15648 if (!v0) v0 = [(y0 - fb) / fm, y0];
15649 else if (v0[1] >= y1) return;
15650 v1 = [(y1 - fb) / fm, y1];
15652 if (!v0) v0 = [(y1 - fb) / fm, y1];
15653 else if (v0[1] < y0) return;
15654 v1 = [(y0 - fb) / fm, y0];
15658 if (!v0) v0 = [x0, fm * x0 + fb];
15659 else if (v0[0] >= x1) return;
15660 v1 = [x1, fm * x1 + fb];
15662 if (!v0) v0 = [x1, fm * x1 + fb];
15663 else if (v0[0] < x0) return;
15664 v1 = [x0, fm * x0 + fb];
15674 function clipEdges(x0, y0, x1, y1) {
15675 var i = edges.length,
15679 if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
15680 || !clipEdge(edge, x0, y0, x1, y1)
15681 || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
15682 || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
15688 function createCell(site) {
15689 return cells[site.index] = {
15695 function cellHalfedgeAngle(cell, edge) {
15696 var site = cell.site,
15699 if (site === vb) vb = va, va = site;
15700 if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
15701 if (site === va) va = edge[1], vb = edge[0];
15702 else va = edge[0], vb = edge[1];
15703 return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
15706 function cellHalfedgeStart(cell, edge) {
15707 return edge[+(edge.left !== cell.site)];
15710 function cellHalfedgeEnd(cell, edge) {
15711 return edge[+(edge.left === cell.site)];
15714 function sortCellHalfedges() {
15715 for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
15716 if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
15717 var index = new Array(m),
15718 array = new Array(m);
15719 for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
15720 index.sort(function(i, j) { return array[j] - array[i]; });
15721 for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
15722 for (j = 0; j < m; ++j) halfedges[j] = array[j];
15727 function clipCells(x0, y0, x1, y1) {
15728 var nCells = cells.length,
15743 for (iCell = 0; iCell < nCells; ++iCell) {
15744 if (cell = cells[iCell]) {
15746 halfedges = cell.halfedges;
15747 iHalfedge = halfedges.length;
15749 // Remove any dangling clipped edges.
15750 while (iHalfedge--) {
15751 if (!edges[halfedges[iHalfedge]]) {
15752 halfedges.splice(iHalfedge, 1);
15756 // Insert any border edges as necessary.
15757 iHalfedge = 0, nHalfedges = halfedges.length;
15758 while (iHalfedge < nHalfedges) {
15759 end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
15760 start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
15761 if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
15762 halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
15763 Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
15764 : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
15765 : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
15766 : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
15772 if (nHalfedges) cover = false;
15776 // If there weren’t any edges, have the closest site cover the extent.
15777 // It doesn’t matter which corner of the extent we measure!
15779 var dx, dy, d2, dc = Infinity;
15781 for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
15782 if (cell = cells[iCell]) {
15786 d2 = dx * dx + dy * dy;
15787 if (d2 < dc) dc = d2, cover = cell;
15792 var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
15793 cover.halfedges.push(
15794 edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
15795 edges.push(createBorderEdge(site, v01, v11)) - 1,
15796 edges.push(createBorderEdge(site, v11, v10)) - 1,
15797 edges.push(createBorderEdge(site, v10, v00)) - 1
15802 // Lastly delete any cells with no edges; these were entirely clipped.
15803 for (iCell = 0; iCell < nCells; ++iCell) {
15804 if (cell = cells[iCell]) {
15805 if (!cell.halfedges.length) {
15806 delete cells[iCell];
15812 var circlePool = [];
15816 function Circle() {
15817 RedBlackNode(this);
15825 function attachCircle(arc) {
15829 if (!lArc || !rArc) return;
15831 var lSite = lArc.site,
15835 if (lSite === rSite) return;
15839 ax = lSite[0] - bx,
15840 ay = lSite[1] - by,
15841 cx = rSite[0] - bx,
15842 cy = rSite[1] - by;
15844 var d = 2 * (ax * cy - ay * cx);
15845 if (d >= -epsilon2$2) return;
15847 var ha = ax * ax + ay * ay,
15848 hc = cx * cx + cy * cy,
15849 x = (cy * ha - ay * hc) / d,
15850 y = (ax * hc - cx * ha) / d;
15852 var circle = circlePool.pop() || new Circle;
15854 circle.site = cSite;
15856 circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
15858 arc.circle = circle;
15864 if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
15865 if (node.L) node = node.L;
15866 else { before = node.P; break; }
15868 if (node.R) node = node.R;
15869 else { before = node; break; }
15873 circles.insert(before, circle);
15874 if (!before) firstCircle = circle;
15877 function detachCircle(arc) {
15878 var circle = arc.circle;
15880 if (!circle.P) firstCircle = circle.N;
15881 circles.remove(circle);
15882 circlePool.push(circle);
15883 RedBlackNode(circle);
15888 var beachPool = [];
15891 RedBlackNode(this);
15894 this.circle = null;
15897 function createBeach(site) {
15898 var beach = beachPool.pop() || new Beach;
15903 function detachBeach(beach) {
15904 detachCircle(beach);
15905 beaches.remove(beach);
15906 beachPool.push(beach);
15907 RedBlackNode(beach);
15910 function removeBeach(beach) {
15911 var circle = beach.circle,
15915 previous = beach.P,
15917 disappearing = [beach];
15919 detachBeach(beach);
15921 var lArc = previous;
15923 && Math.abs(x - lArc.circle.x) < epsilon$4
15924 && Math.abs(y - lArc.circle.cy) < epsilon$4) {
15926 disappearing.unshift(lArc);
15931 disappearing.unshift(lArc);
15932 detachCircle(lArc);
15936 && Math.abs(x - rArc.circle.x) < epsilon$4
15937 && Math.abs(y - rArc.circle.cy) < epsilon$4) {
15939 disappearing.push(rArc);
15944 disappearing.push(rArc);
15945 detachCircle(rArc);
15947 var nArcs = disappearing.length,
15949 for (iArc = 1; iArc < nArcs; ++iArc) {
15950 rArc = disappearing[iArc];
15951 lArc = disappearing[iArc - 1];
15952 setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
15955 lArc = disappearing[0];
15956 rArc = disappearing[nArcs - 1];
15957 rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
15959 attachCircle(lArc);
15960 attachCircle(rArc);
15963 function addBeach(site) {
15965 directrix = site[1],
15973 dxl = leftBreakPoint(node, directrix) - x;
15974 if (dxl > epsilon$4) node = node.L; else {
15975 dxr = x - rightBreakPoint(node, directrix);
15976 if (dxr > epsilon$4) {
15983 if (dxl > -epsilon$4) {
15986 } else if (dxr > -epsilon$4) {
15990 lArc = rArc = node;
15998 var newArc = createBeach(site);
15999 beaches.insert(lArc, newArc);
16001 if (!lArc && !rArc) return;
16003 if (lArc === rArc) {
16004 detachCircle(lArc);
16005 rArc = createBeach(lArc.site);
16006 beaches.insert(newArc, rArc);
16007 newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
16008 attachCircle(lArc);
16009 attachCircle(rArc);
16013 if (!rArc) { // && lArc
16014 newArc.edge = createEdge(lArc.site, newArc.site);
16018 // else lArc !== rArc
16019 detachCircle(lArc);
16020 detachCircle(rArc);
16022 var lSite = lArc.site,
16028 cx = rSite[0] - ax,
16029 cy = rSite[1] - ay,
16030 d = 2 * (bx * cy - by * cx),
16031 hb = bx * bx + by * by,
16032 hc = cx * cx + cy * cy,
16033 vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
16035 setEdgeEnd(rArc.edge, lSite, rSite, vertex);
16036 newArc.edge = createEdge(lSite, site, null, vertex);
16037 rArc.edge = createEdge(site, rSite, null, vertex);
16038 attachCircle(lArc);
16039 attachCircle(rArc);
16042 function leftBreakPoint(arc, directrix) {
16043 var site = arc.site,
16046 pby2 = rfocy - directrix;
16048 if (!pby2) return rfocx;
16051 if (!lArc) return -Infinity;
16054 var lfocx = site[0],
16056 plby2 = lfocy - directrix;
16058 if (!plby2) return lfocx;
16060 var hl = lfocx - rfocx,
16061 aby2 = 1 / pby2 - 1 / plby2,
16064 if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
16066 return (rfocx + lfocx) / 2;
16069 function rightBreakPoint(arc, directrix) {
16071 if (rArc) return leftBreakPoint(rArc, directrix);
16072 var site = arc.site;
16073 return site[1] === directrix ? site[0] : Infinity;
16076 var epsilon$4 = 1e-6;
16077 var epsilon2$2 = 1e-12;
16083 function triangleArea(a, b, c) {
16084 return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
16087 function lexicographic(a, b) {
16092 function Diagram(sites, extent) {
16093 var site = sites.sort(lexicographic).pop(),
16099 cells = new Array(sites.length);
16100 beaches = new RedBlackTree;
16101 circles = new RedBlackTree;
16104 circle = firstCircle;
16105 if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
16106 if (site[0] !== x || site[1] !== y) {
16108 x = site[0], y = site[1];
16110 site = sites.pop();
16111 } else if (circle) {
16112 removeBeach(circle.arc);
16118 sortCellHalfedges();
16121 var x0 = +extent[0][0],
16122 y0 = +extent[0][1],
16123 x1 = +extent[1][0],
16124 y1 = +extent[1][1];
16125 clipEdges(x0, y0, x1, y1);
16126 clipCells(x0, y0, x1, y1);
16129 this.edges = edges;
16130 this.cells = cells;
16138 Diagram.prototype = {
16139 constructor: Diagram,
16141 polygons: function() {
16142 var edges = this.edges;
16144 return this.cells.map(function(cell) {
16145 var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
16146 polygon.data = cell.site.data;
16151 triangles: function() {
16152 var triangles = [],
16153 edges = this.edges;
16155 this.cells.forEach(function(cell, i) {
16156 if (!(m = (halfedges = cell.halfedges).length)) return;
16157 var site = cell.site,
16162 e1 = edges[halfedges[m - 1]],
16163 s1 = e1.left === site ? e1.right : e1.left;
16167 e1 = edges[halfedges[j]];
16168 s1 = e1.left === site ? e1.right : e1.left;
16169 if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
16170 triangles.push([site.data, s0.data, s1.data]);
16178 links: function() {
16179 return this.edges.filter(function(edge) {
16181 }).map(function(edge) {
16183 source: edge.left.data,
16184 target: edge.right.data
16189 find: function(x, y, radius) {
16190 var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
16192 // Use the previously-found cell, or start with an arbitrary one.
16193 while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
16194 var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
16196 // Traverse the half-edges to find a closer cell, if any.
16198 cell = that.cells[i0 = i1], i1 = null;
16199 cell.halfedges.forEach(function(e) {
16200 var edge = that.edges[e], v = edge.left;
16201 if ((v === cell.site || !v) && !(v = edge.right)) return;
16202 var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
16203 if (v2 < d2) d2 = v2, i1 = v.index;
16205 } while (i1 !== null);
16209 return radius == null || d2 <= radius * radius ? cell.site : null;
16213 function voronoi() {
16218 function voronoi(data) {
16219 return new Diagram(data.map(function(d, i) {
16220 var s = [Math.round(x$$1(d, i, data) / epsilon$4) * epsilon$4, Math.round(y$$1(d, i, data) / epsilon$4) * epsilon$4];
16227 voronoi.polygons = function(data) {
16228 return voronoi(data).polygons();
16231 voronoi.links = function(data) {
16232 return voronoi(data).links();
16235 voronoi.triangles = function(data) {
16236 return voronoi(data).triangles();
16239 voronoi.x = function(_) {
16240 return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$b(+_), voronoi) : x$$1;
16243 voronoi.y = function(_) {
16244 return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$b(+_), voronoi) : y$$1;
16247 voronoi.extent = function(_) {
16248 return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]];
16251 voronoi.size = function(_) {
16252 return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
16258 function constant$c(x) {
16259 return function() {
16264 function ZoomEvent(target, type, transform) {
16265 this.target = target;
16267 this.transform = transform;
16270 function Transform(k, x, y) {
16276 Transform.prototype = {
16277 constructor: Transform,
16278 scale: function(k) {
16279 return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
16281 translate: function(x, y) {
16282 return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
16284 apply: function(point) {
16285 return [point[0] * this.k + this.x, point[1] * this.k + this.y];
16287 applyX: function(x) {
16288 return x * this.k + this.x;
16290 applyY: function(y) {
16291 return y * this.k + this.y;
16293 invert: function(location) {
16294 return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
16296 invertX: function(x) {
16297 return (x - this.x) / this.k;
16299 invertY: function(y) {
16300 return (y - this.y) / this.k;
16302 rescaleX: function(x) {
16303 return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
16305 rescaleY: function(y) {
16306 return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
16308 toString: function() {
16309 return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
16313 var identity$7 = new Transform(1, 0, 0);
16315 transform.prototype = Transform.prototype;
16317 function transform(node) {
16318 return node.__zoom || identity$7;
16321 function nopropagation$2() {
16322 event.stopImmediatePropagation();
16325 function noevent$2() {
16326 event.preventDefault();
16327 event.stopImmediatePropagation();
16330 // Ignore right-click, since that should open the context menu.
16331 function defaultFilter$2() {
16332 return !event.button;
16335 function defaultExtent$1() {
16336 var e = this, w, h;
16337 if (e instanceof SVGElement) {
16338 e = e.ownerSVGElement || e;
16339 w = e.width.baseVal.value;
16340 h = e.height.baseVal.value;
16343 h = e.clientHeight;
16345 return [[0, 0], [w, h]];
16348 function defaultTransform() {
16349 return this.__zoom || identity$7;
16352 function defaultWheelDelta() {
16353 return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
16356 function defaultTouchable$1() {
16357 return "ontouchstart" in this;
16360 function defaultConstrain(transform$$1, extent, translateExtent) {
16361 var dx0 = transform$$1.invertX(extent[0][0]) - translateExtent[0][0],
16362 dx1 = transform$$1.invertX(extent[1][0]) - translateExtent[1][0],
16363 dy0 = transform$$1.invertY(extent[0][1]) - translateExtent[0][1],
16364 dy1 = transform$$1.invertY(extent[1][1]) - translateExtent[1][1];
16365 return transform$$1.translate(
16366 dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
16367 dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
16371 function d3_zoom() {
16372 var filter = defaultFilter$2,
16373 extent = defaultExtent$1,
16374 constrain = defaultConstrain,
16375 wheelDelta = defaultWheelDelta,
16376 touchable = defaultTouchable$1,
16377 scaleExtent = [0, Infinity],
16378 translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
16380 interpolate$$1 = interpolateZoom,
16382 listeners = dispatch("start", "zoom", "end"),
16387 clickDistance2 = 0;
16389 function zoom(selection$$1) {
16391 .property("__zoom", defaultTransform)
16392 .on("wheel.zoom", wheeled)
16393 .on("mousedown.zoom", mousedowned)
16394 .on("dblclick.zoom", dblclicked)
16396 .on("touchstart.zoom", touchstarted)
16397 .on("touchmove.zoom", touchmoved)
16398 .on("touchend.zoom touchcancel.zoom", touchended)
16399 .style("touch-action", "none")
16400 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
16403 zoom.transform = function(collection, transform$$1) {
16404 var selection$$1 = collection.selection ? collection.selection() : collection;
16405 selection$$1.property("__zoom", defaultTransform);
16406 if (collection !== selection$$1) {
16407 schedule(collection, transform$$1);
16409 selection$$1.interrupt().each(function() {
16410 gesture(this, arguments)
16412 .zoom(null, typeof transform$$1 === "function" ? transform$$1.apply(this, arguments) : transform$$1)
16418 zoom.scaleBy = function(selection$$1, k) {
16419 zoom.scaleTo(selection$$1, function() {
16420 var k0 = this.__zoom.k,
16421 k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16426 zoom.scaleTo = function(selection$$1, k) {
16427 zoom.transform(selection$$1, function() {
16428 var e = extent.apply(this, arguments),
16431 p1 = t0.invert(p0),
16432 k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16433 return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
16437 zoom.translateBy = function(selection$$1, x, y) {
16438 zoom.transform(selection$$1, function() {
16439 return constrain(this.__zoom.translate(
16440 typeof x === "function" ? x.apply(this, arguments) : x,
16441 typeof y === "function" ? y.apply(this, arguments) : y
16442 ), extent.apply(this, arguments), translateExtent);
16446 zoom.translateTo = function(selection$$1, x, y) {
16447 zoom.transform(selection$$1, function() {
16448 var e = extent.apply(this, arguments),
16451 return constrain(identity$7.translate(p[0], p[1]).scale(t.k).translate(
16452 typeof x === "function" ? -x.apply(this, arguments) : -x,
16453 typeof y === "function" ? -y.apply(this, arguments) : -y
16454 ), e, translateExtent);
16458 function scale(transform$$1, k) {
16459 k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
16460 return k === transform$$1.k ? transform$$1 : new Transform(k, transform$$1.x, transform$$1.y);
16463 function translate(transform$$1, p0, p1) {
16464 var x = p0[0] - p1[0] * transform$$1.k, y = p0[1] - p1[1] * transform$$1.k;
16465 return x === transform$$1.x && y === transform$$1.y ? transform$$1 : new Transform(transform$$1.k, x, y);
16468 function centroid(extent) {
16469 return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
16472 function schedule(transition$$1, transform$$1, center) {
16474 .on("start.zoom", function() { gesture(this, arguments).start(); })
16475 .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
16476 .tween("zoom", function() {
16479 g = gesture(that, args),
16480 e = extent.apply(that, args),
16481 p = center || centroid(e),
16482 w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
16484 b = typeof transform$$1 === "function" ? transform$$1.apply(that, args) : transform$$1,
16485 i = interpolate$$1(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
16486 return function(t) {
16487 if (t === 1) t = b; // Avoid rounding error on end.
16488 else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
16494 function gesture(that, args) {
16495 for (var i = 0, n = gestures.length, g; i < n; ++i) {
16496 if ((g = gestures[i]).that === that) {
16500 return new Gesture(that, args);
16503 function Gesture(that, args) {
16508 this.extent = extent.apply(that, args);
16511 Gesture.prototype = {
16512 start: function() {
16513 if (++this.active === 1) {
16514 this.index = gestures.push(this) - 1;
16515 this.emit("start");
16519 zoom: function(key, transform$$1) {
16520 if (this.mouse && key !== "mouse") this.mouse[1] = transform$$1.invert(this.mouse[0]);
16521 if (this.touch0 && key !== "touch") this.touch0[1] = transform$$1.invert(this.touch0[0]);
16522 if (this.touch1 && key !== "touch") this.touch1[1] = transform$$1.invert(this.touch1[0]);
16523 this.that.__zoom = transform$$1;
16528 if (--this.active === 0) {
16529 gestures.splice(this.index, 1);
16535 emit: function(type) {
16536 customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
16540 function wheeled() {
16541 if (!filter.apply(this, arguments)) return;
16542 var g = gesture(this, arguments),
16544 k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
16547 // If the mouse is in the same location as before, reuse it.
16548 // If there were recent wheel events, reset the wheel idle timeout.
16550 if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
16551 g.mouse[1] = t.invert(g.mouse[0] = p);
16553 clearTimeout(g.wheel);
16556 // If this wheel event won’t trigger a transform change, ignore it.
16557 else if (t.k === k) return;
16559 // Otherwise, capture the mouse point and location at the start.
16561 g.mouse = [p, t.invert(p)];
16567 g.wheel = setTimeout(wheelidled, wheelDelay);
16568 g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
16570 function wheelidled() {
16576 function mousedowned() {
16577 if (touchending || !filter.apply(this, arguments)) return;
16578 var g = gesture(this, arguments),
16579 v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
16581 x0 = event.clientX,
16582 y0 = event.clientY;
16584 nodrag(event.view);
16586 g.mouse = [p, this.__zoom.invert(p)];
16590 function mousemoved() {
16593 var dx = event.clientX - x0, dy = event.clientY - y0;
16594 g.moved = dx * dx + dy * dy > clickDistance2;
16596 g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent));
16599 function mouseupped() {
16600 v.on("mousemove.zoom mouseup.zoom", null);
16601 yesdrag(event.view, g.moved);
16607 function dblclicked() {
16608 if (!filter.apply(this, arguments)) return;
16609 var t0 = this.__zoom,
16611 p1 = t0.invert(p0),
16612 k1 = t0.k * (event.shiftKey ? 0.5 : 2),
16613 t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
16616 if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0);
16617 else select(this).call(zoom.transform, t1);
16620 function touchstarted() {
16621 if (!filter.apply(this, arguments)) return;
16622 var g = gesture(this, arguments),
16623 touches = event.changedTouches,
16625 n = touches.length, i, t, p;
16628 for (i = 0; i < n; ++i) {
16629 t = touches[i], p = touch(this, touches, t.identifier);
16630 p = [p, this.__zoom.invert(p), t.identifier];
16631 if (!g.touch0) g.touch0 = p, started = true;
16632 else if (!g.touch1) g.touch1 = p;
16635 // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
16636 if (touchstarting) {
16637 touchstarting = clearTimeout(touchstarting);
16640 p = select(this).on("dblclick.zoom");
16641 if (p) p.apply(this, arguments);
16647 touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
16653 function touchmoved() {
16654 var g = gesture(this, arguments),
16655 touches = event.changedTouches,
16656 n = touches.length, i, t, p, l;
16659 if (touchstarting) touchstarting = clearTimeout(touchstarting);
16660 for (i = 0; i < n; ++i) {
16661 t = touches[i], p = touch(this, touches, t.identifier);
16662 if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
16663 else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
16667 var p0 = g.touch0[0], l0 = g.touch0[1],
16668 p1 = g.touch1[0], l1 = g.touch1[1],
16669 dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
16670 dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
16671 t = scale(t, Math.sqrt(dp / dl));
16672 p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
16673 l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
16675 else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
16677 g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
16680 function touchended() {
16681 var g = gesture(this, arguments),
16682 touches = event.changedTouches,
16683 n = touches.length, i, t;
16686 if (touchending) clearTimeout(touchending);
16687 touchending = setTimeout(function() { touchending = null; }, touchDelay);
16688 for (i = 0; i < n; ++i) {
16690 if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
16691 else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
16693 if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
16694 if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
16698 zoom.wheelDelta = function(_) {
16699 return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$c(+_), zoom) : wheelDelta;
16702 zoom.filter = function(_) {
16703 return arguments.length ? (filter = typeof _ === "function" ? _ : constant$c(!!_), zoom) : filter;
16706 zoom.touchable = function(_) {
16707 return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$c(!!_), zoom) : touchable;
16710 zoom.extent = function(_) {
16711 return arguments.length ? (extent = typeof _ === "function" ? _ : constant$c([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
16714 zoom.scaleExtent = function(_) {
16715 return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
16718 zoom.translateExtent = function(_) {
16719 return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
16722 zoom.constrain = function(_) {
16723 return arguments.length ? (constrain = _, zoom) : constrain;
16726 zoom.duration = function(_) {
16727 return arguments.length ? (duration = +_, zoom) : duration;
16730 zoom.interpolate = function(_) {
16731 return arguments.length ? (interpolate$$1 = _, zoom) : interpolate$$1;
16734 zoom.on = function() {
16735 var value = listeners.on.apply(listeners, arguments);
16736 return value === listeners ? zoom : value;
16739 zoom.clickDistance = function(_) {
16740 return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
16748 var index$3 = /*#__PURE__*/Object.freeze({
16750 bisect: bisectRight,
16751 bisectRight: bisectRight,
16752 bisectLeft: bisectLeft,
16753 ascending: ascending,
16754 bisector: bisector,
16756 descending: d3_descending,
16757 deviation: deviation,
16759 histogram: histogram,
16760 thresholdFreedmanDiaconis: freedmanDiaconis,
16761 thresholdScott: scott,
16762 thresholdSturges: sturges,
16770 quantile: quantile,
16776 tickIncrement: tickIncrement,
16777 tickStep: tickStep,
16778 transpose: transpose,
16779 variance: variance,
16782 axisRight: axisRight,
16783 axisBottom: axisBottom,
16784 axisLeft: axisLeft,
16788 brushSelection: brushSelection,
16802 cubehelix: cubehelix,
16803 dispatch: dispatch,
16805 dragDisable: nodrag,
16806 dragEnable: yesdrag,
16808 csvParse: csvParse,
16809 csvParseRows: csvParseRows,
16810 csvFormat: csvFormat,
16811 csvFormatRows: csvFormatRows,
16812 tsvParse: tsvParse,
16813 tsvParseRows: tsvParseRows,
16814 tsvFormat: tsvFormat,
16815 tsvFormatRows: tsvFormatRows,
16816 easeLinear: linear$1,
16817 easeQuad: quadInOut,
16818 easeQuadIn: quadIn,
16819 easeQuadOut: quadOut,
16820 easeQuadInOut: quadInOut,
16821 easeCubic: cubicInOut,
16822 easeCubicIn: cubicIn,
16823 easeCubicOut: cubicOut,
16824 easeCubicInOut: cubicInOut,
16825 easePoly: polyInOut,
16826 easePolyIn: polyIn,
16827 easePolyOut: polyOut,
16828 easePolyInOut: polyInOut,
16831 easeSinOut: sinOut,
16832 easeSinInOut: sinInOut,
16835 easeExpOut: expOut,
16836 easeExpInOut: expInOut,
16837 easeCircle: circleInOut,
16838 easeCircleIn: circleIn,
16839 easeCircleOut: circleOut,
16840 easeCircleInOut: circleInOut,
16841 easeBounce: bounceOut,
16842 easeBounceIn: bounceIn,
16843 easeBounceOut: bounceOut,
16844 easeBounceInOut: bounceInOut,
16845 easeBack: backInOut,
16846 easeBackIn: backIn,
16847 easeBackOut: backOut,
16848 easeBackInOut: backInOut,
16849 easeElastic: elasticOut,
16850 easeElasticIn: elasticIn,
16851 easeElasticOut: elasticOut,
16852 easeElasticInOut: elasticInOut,
16853 forceCenter: center$1,
16854 forceCollide: collide,
16856 forceManyBody: manyBody,
16857 forceRadial: radial,
16858 forceSimulation: simulation,
16861 formatDefaultLocale: defaultLocale,
16862 get format () { return format; },
16863 get formatPrefix () { return formatPrefix; },
16864 formatLocale: formatLocale,
16865 formatSpecifier: formatSpecifier,
16866 precisionFixed: precisionFixed,
16867 precisionPrefix: precisionPrefix,
16868 precisionRound: precisionRound,
16869 geoArea: d3_geoArea,
16870 geoBounds: d3_geoBounds,
16871 geoCentroid: d3_geoCentroid,
16873 geoClipAntimeridian: clipAntimeridian,
16874 geoClipCircle: clipCircle,
16875 geoClipExtent: extent$1,
16876 geoClipRectangle: clipRectangle,
16877 geoContains: contains,
16878 geoDistance: distance,
16879 geoGraticule: graticule,
16880 geoGraticule10: graticule10,
16881 geoInterpolate: interpolate$2,
16882 geoLength: length$1,
16883 geoPath: d3_geoPath,
16885 geoAlbersUsa: albersUsa,
16886 geoAzimuthalEqualArea: azimuthalEqualArea,
16887 geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
16888 geoAzimuthalEquidistant: azimuthalEquidistant,
16889 geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
16890 geoConicConformal: conicConformal,
16891 geoConicConformalRaw: conicConformalRaw,
16892 geoConicEqualArea: conicEqualArea,
16893 geoConicEqualAreaRaw: conicEqualAreaRaw,
16894 geoConicEquidistant: conicEquidistant,
16895 geoConicEquidistantRaw: conicEquidistantRaw,
16896 geoEquirectangular: equirectangular,
16897 geoEquirectangularRaw: equirectangularRaw,
16898 geoGnomonic: gnomonic,
16899 geoGnomonicRaw: gnomonicRaw,
16900 geoIdentity: d3_geoIdentity,
16901 geoProjection: projection,
16902 geoProjectionMutator: projectionMutator,
16903 geoMercator: mercator,
16904 geoMercatorRaw: mercatorRaw,
16905 geoNaturalEarth1: naturalEarth1,
16906 geoNaturalEarth1Raw: naturalEarth1Raw,
16907 geoOrthographic: orthographic,
16908 geoOrthographicRaw: orthographicRaw,
16909 geoStereographic: stereographic,
16910 geoStereographicRaw: stereographicRaw,
16911 geoTransverseMercator: transverseMercator,
16912 geoTransverseMercatorRaw: transverseMercatorRaw,
16913 geoRotation: rotation,
16914 geoStream: geoStream,
16915 geoTransform: d3_geoTransform,
16917 hierarchy: hierarchy,
16919 packSiblings: siblings,
16920 packEnclose: enclose,
16921 partition: partition,
16922 stratify: stratify,
16925 treemapBinary: binary,
16926 treemapDice: treemapDice,
16927 treemapSlice: treemapSlice,
16928 treemapSliceDice: sliceDice,
16929 treemapSquarify: squarify,
16930 treemapResquarify: resquarify,
16931 interpolate: interpolate,
16932 interpolateArray: array$1,
16933 interpolateBasis: basis$1,
16934 interpolateBasisClosed: basisClosed,
16935 interpolateDate: date,
16936 interpolateNumber: interpolateNumber,
16937 interpolateObject: object,
16938 interpolateRound: interpolateRound,
16939 interpolateString: interpolateString,
16940 interpolateTransformCss: interpolateTransformCss,
16941 interpolateTransformSvg: interpolateTransformSvg,
16942 interpolateZoom: interpolateZoom,
16943 interpolateRgb: interpolateRgb,
16944 interpolateRgbBasis: rgbBasis,
16945 interpolateRgbBasisClosed: rgbBasisClosed,
16946 interpolateHsl: hsl$2,
16947 interpolateHslLong: hslLong,
16948 interpolateLab: lab$1,
16949 interpolateHcl: hcl$2,
16950 interpolateHclLong: hclLong,
16951 interpolateCubehelix: cubehelix$2,
16952 interpolateCubehelixLong: cubehelixLong,
16953 quantize: d3_quantize,
16955 polygonArea: d3_polygonArea,
16956 polygonCentroid: d3_polygonCentroid,
16957 polygonHull: d3_polygonHull,
16958 polygonContains: contains$1,
16959 polygonLength: length$2,
16960 quadtree: quadtree,
16962 randomUniform: uniform,
16963 randomNormal: normal,
16964 randomLogNormal: logNormal,
16965 randomBates: bates,
16966 randomIrwinHall: irwinHall,
16967 randomExponential: exponential$1,
16976 scalePoint: point$1,
16977 scaleIdentity: identity$5,
16978 scaleLinear: linear$2,
16980 scaleOrdinal: ordinal,
16981 scaleImplicit: implicit,
16984 scaleQuantile: quantile$1,
16985 scaleQuantize: quantize,
16986 scaleThreshold: threshold,
16989 schemeCategory10: category10,
16990 schemeCategory20b: category20b,
16991 schemeCategory20c: category20c,
16992 schemeCategory20: category20,
16993 interpolateCubehelixDefault: cubehelix$3,
16994 interpolateRainbow: rainbow$1,
16995 interpolateWarm: warm,
16996 interpolateCool: cool,
16997 interpolateViridis: viridis,
16998 interpolateMagma: magma,
16999 interpolateInferno: inferno,
17000 interpolatePlasma: plasma,
17001 scaleSequential: sequential,
17005 matcher: matcher$1,
17007 namespace: namespace,
17008 namespaces: namespaces,
17009 clientPoint: point,
17011 selectAll: d3_selectAll,
17012 selection: selection,
17013 selector: selector,
17014 selectorAll: selectorAll,
17017 touches: d3_touches,
17018 window: defaultView,
17019 get event () { return event; },
17020 customEvent: customEvent,
17025 areaRadial: areaRadial,
17026 radialArea: areaRadial,
17027 lineRadial: lineRadial$1,
17028 radialLine: lineRadial$1,
17029 pointRadial: pointRadial,
17030 linkHorizontal: linkHorizontal,
17031 linkVertical: linkVertical,
17032 linkRadial: linkRadial,
17035 symbolCircle: circle$2,
17036 symbolCross: cross$2,
17037 symbolDiamond: diamond,
17038 symbolSquare: square,
17040 symbolTriangle: triangle,
17042 curveBasisClosed: basisClosed$1,
17043 curveBasisOpen: basisOpen,
17044 curveBasis: basis$2,
17045 curveBundle: bundle,
17046 curveCardinalClosed: cardinalClosed,
17047 curveCardinalOpen: cardinalOpen,
17048 curveCardinal: cardinal,
17049 curveCatmullRomClosed: catmullRomClosed,
17050 curveCatmullRomOpen: catmullRomOpen,
17051 curveCatmullRom: catmullRom,
17052 curveLinearClosed: linearClosed,
17053 curveLinear: curveLinear,
17054 curveMonotoneX: monotoneX,
17055 curveMonotoneY: monotoneY,
17056 curveNatural: natural,
17058 curveStepAfter: stepAfter,
17059 curveStepBefore: stepBefore,
17061 stackOffsetExpand: expand,
17062 stackOffsetDiverging: diverging,
17063 stackOffsetNone: none$1,
17064 stackOffsetSilhouette: silhouette,
17065 stackOffsetWiggle: wiggle,
17066 stackOrderAscending: ascending$2,
17067 stackOrderDescending: descending$1,
17068 stackOrderInsideOut: insideOut,
17069 stackOrderNone: none$2,
17070 stackOrderReverse: reverse,
17071 timeInterval: newInterval,
17072 timeMillisecond: millisecond,
17073 timeMilliseconds: milliseconds,
17074 utcMillisecond: millisecond,
17075 utcMilliseconds: milliseconds,
17076 timeSecond: second,
17077 timeSeconds: seconds,
17079 utcSeconds: seconds,
17080 timeMinute: minute,
17081 timeMinutes: minutes,
17087 timeWeeks: sundays,
17088 timeSunday: sunday,
17089 timeSundays: sundays,
17090 timeMonday: monday,
17091 timeMondays: mondays,
17092 timeTuesday: tuesday,
17093 timeTuesdays: tuesdays,
17094 timeWednesday: wednesday,
17095 timeWednesdays: wednesdays,
17096 timeThursday: thursday,
17097 timeThursdays: thursdays,
17098 timeFriday: friday,
17099 timeFridays: fridays,
17100 timeSaturday: saturday,
17101 timeSaturdays: saturdays,
17103 timeMonths: months,
17106 utcMinute: utcMinute,
17107 utcMinutes: utcMinutes,
17109 utcHours: utcHours,
17112 utcWeek: utcSunday,
17113 utcWeeks: utcSundays,
17114 utcSunday: utcSunday,
17115 utcSundays: utcSundays,
17116 utcMonday: utcMonday,
17117 utcMondays: utcMondays,
17118 utcTuesday: utcTuesday,
17119 utcTuesdays: utcTuesdays,
17120 utcWednesday: utcWednesday,
17121 utcWednesdays: utcWednesdays,
17122 utcThursday: utcThursday,
17123 utcThursdays: utcThursdays,
17124 utcFriday: utcFriday,
17125 utcFridays: utcFridays,
17126 utcSaturday: utcSaturday,
17127 utcSaturdays: utcSaturdays,
17128 utcMonth: utcMonth,
17129 utcMonths: utcMonths,
17131 utcYears: utcYears,
17132 timeFormatDefaultLocale: defaultLocale$1,
17133 get timeFormat () { return timeFormat; },
17134 get timeParse () { return timeParse; },
17135 get utcFormat () { return utcFormat; },
17136 get utcParse () { return utcParse; },
17137 timeFormatLocale: formatLocale$1,
17138 isoFormat: formatIso,
17139 isoParse: parseIso,
17142 timerFlush: timerFlush,
17143 timeout: timeout$1,
17144 interval: interval$1,
17145 transition: transition,
17147 interrupt: interrupt,
17150 zoomTransform: transform,
17151 zoomIdentity: identity$7
17154 function actionAddEntity(way) {
17155 return function(graph) {
17156 return graph.replace(way);
17161 * Removes all key-value entries from the list cache.
17165 * @memberOf ListCache
17167 function listCacheClear() {
17168 this.__data__ = [];
17174 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17175 * comparison between two values to determine if they are equivalent.
17181 * @param {*} value The value to compare.
17182 * @param {*} other The other value to compare.
17183 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
17186 * var object = { 'a': 1 };
17187 * var other = { 'a': 1 };
17189 * _.eq(object, object);
17192 * _.eq(object, other);
17198 * _.eq('a', Object('a'));
17204 function eq(value, other) {
17205 return value === other || (value !== value && other !== other);
17209 * Gets the index at which the `key` is found in `array` of key-value pairs.
17212 * @param {Array} array The array to inspect.
17213 * @param {*} key The key to search for.
17214 * @returns {number} Returns the index of the matched value, else `-1`.
17216 function assocIndexOf(array, key) {
17217 var length = array.length;
17219 if (eq(array[length][0], key)) {
17226 /** Used for built-in method references. */
17227 var arrayProto = Array.prototype;
17229 /** Built-in value references. */
17230 var splice = arrayProto.splice;
17233 * Removes `key` and its value from the list cache.
17237 * @memberOf ListCache
17238 * @param {string} key The key of the value to remove.
17239 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17241 function listCacheDelete(key) {
17242 var data = this.__data__,
17243 index = assocIndexOf(data, key);
17248 var lastIndex = data.length - 1;
17249 if (index == lastIndex) {
17252 splice.call(data, index, 1);
17259 * Gets the list cache value for `key`.
17263 * @memberOf ListCache
17264 * @param {string} key The key of the value to get.
17265 * @returns {*} Returns the entry value.
17267 function listCacheGet(key) {
17268 var data = this.__data__,
17269 index = assocIndexOf(data, key);
17271 return index < 0 ? undefined : data[index][1];
17275 * Checks if a list cache value for `key` exists.
17279 * @memberOf ListCache
17280 * @param {string} key The key of the entry to check.
17281 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17283 function listCacheHas(key) {
17284 return assocIndexOf(this.__data__, key) > -1;
17288 * Sets the list cache `key` to `value`.
17292 * @memberOf ListCache
17293 * @param {string} key The key of the value to set.
17294 * @param {*} value The value to set.
17295 * @returns {Object} Returns the list cache instance.
17297 function listCacheSet(key, value) {
17298 var data = this.__data__,
17299 index = assocIndexOf(data, key);
17303 data.push([key, value]);
17305 data[index][1] = value;
17311 * Creates an list cache object.
17315 * @param {Array} [entries] The key-value pairs to cache.
17317 function ListCache(entries) {
17319 length = entries == null ? 0 : entries.length;
17322 while (++index < length) {
17323 var entry = entries[index];
17324 this.set(entry[0], entry[1]);
17328 // Add methods to `ListCache`.
17329 ListCache.prototype.clear = listCacheClear;
17330 ListCache.prototype['delete'] = listCacheDelete;
17331 ListCache.prototype.get = listCacheGet;
17332 ListCache.prototype.has = listCacheHas;
17333 ListCache.prototype.set = listCacheSet;
17336 * Removes all key-value entries from the stack.
17342 function stackClear() {
17343 this.__data__ = new ListCache;
17348 * Removes `key` and its value from the stack.
17353 * @param {string} key The key of the value to remove.
17354 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17356 function stackDelete(key) {
17357 var data = this.__data__,
17358 result = data['delete'](key);
17360 this.size = data.size;
17365 * Gets the stack value for `key`.
17370 * @param {string} key The key of the value to get.
17371 * @returns {*} Returns the entry value.
17373 function stackGet(key) {
17374 return this.__data__.get(key);
17378 * Checks if a stack value for `key` exists.
17383 * @param {string} key The key of the entry to check.
17384 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17386 function stackHas(key) {
17387 return this.__data__.has(key);
17390 /** Detect free variable `global` from Node.js. */
17391 var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
17393 /** Detect free variable `self`. */
17394 var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
17396 /** Used as a reference to the global object. */
17397 var root$2 = freeGlobal || freeSelf || Function('return this')();
17399 /** Built-in value references. */
17400 var Symbol = root$2.Symbol;
17402 /** Used for built-in method references. */
17403 var objectProto = Object.prototype;
17405 /** Used to check objects for own properties. */
17406 var hasOwnProperty = objectProto.hasOwnProperty;
17409 * Used to resolve the
17410 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17413 var nativeObjectToString = objectProto.toString;
17415 /** Built-in value references. */
17416 var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
17419 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
17422 * @param {*} value The value to query.
17423 * @returns {string} Returns the raw `toStringTag`.
17425 function getRawTag(value) {
17426 var isOwn = hasOwnProperty.call(value, symToStringTag),
17427 tag = value[symToStringTag];
17430 value[symToStringTag] = undefined;
17433 var result = nativeObjectToString.call(value);
17436 value[symToStringTag] = tag;
17438 delete value[symToStringTag];
17444 /** Used for built-in method references. */
17445 var objectProto$1 = Object.prototype;
17448 * Used to resolve the
17449 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17452 var nativeObjectToString$1 = objectProto$1.toString;
17455 * Converts `value` to a string using `Object.prototype.toString`.
17458 * @param {*} value The value to convert.
17459 * @returns {string} Returns the converted string.
17461 function objectToString(value) {
17462 return nativeObjectToString$1.call(value);
17465 /** `Object#toString` result references. */
17466 var nullTag = '[object Null]',
17467 undefinedTag = '[object Undefined]';
17469 /** Built-in value references. */
17470 var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
17473 * The base implementation of `getTag` without fallbacks for buggy environments.
17476 * @param {*} value The value to query.
17477 * @returns {string} Returns the `toStringTag`.
17479 function baseGetTag(value) {
17480 if (value == null) {
17481 return value === undefined ? undefinedTag : nullTag;
17483 return (symToStringTag$1 && symToStringTag$1 in Object(value))
17485 : objectToString(value);
17489 * Checks if `value` is the
17490 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
17491 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
17497 * @param {*} value The value to check.
17498 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
17504 * _.isObject([1, 2, 3]);
17507 * _.isObject(_.noop);
17510 * _.isObject(null);
17513 function isObject(value) {
17514 var type = typeof value;
17515 return value != null && (type == 'object' || type == 'function');
17518 /** `Object#toString` result references. */
17519 var asyncTag = '[object AsyncFunction]',
17520 funcTag = '[object Function]',
17521 genTag = '[object GeneratorFunction]',
17522 proxyTag = '[object Proxy]';
17525 * Checks if `value` is classified as a `Function` object.
17531 * @param {*} value The value to check.
17532 * @returns {boolean} Returns `true` if `value` is a function, else `false`.
17538 * _.isFunction(/abc/);
17541 function isFunction(value) {
17542 if (!isObject(value)) {
17545 // The use of `Object#toString` avoids issues with the `typeof` operator
17546 // in Safari 9 which returns 'object' for typed arrays and other constructors.
17547 var tag = baseGetTag(value);
17548 return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
17551 /** Used to detect overreaching core-js shims. */
17552 var coreJsData = root$2['__core-js_shared__'];
17554 /** Used to detect methods masquerading as native. */
17555 var maskSrcKey = (function() {
17556 var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
17557 return uid ? ('Symbol(src)_1.' + uid) : '';
17561 * Checks if `func` has its source masked.
17564 * @param {Function} func The function to check.
17565 * @returns {boolean} Returns `true` if `func` is masked, else `false`.
17567 function isMasked(func) {
17568 return !!maskSrcKey && (maskSrcKey in func);
17571 /** Used for built-in method references. */
17572 var funcProto = Function.prototype;
17574 /** Used to resolve the decompiled source of functions. */
17575 var funcToString = funcProto.toString;
17578 * Converts `func` to its source code.
17581 * @param {Function} func The function to convert.
17582 * @returns {string} Returns the source code.
17584 function toSource(func) {
17585 if (func != null) {
17587 return funcToString.call(func);
17590 return (func + '');
17597 * Used to match `RegExp`
17598 * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
17600 var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
17602 /** Used to detect host constructors (Safari). */
17603 var reIsHostCtor = /^\[object .+?Constructor\]$/;
17605 /** Used for built-in method references. */
17606 var funcProto$1 = Function.prototype,
17607 objectProto$2 = Object.prototype;
17609 /** Used to resolve the decompiled source of functions. */
17610 var funcToString$1 = funcProto$1.toString;
17612 /** Used to check objects for own properties. */
17613 var hasOwnProperty$1 = objectProto$2.hasOwnProperty;
17615 /** Used to detect if a method is native. */
17616 var reIsNative = RegExp('^' +
17617 funcToString$1.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
17618 .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
17622 * The base implementation of `_.isNative` without bad shim checks.
17625 * @param {*} value The value to check.
17626 * @returns {boolean} Returns `true` if `value` is a native function,
17629 function baseIsNative(value) {
17630 if (!isObject(value) || isMasked(value)) {
17633 var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
17634 return pattern.test(toSource(value));
17638 * Gets the value at `key` of `object`.
17641 * @param {Object} [object] The object to query.
17642 * @param {string} key The key of the property to get.
17643 * @returns {*} Returns the property value.
17645 function getValue(object, key) {
17646 return object == null ? undefined : object[key];
17650 * Gets the native function at `key` of `object`.
17653 * @param {Object} object The object to query.
17654 * @param {string} key The key of the method to get.
17655 * @returns {*} Returns the function if it's native, else `undefined`.
17657 function getNative(object, key) {
17658 var value = getValue(object, key);
17659 return baseIsNative(value) ? value : undefined;
17662 /* Built-in method references that are verified to be native. */
17663 var Map$1 = getNative(root$2, 'Map');
17665 /* Built-in method references that are verified to be native. */
17666 var nativeCreate = getNative(Object, 'create');
17669 * Removes all key-value entries from the hash.
17675 function hashClear() {
17676 this.__data__ = nativeCreate ? nativeCreate(null) : {};
17681 * Removes `key` and its value from the hash.
17686 * @param {Object} hash The hash to modify.
17687 * @param {string} key The key of the value to remove.
17688 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17690 function hashDelete(key) {
17691 var result = this.has(key) && delete this.__data__[key];
17692 this.size -= result ? 1 : 0;
17696 /** Used to stand-in for `undefined` hash values. */
17697 var HASH_UNDEFINED = '__lodash_hash_undefined__';
17699 /** Used for built-in method references. */
17700 var objectProto$3 = Object.prototype;
17702 /** Used to check objects for own properties. */
17703 var hasOwnProperty$2 = objectProto$3.hasOwnProperty;
17706 * Gets the hash value for `key`.
17711 * @param {string} key The key of the value to get.
17712 * @returns {*} Returns the entry value.
17714 function hashGet(key) {
17715 var data = this.__data__;
17716 if (nativeCreate) {
17717 var result = data[key];
17718 return result === HASH_UNDEFINED ? undefined : result;
17720 return hasOwnProperty$2.call(data, key) ? data[key] : undefined;
17723 /** Used for built-in method references. */
17724 var objectProto$4 = Object.prototype;
17726 /** Used to check objects for own properties. */
17727 var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
17730 * Checks if a hash value for `key` exists.
17735 * @param {string} key The key of the entry to check.
17736 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17738 function hashHas(key) {
17739 var data = this.__data__;
17740 return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$3.call(data, key);
17743 /** Used to stand-in for `undefined` hash values. */
17744 var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
17747 * Sets the hash `key` to `value`.
17752 * @param {string} key The key of the value to set.
17753 * @param {*} value The value to set.
17754 * @returns {Object} Returns the hash instance.
17756 function hashSet(key, value) {
17757 var data = this.__data__;
17758 this.size += this.has(key) ? 0 : 1;
17759 data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
17764 * Creates a hash object.
17768 * @param {Array} [entries] The key-value pairs to cache.
17770 function Hash(entries) {
17772 length = entries == null ? 0 : entries.length;
17775 while (++index < length) {
17776 var entry = entries[index];
17777 this.set(entry[0], entry[1]);
17781 // Add methods to `Hash`.
17782 Hash.prototype.clear = hashClear;
17783 Hash.prototype['delete'] = hashDelete;
17784 Hash.prototype.get = hashGet;
17785 Hash.prototype.has = hashHas;
17786 Hash.prototype.set = hashSet;
17789 * Removes all key-value entries from the map.
17793 * @memberOf MapCache
17795 function mapCacheClear() {
17799 'map': new (Map$1 || ListCache),
17805 * Checks if `value` is suitable for use as unique object key.
17808 * @param {*} value The value to check.
17809 * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
17811 function isKeyable(value) {
17812 var type = typeof value;
17813 return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
17814 ? (value !== '__proto__')
17815 : (value === null);
17819 * Gets the data for `map`.
17822 * @param {Object} map The map to query.
17823 * @param {string} key The reference key.
17824 * @returns {*} Returns the map data.
17826 function getMapData(map, key) {
17827 var data = map.__data__;
17828 return isKeyable(key)
17829 ? data[typeof key == 'string' ? 'string' : 'hash']
17834 * Removes `key` and its value from the map.
17838 * @memberOf MapCache
17839 * @param {string} key The key of the value to remove.
17840 * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17842 function mapCacheDelete(key) {
17843 var result = getMapData(this, key)['delete'](key);
17844 this.size -= result ? 1 : 0;
17849 * Gets the map value for `key`.
17853 * @memberOf MapCache
17854 * @param {string} key The key of the value to get.
17855 * @returns {*} Returns the entry value.
17857 function mapCacheGet(key) {
17858 return getMapData(this, key).get(key);
17862 * Checks if a map value for `key` exists.
17866 * @memberOf MapCache
17867 * @param {string} key The key of the entry to check.
17868 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17870 function mapCacheHas(key) {
17871 return getMapData(this, key).has(key);
17875 * Sets the map `key` to `value`.
17879 * @memberOf MapCache
17880 * @param {string} key The key of the value to set.
17881 * @param {*} value The value to set.
17882 * @returns {Object} Returns the map cache instance.
17884 function mapCacheSet(key, value) {
17885 var data = getMapData(this, key),
17888 data.set(key, value);
17889 this.size += data.size == size ? 0 : 1;
17894 * Creates a map cache object to store key-value pairs.
17898 * @param {Array} [entries] The key-value pairs to cache.
17900 function MapCache(entries) {
17902 length = entries == null ? 0 : entries.length;
17905 while (++index < length) {
17906 var entry = entries[index];
17907 this.set(entry[0], entry[1]);
17911 // Add methods to `MapCache`.
17912 MapCache.prototype.clear = mapCacheClear;
17913 MapCache.prototype['delete'] = mapCacheDelete;
17914 MapCache.prototype.get = mapCacheGet;
17915 MapCache.prototype.has = mapCacheHas;
17916 MapCache.prototype.set = mapCacheSet;
17918 /** Used as the size to enable large array optimizations. */
17919 var LARGE_ARRAY_SIZE = 200;
17922 * Sets the stack `key` to `value`.
17927 * @param {string} key The key of the value to set.
17928 * @param {*} value The value to set.
17929 * @returns {Object} Returns the stack cache instance.
17931 function stackSet(key, value) {
17932 var data = this.__data__;
17933 if (data instanceof ListCache) {
17934 var pairs = data.__data__;
17935 if (!Map$1 || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
17936 pairs.push([key, value]);
17937 this.size = ++data.size;
17940 data = this.__data__ = new MapCache(pairs);
17942 data.set(key, value);
17943 this.size = data.size;
17948 * Creates a stack cache object to store key-value pairs.
17952 * @param {Array} [entries] The key-value pairs to cache.
17954 function Stack(entries) {
17955 var data = this.__data__ = new ListCache(entries);
17956 this.size = data.size;
17959 // Add methods to `Stack`.
17960 Stack.prototype.clear = stackClear;
17961 Stack.prototype['delete'] = stackDelete;
17962 Stack.prototype.get = stackGet;
17963 Stack.prototype.has = stackHas;
17964 Stack.prototype.set = stackSet;
17967 * A specialized version of `_.forEach` for arrays without support for
17968 * iteratee shorthands.
17971 * @param {Array} [array] The array to iterate over.
17972 * @param {Function} iteratee The function invoked per iteration.
17973 * @returns {Array} Returns `array`.
17975 function arrayEach(array, iteratee) {
17977 length = array == null ? 0 : array.length;
17979 while (++index < length) {
17980 if (iteratee(array[index], index, array) === false) {
17987 var defineProperty = (function() {
17989 var func = getNative(Object, 'defineProperty');
17996 * The base implementation of `assignValue` and `assignMergeValue` without
18000 * @param {Object} object The object to modify.
18001 * @param {string} key The key of the property to assign.
18002 * @param {*} value The value to assign.
18004 function baseAssignValue(object, key, value) {
18005 if (key == '__proto__' && defineProperty) {
18006 defineProperty(object, key, {
18007 'configurable': true,
18008 'enumerable': true,
18013 object[key] = value;
18017 /** Used for built-in method references. */
18018 var objectProto$5 = Object.prototype;
18020 /** Used to check objects for own properties. */
18021 var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
18024 * Assigns `value` to `key` of `object` if the existing value is not equivalent
18025 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
18026 * for equality comparisons.
18029 * @param {Object} object The object to modify.
18030 * @param {string} key The key of the property to assign.
18031 * @param {*} value The value to assign.
18033 function assignValue(object, key, value) {
18034 var objValue = object[key];
18035 if (!(hasOwnProperty$4.call(object, key) && eq(objValue, value)) ||
18036 (value === undefined && !(key in object))) {
18037 baseAssignValue(object, key, value);
18042 * Copies properties of `source` to `object`.
18045 * @param {Object} source The object to copy properties from.
18046 * @param {Array} props The property identifiers to copy.
18047 * @param {Object} [object={}] The object to copy properties to.
18048 * @param {Function} [customizer] The function to customize copied values.
18049 * @returns {Object} Returns `object`.
18051 function copyObject(source, props, object, customizer) {
18052 var isNew = !object;
18053 object || (object = {});
18056 length = props.length;
18058 while (++index < length) {
18059 var key = props[index];
18061 var newValue = customizer
18062 ? customizer(object[key], source[key], key, object, source)
18065 if (newValue === undefined) {
18066 newValue = source[key];
18069 baseAssignValue(object, key, newValue);
18071 assignValue(object, key, newValue);
18078 * The base implementation of `_.times` without support for iteratee shorthands
18079 * or max array length checks.
18082 * @param {number} n The number of times to invoke `iteratee`.
18083 * @param {Function} iteratee The function invoked per iteration.
18084 * @returns {Array} Returns the array of results.
18086 function baseTimes(n, iteratee) {
18090 while (++index < n) {
18091 result[index] = iteratee(index);
18097 * Checks if `value` is object-like. A value is object-like if it's not `null`
18098 * and has a `typeof` result of "object".
18104 * @param {*} value The value to check.
18105 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
18108 * _.isObjectLike({});
18111 * _.isObjectLike([1, 2, 3]);
18114 * _.isObjectLike(_.noop);
18117 * _.isObjectLike(null);
18120 function isObjectLike(value) {
18121 return value != null && typeof value == 'object';
18124 /** `Object#toString` result references. */
18125 var argsTag = '[object Arguments]';
18128 * The base implementation of `_.isArguments`.
18131 * @param {*} value The value to check.
18132 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18134 function baseIsArguments(value) {
18135 return isObjectLike(value) && baseGetTag(value) == argsTag;
18138 /** Used for built-in method references. */
18139 var objectProto$6 = Object.prototype;
18141 /** Used to check objects for own properties. */
18142 var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
18144 /** Built-in value references. */
18145 var propertyIsEnumerable = objectProto$6.propertyIsEnumerable;
18148 * Checks if `value` is likely an `arguments` object.
18154 * @param {*} value The value to check.
18155 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18159 * _.isArguments(function() { return arguments; }());
18162 * _.isArguments([1, 2, 3]);
18165 var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
18166 return isObjectLike(value) && hasOwnProperty$5.call(value, 'callee') &&
18167 !propertyIsEnumerable.call(value, 'callee');
18171 * Checks if `value` is classified as an `Array` object.
18177 * @param {*} value The value to check.
18178 * @returns {boolean} Returns `true` if `value` is an array, else `false`.
18181 * _.isArray([1, 2, 3]);
18184 * _.isArray(document.body.children);
18187 * _.isArray('abc');
18190 * _.isArray(_.noop);
18193 var isArray = Array.isArray;
18196 * This method returns `false`.
18202 * @returns {boolean} Returns `false`.
18205 * _.times(2, _.stubFalse);
18206 * // => [false, false]
18208 function stubFalse() {
18212 /** Detect free variable `exports`. */
18213 var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
18215 /** Detect free variable `module`. */
18216 var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
18218 /** Detect the popular CommonJS extension `module.exports`. */
18219 var moduleExports = freeModule && freeModule.exports === freeExports;
18221 /** Built-in value references. */
18222 var Buffer = moduleExports ? root$2.Buffer : undefined;
18224 /* Built-in method references for those with the same name as other `lodash` methods. */
18225 var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
18228 * Checks if `value` is a buffer.
18234 * @param {*} value The value to check.
18235 * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
18238 * _.isBuffer(new Buffer(2));
18241 * _.isBuffer(new Uint8Array(2));
18244 var isBuffer = nativeIsBuffer || stubFalse;
18246 /** Used as references for various `Number` constants. */
18247 var MAX_SAFE_INTEGER = 9007199254740991;
18249 /** Used to detect unsigned integer values. */
18250 var reIsUint = /^(?:0|[1-9]\d*)$/;
18253 * Checks if `value` is a valid array-like index.
18256 * @param {*} value The value to check.
18257 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
18258 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
18260 function isIndex(value, length) {
18261 var type = typeof value;
18262 length = length == null ? MAX_SAFE_INTEGER : length;
18265 (type == 'number' ||
18266 (type != 'symbol' && reIsUint.test(value))) &&
18267 (value > -1 && value % 1 == 0 && value < length);
18270 /** Used as references for various `Number` constants. */
18271 var MAX_SAFE_INTEGER$1 = 9007199254740991;
18274 * Checks if `value` is a valid array-like length.
18276 * **Note:** This method is loosely based on
18277 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
18283 * @param {*} value The value to check.
18284 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
18290 * _.isLength(Number.MIN_VALUE);
18293 * _.isLength(Infinity);
18299 function isLength(value) {
18300 return typeof value == 'number' &&
18301 value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;
18304 /** `Object#toString` result references. */
18305 var argsTag$1 = '[object Arguments]',
18306 arrayTag = '[object Array]',
18307 boolTag = '[object Boolean]',
18308 dateTag = '[object Date]',
18309 errorTag = '[object Error]',
18310 funcTag$1 = '[object Function]',
18311 mapTag = '[object Map]',
18312 numberTag = '[object Number]',
18313 objectTag = '[object Object]',
18314 regexpTag = '[object RegExp]',
18315 setTag = '[object Set]',
18316 stringTag = '[object String]',
18317 weakMapTag = '[object WeakMap]';
18319 var arrayBufferTag = '[object ArrayBuffer]',
18320 dataViewTag = '[object DataView]',
18321 float32Tag = '[object Float32Array]',
18322 float64Tag = '[object Float64Array]',
18323 int8Tag = '[object Int8Array]',
18324 int16Tag = '[object Int16Array]',
18325 int32Tag = '[object Int32Array]',
18326 uint8Tag = '[object Uint8Array]',
18327 uint8ClampedTag = '[object Uint8ClampedArray]',
18328 uint16Tag = '[object Uint16Array]',
18329 uint32Tag = '[object Uint32Array]';
18331 /** Used to identify `toStringTag` values of typed arrays. */
18332 var typedArrayTags = {};
18333 typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
18334 typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
18335 typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
18336 typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
18337 typedArrayTags[uint32Tag] = true;
18338 typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =
18339 typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
18340 typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
18341 typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =
18342 typedArrayTags[mapTag] = typedArrayTags[numberTag] =
18343 typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
18344 typedArrayTags[setTag] = typedArrayTags[stringTag] =
18345 typedArrayTags[weakMapTag] = false;
18348 * The base implementation of `_.isTypedArray` without Node.js optimizations.
18351 * @param {*} value The value to check.
18352 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18354 function baseIsTypedArray(value) {
18355 return isObjectLike(value) &&
18356 isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
18360 * The base implementation of `_.unary` without support for storing metadata.
18363 * @param {Function} func The function to cap arguments for.
18364 * @returns {Function} Returns the new capped function.
18366 function baseUnary(func) {
18367 return function(value) {
18368 return func(value);
18372 /** Detect free variable `exports`. */
18373 var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18375 /** Detect free variable `module`. */
18376 var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;
18378 /** Detect the popular CommonJS extension `module.exports`. */
18379 var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
18381 /** Detect free variable `process` from Node.js. */
18382 var freeProcess = moduleExports$1 && freeGlobal.process;
18384 /** Used to access faster Node.js helpers. */
18385 var nodeUtil = (function() {
18387 // Use `util.types` for Node.js 10+.
18388 var types = freeModule$1 && freeModule$1.require && freeModule$1.require('util').types;
18394 // Legacy `process.binding('util')` for Node.js < 10.
18395 return freeProcess && freeProcess.binding && freeProcess.binding('util');
18399 /* Node.js helper references. */
18400 var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18403 * Checks if `value` is classified as a typed array.
18409 * @param {*} value The value to check.
18410 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18413 * _.isTypedArray(new Uint8Array);
18416 * _.isTypedArray([]);
18419 var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18421 /** Used for built-in method references. */
18422 var objectProto$7 = Object.prototype;
18424 /** Used to check objects for own properties. */
18425 var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
18428 * Creates an array of the enumerable property names of the array-like `value`.
18431 * @param {*} value The value to query.
18432 * @param {boolean} inherited Specify returning inherited property names.
18433 * @returns {Array} Returns the array of property names.
18435 function arrayLikeKeys(value, inherited) {
18436 var isArr = isArray(value),
18437 isArg = !isArr && isArguments(value),
18438 isBuff = !isArr && !isArg && isBuffer(value),
18439 isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18440 skipIndexes = isArr || isArg || isBuff || isType,
18441 result = skipIndexes ? baseTimes(value.length, String) : [],
18442 length = result.length;
18444 for (var key in value) {
18445 if ((inherited || hasOwnProperty$6.call(value, key)) &&
18447 // Safari 9 has enumerable `arguments.length` in strict mode.
18449 // Node.js 0.10 has enumerable non-index properties on buffers.
18450 (isBuff && (key == 'offset' || key == 'parent')) ||
18451 // PhantomJS 2 has enumerable non-index properties on typed arrays.
18452 (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18453 // Skip index properties.
18454 isIndex(key, length)
18462 /** Used for built-in method references. */
18463 var objectProto$8 = Object.prototype;
18466 * Checks if `value` is likely a prototype object.
18469 * @param {*} value The value to check.
18470 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18472 function isPrototype(value) {
18473 var Ctor = value && value.constructor,
18474 proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8;
18476 return value === proto;
18480 * Creates a unary function that invokes `func` with its argument transformed.
18483 * @param {Function} func The function to wrap.
18484 * @param {Function} transform The argument transform.
18485 * @returns {Function} Returns the new function.
18487 function overArg(func, transform) {
18488 return function(arg) {
18489 return func(transform(arg));
18493 /* Built-in method references for those with the same name as other `lodash` methods. */
18494 var nativeKeys = overArg(Object.keys, Object);
18496 /** Used for built-in method references. */
18497 var objectProto$9 = Object.prototype;
18499 /** Used to check objects for own properties. */
18500 var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18503 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18506 * @param {Object} object The object to query.
18507 * @returns {Array} Returns the array of property names.
18509 function baseKeys(object) {
18510 if (!isPrototype(object)) {
18511 return nativeKeys(object);
18514 for (var key in Object(object)) {
18515 if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
18523 * Checks if `value` is array-like. A value is considered array-like if it's
18524 * not a function and has a `value.length` that's an integer greater than or
18525 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
18531 * @param {*} value The value to check.
18532 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
18535 * _.isArrayLike([1, 2, 3]);
18538 * _.isArrayLike(document.body.children);
18541 * _.isArrayLike('abc');
18544 * _.isArrayLike(_.noop);
18547 function isArrayLike(value) {
18548 return value != null && isLength(value.length) && !isFunction(value);
18552 * Creates an array of the own enumerable property names of `object`.
18554 * **Note:** Non-object values are coerced to objects. See the
18555 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18556 * for more details.
18562 * @param {Object} object The object to query.
18563 * @returns {Array} Returns the array of property names.
18571 * Foo.prototype.c = 3;
18574 * // => ['a', 'b'] (iteration order is not guaranteed)
18579 function keys$1(object) {
18580 return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18584 * The base implementation of `_.assign` without support for multiple sources
18585 * or `customizer` functions.
18588 * @param {Object} object The destination object.
18589 * @param {Object} source The source object.
18590 * @returns {Object} Returns `object`.
18592 function baseAssign(object, source) {
18593 return object && copyObject(source, keys$1(source), object);
18597 * This function is like
18598 * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18599 * except that it includes inherited enumerable properties.
18602 * @param {Object} object The object to query.
18603 * @returns {Array} Returns the array of property names.
18605 function nativeKeysIn(object) {
18607 if (object != null) {
18608 for (var key in Object(object)) {
18615 /** Used for built-in method references. */
18616 var objectProto$a = Object.prototype;
18618 /** Used to check objects for own properties. */
18619 var hasOwnProperty$8 = objectProto$a.hasOwnProperty;
18622 * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18625 * @param {Object} object The object to query.
18626 * @returns {Array} Returns the array of property names.
18628 function baseKeysIn(object) {
18629 if (!isObject(object)) {
18630 return nativeKeysIn(object);
18632 var isProto = isPrototype(object),
18635 for (var key in object) {
18636 if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) {
18644 * Creates an array of the own and inherited enumerable property names of `object`.
18646 * **Note:** Non-object values are coerced to objects.
18652 * @param {Object} object The object to query.
18653 * @returns {Array} Returns the array of property names.
18661 * Foo.prototype.c = 3;
18663 * _.keysIn(new Foo);
18664 * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18666 function keysIn$1(object) {
18667 return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18671 * The base implementation of `_.assignIn` without support for multiple sources
18672 * or `customizer` functions.
18675 * @param {Object} object The destination object.
18676 * @param {Object} source The source object.
18677 * @returns {Object} Returns `object`.
18679 function baseAssignIn(object, source) {
18680 return object && copyObject(source, keysIn$1(source), object);
18683 /** Detect free variable `exports`. */
18684 var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18686 /** Detect free variable `module`. */
18687 var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
18689 /** Detect the popular CommonJS extension `module.exports`. */
18690 var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
18692 /** Built-in value references. */
18693 var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined,
18694 allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
18697 * Creates a clone of `buffer`.
18700 * @param {Buffer} buffer The buffer to clone.
18701 * @param {boolean} [isDeep] Specify a deep clone.
18702 * @returns {Buffer} Returns the cloned buffer.
18704 function cloneBuffer(buffer, isDeep) {
18706 return buffer.slice();
18708 var length = buffer.length,
18709 result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
18711 buffer.copy(result);
18716 * Copies the values of `source` to `array`.
18719 * @param {Array} source The array to copy values from.
18720 * @param {Array} [array=[]] The array to copy values to.
18721 * @returns {Array} Returns `array`.
18723 function copyArray(source, array) {
18725 length = source.length;
18727 array || (array = Array(length));
18728 while (++index < length) {
18729 array[index] = source[index];
18735 * A specialized version of `_.filter` for arrays without support for
18736 * iteratee shorthands.
18739 * @param {Array} [array] The array to iterate over.
18740 * @param {Function} predicate The function invoked per iteration.
18741 * @returns {Array} Returns the new filtered array.
18743 function arrayFilter(array, predicate) {
18745 length = array == null ? 0 : array.length,
18749 while (++index < length) {
18750 var value = array[index];
18751 if (predicate(value, index, array)) {
18752 result[resIndex++] = value;
18759 * This method returns a new empty array.
18765 * @returns {Array} Returns the new empty array.
18768 * var arrays = _.times(2, _.stubArray);
18770 * console.log(arrays);
18773 * console.log(arrays[0] === arrays[1]);
18776 function stubArray() {
18780 /** Used for built-in method references. */
18781 var objectProto$b = Object.prototype;
18783 /** Built-in value references. */
18784 var propertyIsEnumerable$1 = objectProto$b.propertyIsEnumerable;
18786 /* Built-in method references for those with the same name as other `lodash` methods. */
18787 var nativeGetSymbols = Object.getOwnPropertySymbols;
18790 * Creates an array of the own enumerable symbols of `object`.
18793 * @param {Object} object The object to query.
18794 * @returns {Array} Returns the array of symbols.
18796 var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
18797 if (object == null) {
18800 object = Object(object);
18801 return arrayFilter(nativeGetSymbols(object), function(symbol) {
18802 return propertyIsEnumerable$1.call(object, symbol);
18807 * Copies own symbols of `source` to `object`.
18810 * @param {Object} source The object to copy symbols from.
18811 * @param {Object} [object={}] The object to copy symbols to.
18812 * @returns {Object} Returns `object`.
18814 function copySymbols(source, object) {
18815 return copyObject(source, getSymbols(source), object);
18819 * Appends the elements of `values` to `array`.
18822 * @param {Array} array The array to modify.
18823 * @param {Array} values The values to append.
18824 * @returns {Array} Returns `array`.
18826 function arrayPush(array, values) {
18828 length = values.length,
18829 offset = array.length;
18831 while (++index < length) {
18832 array[offset + index] = values[index];
18837 /** Built-in value references. */
18838 var getPrototype = overArg(Object.getPrototypeOf, Object);
18840 /* Built-in method references for those with the same name as other `lodash` methods. */
18841 var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
18844 * Creates an array of the own and inherited enumerable symbols of `object`.
18847 * @param {Object} object The object to query.
18848 * @returns {Array} Returns the array of symbols.
18850 var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
18853 arrayPush(result, getSymbols(object));
18854 object = getPrototype(object);
18860 * Copies own and inherited symbols of `source` to `object`.
18863 * @param {Object} source The object to copy symbols from.
18864 * @param {Object} [object={}] The object to copy symbols to.
18865 * @returns {Object} Returns `object`.
18867 function copySymbolsIn(source, object) {
18868 return copyObject(source, getSymbolsIn(source), object);
18872 * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
18873 * `keysFunc` and `symbolsFunc` to get the enumerable property names and
18874 * symbols of `object`.
18877 * @param {Object} object The object to query.
18878 * @param {Function} keysFunc The function to get the keys of `object`.
18879 * @param {Function} symbolsFunc The function to get the symbols of `object`.
18880 * @returns {Array} Returns the array of property names and symbols.
18882 function baseGetAllKeys(object, keysFunc, symbolsFunc) {
18883 var result = keysFunc(object);
18884 return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
18888 * Creates an array of own enumerable property names and symbols of `object`.
18891 * @param {Object} object The object to query.
18892 * @returns {Array} Returns the array of property names and symbols.
18894 function getAllKeys(object) {
18895 return baseGetAllKeys(object, keys$1, getSymbols);
18899 * Creates an array of own and inherited enumerable property names and
18900 * symbols of `object`.
18903 * @param {Object} object The object to query.
18904 * @returns {Array} Returns the array of property names and symbols.
18906 function getAllKeysIn(object) {
18907 return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
18910 /* Built-in method references that are verified to be native. */
18911 var DataView = getNative(root$2, 'DataView');
18913 /* Built-in method references that are verified to be native. */
18914 var Promise = getNative(root$2, 'Promise');
18916 /* Built-in method references that are verified to be native. */
18917 var Set$1 = getNative(root$2, 'Set');
18919 /* Built-in method references that are verified to be native. */
18920 var WeakMap = getNative(root$2, 'WeakMap');
18922 /** `Object#toString` result references. */
18923 var mapTag$1 = '[object Map]',
18924 objectTag$1 = '[object Object]',
18925 promiseTag = '[object Promise]',
18926 setTag$1 = '[object Set]',
18927 weakMapTag$1 = '[object WeakMap]';
18929 var dataViewTag$1 = '[object DataView]';
18931 /** Used to detect maps, sets, and weakmaps. */
18932 var dataViewCtorString = toSource(DataView),
18933 mapCtorString = toSource(Map$1),
18934 promiseCtorString = toSource(Promise),
18935 setCtorString = toSource(Set$1),
18936 weakMapCtorString = toSource(WeakMap);
18939 * Gets the `toStringTag` of `value`.
18942 * @param {*} value The value to query.
18943 * @returns {string} Returns the `toStringTag`.
18945 var getTag = baseGetTag;
18947 // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
18948 if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
18949 (Map$1 && getTag(new Map$1) != mapTag$1) ||
18950 (Promise && getTag(Promise.resolve()) != promiseTag) ||
18951 (Set$1 && getTag(new Set$1) != setTag$1) ||
18952 (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
18953 getTag = function(value) {
18954 var result = baseGetTag(value),
18955 Ctor = result == objectTag$1 ? value.constructor : undefined,
18956 ctorString = Ctor ? toSource(Ctor) : '';
18959 switch (ctorString) {
18960 case dataViewCtorString: return dataViewTag$1;
18961 case mapCtorString: return mapTag$1;
18962 case promiseCtorString: return promiseTag;
18963 case setCtorString: return setTag$1;
18964 case weakMapCtorString: return weakMapTag$1;
18971 var getTag$1 = getTag;
18973 /** Used for built-in method references. */
18974 var objectProto$c = Object.prototype;
18976 /** Used to check objects for own properties. */
18977 var hasOwnProperty$9 = objectProto$c.hasOwnProperty;
18980 * Initializes an array clone.
18983 * @param {Array} array The array to clone.
18984 * @returns {Array} Returns the initialized clone.
18986 function initCloneArray(array) {
18987 var length = array.length,
18988 result = new array.constructor(length);
18990 // Add properties assigned by `RegExp#exec`.
18991 if (length && typeof array[0] == 'string' && hasOwnProperty$9.call(array, 'index')) {
18992 result.index = array.index;
18993 result.input = array.input;
18998 /** Built-in value references. */
18999 var Uint8Array$1 = root$2.Uint8Array;
19002 * Creates a clone of `arrayBuffer`.
19005 * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
19006 * @returns {ArrayBuffer} Returns the cloned array buffer.
19008 function cloneArrayBuffer(arrayBuffer) {
19009 var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
19010 new Uint8Array$1(result).set(new Uint8Array$1(arrayBuffer));
19015 * Creates a clone of `dataView`.
19018 * @param {Object} dataView The data view to clone.
19019 * @param {boolean} [isDeep] Specify a deep clone.
19020 * @returns {Object} Returns the cloned data view.
19022 function cloneDataView(dataView, isDeep) {
19023 var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
19024 return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
19027 /** Used to match `RegExp` flags from their coerced string values. */
19028 var reFlags = /\w*$/;
19031 * Creates a clone of `regexp`.
19034 * @param {Object} regexp The regexp to clone.
19035 * @returns {Object} Returns the cloned regexp.
19037 function cloneRegExp(regexp) {
19038 var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
19039 result.lastIndex = regexp.lastIndex;
19043 /** Used to convert symbols to primitives and strings. */
19044 var symbolProto = Symbol ? Symbol.prototype : undefined,
19045 symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19048 * Creates a clone of the `symbol` object.
19051 * @param {Object} symbol The symbol object to clone.
19052 * @returns {Object} Returns the cloned symbol object.
19054 function cloneSymbol(symbol) {
19055 return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
19059 * Creates a clone of `typedArray`.
19062 * @param {Object} typedArray The typed array to clone.
19063 * @param {boolean} [isDeep] Specify a deep clone.
19064 * @returns {Object} Returns the cloned typed array.
19066 function cloneTypedArray(typedArray, isDeep) {
19067 var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
19068 return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
19071 /** `Object#toString` result references. */
19072 var boolTag$1 = '[object Boolean]',
19073 dateTag$1 = '[object Date]',
19074 mapTag$2 = '[object Map]',
19075 numberTag$1 = '[object Number]',
19076 regexpTag$1 = '[object RegExp]',
19077 setTag$2 = '[object Set]',
19078 stringTag$1 = '[object String]',
19079 symbolTag = '[object Symbol]';
19081 var arrayBufferTag$1 = '[object ArrayBuffer]',
19082 dataViewTag$2 = '[object DataView]',
19083 float32Tag$1 = '[object Float32Array]',
19084 float64Tag$1 = '[object Float64Array]',
19085 int8Tag$1 = '[object Int8Array]',
19086 int16Tag$1 = '[object Int16Array]',
19087 int32Tag$1 = '[object Int32Array]',
19088 uint8Tag$1 = '[object Uint8Array]',
19089 uint8ClampedTag$1 = '[object Uint8ClampedArray]',
19090 uint16Tag$1 = '[object Uint16Array]',
19091 uint32Tag$1 = '[object Uint32Array]';
19094 * Initializes an object clone based on its `toStringTag`.
19096 * **Note:** This function only supports cloning values with tags of
19097 * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
19100 * @param {Object} object The object to clone.
19101 * @param {string} tag The `toStringTag` of the object to clone.
19102 * @param {boolean} [isDeep] Specify a deep clone.
19103 * @returns {Object} Returns the initialized clone.
19105 function initCloneByTag(object, tag, isDeep) {
19106 var Ctor = object.constructor;
19108 case arrayBufferTag$1:
19109 return cloneArrayBuffer(object);
19113 return new Ctor(+object);
19115 case dataViewTag$2:
19116 return cloneDataView(object, isDeep);
19118 case float32Tag$1: case float64Tag$1:
19119 case int8Tag$1: case int16Tag$1: case int32Tag$1:
19120 case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
19121 return cloneTypedArray(object, isDeep);
19128 return new Ctor(object);
19131 return cloneRegExp(object);
19137 return cloneSymbol(object);
19141 /** Built-in value references. */
19142 var objectCreate = Object.create;
19145 * The base implementation of `_.create` without support for assigning
19146 * properties to the created object.
19149 * @param {Object} proto The object to inherit from.
19150 * @returns {Object} Returns the new object.
19152 var baseCreate = (function() {
19153 function object() {}
19154 return function(proto) {
19155 if (!isObject(proto)) {
19158 if (objectCreate) {
19159 return objectCreate(proto);
19161 object.prototype = proto;
19162 var result = new object;
19163 object.prototype = undefined;
19169 * Initializes an object clone.
19172 * @param {Object} object The object to clone.
19173 * @returns {Object} Returns the initialized clone.
19175 function initCloneObject(object) {
19176 return (typeof object.constructor == 'function' && !isPrototype(object))
19177 ? baseCreate(getPrototype(object))
19181 /** `Object#toString` result references. */
19182 var mapTag$3 = '[object Map]';
19185 * The base implementation of `_.isMap` without Node.js optimizations.
19188 * @param {*} value The value to check.
19189 * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19191 function baseIsMap(value) {
19192 return isObjectLike(value) && getTag$1(value) == mapTag$3;
19195 /* Node.js helper references. */
19196 var nodeIsMap = nodeUtil && nodeUtil.isMap;
19199 * Checks if `value` is classified as a `Map` object.
19205 * @param {*} value The value to check.
19206 * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19209 * _.isMap(new Map);
19212 * _.isMap(new WeakMap);
19215 var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
19217 /** `Object#toString` result references. */
19218 var setTag$3 = '[object Set]';
19221 * The base implementation of `_.isSet` without Node.js optimizations.
19224 * @param {*} value The value to check.
19225 * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19227 function baseIsSet(value) {
19228 return isObjectLike(value) && getTag$1(value) == setTag$3;
19231 /* Node.js helper references. */
19232 var nodeIsSet = nodeUtil && nodeUtil.isSet;
19235 * Checks if `value` is classified as a `Set` object.
19241 * @param {*} value The value to check.
19242 * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19245 * _.isSet(new Set);
19248 * _.isSet(new WeakSet);
19251 var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
19253 /** Used to compose bitmasks for cloning. */
19254 var CLONE_DEEP_FLAG = 1,
19255 CLONE_FLAT_FLAG = 2,
19256 CLONE_SYMBOLS_FLAG = 4;
19258 /** `Object#toString` result references. */
19259 var argsTag$2 = '[object Arguments]',
19260 arrayTag$1 = '[object Array]',
19261 boolTag$2 = '[object Boolean]',
19262 dateTag$2 = '[object Date]',
19263 errorTag$1 = '[object Error]',
19264 funcTag$2 = '[object Function]',
19265 genTag$1 = '[object GeneratorFunction]',
19266 mapTag$4 = '[object Map]',
19267 numberTag$2 = '[object Number]',
19268 objectTag$2 = '[object Object]',
19269 regexpTag$2 = '[object RegExp]',
19270 setTag$4 = '[object Set]',
19271 stringTag$2 = '[object String]',
19272 symbolTag$1 = '[object Symbol]',
19273 weakMapTag$2 = '[object WeakMap]';
19275 var arrayBufferTag$2 = '[object ArrayBuffer]',
19276 dataViewTag$3 = '[object DataView]',
19277 float32Tag$2 = '[object Float32Array]',
19278 float64Tag$2 = '[object Float64Array]',
19279 int8Tag$2 = '[object Int8Array]',
19280 int16Tag$2 = '[object Int16Array]',
19281 int32Tag$2 = '[object Int32Array]',
19282 uint8Tag$2 = '[object Uint8Array]',
19283 uint8ClampedTag$2 = '[object Uint8ClampedArray]',
19284 uint16Tag$2 = '[object Uint16Array]',
19285 uint32Tag$2 = '[object Uint32Array]';
19287 /** Used to identify `toStringTag` values supported by `_.clone`. */
19288 var cloneableTags = {};
19289 cloneableTags[argsTag$2] = cloneableTags[arrayTag$1] =
19290 cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
19291 cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
19292 cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] =
19293 cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] =
19294 cloneableTags[int32Tag$2] = cloneableTags[mapTag$4] =
19295 cloneableTags[numberTag$2] = cloneableTags[objectTag$2] =
19296 cloneableTags[regexpTag$2] = cloneableTags[setTag$4] =
19297 cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] =
19298 cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] =
19299 cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true;
19300 cloneableTags[errorTag$1] = cloneableTags[funcTag$2] =
19301 cloneableTags[weakMapTag$2] = false;
19304 * The base implementation of `_.clone` and `_.cloneDeep` which tracks
19305 * traversed objects.
19308 * @param {*} value The value to clone.
19309 * @param {boolean} bitmask The bitmask flags.
19311 * 2 - Flatten inherited properties
19312 * 4 - Clone symbols
19313 * @param {Function} [customizer] The function to customize cloning.
19314 * @param {string} [key] The key of `value`.
19315 * @param {Object} [object] The parent object of `value`.
19316 * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
19317 * @returns {*} Returns the cloned value.
19319 function baseClone(value, bitmask, customizer, key, object, stack) {
19321 isDeep = bitmask & CLONE_DEEP_FLAG,
19322 isFlat = bitmask & CLONE_FLAT_FLAG,
19323 isFull = bitmask & CLONE_SYMBOLS_FLAG;
19326 result = object ? customizer(value, key, object, stack) : customizer(value);
19328 if (result !== undefined) {
19331 if (!isObject(value)) {
19334 var isArr = isArray(value);
19336 result = initCloneArray(value);
19338 return copyArray(value, result);
19341 var tag = getTag$1(value),
19342 isFunc = tag == funcTag$2 || tag == genTag$1;
19344 if (isBuffer(value)) {
19345 return cloneBuffer(value, isDeep);
19347 if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) {
19348 result = (isFlat || isFunc) ? {} : initCloneObject(value);
19351 ? copySymbolsIn(value, baseAssignIn(result, value))
19352 : copySymbols(value, baseAssign(result, value));
19355 if (!cloneableTags[tag]) {
19356 return object ? value : {};
19358 result = initCloneByTag(value, tag, isDeep);
19361 // Check for circular references and return its corresponding clone.
19362 stack || (stack = new Stack);
19363 var stacked = stack.get(value);
19367 stack.set(value, result);
19369 if (isSet(value)) {
19370 value.forEach(function(subValue) {
19371 result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
19377 if (isMap(value)) {
19378 value.forEach(function(subValue, key) {
19379 result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
19385 var keysFunc = isFull
19386 ? (isFlat ? getAllKeysIn : getAllKeys)
19387 : (isFlat ? keysIn : keys$1);
19389 var props = isArr ? undefined : keysFunc(value);
19390 arrayEach(props || value, function(subValue, key) {
19393 subValue = value[key];
19395 // Recursively populate clone (susceptible to call stack limits).
19396 assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
19401 /** Used to compose bitmasks for cloning. */
19402 var CLONE_SYMBOLS_FLAG$1 = 4;
19405 * Creates a shallow clone of `value`.
19407 * **Note:** This method is loosely based on the
19408 * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
19409 * and supports cloning arrays, array buffers, booleans, date objects, maps,
19410 * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
19411 * arrays. The own enumerable properties of `arguments` objects are cloned
19412 * as plain objects. An empty object is returned for uncloneable values such
19413 * as error objects, functions, DOM nodes, and WeakMaps.
19419 * @param {*} value The value to clone.
19420 * @returns {*} Returns the cloned value.
19424 * var objects = [{ 'a': 1 }, { 'b': 2 }];
19426 * var shallow = _.clone(objects);
19427 * console.log(shallow[0] === objects[0]);
19430 function clone(value) {
19431 return baseClone(value, CLONE_SYMBOLS_FLAG$1);
19435 * A specialized version of `baseAggregator` for arrays.
19438 * @param {Array} [array] The array to iterate over.
19439 * @param {Function} setter The function to set `accumulator` values.
19440 * @param {Function} iteratee The iteratee to transform keys.
19441 * @param {Object} accumulator The initial aggregated object.
19442 * @returns {Function} Returns `accumulator`.
19444 function arrayAggregator(array, setter, iteratee, accumulator) {
19446 length = array == null ? 0 : array.length;
19448 while (++index < length) {
19449 var value = array[index];
19450 setter(accumulator, value, iteratee(value), array);
19452 return accumulator;
19456 * Creates a base function for methods like `_.forIn` and `_.forOwn`.
19459 * @param {boolean} [fromRight] Specify iterating from right to left.
19460 * @returns {Function} Returns the new base function.
19462 function createBaseFor(fromRight) {
19463 return function(object, iteratee, keysFunc) {
19465 iterable = Object(object),
19466 props = keysFunc(object),
19467 length = props.length;
19470 var key = props[fromRight ? length : ++index];
19471 if (iteratee(iterable[key], key, iterable) === false) {
19480 * The base implementation of `baseForOwn` which iterates over `object`
19481 * properties returned by `keysFunc` and invokes `iteratee` for each property.
19482 * Iteratee functions may exit iteration early by explicitly returning `false`.
19485 * @param {Object} object The object to iterate over.
19486 * @param {Function} iteratee The function invoked per iteration.
19487 * @param {Function} keysFunc The function to get the keys of `object`.
19488 * @returns {Object} Returns `object`.
19490 var baseFor = createBaseFor();
19493 * The base implementation of `_.forOwn` without support for iteratee shorthands.
19496 * @param {Object} object The object to iterate over.
19497 * @param {Function} iteratee The function invoked per iteration.
19498 * @returns {Object} Returns `object`.
19500 function baseForOwn(object, iteratee) {
19501 return object && baseFor(object, iteratee, keys$1);
19505 * Creates a `baseEach` or `baseEachRight` function.
19508 * @param {Function} eachFunc The function to iterate over a collection.
19509 * @param {boolean} [fromRight] Specify iterating from right to left.
19510 * @returns {Function} Returns the new base function.
19512 function createBaseEach(eachFunc, fromRight) {
19513 return function(collection, iteratee) {
19514 if (collection == null) {
19517 if (!isArrayLike(collection)) {
19518 return eachFunc(collection, iteratee);
19520 var length = collection.length,
19521 index = fromRight ? length : -1,
19522 iterable = Object(collection);
19524 while ((fromRight ? index-- : ++index < length)) {
19525 if (iteratee(iterable[index], index, iterable) === false) {
19534 * The base implementation of `_.forEach` without support for iteratee shorthands.
19537 * @param {Array|Object} collection The collection to iterate over.
19538 * @param {Function} iteratee The function invoked per iteration.
19539 * @returns {Array|Object} Returns `collection`.
19541 var baseEach = createBaseEach(baseForOwn);
19544 * Aggregates elements of `collection` on `accumulator` with keys transformed
19545 * by `iteratee` and values set by `setter`.
19548 * @param {Array|Object} collection The collection to iterate over.
19549 * @param {Function} setter The function to set `accumulator` values.
19550 * @param {Function} iteratee The iteratee to transform keys.
19551 * @param {Object} accumulator The initial aggregated object.
19552 * @returns {Function} Returns `accumulator`.
19554 function baseAggregator(collection, setter, iteratee, accumulator) {
19555 baseEach(collection, function(value, key, collection) {
19556 setter(accumulator, value, iteratee(value), collection);
19558 return accumulator;
19561 /** Used to stand-in for `undefined` hash values. */
19562 var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
19565 * Adds `value` to the array cache.
19569 * @memberOf SetCache
19571 * @param {*} value The value to cache.
19572 * @returns {Object} Returns the cache instance.
19574 function setCacheAdd(value) {
19575 this.__data__.set(value, HASH_UNDEFINED$2);
19580 * Checks if `value` is in the array cache.
19584 * @memberOf SetCache
19585 * @param {*} value The value to search for.
19586 * @returns {number} Returns `true` if `value` is found, else `false`.
19588 function setCacheHas(value) {
19589 return this.__data__.has(value);
19594 * Creates an array cache object to store unique values.
19598 * @param {Array} [values] The values to cache.
19600 function SetCache(values) {
19602 length = values == null ? 0 : values.length;
19604 this.__data__ = new MapCache;
19605 while (++index < length) {
19606 this.add(values[index]);
19610 // Add methods to `SetCache`.
19611 SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
19612 SetCache.prototype.has = setCacheHas;
19615 * A specialized version of `_.some` for arrays without support for iteratee
19619 * @param {Array} [array] The array to iterate over.
19620 * @param {Function} predicate The function invoked per iteration.
19621 * @returns {boolean} Returns `true` if any element passes the predicate check,
19624 function arraySome(array, predicate) {
19626 length = array == null ? 0 : array.length;
19628 while (++index < length) {
19629 if (predicate(array[index], index, array)) {
19637 * Checks if a `cache` value for `key` exists.
19640 * @param {Object} cache The cache to query.
19641 * @param {string} key The key of the entry to check.
19642 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19644 function cacheHas(cache, key) {
19645 return cache.has(key);
19648 /** Used to compose bitmasks for value comparisons. */
19649 var COMPARE_PARTIAL_FLAG = 1,
19650 COMPARE_UNORDERED_FLAG = 2;
19653 * A specialized version of `baseIsEqualDeep` for arrays with support for
19654 * partial deep comparisons.
19657 * @param {Array} array The array to compare.
19658 * @param {Array} other The other array to compare.
19659 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19660 * @param {Function} customizer The function to customize comparisons.
19661 * @param {Function} equalFunc The function to determine equivalents of values.
19662 * @param {Object} stack Tracks traversed `array` and `other` objects.
19663 * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19665 function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19666 var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
19667 arrLength = array.length,
19668 othLength = other.length;
19670 if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19673 // Assume cyclic values are equal.
19674 var stacked = stack.get(array);
19675 if (stacked && stack.get(other)) {
19676 return stacked == other;
19680 seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
19682 stack.set(array, other);
19683 stack.set(other, array);
19685 // Ignore non-index properties.
19686 while (++index < arrLength) {
19687 var arrValue = array[index],
19688 othValue = other[index];
19691 var compared = isPartial
19692 ? customizer(othValue, arrValue, index, other, array, stack)
19693 : customizer(arrValue, othValue, index, array, other, stack);
19695 if (compared !== undefined) {
19702 // Recursively compare arrays (susceptible to call stack limits).
19704 if (!arraySome(other, function(othValue, othIndex) {
19705 if (!cacheHas(seen, othIndex) &&
19706 (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19707 return seen.push(othIndex);
19714 arrValue === othValue ||
19715 equalFunc(arrValue, othValue, bitmask, customizer, stack)
19721 stack['delete'](array);
19722 stack['delete'](other);
19727 * Converts `map` to its key-value pairs.
19730 * @param {Object} map The map to convert.
19731 * @returns {Array} Returns the key-value pairs.
19733 function mapToArray(map) {
19735 result = Array(map.size);
19737 map.forEach(function(value, key) {
19738 result[++index] = [key, value];
19744 * Converts `set` to an array of its values.
19747 * @param {Object} set The set to convert.
19748 * @returns {Array} Returns the values.
19750 function setToArray(set) {
19752 result = Array(set.size);
19754 set.forEach(function(value) {
19755 result[++index] = value;
19760 /** Used to compose bitmasks for value comparisons. */
19761 var COMPARE_PARTIAL_FLAG$1 = 1,
19762 COMPARE_UNORDERED_FLAG$1 = 2;
19764 /** `Object#toString` result references. */
19765 var boolTag$3 = '[object Boolean]',
19766 dateTag$3 = '[object Date]',
19767 errorTag$2 = '[object Error]',
19768 mapTag$5 = '[object Map]',
19769 numberTag$3 = '[object Number]',
19770 regexpTag$3 = '[object RegExp]',
19771 setTag$5 = '[object Set]',
19772 stringTag$3 = '[object String]',
19773 symbolTag$2 = '[object Symbol]';
19775 var arrayBufferTag$3 = '[object ArrayBuffer]',
19776 dataViewTag$4 = '[object DataView]';
19778 /** Used to convert symbols to primitives and strings. */
19779 var symbolProto$1 = Symbol ? Symbol.prototype : undefined,
19780 symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined;
19783 * A specialized version of `baseIsEqualDeep` for comparing objects of
19784 * the same `toStringTag`.
19786 * **Note:** This function only supports comparing values with tags of
19787 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19790 * @param {Object} object The object to compare.
19791 * @param {Object} other The other object to compare.
19792 * @param {string} tag The `toStringTag` of the objects to compare.
19793 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19794 * @param {Function} customizer The function to customize comparisons.
19795 * @param {Function} equalFunc The function to determine equivalents of values.
19796 * @param {Object} stack Tracks traversed `object` and `other` objects.
19797 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19799 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19801 case dataViewTag$4:
19802 if ((object.byteLength != other.byteLength) ||
19803 (object.byteOffset != other.byteOffset)) {
19806 object = object.buffer;
19807 other = other.buffer;
19809 case arrayBufferTag$3:
19810 if ((object.byteLength != other.byteLength) ||
19811 !equalFunc(new Uint8Array$1(object), new Uint8Array$1(other))) {
19819 // Coerce booleans to `1` or `0` and dates to milliseconds.
19820 // Invalid dates are coerced to `NaN`.
19821 return eq(+object, +other);
19824 return object.name == other.name && object.message == other.message;
19828 // Coerce regexes to strings and treat strings, primitives and objects,
19829 // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19830 // for more details.
19831 return object == (other + '');
19834 var convert = mapToArray;
19837 var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
19838 convert || (convert = setToArray);
19840 if (object.size != other.size && !isPartial) {
19843 // Assume cyclic values are equal.
19844 var stacked = stack.get(object);
19846 return stacked == other;
19848 bitmask |= COMPARE_UNORDERED_FLAG$1;
19850 // Recursively compare objects (susceptible to call stack limits).
19851 stack.set(object, other);
19852 var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19853 stack['delete'](object);
19857 if (symbolValueOf$1) {
19858 return symbolValueOf$1.call(object) == symbolValueOf$1.call(other);
19864 /** Used to compose bitmasks for value comparisons. */
19865 var COMPARE_PARTIAL_FLAG$2 = 1;
19867 /** Used for built-in method references. */
19868 var objectProto$d = Object.prototype;
19870 /** Used to check objects for own properties. */
19871 var hasOwnProperty$a = objectProto$d.hasOwnProperty;
19874 * A specialized version of `baseIsEqualDeep` for objects with support for
19875 * partial deep comparisons.
19878 * @param {Object} object The object to compare.
19879 * @param {Object} other The other object to compare.
19880 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19881 * @param {Function} customizer The function to customize comparisons.
19882 * @param {Function} equalFunc The function to determine equivalents of values.
19883 * @param {Object} stack Tracks traversed `object` and `other` objects.
19884 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19886 function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19887 var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19888 objProps = getAllKeys(object),
19889 objLength = objProps.length,
19890 othProps = getAllKeys(other),
19891 othLength = othProps.length;
19893 if (objLength != othLength && !isPartial) {
19896 var index = objLength;
19898 var key = objProps[index];
19899 if (!(isPartial ? key in other : hasOwnProperty$a.call(other, key))) {
19903 // Assume cyclic values are equal.
19904 var stacked = stack.get(object);
19905 if (stacked && stack.get(other)) {
19906 return stacked == other;
19909 stack.set(object, other);
19910 stack.set(other, object);
19912 var skipCtor = isPartial;
19913 while (++index < objLength) {
19914 key = objProps[index];
19915 var objValue = object[key],
19916 othValue = other[key];
19919 var compared = isPartial
19920 ? customizer(othValue, objValue, key, other, object, stack)
19921 : customizer(objValue, othValue, key, object, other, stack);
19923 // Recursively compare objects (susceptible to call stack limits).
19924 if (!(compared === undefined
19925 ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19931 skipCtor || (skipCtor = key == 'constructor');
19933 if (result && !skipCtor) {
19934 var objCtor = object.constructor,
19935 othCtor = other.constructor;
19937 // Non `Object` object instances with different constructors are not equal.
19938 if (objCtor != othCtor &&
19939 ('constructor' in object && 'constructor' in other) &&
19940 !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19941 typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19945 stack['delete'](object);
19946 stack['delete'](other);
19950 /** Used to compose bitmasks for value comparisons. */
19951 var COMPARE_PARTIAL_FLAG$3 = 1;
19953 /** `Object#toString` result references. */
19954 var argsTag$3 = '[object Arguments]',
19955 arrayTag$2 = '[object Array]',
19956 objectTag$3 = '[object Object]';
19958 /** Used for built-in method references. */
19959 var objectProto$e = Object.prototype;
19961 /** Used to check objects for own properties. */
19962 var hasOwnProperty$b = objectProto$e.hasOwnProperty;
19965 * A specialized version of `baseIsEqual` for arrays and objects which performs
19966 * deep comparisons and tracks traversed objects enabling objects with circular
19967 * references to be compared.
19970 * @param {Object} object The object to compare.
19971 * @param {Object} other The other object to compare.
19972 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19973 * @param {Function} customizer The function to customize comparisons.
19974 * @param {Function} equalFunc The function to determine equivalents of values.
19975 * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19976 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19978 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19979 var objIsArr = isArray(object),
19980 othIsArr = isArray(other),
19981 objTag = objIsArr ? arrayTag$2 : getTag$1(object),
19982 othTag = othIsArr ? arrayTag$2 : getTag$1(other);
19984 objTag = objTag == argsTag$3 ? objectTag$3 : objTag;
19985 othTag = othTag == argsTag$3 ? objectTag$3 : othTag;
19987 var objIsObj = objTag == objectTag$3,
19988 othIsObj = othTag == objectTag$3,
19989 isSameTag = objTag == othTag;
19991 if (isSameTag && isBuffer(object)) {
19992 if (!isBuffer(other)) {
19998 if (isSameTag && !objIsObj) {
19999 stack || (stack = new Stack);
20000 return (objIsArr || isTypedArray(object))
20001 ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
20002 : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
20004 if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
20005 var objIsWrapped = objIsObj && hasOwnProperty$b.call(object, '__wrapped__'),
20006 othIsWrapped = othIsObj && hasOwnProperty$b.call(other, '__wrapped__');
20008 if (objIsWrapped || othIsWrapped) {
20009 var objUnwrapped = objIsWrapped ? object.value() : object,
20010 othUnwrapped = othIsWrapped ? other.value() : other;
20012 stack || (stack = new Stack);
20013 return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
20019 stack || (stack = new Stack);
20020 return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
20024 * The base implementation of `_.isEqual` which supports partial comparisons
20025 * and tracks traversed objects.
20028 * @param {*} value The value to compare.
20029 * @param {*} other The other value to compare.
20030 * @param {boolean} bitmask The bitmask flags.
20031 * 1 - Unordered comparison
20032 * 2 - Partial comparison
20033 * @param {Function} [customizer] The function to customize comparisons.
20034 * @param {Object} [stack] Tracks traversed `value` and `other` objects.
20035 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
20037 function baseIsEqual(value, other, bitmask, customizer, stack) {
20038 if (value === other) {
20041 if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
20042 return value !== value && other !== other;
20044 return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
20047 /** Used to compose bitmasks for value comparisons. */
20048 var COMPARE_PARTIAL_FLAG$4 = 1,
20049 COMPARE_UNORDERED_FLAG$2 = 2;
20052 * The base implementation of `_.isMatch` without support for iteratee shorthands.
20055 * @param {Object} object The object to inspect.
20056 * @param {Object} source The object of property values to match.
20057 * @param {Array} matchData The property names, values, and compare flags to match.
20058 * @param {Function} [customizer] The function to customize comparisons.
20059 * @returns {boolean} Returns `true` if `object` is a match, else `false`.
20061 function baseIsMatch(object, source, matchData, customizer) {
20062 var index = matchData.length,
20064 noCustomizer = !customizer;
20066 if (object == null) {
20069 object = Object(object);
20071 var data = matchData[index];
20072 if ((noCustomizer && data[2])
20073 ? data[1] !== object[data[0]]
20074 : !(data[0] in object)
20079 while (++index < length) {
20080 data = matchData[index];
20082 objValue = object[key],
20083 srcValue = data[1];
20085 if (noCustomizer && data[2]) {
20086 if (objValue === undefined && !(key in object)) {
20090 var stack = new Stack;
20092 var result = customizer(objValue, srcValue, key, object, source, stack);
20094 if (!(result === undefined
20095 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
20106 * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
20109 * @param {*} value The value to check.
20110 * @returns {boolean} Returns `true` if `value` if suitable for strict
20111 * equality comparisons, else `false`.
20113 function isStrictComparable(value) {
20114 return value === value && !isObject(value);
20118 * Gets the property names, values, and compare flags of `object`.
20121 * @param {Object} object The object to query.
20122 * @returns {Array} Returns the match data of `object`.
20124 function getMatchData(object) {
20125 var result = keys$1(object),
20126 length = result.length;
20129 var key = result[length],
20130 value = object[key];
20132 result[length] = [key, value, isStrictComparable(value)];
20138 * A specialized version of `matchesProperty` for source values suitable
20139 * for strict equality comparisons, i.e. `===`.
20142 * @param {string} key The key of the property to get.
20143 * @param {*} srcValue The value to match.
20144 * @returns {Function} Returns the new spec function.
20146 function matchesStrictComparable(key, srcValue) {
20147 return function(object) {
20148 if (object == null) {
20151 return object[key] === srcValue &&
20152 (srcValue !== undefined || (key in Object(object)));
20157 * The base implementation of `_.matches` which doesn't clone `source`.
20160 * @param {Object} source The object of property values to match.
20161 * @returns {Function} Returns the new spec function.
20163 function baseMatches(source) {
20164 var matchData = getMatchData(source);
20165 if (matchData.length == 1 && matchData[0][2]) {
20166 return matchesStrictComparable(matchData[0][0], matchData[0][1]);
20168 return function(object) {
20169 return object === source || baseIsMatch(object, source, matchData);
20173 /** `Object#toString` result references. */
20174 var symbolTag$3 = '[object Symbol]';
20177 * Checks if `value` is classified as a `Symbol` primitive or object.
20183 * @param {*} value The value to check.
20184 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
20187 * _.isSymbol(Symbol.iterator);
20190 * _.isSymbol('abc');
20193 function isSymbol(value) {
20194 return typeof value == 'symbol' ||
20195 (isObjectLike(value) && baseGetTag(value) == symbolTag$3);
20198 /** Used to match property names within property paths. */
20199 var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
20200 reIsPlainProp = /^\w*$/;
20203 * Checks if `value` is a property name and not a property path.
20206 * @param {*} value The value to check.
20207 * @param {Object} [object] The object to query keys on.
20208 * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
20210 function isKey(value, object) {
20211 if (isArray(value)) {
20214 var type = typeof value;
20215 if (type == 'number' || type == 'symbol' || type == 'boolean' ||
20216 value == null || isSymbol(value)) {
20219 return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
20220 (object != null && value in Object(object));
20223 /** Error message constants. */
20224 var FUNC_ERROR_TEXT = 'Expected a function';
20227 * Creates a function that memoizes the result of `func`. If `resolver` is
20228 * provided, it determines the cache key for storing the result based on the
20229 * arguments provided to the memoized function. By default, the first argument
20230 * provided to the memoized function is used as the map cache key. The `func`
20231 * is invoked with the `this` binding of the memoized function.
20233 * **Note:** The cache is exposed as the `cache` property on the memoized
20234 * function. Its creation may be customized by replacing the `_.memoize.Cache`
20235 * constructor with one whose instances implement the
20236 * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
20237 * method interface of `clear`, `delete`, `get`, `has`, and `set`.
20242 * @category Function
20243 * @param {Function} func The function to have its output memoized.
20244 * @param {Function} [resolver] The function to resolve the cache key.
20245 * @returns {Function} Returns the new memoized function.
20248 * var object = { 'a': 1, 'b': 2 };
20249 * var other = { 'c': 3, 'd': 4 };
20251 * var values = _.memoize(_.values);
20262 * // Modify the result cache.
20263 * values.cache.set(object, ['a', 'b']);
20267 * // Replace `_.memoize.Cache`.
20268 * _.memoize.Cache = WeakMap;
20270 function memoize(func, resolver) {
20271 if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
20272 throw new TypeError(FUNC_ERROR_TEXT);
20274 var memoized = function() {
20275 var args = arguments,
20276 key = resolver ? resolver.apply(this, args) : args[0],
20277 cache = memoized.cache;
20279 if (cache.has(key)) {
20280 return cache.get(key);
20282 var result = func.apply(this, args);
20283 memoized.cache = cache.set(key, result) || cache;
20286 memoized.cache = new (memoize.Cache || MapCache);
20290 // Expose `MapCache`.
20291 memoize.Cache = MapCache;
20293 /** Used as the maximum memoize cache size. */
20294 var MAX_MEMOIZE_SIZE = 500;
20297 * A specialized version of `_.memoize` which clears the memoized function's
20298 * cache when it exceeds `MAX_MEMOIZE_SIZE`.
20301 * @param {Function} func The function to have its output memoized.
20302 * @returns {Function} Returns the new memoized function.
20304 function memoizeCapped(func) {
20305 var result = memoize(func, function(key) {
20306 if (cache.size === MAX_MEMOIZE_SIZE) {
20312 var cache = result.cache;
20316 /** Used to match property names within property paths. */
20317 var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
20319 /** Used to match backslashes in property paths. */
20320 var reEscapeChar = /\\(\\)?/g;
20323 * Converts `string` to a property path array.
20326 * @param {string} string The string to convert.
20327 * @returns {Array} Returns the property path array.
20329 var stringToPath = memoizeCapped(function(string) {
20331 if (string.charCodeAt(0) === 46 /* . */) {
20334 string.replace(rePropName, function(match, number, quote, subString) {
20335 result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
20341 * A specialized version of `_.map` for arrays without support for iteratee
20345 * @param {Array} [array] The array to iterate over.
20346 * @param {Function} iteratee The function invoked per iteration.
20347 * @returns {Array} Returns the new mapped array.
20349 function arrayMap(array, iteratee) {
20351 length = array == null ? 0 : array.length,
20352 result = Array(length);
20354 while (++index < length) {
20355 result[index] = iteratee(array[index], index, array);
20360 /** Used as references for various `Number` constants. */
20361 var INFINITY = 1 / 0;
20363 /** Used to convert symbols to primitives and strings. */
20364 var symbolProto$2 = Symbol ? Symbol.prototype : undefined,
20365 symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined;
20368 * The base implementation of `_.toString` which doesn't convert nullish
20369 * values to empty strings.
20372 * @param {*} value The value to process.
20373 * @returns {string} Returns the string.
20375 function baseToString(value) {
20376 // Exit early for strings to avoid a performance hit in some environments.
20377 if (typeof value == 'string') {
20380 if (isArray(value)) {
20381 // Recursively convert values (susceptible to call stack limits).
20382 return arrayMap(value, baseToString) + '';
20384 if (isSymbol(value)) {
20385 return symbolToString ? symbolToString.call(value) : '';
20387 var result = (value + '');
20388 return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
20392 * Converts `value` to a string. An empty string is returned for `null`
20393 * and `undefined` values. The sign of `-0` is preserved.
20399 * @param {*} value The value to convert.
20400 * @returns {string} Returns the converted string.
20403 * _.toString(null);
20409 * _.toString([1, 2, 3]);
20412 function toString(value) {
20413 return value == null ? '' : baseToString(value);
20417 * Casts `value` to a path array if it's not one.
20420 * @param {*} value The value to inspect.
20421 * @param {Object} [object] The object to query keys on.
20422 * @returns {Array} Returns the cast property path array.
20424 function castPath(value, object) {
20425 if (isArray(value)) {
20428 return isKey(value, object) ? [value] : stringToPath(toString(value));
20431 /** Used as references for various `Number` constants. */
20432 var INFINITY$1 = 1 / 0;
20435 * Converts `value` to a string key if it's not a string or symbol.
20438 * @param {*} value The value to inspect.
20439 * @returns {string|symbol} Returns the key.
20441 function toKey(value) {
20442 if (typeof value == 'string' || isSymbol(value)) {
20445 var result = (value + '');
20446 return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
20450 * The base implementation of `_.get` without support for default values.
20453 * @param {Object} object The object to query.
20454 * @param {Array|string} path The path of the property to get.
20455 * @returns {*} Returns the resolved value.
20457 function baseGet(object, path) {
20458 path = castPath(path, object);
20461 length = path.length;
20463 while (object != null && index < length) {
20464 object = object[toKey(path[index++])];
20466 return (index && index == length) ? object : undefined;
20470 * Gets the value at `path` of `object`. If the resolved value is
20471 * `undefined`, the `defaultValue` is returned in its place.
20477 * @param {Object} object The object to query.
20478 * @param {Array|string} path The path of the property to get.
20479 * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20480 * @returns {*} Returns the resolved value.
20483 * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20485 * _.get(object, 'a[0].b.c');
20488 * _.get(object, ['a', '0', 'b', 'c']);
20491 * _.get(object, 'a.b.c', 'default');
20494 function get$2(object, path, defaultValue) {
20495 var result = object == null ? undefined : baseGet(object, path);
20496 return result === undefined ? defaultValue : result;
20500 * The base implementation of `_.hasIn` without support for deep paths.
20503 * @param {Object} [object] The object to query.
20504 * @param {Array|string} key The key to check.
20505 * @returns {boolean} Returns `true` if `key` exists, else `false`.
20507 function baseHasIn(object, key) {
20508 return object != null && key in Object(object);
20512 * Checks if `path` exists on `object`.
20515 * @param {Object} object The object to query.
20516 * @param {Array|string} path The path to check.
20517 * @param {Function} hasFunc The function to check properties.
20518 * @returns {boolean} Returns `true` if `path` exists, else `false`.
20520 function hasPath(object, path, hasFunc) {
20521 path = castPath(path, object);
20524 length = path.length,
20527 while (++index < length) {
20528 var key = toKey(path[index]);
20529 if (!(result = object != null && hasFunc(object, key))) {
20532 object = object[key];
20534 if (result || ++index != length) {
20537 length = object == null ? 0 : object.length;
20538 return !!length && isLength(length) && isIndex(key, length) &&
20539 (isArray(object) || isArguments(object));
20543 * Checks if `path` is a direct or inherited property of `object`.
20549 * @param {Object} object The object to query.
20550 * @param {Array|string} path The path to check.
20551 * @returns {boolean} Returns `true` if `path` exists, else `false`.
20554 * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20556 * _.hasIn(object, 'a');
20559 * _.hasIn(object, 'a.b');
20562 * _.hasIn(object, ['a', 'b']);
20565 * _.hasIn(object, 'b');
20568 function hasIn(object, path) {
20569 return object != null && hasPath(object, path, baseHasIn);
20572 /** Used to compose bitmasks for value comparisons. */
20573 var COMPARE_PARTIAL_FLAG$5 = 1,
20574 COMPARE_UNORDERED_FLAG$3 = 2;
20577 * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20580 * @param {string} path The path of the property to get.
20581 * @param {*} srcValue The value to match.
20582 * @returns {Function} Returns the new spec function.
20584 function baseMatchesProperty(path, srcValue) {
20585 if (isKey(path) && isStrictComparable(srcValue)) {
20586 return matchesStrictComparable(toKey(path), srcValue);
20588 return function(object) {
20589 var objValue = get$2(object, path);
20590 return (objValue === undefined && objValue === srcValue)
20591 ? hasIn(object, path)
20592 : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20597 * This method returns the first argument it receives.
20603 * @param {*} value Any value.
20604 * @returns {*} Returns `value`.
20607 * var object = { 'a': 1 };
20609 * console.log(_.identity(object) === object);
20612 function identity$8(value) {
20617 * The base implementation of `_.property` without support for deep paths.
20620 * @param {string} key The key of the property to get.
20621 * @returns {Function} Returns the new accessor function.
20623 function baseProperty(key) {
20624 return function(object) {
20625 return object == null ? undefined : object[key];
20630 * A specialized version of `baseProperty` which supports deep paths.
20633 * @param {Array|string} path The path of the property to get.
20634 * @returns {Function} Returns the new accessor function.
20636 function basePropertyDeep(path) {
20637 return function(object) {
20638 return baseGet(object, path);
20643 * Creates a function that returns the value at `path` of a given object.
20649 * @param {Array|string} path The path of the property to get.
20650 * @returns {Function} Returns the new accessor function.
20654 * { 'a': { 'b': 2 } },
20655 * { 'a': { 'b': 1 } }
20658 * _.map(objects, _.property('a.b'));
20661 * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20664 function property(path) {
20665 return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20669 * The base implementation of `_.iteratee`.
20672 * @param {*} [value=_.identity] The value to convert to an iteratee.
20673 * @returns {Function} Returns the iteratee.
20675 function baseIteratee(value) {
20676 // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20677 // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20678 if (typeof value == 'function') {
20681 if (value == null) {
20684 if (typeof value == 'object') {
20685 return isArray(value)
20686 ? baseMatchesProperty(value[0], value[1])
20687 : baseMatches(value);
20689 return property(value);
20693 * Creates a function like `_.groupBy`.
20696 * @param {Function} setter The function to set accumulator values.
20697 * @param {Function} [initializer] The accumulator object initializer.
20698 * @returns {Function} Returns the new aggregator function.
20700 function createAggregator(setter, initializer) {
20701 return function(collection, iteratee) {
20702 var func = isArray(collection) ? arrayAggregator : baseAggregator,
20703 accumulator = initializer ? initializer() : {};
20705 return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
20709 /** Used for built-in method references. */
20710 var objectProto$f = Object.prototype;
20712 /** Used to check objects for own properties. */
20713 var hasOwnProperty$c = objectProto$f.hasOwnProperty;
20716 * Creates an object composed of keys generated from the results of running
20717 * each element of `collection` thru `iteratee`. The order of grouped values
20718 * is determined by the order they occur in `collection`. The corresponding
20719 * value of each key is an array of elements responsible for generating the
20720 * key. The iteratee is invoked with one argument: (value).
20725 * @category Collection
20726 * @param {Array|Object} collection The collection to iterate over.
20727 * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
20728 * @returns {Object} Returns the composed aggregate object.
20731 * _.groupBy([6.1, 4.2, 6.3], Math.floor);
20732 * // => { '4': [4.2], '6': [6.1, 6.3] }
20734 * // The `_.property` iteratee shorthand.
20735 * _.groupBy(['one', 'two', 'three'], 'length');
20736 * // => { '3': ['one', 'two'], '5': ['three'] }
20738 var groupBy = createAggregator(function(result, value, key) {
20739 if (hasOwnProperty$c.call(result, key)) {
20740 result[key].push(value);
20742 baseAssignValue(result, key, [value]);
20747 * Gets the last element of `array`.
20753 * @param {Array} array The array to query.
20754 * @returns {*} Returns the last element of `array`.
20757 * _.last([1, 2, 3]);
20760 function last(array) {
20761 var length = array == null ? 0 : array.length;
20762 return length ? array[length - 1] : undefined;
20766 * The base implementation of `_.slice` without an iteratee call guard.
20769 * @param {Array} array The array to slice.
20770 * @param {number} [start=0] The start position.
20771 * @param {number} [end=array.length] The end position.
20772 * @returns {Array} Returns the slice of `array`.
20774 function baseSlice(array, start, end) {
20776 length = array.length;
20779 start = -start > length ? 0 : (length + start);
20781 end = end > length ? length : end;
20785 length = start > end ? 0 : ((end - start) >>> 0);
20788 var result = Array(length);
20789 while (++index < length) {
20790 result[index] = array[index + start];
20796 * Gets the parent value at `path` of `object`.
20799 * @param {Object} object The object to query.
20800 * @param {Array} path The path to get the parent value of.
20801 * @returns {*} Returns the parent value.
20803 function parent(object, path) {
20804 return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
20808 * The base implementation of `_.unset`.
20811 * @param {Object} object The object to modify.
20812 * @param {Array|string} path The property path to unset.
20813 * @returns {boolean} Returns `true` if the property is deleted, else `false`.
20815 function baseUnset(object, path) {
20816 path = castPath(path, object);
20817 object = parent(object, path);
20818 return object == null || delete object[toKey(last(path))];
20821 /** `Object#toString` result references. */
20822 var objectTag$4 = '[object Object]';
20824 /** Used for built-in method references. */
20825 var funcProto$2 = Function.prototype,
20826 objectProto$g = Object.prototype;
20828 /** Used to resolve the decompiled source of functions. */
20829 var funcToString$2 = funcProto$2.toString;
20831 /** Used to check objects for own properties. */
20832 var hasOwnProperty$d = objectProto$g.hasOwnProperty;
20834 /** Used to infer the `Object` constructor. */
20835 var objectCtorString = funcToString$2.call(Object);
20838 * Checks if `value` is a plain object, that is, an object created by the
20839 * `Object` constructor or one with a `[[Prototype]]` of `null`.
20845 * @param {*} value The value to check.
20846 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
20853 * _.isPlainObject(new Foo);
20856 * _.isPlainObject([1, 2, 3]);
20859 * _.isPlainObject({ 'x': 0, 'y': 0 });
20862 * _.isPlainObject(Object.create(null));
20865 function isPlainObject(value) {
20866 if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
20869 var proto = getPrototype(value);
20870 if (proto === null) {
20873 var Ctor = hasOwnProperty$d.call(proto, 'constructor') && proto.constructor;
20874 return typeof Ctor == 'function' && Ctor instanceof Ctor &&
20875 funcToString$2.call(Ctor) == objectCtorString;
20879 * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
20883 * @param {*} value The value to inspect.
20884 * @param {string} key The key of the property to inspect.
20885 * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
20887 function customOmitClone(value) {
20888 return isPlainObject(value) ? undefined : value;
20891 /** Built-in value references. */
20892 var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
20895 * Checks if `value` is a flattenable `arguments` object or array.
20898 * @param {*} value The value to check.
20899 * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
20901 function isFlattenable(value) {
20902 return isArray(value) || isArguments(value) ||
20903 !!(spreadableSymbol && value && value[spreadableSymbol]);
20907 * The base implementation of `_.flatten` with support for restricting flattening.
20910 * @param {Array} array The array to flatten.
20911 * @param {number} depth The maximum recursion depth.
20912 * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
20913 * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
20914 * @param {Array} [result=[]] The initial result value.
20915 * @returns {Array} Returns the new flattened array.
20917 function baseFlatten(array, depth, predicate, isStrict, result) {
20919 length = array.length;
20921 predicate || (predicate = isFlattenable);
20922 result || (result = []);
20924 while (++index < length) {
20925 var value = array[index];
20926 if (depth > 0 && predicate(value)) {
20928 // Recursively flatten arrays (susceptible to call stack limits).
20929 baseFlatten(value, depth - 1, predicate, isStrict, result);
20931 arrayPush(result, value);
20933 } else if (!isStrict) {
20934 result[result.length] = value;
20941 * Flattens `array` a single level deep.
20947 * @param {Array} array The array to flatten.
20948 * @returns {Array} Returns the new flattened array.
20951 * _.flatten([1, [2, [3, [4]], 5]]);
20952 * // => [1, 2, [3, [4]], 5]
20954 function flatten(array) {
20955 var length = array == null ? 0 : array.length;
20956 return length ? baseFlatten(array, 1) : [];
20960 * A faster alternative to `Function#apply`, this function invokes `func`
20961 * with the `this` binding of `thisArg` and the arguments of `args`.
20964 * @param {Function} func The function to invoke.
20965 * @param {*} thisArg The `this` binding of `func`.
20966 * @param {Array} args The arguments to invoke `func` with.
20967 * @returns {*} Returns the result of `func`.
20969 function apply(func, thisArg, args) {
20970 switch (args.length) {
20971 case 0: return func.call(thisArg);
20972 case 1: return func.call(thisArg, args[0]);
20973 case 2: return func.call(thisArg, args[0], args[1]);
20974 case 3: return func.call(thisArg, args[0], args[1], args[2]);
20976 return func.apply(thisArg, args);
20979 /* Built-in method references for those with the same name as other `lodash` methods. */
20980 var nativeMax = Math.max;
20983 * A specialized version of `baseRest` which transforms the rest array.
20986 * @param {Function} func The function to apply a rest parameter to.
20987 * @param {number} [start=func.length-1] The start position of the rest parameter.
20988 * @param {Function} transform The rest array transform.
20989 * @returns {Function} Returns the new function.
20991 function overRest(func, start, transform) {
20992 start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
20993 return function() {
20994 var args = arguments,
20996 length = nativeMax(args.length - start, 0),
20997 array = Array(length);
20999 while (++index < length) {
21000 array[index] = args[start + index];
21003 var otherArgs = Array(start + 1);
21004 while (++index < start) {
21005 otherArgs[index] = args[index];
21007 otherArgs[start] = transform(array);
21008 return apply(func, this, otherArgs);
21013 * Creates a function that returns `value`.
21019 * @param {*} value The value to return from the new function.
21020 * @returns {Function} Returns the new constant function.
21023 * var objects = _.times(2, _.constant({ 'a': 1 }));
21025 * console.log(objects);
21026 * // => [{ 'a': 1 }, { 'a': 1 }]
21028 * console.log(objects[0] === objects[1]);
21031 function constant$d(value) {
21032 return function() {
21038 * The base implementation of `setToString` without support for hot loop shorting.
21041 * @param {Function} func The function to modify.
21042 * @param {Function} string The `toString` result.
21043 * @returns {Function} Returns `func`.
21045 var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
21046 return defineProperty(func, 'toString', {
21047 'configurable': true,
21048 'enumerable': false,
21049 'value': constant$d(string),
21054 /** Used to detect hot functions by number of calls within a span of milliseconds. */
21055 var HOT_COUNT = 800,
21058 /* Built-in method references for those with the same name as other `lodash` methods. */
21059 var nativeNow = Date.now;
21062 * Creates a function that'll short out and invoke `identity` instead
21063 * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
21067 * @param {Function} func The function to restrict.
21068 * @returns {Function} Returns the new shortable function.
21070 function shortOut(func) {
21074 return function() {
21075 var stamp = nativeNow(),
21076 remaining = HOT_SPAN - (stamp - lastCalled);
21078 lastCalled = stamp;
21079 if (remaining > 0) {
21080 if (++count >= HOT_COUNT) {
21081 return arguments[0];
21086 return func.apply(undefined, arguments);
21091 * Sets the `toString` method of `func` to return `string`.
21094 * @param {Function} func The function to modify.
21095 * @param {Function} string The `toString` result.
21096 * @returns {Function} Returns `func`.
21098 var setToString = shortOut(baseSetToString);
21101 * A specialized version of `baseRest` which flattens the rest array.
21104 * @param {Function} func The function to apply a rest parameter to.
21105 * @returns {Function} Returns the new function.
21107 function flatRest(func) {
21108 return setToString(overRest(func, undefined, flatten), func + '');
21111 /** Used to compose bitmasks for cloning. */
21112 var CLONE_DEEP_FLAG$1 = 1,
21113 CLONE_FLAT_FLAG$1 = 2,
21114 CLONE_SYMBOLS_FLAG$2 = 4;
21117 * The opposite of `_.pick`; this method creates an object composed of the
21118 * own and inherited enumerable property paths of `object` that are not omitted.
21120 * **Note:** This method is considerably slower than `_.pick`.
21126 * @param {Object} object The source object.
21127 * @param {...(string|string[])} [paths] The property paths to omit.
21128 * @returns {Object} Returns the new object.
21131 * var object = { 'a': 1, 'b': '2', 'c': 3 };
21133 * _.omit(object, ['a', 'c']);
21134 * // => { 'b': '2' }
21136 var omit = flatRest(function(object, paths) {
21138 if (object == null) {
21141 var isDeep = false;
21142 paths = arrayMap(paths, function(path) {
21143 path = castPath(path, object);
21144 isDeep || (isDeep = path.length > 1);
21147 copyObject(object, getAllKeysIn(object), result);
21149 result = baseClone(result, CLONE_DEEP_FLAG$1 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$2, customOmitClone);
21151 var length = paths.length;
21153 baseUnset(result, paths[length]);
21159 * Creates an array with all falsey values removed. The values `false`, `null`,
21160 * `0`, `""`, `undefined`, and `NaN` are falsey.
21166 * @param {Array} array The array to compact.
21167 * @returns {Array} Returns the new array of filtered values.
21170 * _.compact([0, 1, false, 2, '', 3]);
21173 function compact(array) {
21175 length = array == null ? 0 : array.length,
21179 while (++index < length) {
21180 var value = array[index];
21182 result[resIndex++] = value;
21189 * The base implementation of `_.rest` which doesn't validate or coerce arguments.
21192 * @param {Function} func The function to apply a rest parameter to.
21193 * @param {number} [start=func.length-1] The start position of the rest parameter.
21194 * @returns {Function} Returns the new function.
21196 function baseRest(func, start) {
21197 return setToString(overRest(func, start, identity$8), func + '');
21201 * Checks if the given arguments are from an iteratee call.
21204 * @param {*} value The potential iteratee value argument.
21205 * @param {*} index The potential iteratee index or key argument.
21206 * @param {*} object The potential iteratee object argument.
21207 * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
21210 function isIterateeCall(value, index, object) {
21211 if (!isObject(object)) {
21214 var type = typeof index;
21215 if (type == 'number'
21216 ? (isArrayLike(object) && isIndex(index, object.length))
21217 : (type == 'string' && index in object)
21219 return eq(object[index], value);
21225 * Creates a function like `_.assign`.
21228 * @param {Function} assigner The function to assign values.
21229 * @returns {Function} Returns the new assigner function.
21231 function createAssigner(assigner) {
21232 return baseRest(function(object, sources) {
21234 length = sources.length,
21235 customizer = length > 1 ? sources[length - 1] : undefined,
21236 guard = length > 2 ? sources[2] : undefined;
21238 customizer = (assigner.length > 3 && typeof customizer == 'function')
21239 ? (length--, customizer)
21242 if (guard && isIterateeCall(sources[0], sources[1], guard)) {
21243 customizer = length < 3 ? undefined : customizer;
21246 object = Object(object);
21247 while (++index < length) {
21248 var source = sources[index];
21250 assigner(object, source, index, customizer);
21258 * This method is like `_.assign` except that it iterates over own and
21259 * inherited source properties.
21261 * **Note:** This method mutates `object`.
21268 * @param {Object} object The destination object.
21269 * @param {...Object} [sources] The source objects.
21270 * @returns {Object} Returns `object`.
21282 * Foo.prototype.b = 2;
21283 * Bar.prototype.d = 4;
21285 * _.assignIn({ 'a': 0 }, new Foo, new Bar);
21286 * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
21288 var assignIn = createAssigner(function(object, source) {
21289 copyObject(source, keysIn$1(source), object);
21293 * The base implementation of `_.filter` without support for iteratee shorthands.
21296 * @param {Array|Object} collection The collection to iterate over.
21297 * @param {Function} predicate The function invoked per iteration.
21298 * @returns {Array} Returns the new filtered array.
21300 function baseFilter(collection, predicate) {
21302 baseEach(collection, function(value, index, collection) {
21303 if (predicate(value, index, collection)) {
21304 result.push(value);
21311 * Iterates over elements of `collection`, returning an array of all elements
21312 * `predicate` returns truthy for. The predicate is invoked with three
21313 * arguments: (value, index|key, collection).
21315 * **Note:** Unlike `_.remove`, this method returns a new array.
21320 * @category Collection
21321 * @param {Array|Object} collection The collection to iterate over.
21322 * @param {Function} [predicate=_.identity] The function invoked per iteration.
21323 * @returns {Array} Returns the new filtered array.
21328 * { 'user': 'barney', 'age': 36, 'active': true },
21329 * { 'user': 'fred', 'age': 40, 'active': false }
21332 * _.filter(users, function(o) { return !o.active; });
21333 * // => objects for ['fred']
21335 * // The `_.matches` iteratee shorthand.
21336 * _.filter(users, { 'age': 36, 'active': true });
21337 * // => objects for ['barney']
21339 * // The `_.matchesProperty` iteratee shorthand.
21340 * _.filter(users, ['active', false]);
21341 * // => objects for ['fred']
21343 * // The `_.property` iteratee shorthand.
21344 * _.filter(users, 'active');
21345 * // => objects for ['barney']
21347 function filter(collection, predicate) {
21348 var func = isArray(collection) ? arrayFilter : baseFilter;
21349 return func(collection, baseIteratee(predicate, 3));
21353 * Creates a `_.find` or `_.findLast` function.
21356 * @param {Function} findIndexFunc The function to find the collection index.
21357 * @returns {Function} Returns the new find function.
21359 function createFind(findIndexFunc) {
21360 return function(collection, predicate, fromIndex) {
21361 var iterable = Object(collection);
21362 if (!isArrayLike(collection)) {
21363 var iteratee = baseIteratee(predicate, 3);
21364 collection = keys$1(collection);
21365 predicate = function(key) { return iteratee(iterable[key], key, iterable); };
21367 var index = findIndexFunc(collection, predicate, fromIndex);
21368 return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
21373 * The base implementation of `_.findIndex` and `_.findLastIndex` without
21374 * support for iteratee shorthands.
21377 * @param {Array} array The array to inspect.
21378 * @param {Function} predicate The function invoked per iteration.
21379 * @param {number} fromIndex The index to search from.
21380 * @param {boolean} [fromRight] Specify iterating from right to left.
21381 * @returns {number} Returns the index of the matched value, else `-1`.
21383 function baseFindIndex(array, predicate, fromIndex, fromRight) {
21384 var length = array.length,
21385 index = fromIndex + (fromRight ? 1 : -1);
21387 while ((fromRight ? index-- : ++index < length)) {
21388 if (predicate(array[index], index, array)) {
21395 /** Used as references for various `Number` constants. */
21398 /** Used to match leading and trailing whitespace. */
21399 var reTrim = /^\s+|\s+$/g;
21401 /** Used to detect bad signed hexadecimal string values. */
21402 var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
21404 /** Used to detect binary string values. */
21405 var reIsBinary = /^0b[01]+$/i;
21407 /** Used to detect octal string values. */
21408 var reIsOctal = /^0o[0-7]+$/i;
21410 /** Built-in method references without a dependency on `root`. */
21411 var freeParseInt = parseInt;
21414 * Converts `value` to a number.
21420 * @param {*} value The value to process.
21421 * @returns {number} Returns the number.
21427 * _.toNumber(Number.MIN_VALUE);
21430 * _.toNumber(Infinity);
21433 * _.toNumber('3.2');
21436 function toNumber(value) {
21437 if (typeof value == 'number') {
21440 if (isSymbol(value)) {
21443 if (isObject(value)) {
21444 var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
21445 value = isObject(other) ? (other + '') : other;
21447 if (typeof value != 'string') {
21448 return value === 0 ? value : +value;
21450 value = value.replace(reTrim, '');
21451 var isBinary = reIsBinary.test(value);
21452 return (isBinary || reIsOctal.test(value))
21453 ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
21454 : (reIsBadHex.test(value) ? NAN : +value);
21457 /** Used as references for various `Number` constants. */
21458 var INFINITY$2 = 1 / 0,
21459 MAX_INTEGER = 1.7976931348623157e+308;
21462 * Converts `value` to a finite number.
21468 * @param {*} value The value to convert.
21469 * @returns {number} Returns the converted number.
21475 * _.toFinite(Number.MIN_VALUE);
21478 * _.toFinite(Infinity);
21479 * // => 1.7976931348623157e+308
21481 * _.toFinite('3.2');
21484 function toFinite(value) {
21486 return value === 0 ? value : 0;
21488 value = toNumber(value);
21489 if (value === INFINITY$2 || value === -INFINITY$2) {
21490 var sign = (value < 0 ? -1 : 1);
21491 return sign * MAX_INTEGER;
21493 return value === value ? value : 0;
21497 * Converts `value` to an integer.
21499 * **Note:** This method is loosely based on
21500 * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
21506 * @param {*} value The value to convert.
21507 * @returns {number} Returns the converted integer.
21510 * _.toInteger(3.2);
21513 * _.toInteger(Number.MIN_VALUE);
21516 * _.toInteger(Infinity);
21517 * // => 1.7976931348623157e+308
21519 * _.toInteger('3.2');
21522 function toInteger(value) {
21523 var result = toFinite(value),
21524 remainder = result % 1;
21526 return result === result ? (remainder ? result - remainder : result) : 0;
21529 /* Built-in method references for those with the same name as other `lodash` methods. */
21530 var nativeMax$1 = Math.max;
21533 * This method is like `_.find` except that it returns the index of the first
21534 * element `predicate` returns truthy for instead of the element itself.
21540 * @param {Array} array The array to inspect.
21541 * @param {Function} [predicate=_.identity] The function invoked per iteration.
21542 * @param {number} [fromIndex=0] The index to search from.
21543 * @returns {number} Returns the index of the found element, else `-1`.
21547 * { 'user': 'barney', 'active': false },
21548 * { 'user': 'fred', 'active': false },
21549 * { 'user': 'pebbles', 'active': true }
21552 * _.findIndex(users, function(o) { return o.user == 'barney'; });
21555 * // The `_.matches` iteratee shorthand.
21556 * _.findIndex(users, { 'user': 'fred', 'active': false });
21559 * // The `_.matchesProperty` iteratee shorthand.
21560 * _.findIndex(users, ['active', false]);
21563 * // The `_.property` iteratee shorthand.
21564 * _.findIndex(users, 'active');
21567 function findIndex(array, predicate, fromIndex) {
21568 var length = array == null ? 0 : array.length;
21572 var index = fromIndex == null ? 0 : toInteger(fromIndex);
21574 index = nativeMax$1(length + index, 0);
21576 return baseFindIndex(array, baseIteratee(predicate, 3), index);
21580 * Iterates over elements of `collection`, returning the first element
21581 * `predicate` returns truthy for. The predicate is invoked with three
21582 * arguments: (value, index|key, collection).
21587 * @category Collection
21588 * @param {Array|Object} collection The collection to inspect.
21589 * @param {Function} [predicate=_.identity] The function invoked per iteration.
21590 * @param {number} [fromIndex=0] The index to search from.
21591 * @returns {*} Returns the matched element, else `undefined`.
21595 * { 'user': 'barney', 'age': 36, 'active': true },
21596 * { 'user': 'fred', 'age': 40, 'active': false },
21597 * { 'user': 'pebbles', 'age': 1, 'active': true }
21600 * _.find(users, function(o) { return o.age < 40; });
21601 * // => object for 'barney'
21603 * // The `_.matches` iteratee shorthand.
21604 * _.find(users, { 'age': 1, 'active': true });
21605 * // => object for 'pebbles'
21607 * // The `_.matchesProperty` iteratee shorthand.
21608 * _.find(users, ['active', false]);
21609 * // => object for 'fred'
21611 * // The `_.property` iteratee shorthand.
21612 * _.find(users, 'active');
21613 * // => object for 'barney'
21615 var find$1 = createFind(findIndex);
21618 * The base implementation of `_.map` without support for iteratee shorthands.
21621 * @param {Array|Object} collection The collection to iterate over.
21622 * @param {Function} iteratee The function invoked per iteration.
21623 * @returns {Array} Returns the new mapped array.
21625 function baseMap(collection, iteratee) {
21627 result = isArrayLike(collection) ? Array(collection.length) : [];
21629 baseEach(collection, function(value, key, collection) {
21630 result[++index] = iteratee(value, key, collection);
21636 * Creates an array of values by running each element in `collection` thru
21637 * `iteratee`. The iteratee is invoked with three arguments:
21638 * (value, index|key, collection).
21640 * Many lodash methods are guarded to work as iteratees for methods like
21641 * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
21643 * The guarded methods are:
21644 * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
21645 * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
21646 * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
21647 * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
21652 * @category Collection
21653 * @param {Array|Object} collection The collection to iterate over.
21654 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
21655 * @returns {Array} Returns the new mapped array.
21658 * function square(n) {
21662 * _.map([4, 8], square);
21665 * _.map({ 'a': 4, 'b': 8 }, square);
21666 * // => [16, 64] (iteration order is not guaranteed)
21669 * { 'user': 'barney' },
21670 * { 'user': 'fred' }
21673 * // The `_.property` iteratee shorthand.
21674 * _.map(users, 'user');
21675 * // => ['barney', 'fred']
21677 function map$3(collection, iteratee) {
21678 var func = isArray(collection) ? arrayMap : baseMap;
21679 return func(collection, baseIteratee(iteratee, 3));
21683 * The base implementation of `_.values` and `_.valuesIn` which creates an
21684 * array of `object` property values corresponding to the property names
21688 * @param {Object} object The object to query.
21689 * @param {Array} props The property names to get values for.
21690 * @returns {Object} Returns the array of property values.
21692 function baseValues(object, props) {
21693 return arrayMap(props, function(key) {
21694 return object[key];
21699 * Creates an array of the own enumerable string keyed property values of `object`.
21701 * **Note:** Non-object values are coerced to objects.
21707 * @param {Object} object The object to query.
21708 * @returns {Array} Returns the array of property values.
21716 * Foo.prototype.c = 3;
21718 * _.values(new Foo);
21719 * // => [1, 2] (iteration order is not guaranteed)
21724 function values$1(object) {
21725 return object == null ? [] : baseValues(object, keys$1(object));
21729 * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
21730 * of key-value pairs for `object` corresponding to the property names of `props`.
21733 * @param {Object} object The object to query.
21734 * @param {Array} props The property names to get values for.
21735 * @returns {Object} Returns the key-value pairs.
21737 function baseToPairs(object, props) {
21738 return arrayMap(props, function(key) {
21739 return [key, object[key]];
21744 * Converts `set` to its value-value pairs.
21747 * @param {Object} set The set to convert.
21748 * @returns {Array} Returns the value-value pairs.
21750 function setToPairs(set) {
21752 result = Array(set.size);
21754 set.forEach(function(value) {
21755 result[++index] = [value, value];
21760 /** `Object#toString` result references. */
21761 var mapTag$6 = '[object Map]',
21762 setTag$6 = '[object Set]';
21765 * Creates a `_.toPairs` or `_.toPairsIn` function.
21768 * @param {Function} keysFunc The function to get the keys of a given object.
21769 * @returns {Function} Returns the new pairs function.
21771 function createToPairs(keysFunc) {
21772 return function(object) {
21773 var tag = getTag$1(object);
21774 if (tag == mapTag$6) {
21775 return mapToArray(object);
21777 if (tag == setTag$6) {
21778 return setToPairs(object);
21780 return baseToPairs(object, keysFunc(object));
21785 * Creates an array of own enumerable string keyed-value pairs for `object`
21786 * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
21787 * entries are returned.
21794 * @param {Object} object The object to query.
21795 * @returns {Array} Returns the key-value pairs.
21803 * Foo.prototype.c = 3;
21805 * _.toPairs(new Foo);
21806 * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
21808 var toPairs = createToPairs(keys$1);
21811 * The base implementation of `_.isNaN` without support for number objects.
21814 * @param {*} value The value to check.
21815 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21817 function baseIsNaN(value) {
21818 return value !== value;
21822 * A specialized version of `_.indexOf` which performs strict equality
21823 * comparisons of values, i.e. `===`.
21826 * @param {Array} array The array to inspect.
21827 * @param {*} value The value to search for.
21828 * @param {number} fromIndex The index to search from.
21829 * @returns {number} Returns the index of the matched value, else `-1`.
21831 function strictIndexOf(array, value, fromIndex) {
21832 var index = fromIndex - 1,
21833 length = array.length;
21835 while (++index < length) {
21836 if (array[index] === value) {
21844 * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21847 * @param {Array} array The array to inspect.
21848 * @param {*} value The value to search for.
21849 * @param {number} fromIndex The index to search from.
21850 * @returns {number} Returns the index of the matched value, else `-1`.
21852 function baseIndexOf(array, value, fromIndex) {
21853 return value === value
21854 ? strictIndexOf(array, value, fromIndex)
21855 : baseFindIndex(array, baseIsNaN, fromIndex);
21859 * A specialized version of `_.includes` for arrays without support for
21860 * specifying an index to search from.
21863 * @param {Array} [array] The array to inspect.
21864 * @param {*} target The value to search for.
21865 * @returns {boolean} Returns `true` if `target` is found, else `false`.
21867 function arrayIncludes(array, value) {
21868 var length = array == null ? 0 : array.length;
21869 return !!length && baseIndexOf(array, value, 0) > -1;
21873 * This function is like `arrayIncludes` except that it accepts a comparator.
21876 * @param {Array} [array] The array to inspect.
21877 * @param {*} target The value to search for.
21878 * @param {Function} comparator The comparator invoked per element.
21879 * @returns {boolean} Returns `true` if `target` is found, else `false`.
21881 function arrayIncludesWith(array, value, comparator) {
21883 length = array == null ? 0 : array.length;
21885 while (++index < length) {
21886 if (comparator(value, array[index])) {
21894 * This method returns `undefined`.
21902 * _.times(2, _.noop);
21903 * // => [undefined, undefined]
21905 function noop$3() {
21906 // No operation performed.
21909 /** Used as references for various `Number` constants. */
21910 var INFINITY$3 = 1 / 0;
21913 * Creates a set object of `values`.
21916 * @param {Array} values The values to add to the set.
21917 * @returns {Object} Returns the new set.
21919 var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21920 return new Set$1(values);
21923 /** Used as the size to enable large array optimizations. */
21924 var LARGE_ARRAY_SIZE$1 = 200;
21927 * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21930 * @param {Array} array The array to inspect.
21931 * @param {Function} [iteratee] The iteratee invoked per element.
21932 * @param {Function} [comparator] The comparator invoked per element.
21933 * @returns {Array} Returns the new duplicate free array.
21935 function baseUniq(array, iteratee, comparator) {
21937 includes = arrayIncludes,
21938 length = array.length,
21945 includes = arrayIncludesWith;
21947 else if (length >= LARGE_ARRAY_SIZE$1) {
21948 var set = iteratee ? null : createSet(array);
21950 return setToArray(set);
21953 includes = cacheHas;
21954 seen = new SetCache;
21957 seen = iteratee ? [] : result;
21960 while (++index < length) {
21961 var value = array[index],
21962 computed = iteratee ? iteratee(value) : value;
21964 value = (comparator || value !== 0) ? value : 0;
21965 if (isCommon && computed === computed) {
21966 var seenIndex = seen.length;
21967 while (seenIndex--) {
21968 if (seen[seenIndex] === computed) {
21973 seen.push(computed);
21975 result.push(value);
21977 else if (!includes(seen, computed, comparator)) {
21978 if (seen !== result) {
21979 seen.push(computed);
21981 result.push(value);
21988 * This method is like `_.isArrayLike` except that it also checks if `value`
21995 * @param {*} value The value to check.
21996 * @returns {boolean} Returns `true` if `value` is an array-like object,
22000 * _.isArrayLikeObject([1, 2, 3]);
22003 * _.isArrayLikeObject(document.body.children);
22006 * _.isArrayLikeObject('abc');
22009 * _.isArrayLikeObject(_.noop);
22012 function isArrayLikeObject(value) {
22013 return isObjectLike(value) && isArrayLike(value);
22017 * Creates an array of unique values, in order, from all given arrays using
22018 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22019 * for equality comparisons.
22025 * @param {...Array} [arrays] The arrays to inspect.
22026 * @returns {Array} Returns the new array of combined values.
22029 * _.union([2], [1, 2]);
22032 var union = baseRest(function(arrays) {
22033 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
22036 /** Used as the size to enable large array optimizations. */
22037 var LARGE_ARRAY_SIZE$2 = 200;
22040 * The base implementation of methods like `_.difference` without support
22041 * for excluding multiple arrays or iteratee shorthands.
22044 * @param {Array} array The array to inspect.
22045 * @param {Array} values The values to exclude.
22046 * @param {Function} [iteratee] The iteratee invoked per element.
22047 * @param {Function} [comparator] The comparator invoked per element.
22048 * @returns {Array} Returns the new array of filtered values.
22050 function baseDifference(array, values, iteratee, comparator) {
22052 includes = arrayIncludes,
22054 length = array.length,
22056 valuesLength = values.length;
22062 values = arrayMap(values, baseUnary(iteratee));
22065 includes = arrayIncludesWith;
22068 else if (values.length >= LARGE_ARRAY_SIZE$2) {
22069 includes = cacheHas;
22071 values = new SetCache(values);
22074 while (++index < length) {
22075 var value = array[index],
22076 computed = iteratee == null ? value : iteratee(value);
22078 value = (comparator || value !== 0) ? value : 0;
22079 if (isCommon && computed === computed) {
22080 var valuesIndex = valuesLength;
22081 while (valuesIndex--) {
22082 if (values[valuesIndex] === computed) {
22086 result.push(value);
22088 else if (!includes(values, computed, comparator)) {
22089 result.push(value);
22096 * Creates an array excluding all given values using
22097 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22098 * for equality comparisons.
22100 * **Note:** Unlike `_.pull`, this method returns a new array.
22106 * @param {Array} array The array to inspect.
22107 * @param {...*} [values] The values to exclude.
22108 * @returns {Array} Returns the new array of filtered values.
22109 * @see _.difference, _.xor
22112 * _.without([2, 1, 2, 3], 1, 2);
22115 var without = baseRest(function(array, values) {
22116 return isArrayLikeObject(array)
22117 ? baseDifference(array, values)
22121 function osmIsInterestingTag(key) {
22122 return key !== 'attribution' &&
22123 key !== 'created_by' &&
22124 key !== 'source' &&
22126 key.indexOf('tiger:') !== 0;
22131 var osmOneWayTags = {
22133 'chair_lift': true,
22134 'mixed_lift': true,
22139 'magic_carpet': true,
22150 'piste:halfpipe': true
22167 var osmPavedTags = {
22172 'concrete:lanes': true,
22173 'concrete:plates': true
22297 "беларуская (тарашкевіца)",
22298 "беларуская (тарашкевіца)",
22338 "বিষ্ণুপ্রিয়া মণিপুরী",
22367 "Chavacano de Zamboanga",
22368 "Chavacano de Zamboanga",
22372 "Min Dong Chinese",
22413 "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
22433 "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
22487 "Emiliano-Romagnolo",
22488 "emiliàn e rumagnòl",
22543 "Na Vosa Vakaviti",
22562 "Northern Frisian",
22613 "गोंयची कोंकणी / Gõychi Konknni",
22693 "Bahasa Indonesia",
22733 "ᐃᓄᒃᑎᑐᑦ/inuktitut",
22742 "Jamaican Creole English",
22818 "къарачай-малкъар",
22958 "Baso Minangkabau",
23057 "Norwegian Nynorsk",
23078 "Sesotho sa Leboa",
23142 "Pennsylvania German",
23157 "Norfuk / Pitkern",
23158 "Norfuk / Pitkern",
23283 "srpskohrvatski / српскохрватски",
23347 "Saterland Frisian",
23473 "ئۇيغۇرچە / Uyghurche",
23488 "oʻzbekcha/ўзбекча",
23582 "Classical Chinese",
23587 "Chinese (Min Nan)",
23603 var wikipedia$1 = /*#__PURE__*/Object.freeze({
23607 var require$$6 = ( wikipedia$1 && wikipedia ) || wikipedia$1;
23609 var wikipedia$2 = require$$6;
23611 var amenity = {arts_centre:{"Świetlica wiejska":{count:62},"Дом культуры":{count:182}},bank:{ABANCA:{count:83},"ABN AMRO":{count:152},ABSA:{count:105},AIB:{count:85},ANZ:{count:378},"ASB Bank":{count:51},"ATB Financial":{count:68},AXA:{count:106},Agribank:{count:58},Akbank:{count:129},"Alior Bank":{count:180},"Allahabad Bank":{count:52},"Allied Bank":{count:67},"Alpha Bank":{count:329},"Andhra Bank":{count:97},Antonveneta:{count:56},Argenta:{count:125},"Asia United Bank":{count:57},"Askari Bank":{count:71},"Associated Bank":{count:55},"Axis Bank":{count:198},BAC:{count:77},"BAWAG PSK":{count:97},"BB&T":{count:418},BBBank:{count:58},BBK:{count:122},BBVA:{count:1445},"BBVA Bancomer":{count:157},"BBVA Compass":{count:80},"BBVA Continental":{count:74},"BBVA Francés":{count:158},BCA:{count:135},BCI:{count:140},BCP:{count:226},BCR:{count:232},BDO:{count:538},"BGŻ BNP Paribas":{count:74},BMCE:{count:53},BMN:{count:88},BMO:{count:339},"BMO Harris Bank":{count:72},BNA:{count:70},BNI:{count:136},BNL:{count:159},"BNP Paribas":{count:1165},"BNP Paribas Fortis":{count:303},BOC:{count:95},BPH:{count:63},BPI:{count:579},"BPI Family Savings Bank":{count:54},BRD:{count:276},BRED:{count:70},BRI:{count:209},"BW-Bank":{count:95},"BZ WBK":{count:156},Banamex:{count:356},"Banc Sabadell":{count:175},"Banca Intesa":{count:92},"Banca March":{count:51},"Banca Popolare di Milano":{count:99},"Banca Popolare di Novara":{count:79},"Banca Popolare di Sondrio":{count:105},"Banca Popolare di Verona":{count:59},"Banca Popolare di Vicenza":{count:119},"Banca Românească":{count:61},"Banca Sella":{count:56},"Banca Transilvania":{count:167},"Banco Agrario":{count:58},"Banco Azteca":{count:119},"Banco BCI":{count:74},"Banco Continental":{count:64},"Banco Estado":{count:153},"Banco Fassil":{count:59},"Banco G&T Continental":{count:84},"Banco General":{count:53},"Banco Industrial":{count:91},"Banco Internacional":{count:62},"Banco Nacional":{count:143},"Banco Nación":{count:149},"Banco Pastor":{count:74},"Banco Pichincha":{count:109},"Banco Popular":{count:619},"Banco Provincia":{count:138},"Banco Sabadell":{count:189},"Banco Santander":{count:112},"Banco Sol":{count:74},"Banco de Bogotá":{count:74},"Banco de Chile":{count:175},"Banco de Costa Rica":{count:123},"Banco de Desarrollo Banrural":{count:85},"Banco de Occidente":{count:67},"Banco de Venezuela":{count:76},"Banco de la Nación":{count:156},"Banco de la Nación Argentina":{count:166},"Banco di Napoli":{count:79},"Banco di Sardegna":{count:79},"Banco do Brasil":{count:1313},"Banco do Nordeste":{count:56},BancoEstado:{count:121},Bancolombia:{count:170},Bancomer:{count:227},Bancpost:{count:77},Banesco:{count:209},"Bangkok Bank":{count:69},"Bank Al Habib":{count:52},"Bank Alfalah":{count:63},"Bank Austria":{count:123},"Bank BCA":{count:71},"Bank BNI":{count:67},"Bank BPH":{count:56},"Bank BRI":{count:196},"Bank Danamon":{count:60},"Bank Mandiri":{count:232},"Bank Mega":{count:54},"Bank Spółdzielczy":{count:395},"Bank Zachodni WBK":{count:103},"Bank of Africa":{count:59},"Bank of America":{count:1787},"Bank of Baroda":{count:122},"Bank of Ceylon":{count:74},"Bank of China":{count:152},"Bank of Commerce":{count:69},"Bank of India":{count:113},"Bank of Ireland":{count:151},"Bank of Montreal":{count:157},"Bank of New Zealand":{count:63},"Bank of Scotland":{count:122},"Bank of the West":{count:173},Bankia:{count:613},Bankinter:{count:139},"Banner Bank":{count:53},Banorte:{count:260},"Banque Atlantique":{count:57},"Banque Nationale":{count:137},"Banque Populaire":{count:919},Banrisul:{count:101},Banrural:{count:84},Barclays:{count:1243},Bcc:{count:54},Belfius:{count:285},"Bendigo Bank":{count:140},"Berliner Volksbank":{count:73},Bicentenario:{count:173},Bradesco:{count:977},"Budapest Bank":{count:56},CBAO:{count:53},"CEC Bank":{count:121},CGD:{count:52},"CIB Bank":{count:64},CIBC:{count:574},CIC:{count:742},"CIMB Bank":{count:64},CNEP:{count:52},"Caisse Desjardins":{count:69},"Caisse d'Épargne":{count:1607},Caixa:{count:239},"Caixa Econômica Federal":{count:573},"Caixa Geral de Depósitos":{count:231},CaixaBank:{count:343},"Caja Círculo":{count:68},"Caja Duero":{count:90},"Caja España":{count:74},"Caja Rural":{count:216},"Caja Rural de Jaén":{count:55},CajaSur:{count:73},Cajamar:{count:216},"Cajero Automatico Bancared":{count:123},"Canara Bank":{count:270},"Capital One":{count:199},Carige:{count:57},Cariparma:{count:69},"Cassa di Risparmio del Veneto":{count:102},CatalunyaCaixa:{count:107},"Central Bank of India":{count:60},Chase:{count:1658},"China Bank":{count:156},"China Bank Savings":{count:54},"China Construction Bank":{count:68},Citibank:{count:485},"Citizens Bank":{count:248},"Clydesdale Bank":{count:55},"Columbia Bank":{count:79},"Comerica Bank":{count:67},"Commerce Bank":{count:61},"Commercial Bank":{count:75},"Commercial Bank of Ceylon PLC":{count:100},Commerzbank:{count:879},"Commonwealth Bank":{count:376},"Corporation Bank":{count:92},Credem:{count:77},Credicoop:{count:111},"Credit Agricole":{count:104},"Credit Suisse":{count:93},Crelan:{count:53},"Crédit Agricole":{count:2544},"Crédit Mutuel":{count:1129},"Crédit Mutuel de Bretagne":{count:368},"Crédit du Nord":{count:148},"Crédito Agrícola":{count:87},"Cбербанк":{count:74},"Danske Bank":{count:157},Davivienda:{count:172},"De Venezuela":{count:87},Denizbank:{count:58},Desjardins:{count:80},"Deutsche Bank":{count:995},"Dubai Islamic Bank":{count:71},"EastWest Bank":{count:127},Ecobank:{count:197},"Erste Bank":{count:200},Eurobank:{count:261},"Express Union":{count:58},FNB:{count:143},"Federal Bank":{count:88},"Fifth Third Bank":{count:234},Finansbank:{count:68},"First Bank":{count:91},"First Citizens Bank":{count:88},"First National Bank":{count:209},Galicia:{count:179},Garanti:{count:58},"Garanti Bankası":{count:82},"Getin Bank":{count:112},Groupama:{count:61},"HDFC Bank":{count:219},HNB:{count:67},HSBC:{count:1748},Halifax:{count:367},Halkbank:{count:74},"Hamburger Sparkasse":{count:159},Handelsbanken:{count:250},"Hong Leong Bank":{count:51},"Hrvatska poštanska banka":{count:54},"Huntington Bank":{count:110},HypoVereinsbank:{count:408},ICBC:{count:158},"ICICI Bank":{count:224},"IDBI Bank":{count:73},ING:{count:654},"ING Bank Śląski":{count:128},IberCaja:{count:209},"Indian Bank":{count:98},"Indian Overseas Bank":{count:108},Interbank:{count:131},"Intesa San Paolo":{count:257},"Itaú":{count:1077},"K&H Bank":{count:75},KBC:{count:273},"Kasa Stefczyka":{count:65},"Key Bank":{count:382},"Komerční banka":{count:180},Kreissparkasse:{count:600},"Kreissparkasse Köln":{count:69},Kutxabank:{count:68},LCL:{count:903},"La Banque Postale":{count:124},"La Caixa":{count:1144},"Laboral Kutxa":{count:66},Landbank:{count:115},Liberbank:{count:164},"Lloyds Bank":{count:612},"M&T Bank":{count:184},MCB:{count:62},"MCB Bank":{count:54},"MONETA Money Bank":{count:92},Macro:{count:174},Maybank:{count:234},"Meezan Bank":{count:63},Mercantil:{count:132},"Metro Bank":{count:57},Metrobank:{count:434},"Millennium BCP":{count:119},"Millennium Bank":{count:386},"Monte dei Paschi di Siena":{count:265},Montepio:{count:113},NAB:{count:205},NSB:{count:51},NatWest:{count:800},"National Bank":{count:147},Nationwide:{count:337},Nedbank:{count:100},Nordea:{count:331},"Novo Banco":{count:101},OLB:{count:57},OTP:{count:362},Oberbank:{count:103},"Occidental de Descuento":{count:68},"Oldenburgische Landesbank":{count:68},"One Network Bank":{count:91},Osuuspankki:{count:89},PBZ:{count:65},PKO:{count:58},"PKO BP":{count:561},PNB:{count:323},PNC:{count:52},"PNC Bank":{count:639},PSBank:{count:108},Patagonia:{count:94},"Pekao SA":{count:155},"Peoples Bank":{count:254},"Philippine National Bank":{count:69},"Piraeus Bank":{count:96},Popular:{count:104},Postbank:{count:567},"Postbank Finanzcenter":{count:65},Provincial:{count:135},"Public Bank":{count:90},"Punjab National Bank":{count:134},RBC:{count:487},"RBC Financial Group":{count:59},RBS:{count:190},RCBC:{count:144},"RCBC Savings Bank":{count:84},Rabobank:{count:557},"Raiffeisen Polbank":{count:78},Raiffeisenbank:{count:2705},"Regions Bank":{count:204},"Republic Bank":{count:85},"Royal Bank":{count:90},"Royal Bank of Canada":{count:56},"Royal Bank of Scotland":{count:129},SEB:{count:129},"SNS Bank":{count:58},Sabadell:{count:97},"Sampath Bank":{count:87},Santander:{count:3268},"Santander Consumer Bank":{count:109},"Santander Río":{count:239},"Santander Totta":{count:201},Sberbank:{count:135},Scotiabank:{count:1144},"Security Bank":{count:171},Sicredi:{count:94},"Slovenská sporiteľňa":{count:165},"Société Générale":{count:1136},"Sparda-Bank":{count:277},Sparkasse:{count:4667},"Sparkasse Aachen":{count:56},"Sparkasse KölnBonn":{count:76},Stadtsparkasse:{count:68},"Stanbic Bank":{count:63},"Standard Bank":{count:165},"Standard Chartered":{count:95},"Standard Chartered Bank":{count:74},"State Bank of India":{count:1013},SunTrust:{count:322},Supervielle:{count:72},Swedbank:{count:252},"Syndicate Bank":{count:118},"TCF Bank":{count:85},"TD Bank":{count:425},"TD Canada Trust":{count:675},TEB:{count:56},TSB:{count:259},"Takarékszövetkezet":{count:120},Targobank:{count:279},"Tatra banka":{count:70},"Türkiye İş Bankası":{count:53},UBS:{count:169},"UCO Bank":{count:51},UCPB:{count:122},UOB:{count:126},"US Bank":{count:723},"Ulster Bank":{count:100},"Umpqua Bank":{count:103},"UniCredit Bank":{count:548},"Unicaja Banco":{count:182},"Unicredit Banca":{count:496},"Union Bank":{count:304},"United Bank":{count:68},"VR-Bank":{count:506},"Vakıfbank":{count:85},"Veneto Banca":{count:73},"Vijaya Bank":{count:56},"Volks- und Raiffeisenbank":{count:53},Volksbank:{count:2665},"Volksbank Mittelhessen":{count:53},"Volksbank Raiffeisenbank":{count:63},"VÚB":{count:105},"Washington Federal":{count:65},"Wells Fargo":{count:1947},"Western Union":{count:440},Westpac:{count:322},"Yorkshire Bank":{count:95},"Yorkshire Building Society":{count:69},"Zagrebačka banka":{count:54},"Ziraat Bankası":{count:172},mBank:{count:70},"ČSOB":{count:211},"Česká spořitelna":{count:243},"İş Bankası":{count:112},"Εθνική Τράπεζα":{count:103},"Πειραιώς":{count:120},"Τράπεζα Πειραιώς":{count:104},"Авангард":{count:76},"Альфа-Банк":{count:301},"Банк Москвы":{count:176},"Банка ДСК":{count:63},"Белагропромбанк":{count:184},"Беларусбанк":{count:570},"Белинвестбанк":{count:78},"Бинбанк":{count:114},"ВТБ":{count:80},"ВТБ24":{count:545},"Возрождение":{count:81},"Газпромбанк":{count:161},"Генбанк":{count:83},"Казкоммерцбанк":{count:74},"МДМ Банк":{count:52},"Московский индустриальный банк":{count:53},"Мособлбанк":{count:54},"Народный банк":{count:63},"ОТП Банк":{count:54},"Открытие":{count:92},"Ощадбанк":{count:883},"ПУМБ":{count:78},"Почта Банк":{count:65},"ПриватБанк":{count:1018},"Приватбанк":{count:76},"Приднестровский Сбербанк":{count:59},"Приорбанк":{count:69},"Промсвязьбанк":{count:133},"РНКБ":{count:124},"Райффайзен":{count:65},"Райффайзен Банк Аваль":{count:125},"Райффайзенбанк":{count:52},"Росбанк":{count:218},"Россельхозбанк":{count:374},"Русский стандарт":{count:55},"Сбербанк":{count:6921},"Совкомбанк":{count:186},"УкрСиббанк":{count:213},"Укрсоцбанк":{count:57},"Уралсиб":{count:130},"Хоум Кредит":{count:53},"בנק הפועלים":{count:112},"בנק לאומי":{count:83},"بانک":{count:219},"بانک آینده":{count:58},"بانک اقتصاد نوین":{count:78},"بانک انصار":{count:99},"بانک تجارت":{count:365},"بانک رفاه":{count:138},"بانک رفاه کارگران":{count:72},"بانک سپه":{count:348},"بانک شهر":{count:93},"بانک صادرات":{count:492},"بانک قوامین":{count:110},"بانک مسکن":{count:263},"بانک ملت":{count:428},"بانک ملی":{count:561},"بانک ملی ایران":{count:80},"بانک مهر اقتصاد":{count:92},"بانک پارسیان":{count:103},"بانک پاسارگاد":{count:107},"بانک کشاورزی":{count:277},"صادرات":{count:85},"ملی":{count:67},"پست بانک":{count:71},"ธนาคารกรุงเทพ":{count:121},"ธนาคารกรุงไทย":{count:85},"ธนาคารกสิกรไทย":{count:108},"ธนาคารออมสิน":{count:71},"ธนาคารไทยพาณิชย์":{count:95},"みずほ銀行":{count:255},"りそな銀行":{count:135},"三井住友銀行":{count:204},"三菱東京UFJ銀行":{count:235},"中国农业银行":{count:198},"中国工商银行":{count:181},"中国建设银行":{count:158},"中国邮政储蓄银行":{count:76},"中国银行":{count:275},"交通银行":{count:68},"京都中央信用金庫":{count:53},"京都銀行":{count:66},"农业银行":{count:78},"北海道銀行":{count:51},"合作金庫銀行":{count:55},"土地銀行":{count:54},"工商银行":{count:160},"建设银行":{count:89},"彰化銀行":{count:53},"招商银行":{count:94},"横浜銀行":{count:92},"第一銀行":{count:78},"華南銀行":{count:52},"국민은행":{count:199,tags:{"name:en":"Gungmin Bank"}},"기업은행":{count:53},"농협":{count:148},"새마을금고":{count:102},"신한은행":{count:245,tags:{"name:en":"Sinhan Bank"}},"우리은행":{count:316,tags:{"name:en":"Uri Bank"}},"하나은행":{count:85}},bar:{"Bar Centrale":{count:141},"Bar Sport":{count:90},"Beach Bar":{count:80},"Pool Bar":{count:54}},bicycle_rental:{Bicing:{count:130},"Call a Bike":{count:95},Grid:{count:51},Mibici:{count:116},metropolradruhr:{count:91}},bureau_de_change:{Abitab:{count:55},Change:{count:51},Travelex:{count:75},"Western Union":{count:189}},cafe:{"85度C":{count:128},"Bar Centrale":{count:77},"Bar Kafe":{count:253},Barista:{count:65},Bistro:{count:60},Bonafide:{count:63},"Cafe Coffee Day":{count:239},"Cafe Nero":{count:52},Cafeteria:{count:579},"Cafetería":{count:61},"Caffè Nero":{count:316},"Café Amazon":{count:241},"Café Central":{count:115},"Café de la Place":{count:55},"Café des Sports":{count:71},"Caribou Coffee":{count:184},"Coffee Fellows":{count:77},"Coffee House":{count:71},"Coffee Island":{count:51},"Coffee Time":{count:133},Costa:{count:1403},"Country Style":{count:58},"Dolce Vita":{count:55},"Dunkin' Donuts":{count:1662,tags:{cuisine:"donut"}},"Eiscafe Dolomiti":{count:51},"Eiscafe Venezia":{count:237},"Espresso House":{count:122},Havanna:{count:81},"Internet Cafe":{count:95},"Jamba Juice":{count:86},Kafe:{count:55},"Krispy Kreme":{count:63},"Le Pain Quotidien":{count:59},"McCafé":{count:72,tags:{amenity:"cafe",cuisine:"coffee_shop"}},"Peet's Coffee & Tea":{count:82},"Pret A Manger":{count:174},Prime:{count:51},"Second Cup":{count:234},Segafredo:{count:103},Starbucks:{count:8463,tags:{cuisine:"coffee_shop"}},Subway:{count:114},Tchibo:{count:168},"The Coffee Bean & Tea Leaf":{count:93},"The Coffee Club":{count:81},"Tim Hortons":{count:1945},"Traveler's Coffee":{count:70},Venezia:{count:55},"Wayne's Coffee":{count:52},"Берёзка":{count:52},"Бистро":{count:84},"Буфет":{count:56},"Встреча":{count:83},"Даблби":{count:59},"Закусочная":{count:101},"Кофе Хауз":{count:119},"Кофейня":{count:78},"Лакомка":{count:62},"Летнее кафе":{count:61},"Оазис":{count:54},"Пельменная":{count:63},"Пиццерия":{count:60},"Рандеву":{count:54},"Сказка":{count:66},"Смак":{count:62},"Старбакс":{count:55},"Столовая":{count:1181},"Теремок":{count:64},"Уют":{count:115},"Хуторок":{count:59},"Шашлычная":{count:153},"Шоколад":{count:54},"Шоколадница":{count:252},"ארומה":{count:64},"مقهى":{count:136},"คาเฟ่ อเมซอน":{count:59},"エクセルシオール カフェ":{count:61},"カフェ・ド・クリエ":{count:80,tags:{"name:en":"Cafe de CRIE"}},"カフェ・ベローチェ":{count:105},"コメダ珈琲店":{count:179},"サンマルクカフェ":{count:156},"スターバックス":{count:558,tags:{"name:en":"Starbucks"}},"タリーズコーヒー":{count:243},"ドトールコーヒーショップ":{count:489,tags:{"name:en":"Doutor"}},"星巴克":{count:146},"스타벅스":{count:52}},car_rental:{Alamo:{count:57},Avis:{count:604},Budget:{count:218},Enterprise:{count:594},"Enterprise Rent-a-Car":{count:51},Europcar:{count:611},Hertz:{count:654},Localiza:{count:59},Sixt:{count:323},Thrifty:{count:81},"U-Haul":{count:94},"オリックスレンタカー":{count:54},"トヨタレンタカー":{count:57},"トヨタレンタリース":{count:63},"ニッポンレンタカー":{count:113}},car_wash:{Aral:{count:88},Autolavaggio:{count:52},BP:{count:63},Esso:{count:55},"H-E-B Car Wash":{count:71},"Intermarché":{count:60},"Lavage Auto":{count:60},Lavazh:{count:52},Myjnia:{count:54},"Myjnia bezdotykowa":{count:93},"Myjnia samochodowa":{count:66},Shell:{count:162},"Spălătorie Auto":{count:69},"Spălătorie auto":{count:52},"Автомийка":{count:63}},cinema:{"Cinema City":{count:61},Cinemark:{count:87},Cinemex:{count:70},Cinepolis:{count:59},Cineworld:{count:64},Odeon:{count:81}},clinic:{"ФАП":{count:162}},dentist:{"Aspen Dental":{count:73},"Family Dentistry":{count:51},Vitaldent:{count:54},"Стоматолог":{count:72},"Стоматологія":{count:66}},doctors:{"Háziorvosi rendelő":{count:54},"Инвитро":{count:115},"ФАП":{count:147}},driving_school:{"Автодром":{count:55}},fast_food:{"A&W":{count:614},"Ali Baba":{count:101},"Angel's Burger":{count:66},Antalya:{count:53},"Arby's":{count:1432},"Asia Bistro":{count:53},"Asia Wok":{count:53},"Baskin-Robbins":{count:262,tags:{amenity:"ice_cream"}},Bistro:{count:80},"Bob's":{count:83},Bojangles:{count:89},"Booster Juice":{count:76},"Boston Market":{count:107},"Braum's":{count:58},"Burger King":{count:6601,tags:{cuisine:"burger"}},"Burger Machine":{count:55},"Büfé":{count:72},"Captain D's":{count:56},"Carl's Jr.":{count:593,tags:{cuisine:"burger"}},Checkers:{count:102},"Chick-fil-A":{count:906,tags:{cuisine:"chicken"}},"Chicken Express":{count:67},Chipotle:{count:688,tags:{cuisine:"mexican"}},Chowking:{count:250},"Church's Chicken":{count:249},"CoCo壱番屋":{count:218},"Cold Stone Creamery":{count:72},"Cook Out":{count:81},"Culver's":{count:541},DQ:{count:66},"Dairy Queen":{count:1485},"Del Taco":{count:244},Ditsch:{count:55},"Domino's Pizza":{count:2577,tags:{cuisine:"pizza"}},"Dunkin' Donuts":{count:747,tags:{cuisine:"donut"}},"El Pollo Loco":{count:132},Everest:{count:59},"Extreme Pita":{count:58},"Fazoli's":{count:53},"Firehouse Subs":{count:147},"Fish & Chips":{count:185},"Fish and Chips":{count:55},"Five Guys":{count:457},Greenwich:{count:83},"Habib's":{count:87},"Hallo Pizza":{count:98},"Hardee's":{count:634,tags:{cuisine:"burger"}},"Harvey's":{count:158},Hesburger:{count:164},"Hungry Jacks":{count:261,tags:{cuisine:"burger"}},"In-N-Out Burger":{count:211},Istanbul:{count:96},"Istanbul Kebab":{count:59},"Jack in the Box":{count:951,tags:{cuisine:"burger"}},"Jamba Juice":{count:148},"Jersey Mike's Subs":{count:88},"Jimmy John's":{count:519,tags:{cuisine:"sandwich"}},Jollibee:{count:740},KFC:{count:6003,tags:{cuisine:"chicken"}},"KFC/Taco Bell":{count:70},"Kebab House":{count:74},Kebabai:{count:64},"Kochlöffel":{count:78},Kotipizza:{count:89},"Krispy Kreme":{count:63},Krystal:{count:53},"Little Caesars":{count:567},"Little Caesars Pizza":{count:82},"Long John Silver's":{count:200},Lotteria:{count:67},Max:{count:54},"McDonald's":{count:18327,tags:{cuisine:"burger"}},"Minute Burger":{count:53},"Mr. Sub":{count:153},"New York Pizza":{count:65},Nordsee:{count:198},"Panda Express":{count:593,tags:{cuisine:"chinese"}},"Panera Bread":{count:120},"Papa John's":{count:820,tags:{cuisine:"pizza"}},"Papa Murphy's":{count:100},Pinulito:{count:58},"Pita Pit":{count:150},"Pizza Hut":{count:1503,tags:{cuisine:"pizza"}},"Pizza Hut Delivery":{count:70},"Pizza King":{count:56},"Pizza Nova":{count:90},"Pizza Pizza":{count:411},"Pollo Campero":{count:134},"Pollo Granjero":{count:66},"Popeye's":{count:521,tags:{cuisine:"chicken"}},"Popeyes Louisiana Kitchen":{count:51},Qdoba:{count:91},Quick:{count:434},Quiznos:{count:401},"Rally's":{count:68},"Red Rooster":{count:192},Sbarro:{count:65},"Schlotzsky's Deli":{count:348},Sibylla:{count:74},Sonic:{count:1166,tags:{cuisine:"burger"}},Starbucks:{count:60,tags:{cuisine:"coffee_shop"}},Steers:{count:190},Subway:{count:11431},"Taco Bell":{count:2947,tags:{cuisine:"mexican"}},"Taco Bueno":{count:59},"Taco Cabana":{count:57},"Taco Del Mar":{count:57},"Taco John's":{count:141},"Taco Time":{count:171},Telepizza:{count:323},"Thai Express":{count:63},"The Pizza Company":{count:62},"Waffle House":{count:86},"Wendy's":{count:3036,tags:{cuisine:"burger"}},Whataburger:{count:815},"White Castle":{count:149},Wienerschnitzel:{count:61},Wimpy:{count:168},"Zaxby's":{count:185},"Γρηγόρης":{count:59},"Бистро":{count:61},"Бургер Кинг":{count:181},"Крошка Картошка":{count:77},"Макдоналдс":{count:469,tags:{"name:en":"McDonald's"}},"Робин Сдобин":{count:131},"Русский Аппетит":{count:129},"Сабвэй":{count:73},"Стардог!s":{count:66},"Теремок":{count:155},"Шаверма":{count:93},"Шаурма":{count:265},"かっぱ寿司":{count:84},"かつや":{count:58},"くら寿司":{count:99},"すき家":{count:571,tags:{"name:en":"Sukiya"}},"なか卯":{count:180},"ほっかほっか亭":{count:57},"ほっともっと":{count:168},"オリジン弁当":{count:93},"ケンタッキーフライドチキン":{count:334,tags:{cuisine:"chicken","name:en":"KFC"}},"サブウェイ":{count:74},"スシロー":{count:94},"マクドナルド":{count:1261,tags:{cuisine:"burger","name:en":"McDonald's"}},"ミスタードーナツ":{count:188},"モスバーガー":{count:507,tags:{"name:en":"Mos Burger"}},"ロッテリア":{count:97},"丸亀製麺":{count:57},"吉野家":{count:461},"幸楽苑":{count:80},"摩斯漢堡":{count:86},"松屋":{count:574,tags:{"name:en":"Matsuya"}},"肯德基":{count:197},"麥當勞":{count:224},"麦当劳":{count:97},"롯데리아":{count:83}},fuel:{"76":{count:603},"1-2-3":{count:75},"7-Eleven":{count:1013},ABC:{count:83},ADNOC:{count:76},ANP:{count:202},ARAL:{count:68},Aegean:{count:56},Afriquia:{count:134},Agip:{count:2348},Agrola:{count:99},Alon:{count:54},Alpet:{count:61},Api:{count:234},Aral:{count:1708},Arco:{count:585},Asda:{count:51},Auchan:{count:84},Avanti:{count:112},Avia:{count:1061},BEBECO:{count:77},BFT:{count:102},BHPetrol:{count:60},BP:{count:4069},BR:{count:874},Bangchak:{count:106},Benzina:{count:167},"Bharat Petroleum":{count:230},Bliska:{count:141},CAMPSA:{count:420},CARREFOUR:{count:61},CEPSA:{count:892},CNG:{count:373},Caltex:{count:1574},Campsa:{count:64},"Canadian Tire":{count:97},Carrefour:{count:372},"Casey's General Store":{count:385},Cenex:{count:222},Cepsa:{count:305},Ceypetco:{count:70},Chevron:{count:1781},"Circle K":{count:730},Citgo:{count:692},Clark:{count:56},"Co-op":{count:52},"Coles Express":{count:305},Conoco:{count:398},Coop:{count:71},Copec:{count:566},Copetrol:{count:119},Cosmo:{count:68},"Costco Gasoline":{count:203},"Couche-Tard":{count:54},Crodux:{count:51},"Cumberland Farms":{count:93},Delta:{count:157},"Diamond Shamrock":{count:51},"Drummed Fuel":{count:178},"E. Leclerc":{count:136},EKO:{count:224},ENEOS:{count:1600},ENI:{count:92},ERG:{count:71},Elan:{count:208},Eneos:{count:130},Engen:{count:383},Eni:{count:681},Erg:{count:469},Esso:{count:4742},"Esso Express":{count:176},EuroOil:{count:52},Exxon:{count:1064},F24:{count:67},Firezone:{count:66},"Flying V":{count:175},GALP:{count:788},Gazprom:{count:68},GetGo:{count:54},Goil:{count:78},Gulf:{count:416},"H-E-B Fuel":{count:51},"H-E-B Gas":{count:155},HEM:{count:276},HP:{count:163},"HP Petrol Pump":{count:53},Helios:{count:63},Hess:{count:195},"Hindustan Petroleum":{count:82},Holiday:{count:156},Husky:{count:244},IES:{count:57},IP:{count:993},"Independent Fuel Station":{count:52},"Indian Oil":{count:416},"Indipend.":{count:129},Ingo:{count:62},"Intermarché":{count:556},"Intermarché Super":{count:102},Ipiranga:{count:173},Irving:{count:194},"JA-SS":{count:74},JOMO:{count:51},Jet:{count:707},Jetti:{count:61},Kangaroo:{count:115},Kobil:{count:87},Kroger:{count:59},"Kroger Fuel":{count:68},"Kum & Go":{count:136},"Kwik Trip":{count:210},LPG:{count:349},"LPG Station":{count:51},LUKOIL:{count:61},Liberty:{count:93},Lotos:{count:284},"Lotos Optima":{count:71},"Love's":{count:52},Lukoil:{count:908},MEROIL:{count:70},MOL:{count:436},MRS:{count:65},Marathon:{count:694},Maverik:{count:66},Maxol:{count:57},Metano:{count:248},Migrol:{count:71},Minipump:{count:140},Mobil:{count:1387},Mobile:{count:62},Mol:{count:64},Morrisons:{count:128},Moya:{count:62},"Murphy USA":{count:190},NP:{count:63},Neste:{count:166},"OIL!":{count:110},OK:{count:269},OKQ8:{count:218},OMV:{count:936},Oilibya:{count:127,tags:{brand:"Oilibya","name:ar":"أويليبيا"}},Opet:{count:117},Orlen:{count:1185},PETRONOR:{count:182},PSO:{count:121},"PSO Petrol Pump":{count:56},PT:{count:306},PTT:{count:423},"PV Oil":{count:100},"Pacific Pride":{count:54},Pecsa:{count:130},Pemex:{count:2023},Pertamina:{count:324},Petro:{count:54},"Petro-Canada":{count:893},Petrochina:{count:116},Petroecuador:{count:64},"Petrol Ofisi":{count:237},Petrolimex:{count:325},Petrom:{count:381},Petron:{count:1485},Petronas:{count:387},Petroperu:{count:110},"Phillips 66":{count:424},Phoenix:{count:210},Pilot:{count:69},Pioneer:{count:104},Posto:{count:52},"Posto Atem":{count:68},"Posto Ipiranga":{count:177},"Posto Shell":{count:104},Primax:{count:288},Prio:{count:52},Puma:{count:442},Q1:{count:53},Q8:{count:1467},"Q8 Easy":{count:66},QuikTrip:{count:251},REPSOL:{count:1380},RaceTrac:{count:80},Raiffeisenbank:{count:130},Repsol:{count:1099},Rompetrol:{count:234},"Royal Farms":{count:79},Rubis:{count:108},"SB Tank":{count:62},SPBU:{count:203},Safeway:{count:74},"Sainsbury's":{count:75},"Sam's Club":{count:57},Sasol:{count:90},"Sea Oil":{count:142},Sheetz:{count:304},Shell:{count:12317},"Shell Express":{count:135},Sinclair:{count:201},Sinopec:{count:106},"Sinopec Fuel":{count:116},Slovnaft:{count:259},Socar:{count:86},Sokimex:{count:85},Speedway:{count:556},St1:{count:141},Star:{count:419},"Star Oil":{count:100},"Station Service E. Leclerc":{count:423},Statoil:{count:495},"Stewart's":{count:72},Sunoco:{count:853},"Super U":{count:174},Tamoil:{count:959},Tango:{count:146},Teboil:{count:100},Tela:{count:191},Terpel:{count:367},Tesco:{count:218},Texaco:{count:1167},Tinq:{count:219},Topaz:{count:111},Total:{count:3591},"Total Access":{count:226},"Total Erg":{count:59},TotalErg:{count:267},"Turkey Hill":{count:80},"Turmöl":{count:80},Ultramar:{count:372},United:{count:197},Uno:{count:134},"Uno-X":{count:69},Valero:{count:778},Vito:{count:91},WOG:{count:350},Wawa:{count:173},Westfalen:{count:94},"Woolworths Petrol":{count:187},Z:{count:98},bft:{count:202},eni:{count:71},"ΕΚΟ":{count:58},"АГЗС":{count:1020},"АЗС":{count:86},"Авіас":{count:116},"БРСМ-Нафта":{count:64},"Башнефть":{count:272},"Белоруснефть":{count:71},"Газовая заправка":{count:57},"Газпромнефть":{count:1242},"Гелиос":{count:61},"ЕКА":{count:78},"Заправка":{count:63},"КазМунайГаз":{count:150},"Лукойл":{count:2327},"Макпетрол":{count:108},"НК Альянс":{count:105},"Нефтьмагистраль":{count:66},"ОККО":{count:316},"ОМВ":{count:55},"Октан":{count:53},"ПТК":{count:104},"Петрол":{count:124},"Пропан":{count:83},"Роснефть":{count:957},"Сибнефть":{count:51},"Сургутнефтегаз":{count:95},"ТНК":{count:588},"Татнефтепродукт":{count:58},"Татнефть":{count:331},"Укрнафта":{count:228},"דור אלון":{count:126},"דלק":{count:160},"סונול":{count:159},"פז":{count:209},"محطة وقود":{count:221},"محطه وقود":{count:98},"پمپ بنزین":{count:559},"پمپ گاز":{count:152},"บางจาก":{count:214},"ป.ต.ท.":{count:414},"เชลล์":{count:90},"เอสโซ่":{count:82},"エッソ":{count:70},"エネオス":{count:301},"コスモ石油":{count:415},"ゼネラル":{count:75},"中国石化":{count:104},"中国石化 Sinopec":{count:61},"中国石油":{count:82},"中油":{count:64},"出光":{count:620,tags:{"name:en":"Idemitsu"}},"加油站":{count:60},"台灣中油":{count:257},"昭和シェル":{count:274}},hospital:{"Cruz Roja":{count:93},IMSS:{count:64},"Инфекционное отделение":{count:91},"Кожно-венерологический диспансер":{count:57},"Районная больница":{count:88},"Роддом":{count:133},"Родильный дом":{count:75},"Скорая помощь":{count:75},"ФАП":{count:108},"ЦРБ":{count:122},"Центральная районная больница":{count:144},"โรงพยาบาลส่งเสริมสุขภาพตำบล":{count:69}},ice_cream:{"Baskin-Robbins":{count:69,tags:{amenity:"ice_cream"}},"Cold Stone Creamery":{count:66},Grido:{count:163}},kindergarten:{"Amado Nervo":{count:64},Anganwadi:{count:85},"Arche Noah":{count:67},"Benito Juarez":{count:89},"CONAFE Preescolar":{count:90},Cuauhtemoc:{count:54},"Cursos Comunitarios":{count:74},"Educacion Inicial de CONAFE No Escolarizado":{count:184},"Emiliano Zapata":{count:60},"Estefania Casta�eda":{count:53},"Evangelischer Kindergarten":{count:320},"Federico Froebel":{count:88},"Gabriela Mistral":{count:129},"Jean Piaget":{count:82},"Jose Vasconcelos":{count:71},"Juan Escutia":{count:82},"Katholischer Kindergarten":{count:99},"Kindergarten Regenbogen":{count:62},"Kindergarten St. Josef":{count:55},"Kindergarten St. Martin":{count:55},"Maria Montessori":{count:93},"Miguel Hidalgo Y Costilla":{count:57},"Ni�os Heroes":{count:68},PAUD:{count:82},Pusteblume:{count:54},"Rosaura Zapata":{count:68},"Sor Juana Ines De La Cruz":{count:76},Spatzennest:{count:54},"Städtischer Kindergarten":{count:103},"Villa Kunterbunt":{count:88},Waldkindergarten:{count:111},Waldorfkindergarten:{count:71},"Óvoda":{count:72},"Детсад":{count:65},"Детский сад \"Солнышко\"":{count:83},"Детский сад № 1":{count:54},"Детский сад №1":{count:150},"Детский сад №10":{count:77},"Детский сад №11":{count:81},"Детский сад №12":{count:57},"Детский сад №13":{count:57},"Детский сад №14":{count:76},"Детский сад №15":{count:72},"Детский сад №16":{count:58},"Детский сад №17":{count:67},"Детский сад №18":{count:77},"Детский сад №19":{count:62},"Детский сад №2":{count:155},"Детский сад №22":{count:60},"Детский сад №24":{count:53},"Детский сад №25":{count:56},"Детский сад №27":{count:54},"Детский сад №29":{count:57},"Детский сад №3":{count:129},"Детский сад №33":{count:55},"Детский сад №4":{count:86},"Детский сад №5":{count:106},"Детский сад №6":{count:93},"Детский сад №7":{count:98},"Детский сад №8":{count:80},"Детский сад №9":{count:80},"Дитячий садок":{count:58},"Сказка":{count:52},"Солнышко":{count:99},"Теремок":{count:59},"საბავშვო ბაღი":{count:69},"中央保育所":{count:56}},library:{"Biblioteca Comunale":{count:212},"Biblioteca comunale":{count:187},"Biblioteka Publiczna":{count:78},"Bibliothèque Municipale":{count:299},"Bibliothèque municipale":{count:247},"Bücherei":{count:113},"Central Library":{count:65},"Gemeindebücherei":{count:150},"Gminna Biblioteka Publiczna":{count:71},"Miejska Biblioteka Publiczna":{count:66},"Médiathèque":{count:287},"Městská knihovna":{count:60},"Public Library":{count:91},Stadtbibliothek:{count:232},"Stadtbücherei":{count:289},"Городская библиотека":{count:69},"Детская библиотека":{count:260},"Центральная библиотека":{count:83},"Центральная городская библиотека":{count:61},"图书馆":{count:65}},pharmacy:{"36.6":{count:57},"Adler-Apotheke":{count:375},"Alte Apotheke":{count:99},"Apollo Pharmacy":{count:87},Apotek:{count:62},"Apotek Hjärtat":{count:51},"Apotheke am Markt":{count:83},"Bahnhof Apotheke":{count:51},"Bahnhof-Apotheke":{count:90},"Bartell Drugs":{count:53},Benavides:{count:83},Benu:{count:61},Boots:{count:1348},Botica:{count:118},"Brunnen-Apotheke":{count:77},"Burg-Apotheke":{count:76},"Bären-Apotheke":{count:111},CVS:{count:3228},Camelia:{count:54},Catena:{count:112},"Chemist Warehouse":{count:82},Clicks:{count:123},"Cruz Azul":{count:97},"Cruz Verde":{count:223},"Dbam o Zdrowie":{count:68},"Dr. Max":{count:324},"Droga Raia":{count:152},"Drogaria São Paulo":{count:87},Drogasil:{count:157},"Duane Reade":{count:91},Eczane:{count:88},"Engel-Apotheke":{count:143},"Eurovaistinė":{count:89},Familiprix:{count:70},Farmacenter:{count:65},"Farmacia Centrale":{count:61},"Farmacia Comunale":{count:196},"Farmacia Guadalajara":{count:146},"Farmacia del Ahorro":{count:65},"Farmacias Ahumada":{count:182},"Farmacias Cruz Azul":{count:134},"Farmacias Cruz Verde":{count:162},"Farmacias Económicas":{count:63},"Farmacias Guadalajara":{count:107},"Farmacias SalcoBrand":{count:140},"Farmacias Sana Sana":{count:111},"Farmacias Similares":{count:137},"Farmacias del Ahorro":{count:187},Farmacity:{count:191},Farmahorro:{count:53},Farmatodo:{count:165},Felicia:{count:56},Fybeca:{count:52},"Generika Drugstore":{count:52},"Gintarinė vaistinė":{count:121},Guardian:{count:71},"Gyógyszertár":{count:59},"H-E-B Pharmacy":{count:239},"Hirsch-Apotheke":{count:180},"Hubertus Apotheke":{count:120},Inkafarma:{count:234},"Jean Coutu":{count:132},"Kinney Drugs":{count:74},"Kur-Apotheke":{count:52},"Linden-Apotheke":{count:224},Ljekarna:{count:77},"Lloyds Pharmacy":{count:539},"Lékárna":{count:52},"Löwen-Apotheke":{count:397},"Marien-Apotheke":{count:370},"Markt-Apotheke":{count:207},"Mercury Drug":{count:584},Mifarma:{count:195},"Mēness aptieka":{count:64},"Neue Apotheke":{count:129},"Pague Menos":{count:74},Panvel:{count:77},"Park-Apotheke":{count:54},"Pharmacie Centrale":{count:218},"Pharmacie Principale":{count:62},"Pharmacie de l'Hôtel de Ville":{count:52},"Pharmacie de la Gare":{count:114},"Pharmacie de la Mairie":{count:71},"Pharmacie de la Poste":{count:68},"Pharmacie du Centre":{count:154},"Pharmacie du Marché":{count:110},"Pharmacie du Parc":{count:60},Pharmaprix:{count:99},Pharmasave:{count:129},"Punkt Apteczny":{count:53},"Rathaus-Apotheke":{count:181},"Rats-Apotheke":{count:126},Rexall:{count:109},"Rite Aid":{count:1481},"Rose Pharmacy":{count:99},"Rosen-Apotheke":{count:205},"Rowlands Pharmacy":{count:127},SalcoBrand:{count:112},"Sana Sana":{count:95},"Schloss-Apotheke":{count:62},Sensiblu:{count:115},"Shoppers Drug Mart":{count:713},"Sonnen-Apotheke":{count:372},"South Star Drug":{count:69},"Stadt-Apotheke":{count:397},"Stern-Apotheke":{count:83},Superdrug:{count:177},"São João":{count:54},"The Generics Pharmacy":{count:211},Uniprix:{count:63},Walgreens:{count:3314},"Walgreens Pharmacy":{count:76},"Walmart Pharmacy":{count:99},Watsons:{count:110},"Well Pharmacy":{count:61},"centro naturista":{count:123},"А5":{count:94},"Айболит":{count:88},"Аптека 36,6":{count:285},"Аптека низких цен":{count:65},"Аптека низьких цін":{count:88},"Аптека от склада":{count:83},"Аптека №1":{count:92},"Аптечный пункт":{count:285},"Арніка":{count:124},"Бережная аптека":{count:67},"Будь здоров":{count:63},"Вита":{count:140},"Горздрав":{count:395},"Живика":{count:105},"Здоровье":{count:87},"Имплозия":{count:84},"Классика":{count:102},"Ладушка":{count:53},"Мед-сервіс":{count:59},"Мелодия здоровья":{count:60},"Невис":{count:151},"Норма":{count:89},"Озерки":{count:54},"Панацея":{count:68},"Первая помощь":{count:132},"Планета здоровья":{count:140},"Радуга":{count:139},"Ригла":{count:215},"Семейная":{count:52},"Социальная аптека":{count:62},"Столички":{count:83},"Фармакопейка":{count:85},"Фармакор":{count:106},"Фармация":{count:187},"Фармленд":{count:108},"Центральная аптека":{count:57},"סופר-פארם":{count:93},"داروخانه":{count:264},"داروخانه شبانه روزی":{count:54},"صيدلية":{count:148},"くすりの福太郎":{count:51},"さくら薬局":{count:52},"ウエルシア":{count:84},"カワチ薬品":{count:52},"クリエイト":{count:53},"サンドラッグ":{count:130},"スギ薬局":{count:134},"セイジョー":{count:58},"ツルハドラッグ":{count:185},"ドラッグてらしま (Drug Terashima)":{count:58},"マツモトキヨシ":{count:221},"丁丁藥局":{count:75}},pub:{"Black Bull":{count:55},"Commercial Hotel":{count:62},"Cross Keys":{count:64},"Irish Pub":{count:107},"Kings Arms":{count:81},"Kings Head":{count:65},"New Inn":{count:100},"Prince of Wales":{count:89},"Queens Head":{count:55},"Red Lion":{count:201},"Rose & Crown":{count:63},"Rose and Crown":{count:82},"Royal Hotel":{count:64},"Royal Oak":{count:172},"The Albion":{count:51},"The Anchor":{count:68},"The Angel":{count:55},"The Beehive":{count:52},"The Bell":{count:128},"The Bell Inn":{count:58},"The Black Horse":{count:100},"The Bull":{count:82},"The Castle":{count:63},"The Chequers":{count:74},"The Cricketers":{count:56},"The Cross Keys":{count:58},"The Crown":{count:252},"The Crown Inn":{count:88},"The Fox":{count:76},"The George":{count:119},"The Green Man":{count:59},"The Greyhound":{count:99},"The Kings Arms":{count:65},"The Kings Head":{count:68},"The New Inn":{count:126},"The Plough":{count:182},"The Plough Inn":{count:57},"The Queens Head":{count:61},"The Railway":{count:112},"The Red Lion":{count:271},"The Rising Sun":{count:74},"The Royal Oak":{count:223},"The Ship":{count:92},"The Ship Inn":{count:98},"The Star":{count:72},"The Star Inn":{count:53},"The Sun Inn":{count:51},"The Swan":{count:155},"The Swan Inn":{count:59},"The Victoria":{count:72},"The Wheatsheaf":{count:126},"The White Hart":{count:247},"The White Horse":{count:234},"The White Lion":{count:75},"The White Swan":{count:55},"魚民":{count:119},"鳥貴族":{count:57}},restaurant:{Adler:{count:228},Adria:{count:60},"Adyar Ananda Bhavan":{count:60},Akropolis:{count:212},"Ali Baba":{count:59},"Alte Post":{count:68},"Applebee's":{count:977},Asia:{count:78},Athen:{count:75},Athos:{count:61},Autogrill:{count:60},Bahnhof:{count:56},"Bella Italia":{count:194},"Bella Napoli":{count:88},"Big Boy":{count:58},Bistro:{count:64},"Bob Evans":{count:269},"Bonefish Grill":{count:73},"Boston Market":{count:91},"Boston Pizza":{count:278},"Buffalo Grill":{count:282},"Buffalo Wild Wings":{count:454},"Bären":{count:75},Cafeteria:{count:65},"California Pizza Kitchen":{count:116},Campanile:{count:55},Canteen:{count:91},Capri:{count:56},"Captain D's":{count:54},"Carluccio's":{count:57},"Carpe Diem":{count:60},"Carrabba's Italian Grill":{count:62},"Casa Mia":{count:64},Casablanca:{count:61},"Cheesecake Factory":{count:52},Chifa:{count:86},"Chili's":{count:698},"China Buffet":{count:54},"China Garden":{count:114},"China House":{count:72},"China Town":{count:117},"China Wok":{count:100},Chiquito:{count:55},"Chuck E. Cheese's":{count:54},"Cici's Pizza":{count:51},"CoCo壱番屋":{count:77},"Cold Stone Creamery":{count:67},Comedor:{count:60},"Comida China":{count:52},Courtepaille:{count:170},"Cracker Barrel":{count:392},"Da Grasso":{count:63},"Da Vinci":{count:88},Delphi:{count:105},"Denny's":{count:850},"Deutsches Haus":{count:93},Dionysos:{count:75},"Dolce Vita":{count:121},Dorfkrug:{count:60},"Dunkin' Donuts":{count:94,tags:{cuisine:"donut"}},"East Side Mario's":{count:53},"El Greco":{count:112},"El Paso":{count:60},"El Rancho":{count:82},Europa:{count:61},"Famous Dave's":{count:62},"Firehouse Subs":{count:85},"Five Guys":{count:91},Flunch:{count:179},"Frankie & Benny's":{count:151},"Friendly's":{count:113},"Gasthaus Krone":{count:93},"Gasthaus zur Linde":{count:59},"Gasthof zur Post":{count:109},"Golden Corral":{count:209},"Golden Dragon":{count:62},"Great Wall":{count:54},"Grüner Baum":{count:122},Gusto:{count:74},"Hard Rock Cafe":{count:96},"Hardee's":{count:56,tags:{cuisine:"burger"}},Harvester:{count:75},Hellas:{count:66},Hippopotamus:{count:115},Hirsch:{count:83},Hirschen:{count:86},"Hong Kong":{count:126},Hooters:{count:190},IHOP:{count:758},"IL Патио":{count:51},"Jason's Deli":{count:73},"Jimmy John's":{count:150,tags:{cuisine:"sandwich"}},"Joe's Crab Shack":{count:70},"Jägerhof":{count:54},Kantine:{count:104},"Kelsey's":{count:66},Kirchenwirt:{count:94},Kreta:{count:70},Kreuz:{count:85},Krone:{count:179},Kudu:{count:172},"L'Escale":{count:66},"L'Osteria":{count:80},"La Bodega":{count:55},"La Boucherie":{count:80},"La Cantina":{count:105},"La Casa":{count:66},"La Casona":{count:62},"La Dolce Vita":{count:129},"La Fontana":{count:62},"La Gondola":{count:60},"La Hacienda":{count:54},"La Pataterie":{count:116},"La Pergola":{count:87},"La Perla":{count:85},"La Piazza":{count:123},"La Piazzetta":{count:77},"La Place":{count:55},"La Scala":{count:62},"La Strada":{count:74},"La Tagliatella":{count:69},"La Tasca":{count:56},"La Taverna":{count:58},"La Terrasse":{count:82},"La Terraza":{count:56},"La Terrazza":{count:57},"La Trattoria":{count:91},Lamm:{count:69},Linde:{count:114},Lindenhof:{count:95},"Little Caesars":{count:80},"Little Chef":{count:62},"Little Italy":{count:90},"Logan's Roadhouse":{count:89},"LongHorn Steakhouse":{count:183},Lotus:{count:87},"Léon de Bruxelles":{count:63},"Löwen":{count:141},"MK Restaurants":{count:65},Maharaja:{count:52},"Mamma Mia":{count:130},Mandarin:{count:90},"Mang Inasal":{count:128},"Marco Polo":{count:62},"Marco's Pizza":{count:53},"McAlister's Deli":{count:51},Mediterraneo:{count:55},"Mellow Mushroom":{count:73},Mensa:{count:148},Milano:{count:77},"Mimi's Cafe":{count:52},"Moe's Southwest Grill":{count:79},Mykonos:{count:89},Mythos:{count:61},"Nando's":{count:412},"Noodles & Company":{count:106},"O'Charley's":{count:61},Oasis:{count:73},"Ocean Basket":{count:71},Ochsen:{count:94},"Old Chicago":{count:54},"Olive Garden":{count:504},Olympia:{count:86},Osaka:{count:52},"Outback Steakhouse":{count:399},"P.F. Chang's":{count:53},"Pancake House":{count:79},Panda:{count:52},"Panera Bread":{count:582},Panorama:{count:102},"Papa Murphy's":{count:66},Parrilla:{count:62},Peking:{count:68},Perkins:{count:157},Pinocchio:{count:63},"Pizza Express":{count:417},"Pizza Factory":{count:59},"Pizza House":{count:56},"Pizza Hut":{count:2688,tags:{cuisine:"pizza"}},"Pizza Ranch":{count:77},"Pizzeria Italia":{count:65},"Pizzeria Milano":{count:51},"Pizzeria Napoli":{count:53},"Pizzeria Roma":{count:86},"Pizzeria Venezia":{count:54},"Poivre Rouge":{count:56},"Pollo Campero":{count:53},Pomodoro:{count:62},Portofino:{count:67},Poseidon:{count:145},Prezzo:{count:147},Qdoba:{count:81},"Qdoba Mexican Grill":{count:54},Ratskeller:{count:161},"Red Lobster":{count:419},"Red Robin":{count:312},"Restaurante Universitário":{count:53},Rhodos:{count:94},"Ristorante Del Arte":{count:160},Roma:{count:85},Rose:{count:51},"Round Table Pizza":{count:100},"Ruby Tuesday":{count:303},"Rössle":{count:54},"Rössli":{count:93},Saigon:{count:51},Sakura:{count:139},"San Marco":{count:88},Santorini:{count:59},"Schwarzer Adler":{count:65},"Schützenhaus":{count:151},"Shakey's":{count:64},Shalimar:{count:53},Shanghai:{count:96},"Shari's":{count:75},"Shoney's":{count:55},Sizzler:{count:90},Sonic:{count:80,tags:{cuisine:"burger"}},Sonne:{count:121},Sphinx:{count:66},Sportheim:{count:113},Spur:{count:70},Starbucks:{count:54,tags:{cuisine:"coffee_shop"}},"Steak 'n Shake":{count:86,tags:{cuisine:"burger"}},Sternen:{count:85},Subway:{count:1108},"Sunset Grill":{count:55},Sushi:{count:88},"Sushi Bar":{count:68},"Swiss Chalet":{count:162},Syrtaki:{count:65},"TGI Friday's":{count:364},"Taj Mahal":{count:183},"Taste of India":{count:68},Taverna:{count:69},Telepizza:{count:109},"Texas Roadhouse":{count:232},"The Cheesecake Factory":{count:52},"Tim Hortons":{count:61},"Toby Carvery":{count:51},"Tony Roma's":{count:63},Toscana:{count:76},Trattoria:{count:70},Traube:{count:68},Vapiano:{count:136},Venezia:{count:68},"Village Inn":{count:149},Vips:{count:109},"Waffle House":{count:521},Wagamama:{count:111},"Waldschänke":{count:52},Warung:{count:73},Wasabi:{count:70},Wimpy:{count:66},"Zaxby's":{count:60},Zizzi:{count:102},Zorbas:{count:62},"Zum Hirschen":{count:52},"Zum Löwen":{count:80},"Zur Krone":{count:96},"Zur Linde":{count:228},"Zur Post":{count:125},"Zur Sonne":{count:77},"Евразия":{count:93},"Ресторан":{count:60},"Тануки":{count:62},"Якитория":{count:84},"رستوران":{count:72},"مطعم":{count:52},"すき家":{count:61,tags:{"name:en":"Sukiya"}},"はま寿司":{count:67},"びっくりドンキー":{count:120},"やよい軒":{count:71},"ガスト":{count:512,tags:{"name:en":"Gusto"}},"ココス":{count:142},"サイゼリア":{count:54},"サイゼリヤ":{count:285},"ジョイフル":{count:83},"ジョナサン":{count:139},"ジョリーパスタ":{count:75},"デニーズ":{count:199},"バーミヤン":{count:130},"ロイヤルホスト":{count:108},"丸亀製麺":{count:98},"八方雲集":{count:145},"吉野家":{count:61},"夢庵":{count:67},"大戸屋":{count:68},"大阪王将":{count:68},"天下一品":{count:70},"安楽亭":{count:60},"牛角":{count:107},"食堂":{count:63},"餃子の王将":{count:212},"바다횟집 (Bada Fish Restaurant)":{count:52}},school:{"Adolfo Lopez Mateos":{count:137},"Agustin Ya�ez":{count:57},"Albert-Schweitzer-Schule":{count:81},"Amado Nervo":{count:85},"Astrid-Lindgren-Schule":{count:77},"Benito Juarez":{count:294},"Brown School":{count:54},CEM:{count:215},"Center School":{count:115},"Central Elementary School":{count:179},"Central High School":{count:130},"Central School":{count:215},"Colegio San José":{count:74},"Collège Jean Moulin":{count:68},"Collège privé Saint-Joseph":{count:60},Cuauhtemoc:{count:152},"Curso Comunitario":{count:57},"Cursos Comunitarios":{count:116},EPP:{count:112},"Emiliano Zapata":{count:286},"Fairview Elementary School":{count:64},"Fairview School":{count:164},"Francisco I Madero":{count:86},"Francisco I. Madero":{count:52},"Francisco Villa":{count:116},"Franklin Elementary School":{count:96},"Franklin School":{count:126},"Garfield Elementary School":{count:69},"Garfield School":{count:58},"Gimnazjum nr 1":{count:59},"Government School":{count:60},"Gregorio Torres Quintero":{count:53},"Groupe Scolaire":{count:57},"Guadalupe Victoria":{count:58},"Highland School":{count:71},"Hillcrest Elementary School":{count:63},"Holy Cross School":{count:68},"Holy Family School":{count:77},"Holy Trinity School":{count:59},"Ignacio Allende":{count:51},"Ignacio Zaragoza":{count:98},"Immaculate Conception School":{count:83},"Jackson Elementary School":{count:53},"Jackson School":{count:56},"Jefferson Elementary School":{count:177},"Jefferson School":{count:108},"Jose Clemente Orozco":{count:59},"Jose Ma Morelos Y Pavon":{count:120},"Jose Vasconcelos":{count:73},"Josefa Ortiz De Dominguez":{count:78},"Juan Escutia":{count:121},"Justo Sierra":{count:118},Kumon:{count:66},"Lazaro Cardenas":{count:68},"Lazaro Cardenas Del Rio":{count:153},"Leona Vicario":{count:64},"Liberty Elementary School":{count:56},"Liberty School":{count:84},"Lincoln Elementary School":{count:264},"Lincoln School":{count:269},"Longfellow Elementary School":{count:55},"Longfellow School":{count:53},"Madison Elementary School":{count:55},"Manuel Lopez Cotilla":{count:107},"Maple Grove School":{count:51},"McKinley Elementary School":{count:62},"McKinley School":{count:63},"Miguel Hidalgo":{count:86},"Miguel Hidalgo Y Costilla":{count:213},"Miller School":{count:66},"Mount Pleasant School":{count:61},"Mount Zion School":{count:53},"Mountain View Elementary School":{count:52},"New Hope School":{count:51},"Nicolas Bravo":{count:58},"Ni�os Heroes":{count:155},"Nombre En Tramite":{count:126},"North Elementary School":{count:57},"Oak Grove School":{count:148},"Pedro Moreno":{count:69},Pestalozzischule:{count:84},"Pine Grove School":{count:63},"Pleasant Hill School":{count:110},"Pleasant Valley School":{count:85},"Pleasant View School":{count:61},"Primaria Comunitaria":{count:59},"Ramon Corona":{count:54},"Ricardo Flores Magon":{count:91},"Riverside School":{count:76},"Roosevelt Elementary School":{count:112},"Roosevelt School":{count:114},SD:{count:76},SDN:{count:290},"Sacred Heart School":{count:206},"Saint Francis School":{count:56},"Saint James School":{count:83},"Saint Johns School":{count:173},"Saint Joseph School":{count:147},"Saint Josephs School":{count:157},"Saint Kizito Primary School":{count:61},"Saint Mary School":{count:54},"Saint Marys School":{count:256},"Saint Patricks School":{count:80},"Saint Paul School":{count:53},"Saint Pauls School":{count:74},"Saint Peters School":{count:81},Schillerschule:{count:61},"School Number 1":{count:233},"School Number 2":{count:206},"School Number 3":{count:184},"School Number 4":{count:126},"Smith School":{count:60},"Sor Juana Ines De La Cruz":{count:56},"South Elementary School":{count:53},"Sunnyside School":{count:60},"Szkoła Podstawowa nr 1":{count:78},"Szkoła Podstawowa nr 2":{count:75},"Szkoła Podstawowa nr 3":{count:60},"Trinity School":{count:85},"UNIDAD EDUCATIVA":{count:106},"Union School":{count:128},"Valentin Gomez Farias":{count:71},"Venustiano Carranza":{count:64},"Vicente Guerrero":{count:159},Volkshochschule:{count:105},Volksschule:{count:366},"Washington Elementary School":{count:192},"Washington School":{count:213},"West Elementary School":{count:58},"White School":{count:51},"Wilson Elementary School":{count:66},"Wilson School":{count:80},"Általános iskola":{count:105},"École Jules Ferry":{count:51},"École Notre-Dame":{count:61},"École Saint-Joseph":{count:96},"École primaire Jean Jaurès":{count:71},"École primaire Jules Ferry":{count:82},"École primaire privée Notre-Dame":{count:69},"École primaire privée Saint-Joseph":{count:132},"École primaire privée Sainte-Marie":{count:63},"École élémentaire Jules Ferry":{count:52},"Școala Generală":{count:51},"Școală":{count:53},"Вечерняя школа":{count:53},"Гимназия №1":{count:96},"ДЮСШ":{count:63},"Средняя школа №1":{count:80},"Средняя школа №2":{count:86},"Средняя школа №3":{count:58},"Школа № 1":{count:130},"Школа № 2":{count:117},"Школа № 3":{count:80},"Школа № 4":{count:77},"Школа № 5":{count:55},"Школа №1":{count:576},"Школа №10":{count:167},"Школа №11":{count:148},"Школа №12":{count:136},"Школа №13":{count:129},"Школа №14":{count:123},"Школа №15":{count:129},"Школа №16":{count:99},"Школа №17":{count:117},"Школа №18":{count:111},"Школа №19":{count:98},"Школа №2":{count:509},"Школа №20":{count:100},"Школа №21":{count:72},"Школа №22":{count:72},"Школа №23":{count:75},"Школа №24":{count:78},"Школа №25":{count:57},"Школа №26":{count:64},"Школа №27":{count:58},"Школа №28":{count:53},"Школа №3":{count:393},"Школа №31":{count:55},"Школа №35":{count:54},"Школа №4":{count:281},"Школа №5":{count:275},"Школа №6":{count:217},"Школа №7":{count:215},"Школа №8":{count:188},"Школа №9":{count:183},"مدرسة":{count:92},"مدرسه":{count:500},"市立南中学校":{count:53},"市立南小学校":{count:56},"市立東中学校":{count:54}},social_facility:{"Safe Haven":{count:92},"Детский дом":{count:70},"Социальный участковый":{count:195}},theatre:{Amfiteatr:{count:97},Amphitheater:{count:110},Amphitheatre:{count:109},"Freilichtbühne":{count:78},"Teatro Comunale":{count:56}}};
23612 var leisure = {fitness_centre:{"Anytime Fitness":{count:143},"Gold's Gym":{count:61},"LA Fitness":{count:126},"Planet Fitness":{count:106},"Snap Fitness":{count:67}},playground:{"Çocuk Parkı":{count:60},"놀이터":{count:292}},sports_centre:{"Anytime Fitness":{count:152},"Complejo Municipal de Deportes":{count:88},"Complexe Sportif":{count:51},Curves:{count:91},"Fitness First":{count:70},"Gold's Gym":{count:82},"Kieser Training":{count:90},"LA Fitness":{count:72},"Life Time Fitness":{count:76},McFit:{count:60},"Mrs. Sporty":{count:76},Orlik:{count:82},"Pabellón Municipal de Deportes":{count:109},"Palestra Comunale":{count:81},"Planet Fitness":{count:106},"Salle Omnisport":{count:57},"Schützenhaus":{count:79},"Snap Fitness":{count:51},"Virgin Active":{count:69},YMCA:{count:174},"ДЮСШ":{count:82},"Ледовый дворец":{count:54},"体育館":{count:80}},swimming_pool:{Schwimmerbecken:{count:57},"Yüzme Havuzu":{count:51},"プール":{count:56},"游泳池":{count:55}}};
23613 var man_made = {windmill:{"De Hoop":{count:57}}};
23614 var shop = {alcohol:{Alko:{count:170},"BC Liquor Store":{count:66},BWS:{count:157},"Bargain Booze":{count:140},"Beer Store":{count:66},Botilleria:{count:121},"Dan Murphy's":{count:61},"Gall & Gall":{count:511},LCBO:{count:430},"Liquor Depot":{count:53},"Liquor Store":{count:72},Liquorland:{count:112},Mitra:{count:60},Nicolas:{count:253},SAQ:{count:169},Systembolaget:{count:271},"The Beer Store":{count:231},Vinmonopolet:{count:66},"Алкомаркет":{count:67},"Ароматный мир":{count:196},"Бристоль":{count:329},"Градус":{count:52},"Живое пиво":{count:182},"Красное & Белое":{count:989},"Кристалл":{count:56},"Норман":{count:146},"Отдохни":{count:75},"Пиво":{count:73},"Разливное пиво":{count:143}},baby_goods:{Aubert:{count:56},"Babies R Us":{count:80},BabyOne:{count:52},"西松屋":{count:53}},bakery:{AILI:{count:53},Anker:{count:85},Awiteks:{count:53},Backshop:{count:57},Backwerk:{count:161},Baguette:{count:72},"Bakers Delight":{count:75},"Bakker Bart":{count:97},Banette:{count:111},"Bäckerei Fuchs":{count:62},"Bäckerei Grimminger":{count:51},"Bäckerei Müller":{count:68},"Bäckerei Schmidt":{count:103},"Bäckerei Schneider":{count:52},Cooplands:{count:63},"Dat Backhus":{count:81},"Der Beck":{count:114},"Der Mann":{count:53},Ditsch:{count:70},"Dunkin' Donuts":{count:55,tags:{cuisine:"donut"}},Fornetti:{count:113},"Goeken backen":{count:53},Goldilocks:{count:124},Greggs:{count:613},Hofpfisterei:{count:134},Ihle:{count:108},"Julie's Bakeshop":{count:57},"K&U":{count:117},"K&U Bäckerei":{count:54},Kamps:{count:268},"La Mie Câline":{count:56},"Le Crobag":{count:54},"Le Fournil":{count:57},"Lila Bäcker":{count:107},"Lipóti Pékség":{count:54},"Marie Blachère":{count:89},Mlinar:{count:80},Musmanni:{count:81},Oebel:{count:65},Paul:{count:186},"Red Ribbon":{count:72},"Schäfer's":{count:146},Sehne:{count:91},"Stadtbäckerei":{count:60},Steinecke:{count:268},"Sternenbäck":{count:89},"Ströck":{count:62},"Wiener Feinbäcker":{count:55},"von Allwörden":{count:65},"Булочная":{count:71},"Горячий хлеб":{count:54},"Каравай":{count:56},"Кулиничи":{count:121},"Кулиничі":{count:59},"Свежий хлеб":{count:68},"Хлеб":{count:177},"مخبز":{count:72},"مخبزة":{count:55},"نان لواش":{count:54},"نانوایی":{count:665},"نانوایی بربری":{count:140},"نانوایی سنگک":{count:68},"نانوایی سنگکی":{count:52},"نانوایی لواش":{count:63}},beauty:{Marionnaud:{count:54},"Sally Beauty Supply":{count:151},"Yves Rocher":{count:654}},bed:{"Dänisches Bettenlager":{count:157},"Matratzen Concord":{count:361},"Mattress Firm":{count:173},"Sleepy's":{count:52}},beverages:{"50嵐":{count:101},Dursty:{count:77},"Edeka Getränkemarkt":{count:69},Fristo:{count:88},"Getränke Hoffmann":{count:187},"Getränkeland":{count:81},"Getränkemarkt":{count:110},"Orterer Getränkemarkt":{count:64},"Rewe Getränkemarkt":{count:256},Trinkgut:{count:112},"茶湯會":{count:56}},bicycle:{Giant:{count:52},Halfords:{count:158},"Веломарка":{count:51},"サイクルベースあさひ":{count:87}},bookmaker:{Betfred:{count:320},Coral:{count:466},Ladbrokes:{count:629},"Paddy Power":{count:127},"William Hill":{count:634},"ΟΠΑΠ":{count:102}},butcher:{"Boucherie Charcuterie":{count:51},"Carnicería":{count:78},"Fleischerei Richter":{count:51},"Húsbolt":{count:52},Macelleria:{count:84},Vinzenzmurr:{count:55},"Ариант":{count:84},"Великолукский мясокомбинат":{count:173},"Мясная лавка":{count:226},"Мясницкий ряд":{count:64},"Мясной":{count:53},"Мясо":{count:156},"Наша Ряба":{count:60},"Свежее мясо":{count:111}},car:{Audi:{count:191},BMW:{count:216},Chevrolet:{count:259},"Citroën":{count:445},Dacia:{count:56},Fiat:{count:167},Ford:{count:446},Honda:{count:348},Hyundai:{count:421},Isuzu:{count:66},Kia:{count:456},"Land Rover":{count:54},Lexus:{count:76},Mazda:{count:193},"Mercedes-Benz":{count:447},Mitsubishi:{count:176},"Mitsubishi Motors":{count:60},NISSAN:{count:51},Nissan:{count:424},Opel:{count:218},Peugeot:{count:527},Porsche:{count:97},Renault:{count:701},Seat:{count:90},Skoda:{count:143},Subaru:{count:118},Suzuki:{count:178},Toyota:{count:597},Volkswagen:{count:371},Volvo:{count:180}},car_parts:{"Advance Auto Parts":{count:306},AutoZone:{count:759},Brezan:{count:95},Halfords:{count:95},"NAPA Auto Parts":{count:250},"Napa Auto Parts":{count:61},"O'Reilly Auto Parts":{count:374},Repco:{count:77},"Tokić":{count:61},"repuestos automotrices":{count:56},"Автозапчастини":{count:61},"Автомир":{count:53},"イエローハット":{count:80},"オートバックス":{count:91},"タイヤ館":{count:83}},car_repair:{"A.T.U":{count:457},"Advance Auto Parts":{count:290},Borracharia:{count:56},"Bosch Car Service":{count:65},Carglass:{count:234},"Citroën":{count:108},Euromaster:{count:142},"Feu Vert":{count:178},Firestone:{count:224},"Firestone Complete Auto Care":{count:73},Ford:{count:61},"Garage Renault":{count:84},Gomeria:{count:153},"Gomería":{count:107},Goodyear:{count:97},"Grease Monkey":{count:57},Halfords:{count:56},"Jiffy Lube":{count:464},"Kwik Fit":{count:249},Lubricentro:{count:83},Meineke:{count:52},Mekonomen:{count:59},Midas:{count:462},"Mr. Lube":{count:56},"NAPA Auto Parts":{count:82},Norauto:{count:257},"O'Reilly Auto Parts":{count:227},"Pep Boys":{count:79},Peugeot:{count:152},"Pit Stop":{count:84},"Point S":{count:59},Renault:{count:294},Roady:{count:82},"Sears Auto Center":{count:59},Speedy:{count:192},"Stacja Kontroli Pojazdów":{count:70},Taller:{count:63},Toyota:{count:63},Valvoline:{count:52},"Valvoline Instant Oil Change":{count:92},Wulkanizacja:{count:84},"ÖAMTC":{count:52},"Автомастерская":{count:93},"Авторемонт":{count:57},"Автосервис":{count:799},"Автосервис+шиномонтаж":{count:66},"Вулканизация":{count:72},"Замена масла":{count:98},"СТО":{count:1058},"Шиномонтаж":{count:3591},"шиномонтаж":{count:173}},carpet:{"Carpet Right":{count:111},Carpetright:{count:53}},charity:{"Age UK":{count:116},"Barnardo's":{count:56},"British Heart Foundation":{count:189},"Cancer Research UK":{count:129},Goodwill:{count:120},Oxfam:{count:216},"Salvation Army":{count:63},Scope:{count:74},"Sue Ryder":{count:83}},chemist:{"7 Дней":{count:55},Bipa:{count:485},Budnikowsky:{count:114},CVS:{count:58},Etos:{count:486},Kruidvat:{count:1169},Matas:{count:74},"Müller":{count:350},Rossmann:{count:2516},Schlecker:{count:51},Teta:{count:120},Trekpleister:{count:185},Walgreens:{count:142},Watsons:{count:123},dm:{count:1877},"Бытовая химия":{count:73},"Магнит Косметик":{count:233},"Мила":{count:70},"Остров чистоты":{count:110},"Рубль Бум":{count:68},"Улыбка радуги":{count:110},"スギ薬局":{count:51},"丁丁藥局":{count:72},"屈臣氏":{count:134},"康是美":{count:81}},clothes:{AOKI:{count:119},AWG:{count:95},Ackermans:{count:98},Adidas:{count:224},Adler:{count:83},"American Apparel":{count:89},"American Eagle Outfitters":{count:93},Anthropologie:{count:55},Ardene:{count:55},"Armand Thiery":{count:89},"Banana Republic":{count:120},Benetton:{count:190},Bershka:{count:166},Bonita:{count:315},Bonobo:{count:59},"Brooks Brothers":{count:55},Burberry:{count:63},"Burlington Coat Factory":{count:104},Burton:{count:94},"C&A":{count:860},"Cache Cache":{count:59},"Calvin Klein":{count:78},Calzedonia:{count:264},"Camaïeu":{count:167},Caroll:{count:75},"Carter's":{count:64},Cecil:{count:119},Celio:{count:206},"Charles Vögele":{count:133},"Chico's":{count:96},Cropp:{count:68},Cubus:{count:65},Desigual:{count:175},Devred:{count:59},Didi:{count:72},Diesel:{count:77},"Dorothy Perkins":{count:85},"Dress Barn":{count:135},Dressmann:{count:67},"Eddie Bauer":{count:54},Edgars:{count:117},Engbers:{count:64},"Ernsting's family":{count:720},Esprit:{count:404},Etam:{count:121},Express:{count:56},"Fat Face":{count:82},"Forever 21":{count:124},Gant:{count:78},Gap:{count:258},"Gerry Weber":{count:220},"Gina Laura":{count:80},Goodwill:{count:65},Guess:{count:146},Gymboree:{count:60},"Gémo":{count:99},"H&M":{count:1467},Hallhuber:{count:63},House:{count:67},"Hugo Boss":{count:109},Humana:{count:83},"Hunkemöller":{count:224},Intimissimi:{count:173},JBC:{count:54},"Jack & Jones":{count:174},"Jack Wolfskin":{count:68},"Jeans Fritz":{count:110},Jennyfer:{count:81},Jet:{count:68},Jigsaw:{count:51},Jules:{count:120},Justice:{count:81},KappAhl:{count:68},KiK:{count:1862},Kiabi:{count:276},"La Halle":{count:148},Lacoste:{count:193},"Lane Bryant":{count:86},"Levi's":{count:197},Lindex:{count:120},Loft:{count:62},Mango:{count:339},"Marc O'Polo":{count:82},"Mark's":{count:76},"Marks & Spencer":{count:53},Marshalls:{count:218},"Massimo Dutti":{count:109},Matalan:{count:144},Maurices:{count:70},"Max Mara":{count:55},"Men's Wearhouse":{count:128},Mexx:{count:68},"Michael Kors":{count:55},Mim:{count:57},Monsoon:{count:75},"Mr Price":{count:99},NKD:{count:783},"New Look":{count:280},"New Yorker":{count:350},NewYorker:{count:54},Next:{count:313},Nike:{count:122},"Nordstrom Rack":{count:57},OVS:{count:92},"Okaïdi":{count:63},"Old Navy":{count:361},Only:{count:94},Orchestra:{count:117},"Original Marines":{count:60},Orsay:{count:168},Outfit:{count:51},Outlet:{count:63},Palmers:{count:78},Peacocks:{count:178},"Peek & Cloppenburg":{count:69},Pep:{count:139},Pepco:{count:153},"Petit Bateau":{count:67},Pimkie:{count:163},"Plato's Closet":{count:53},Primark:{count:177},Promod:{count:195},"Pull & Bear":{count:63},Puma:{count:65},Reitmans:{count:71},Reserved:{count:150},"River Island":{count:125},Ross:{count:363},Sela:{count:58},"Sergent Major":{count:77},Shoeby:{count:109},Sisley:{count:82},Springfield:{count:83},Stefanel:{count:63},Steps:{count:56},Stradivarius:{count:103},"Street One":{count:153},Superdry:{count:82},"TJ Maxx":{count:200},"TK Maxx":{count:209},Takko:{count:843},Talbots:{count:54},"Tally Weijl":{count:151},Tati:{count:64},Terranova:{count:63},Tesha:{count:76},Tezenis:{count:98},"The Children's Place":{count:71},"The North Face":{count:56},"The Sting":{count:53},Timberland:{count:87},"Toko Pakaian":{count:72},"Tom Tailor":{count:120},"Tommy Hilfiger":{count:206},Topshop:{count:62},Triumph:{count:132},Truworths:{count:72},"Ulla Popken":{count:117},Uniqlo:{count:63},"United Colors of Benetton":{count:210},"Urban Outfitters":{count:130},"Vero Moda":{count:222},"Victoria's Secret":{count:143},"Vögele":{count:191},WE:{count:68},Wibra:{count:99},Winners:{count:112},Woolworths:{count:119},Yamamay:{count:65},Zara:{count:540},Zeeman:{count:379},"mister*lady":{count:59},"s.Oliver":{count:103},"Детская одежда":{count:59},"Женская одежда":{count:65},"Липненски":{count:81},"Московская ярмарка":{count:51},"Одежда":{count:163},"Смешные цены":{count:86},"Спецодежда":{count:85},"しまむら":{count:213},"ユニクロ":{count:201},"ワークマン":{count:65},"洋服の青山":{count:242},"西松屋":{count:113}},coffee:{"Café Amazon":{count:212},Nespresso:{count:74},Starbucks:{count:264,tags:{cuisine:"coffee_shop"}},Tchibo:{count:197}},computer:{"Apple Store":{count:75},DNS:{count:234},"PC World":{count:59},"ДНС":{count:55}},confectionery:{"Fagyizó":{count:58},Hussel:{count:78},Leonidas:{count:84},"T. SN":{count:77},Thorntons:{count:66}},convenience:{"711":{count:64},"777":{count:58},"24 часа":{count:85},"7-Eleven":{count:11418},"8 à Huit":{count:82},"99 Speedmart":{count:85},ABC:{count:716},AMPM:{count:125},"Aibė":{count:112},Alepa:{count:60},Alfamart:{count:427},Alimentara:{count:63},Almacen:{count:405},"Almacén":{count:94},Aral:{count:93},BP:{count:273},"BP Shop":{count:70},Baqala:{count:181},"Best One":{count:57},"Best-One":{count:63},Biedronka:{count:98},Bodega:{count:83},Bonjour:{count:71},CBA:{count:299},COOP:{count:470},"COOP Jednota":{count:381},CU:{count:324},"Carrefour City":{count:91},"Carrefour Express":{count:255},"Casey's General Store":{count:225},"Casino Shop":{count:56},Centra:{count:139},"Central Convenience Store":{count:69},Chevron:{count:110},"Circle K":{count:790},Citgo:{count:73},"Co-Op":{count:54},"Co-op":{count:161},"Coles Express":{count:217},Coop:{count:492},"Coop Jednota":{count:128},"Corner Store":{count:109},Costcutter:{count:435},"Couche-Tard":{count:139},"Cumberland Farms":{count:109},"Daisy Mart":{count:57},Delikatesy:{count:148},"Delikatesy Centrum":{count:182},"Dollar General":{count:646},"Dollar Tree":{count:67},"Dépanneur":{count:53},Esso:{count:143},Express:{count:53},Extra:{count:86},Exxon:{count:51},"Family Dollar":{count:85},FamilyMart:{count:919},"Food Mart":{count:512},"Four Square":{count:99},Franprix:{count:96},Fresh:{count:67},Freshmarket:{count:224},GS25:{count:343},Groszek:{count:254},"Hasty Market":{count:87},Holiday:{count:67},"Hruška":{count:89},Indomaret:{count:483},Jednota:{count:66},Joker:{count:56},"K-Market":{count:104},Kangaroo:{count:54},"Kangaroo Express":{count:51},Kisbolt:{count:94},Konzum:{count:229},"Kum & Go":{count:127},"Kwik Trip":{count:134},Lawson:{count:311},Lewiatan:{count:565},"Lifestyle Express":{count:114},Londis:{count:505},"M&S Simply Food":{count:72},"Mac's":{count:295},Mace:{count:166},Magazin:{count:81},"Magazin Mixt":{count:139},"Magazin Non-Stop":{count:62},"Magazin mixt":{count:57},Marathon:{count:59},Maxikiosco:{count:86},"Małpka Express":{count:71},"McColl's":{count:289},Mercator:{count:122},Migrolino:{count:63},"Mini ABC":{count:77},"Mini Market":{count:1312},"Mini Market Non-Stop":{count:134},"Mini Mart":{count:78},"Mini Stop":{count:466},Minimercado:{count:77},"Mlin i pekare":{count:63},Mobil:{count:82},"Nasz Sklep":{count:92},Nisa:{count:70},"Nisa Local":{count:164},OK:{count:107},"OK-Mart":{count:51},"OK便利商店":{count:96},"OK便利店 Circle K":{count:92},Odido:{count:148},"On The Run":{count:53},"On the Run":{count:111},"One Stop":{count:294},Oxxo:{count:2261},"Parduotuvė":{count:102},"Petit Casino":{count:297},"Plaid Pantry":{count:69},Potraviny:{count:438},Prehrana:{count:88},Premier:{count:321},Proxi:{count:249},"Proxy":{count:53},Pulperia:{count:56},"Pulpería":{count:51},QuikTrip:{count:161},"Rite Aid":{count:72},"Royal Farms":{count:90},"Sainsbury's Local":{count:208},Sale:{count:89},"Sari-sari Store":{count:82},Select:{count:133},Sheetz:{count:137},Shell:{count:479},"Shell Select":{count:71},"Shop & Go":{count:80},Siwa:{count:157},"Sklep spożywczy":{count:151},"Smíšené zboží":{count:57},Spar:{count:1472},Speedway:{count:108},"Społem":{count:199},"Spätkauf":{count:60},Statoil:{count:62},"Stewart's":{count:255},Stores:{count:70},Stripes:{count:63},Studenac:{count:113},Sunkus:{count:51},Sunoco:{count:65},"Słoneczko":{count:61},"TESCO Lotus Express":{count:55},Tchibo:{count:75},Tesco:{count:54},"Tesco Express":{count:661},"Tesco Lotus Express":{count:107},"The Co-operative Food":{count:341},"Tom Market 89":{count:232},Total:{count:172},"United Dairy Farmers":{count:55},Utile:{count:63},Valero:{count:71},Vegyesbolt:{count:391},"Večerka":{count:131},Vival:{count:381},Volg:{count:149},Wawa:{count:279},Weltladen:{count:64},"Woolworths Petrol":{count:97},abc:{count:374},ampm:{count:152},"best-one":{count:52},odido:{count:77},"Élelmiszer":{count:59},"Élelmiszerbolt":{count:65},"Żabka":{count:1656},"Žabka":{count:61},"АТБ":{count:56},"Августина":{count:52},"Авоська":{count:115},"Агрокомплекс":{count:79},"Альянс":{count:51},"Апельсин":{count:72},"Ассорти":{count:118},"Белорусские продукты":{count:58},"Берёзка":{count:193},"Везунчик":{count:66},"Верный":{count:61},"Весна":{count:101},"Ветеран":{count:56},"Визит":{count:99},"Виктория":{count:164},"ВкусВилл":{count:131},"Гастроном":{count:383},"Гермес":{count:68},"Гроздь":{count:52},"Гурман":{count:92},"Дикси":{count:270},"Домашний":{count:77},"Евроопт":{count:152},"Елена":{count:68},"Ермолино":{count:51},"КазМунайГаз":{count:117},"Калинка":{count:61},"Каравай":{count:52},"Квартал":{count:57},"Кировский":{count:86},"Колобок":{count:51},"Колосок":{count:58},"Копеечка":{count:99},"Копейка":{count:65},"Корзинка":{count:54},"Крамниця":{count:64},"Кристалл":{count:57},"Кулинария":{count:134},"Купец":{count:64},"Ласточка":{count:51},"Лидер":{count:60},"Любимый":{count:84},"Люкс":{count:59},"Магазин при АЗС":{count:54},"Магнит":{count:1991},"Магнолия":{count:88},"Мария-Ра":{count:197},"Маяк":{count:76},"Меркурий":{count:77},"Мечта":{count:103},"Минимаркет":{count:424},"Мираж":{count:56},"Монетка":{count:165},"Надежда":{count:115},"Ника":{count:57},"Оазис":{count:57},"Олимп":{count:51},"Перекресток":{count:157},"Подсолнух":{count:69},"Престиж":{count:58},"Продукти":{count:1446},"Продуктовый":{count:307},"Продуктовый магазин":{count:803},"Продукты":{count:8416},"Продукты 24":{count:65},"Пятёрочка":{count:1324},"Радуга":{count:165},"Родны кут":{count:90},"Ромашка":{count:83},"Русь":{count:61},"Светлана":{count:96},"Сказка":{count:62},"Смак":{count:151},"Солнечный":{count:54},"Солнышко":{count:54},"Татьяна":{count:68},"Теремок":{count:105},"Тройка":{count:62},"У Палыча":{count:69},"Универсам":{count:153},"Фортуна":{count:97},"Хороший":{count:55},"Центральный":{count:73},"Чайка":{count:57},"Шанс":{count:60},"Эконом":{count:72},"Юбилейный":{count:56},"Юлия":{count:58},"продукты":{count:157},"მარკეტი":{count:134},"მარკეტი (Market)":{count:71},"サンクス":{count:970,tags:{"name:en":"Sunkus"}},"サークルK":{count:1109,tags:{"name:en":"Circle K"}},"スリーエフ":{count:228},"セイコーマート":{count:449},"セブン-イレブン":{count:7859,tags:{"name:en":"7-Eleven"}},"セブンイレブン(Seven-Eleven)":{count:332},"セーブオン":{count:71},"デイリーヤマザキ":{count:421},"ファミリーマート":{count:4457,tags:{"name:en":"FamilyMart"}},"ポプラ":{count:101},"ミニストップ":{count:773,tags:{"name:en":"MINISTOP"}},"ヤマザキショップ":{count:106},"ローソン":{count:4247,tags:{"name:en":"Lawson"}},"ローソンストア100":{count:272},"全家":{count:482},"全家便利商店":{count:833},"萊爾富":{count:405},"세븐일레븐":{count:157}},copyshop:{"FedEx Office":{count:53},"FedEx Office Print and Ship Center":{count:170}},cosmetics:{Douglas:{count:58},Lush:{count:80},Marionnaud:{count:55},Sephora:{count:184},"The Body Shop":{count:95},"Yves Rocher":{count:111},"Л'Этуаль":{count:111},"Магнит Косметик":{count:116},"Магнит косметик":{count:63},"Магнит-Косметик":{count:55},"Мила":{count:68},"Подружка":{count:51}},craft:{"Hobby Lobby":{count:96},Michaels:{count:222}},deli:{"ほっともっと":{count:58}},department_store:{Argos:{count:90},"Bed Bath & Beyond":{count:72},"Big Lots":{count:142},"Big W":{count:120},"Canadian Tire":{count:176},Coppel:{count:55},Debenhams:{count:118},"Dillard's":{count:86},"Dollar General":{count:62},"Dollar Tree":{count:64},"El Corte Inglés":{count:61},"Family Dollar":{count:76},"Fred Meyer":{count:51},"Galeria Kaufhof":{count:60},HEMA:{count:248},"Harvey Norman":{count:62},JCPenney:{count:365},Karstadt:{count:66},Kmart:{count:390},"Kohl's":{count:371},"Lojas Americanas":{count:63},"Macy's":{count:292},"Marks & Spencer":{count:136},Marshalls:{count:58},Myer:{count:51},Nordstrom:{count:54},"Sam's Club":{count:103},Sears:{count:462},Shopko:{count:65},Target:{count:1104},"The Warehouse":{count:68},Walmart:{count:847},"Walmart Supercenter":{count:234},Woolworth:{count:153},"Магнит":{count:88},"Универмаг":{count:170}},doityourself:{"Ace Hardware":{count:300},"B&Q":{count:229},Bauhaus:{count:223},Biltema:{count:64},Brico:{count:126},"Bricomarché":{count:425},Bricorama:{count:117},"Bunnings Warehouse":{count:210},"Canadian Tire":{count:138},Castorama:{count:168},Easy:{count:53},Gamma:{count:133},"Globus Baumarkt":{count:52},Hagebaumarkt:{count:132},Hellweg:{count:70},"Home Depot":{count:1345},"Home Hardware":{count:172},Homebase:{count:205},Hornbach:{count:134},Hubo:{count:107},Karwei:{count:77},Lagerhaus:{count:116},"Leroy Merlin":{count:285},"Lowe's":{count:1236},Lowes:{count:95},Menards:{count:132},"Mr Bricolage":{count:112},"Mr.Bricolage":{count:139},OBI:{count:501},"Point P":{count:125},Praktiker:{count:54},Praxis:{count:61},Rona:{count:77},Screwfix:{count:80},"Sonderpreis Baumarkt":{count:68},Tekzen:{count:112},"Toom Baumarkt":{count:155},Weldom:{count:110},Wickes:{count:159},"Леруа Мерлен":{count:54},"Мастер":{count:59},"Сантехника":{count:51},"Строитель":{count:67},"Стройматериалы":{count:506},"Хозтовары":{count:137},"カインズホーム":{count:51},"コメリ":{count:137},"コーナン":{count:77}},dry_cleaning:{Cleaners:{count:103},Pressing:{count:58},"Диана":{count:88},"Химчистка":{count:73},"ホワイト急便":{count:136}},electronics:{"Apple Store":{count:63},BCC:{count:54},"Batteries Plus Bulbs":{count:74},Bell:{count:73},"Best Buy":{count:706},Boulanger:{count:71},Currys:{count:109},"Currys PC World":{count:70},DNS:{count:111},Darty:{count:168},Elektra:{count:64},Elgiganten:{count:67},Euronics:{count:247},Expert:{count:224},Hartlauer:{count:64},Interdiscount:{count:57},"La Curacao":{count:69},Maplin:{count:114},"Media Expert":{count:163},"Media Markt":{count:422},Musimundo:{count:53},Neonet:{count:97},"RTV Euro AGD":{count:68},"Radio Shack":{count:485},Rogers:{count:61},Samsung:{count:164},Saturn:{count:155},Sony:{count:51},"The Source":{count:91},Unieuro:{count:66},"М.Видео":{count:121},"Фокстрот":{count:76},"Эксперт":{count:70},"Эльдорадо":{count:313},"エディオン":{count:74},"ケーズデンキ":{count:136},"コジマ":{count:53},"ヤマダ電機":{count:162},"全國電子":{count:72},"燦坤3C":{count:52}},erotic:{Orion:{count:85}},fabric:{"Ткани":{count:121}},farm:{Hofladen:{count:63}},florist:{"Blume 2000":{count:94},"Blumen Risse":{count:69},Fleuriste:{count:54},Interflora:{count:78},"Monceau Fleurs":{count:69},"Virágbolt":{count:64},"Квіти":{count:86},"Цветочный магазин":{count:57},"Цветы":{count:1098}},frame:{"rumah penduduk":{count:316}},funeral_directors:{"The Co-operative Funeralcare":{count:82},"Ритуальные услуги":{count:133}},furniture:{"Aaron's":{count:57},"Black Red White":{count:79},Bodzio:{count:61},But:{count:162},Casa:{count:62},Conforama:{count:174},DFS:{count:52},"Dänisches Bettenlager":{count:464},Fly:{count:53},Harveys:{count:58},IKEA:{count:234},JYSK:{count:431},Kwantum:{count:54},"Leen Bakker":{count:72},"Pier 1 Imports":{count:95},Roller:{count:99},"The Brick":{count:68},"Меблі":{count:70},"ニトリ":{count:93}},garden_centre:{Dehner:{count:59},"Gamm Vert":{count:210},Jardiland:{count:124},"Point Vert":{count:68},Welkoop:{count:97},"Семена":{count:53}},gift:{"Card Factory":{count:116},Hallmark:{count:163},"Подарки":{count:56}},greengrocer:{"Frutería":{count:60},"Овощи и фрукты":{count:71}},hairdresser:{Berber:{count:71},"Cost Cutters":{count:69},"Fantastic Sams":{count:53},Figaro:{count:79},"First Choice Haircutters":{count:51},"Franck Provost":{count:136},Frizerie:{count:59},"Great Clips":{count:578},Haarmonie:{count:79},Haarscharf:{count:59},"Hair Cuttery":{count:121},Hairkiller:{count:73},"Jean Louis David":{count:90},"Jean-Louis David":{count:59},Klier:{count:239},Klipp:{count:76},"Le Salon":{count:55},"Marco Aldany":{count:55},"Peluquería":{count:165},"Salon fryzjerski":{count:52},"Sport Clips":{count:114},"Super Cuts":{count:55},Supercuts:{count:359},Tchip:{count:62},"The Barber Shop":{count:130},"Toni & Guy":{count:77},"Top Hair":{count:74},"Виктория":{count:53},"Елена":{count:53},"Локон":{count:67},"Парикмахерская":{count:798},"Перукарня":{count:119},"Салон красоты":{count:58},"Стиль":{count:94},"Шарм":{count:79},"حلاق":{count:65}},hardware:{"1000 мелочей":{count:125},"Ferretería":{count:295},"Harbor Freight Tools":{count:57},"Home Hardware":{count:94},"Lowe's":{count:74},Quincaillerie:{count:105},"True Value":{count:52},"Würth":{count:51},"Промтовары":{count:67},"Сантехника":{count:87},"Стройматериалы":{count:142},"Товары для дома":{count:69},"Хозтовары":{count:477}},hearing_aids:{Amplifon:{count:124},Geers:{count:66},"Kind Hörgeräte":{count:74},amplifon:{count:52}},hifi:{"Bang & Olufsen":{count:51}},houseware:{Blokker:{count:264},Marskramer:{count:72},Xenos:{count:119}},interior_decoration:{Casa:{count:65},Depot:{count:97}},jewelry:{"585":{count:94},Apart:{count:53},"Bijou Brigitte":{count:172},Christ:{count:116},"Claire's":{count:99},"Ernest Jones":{count:53},"H Samuel":{count:55},"James Avery Jewelry":{count:99},"Julien d'Orcel":{count:123},"Kay Jewelers":{count:78},Pandora:{count:280},Swarovski:{count:240},"Адамас":{count:60},"Золото":{count:51}},kiosk:{Aral:{count:76},Edicola:{count:94},Esso:{count:51},KIOS:{count:288},Kiosko:{count:62},Kiosque:{count:68},Kolporter:{count:88},"Lietuvos spauda":{count:62},Narvesen:{count:188},"Pressbyrån":{count:117},"Pulpería":{count:61},"R-Kioski":{count:352},Relay:{count:61},Ruch:{count:187},Shell:{count:122},"Tabak Trafik":{count:83},Tisak:{count:245},Trafik:{count:221},Trafika:{count:64},Trinkhalle:{count:98},Warung:{count:73},"Белсоюзпечать":{count:59},"Киоск":{count:143},"Продукты":{count:212},"Роспечать":{count:233},"Союзпечать":{count:94},"მარკეტი (Market)":{count:94}},kitchen:{Cuisinella:{count:60},"Home Utensils":{count:65}},laundry:{Launderette:{count:51},"Lavandería":{count:84},"コインランドリー":{count:64}},lottery:{"Loteria de la Provincia":{count:63},"Lotería Nacional":{count:221},"Lotería de la Provincia":{count:349},Lotto:{count:192},"Lottózó":{count:69},ONCE:{count:91}},mall:{"Торговый центр":{count:57}},massage:{"Massage Envy":{count:80}},medical_supply:{"Pofam-Poznań":{count:61}},mobile_phone:{"3 Store":{count:90},"AT&T":{count:558},Bell:{count:140},"Bitė":{count:66},"Boost Mobile":{count:151},"Carphone Warehouse":{count:357},Claro:{count:446},"Cricket Wireless":{count:73},Digicel:{count:152},EE:{count:190},MetroPCS:{count:201},Movistar:{count:411},O2:{count:527},Orange:{count:730},Personal:{count:54},Play:{count:150},Plus:{count:122},Rogers:{count:52},SFR:{count:156},Samsung:{count:71},Sprint:{count:394},"T-Mobile":{count:665},TIM:{count:67},Telcel:{count:52},Tele2:{count:186},Telekom:{count:148},"Telekom Shop":{count:99},Telenor:{count:99},Telus:{count:69},"The Phone House":{count:137},Three:{count:57},Tim:{count:51},"Télécentre":{count:76},Verizon:{count:152},"Verizon Wireless":{count:629},Vodafone:{count:1168},"Vodafone Shop":{count:52},Wind:{count:156},Yoigo:{count:61},au:{count:136},"auショップ":{count:340},"mobilcom debitel":{count:63},"Алло":{count:86},"Билайн":{count:441},"Евросеть":{count:1020},"Київстар":{count:57},"МТС":{count:1012},"Мегафон":{count:687},"Связной":{count:842},"Теле2":{count:70},"ソフトバンクショップ":{count:482},"ドコモショップ":{count:426}},money_lender:{"Money Mart":{count:95}},motorcycle:{"Harley Davidson":{count:81},Honda:{count:238},Suzuki:{count:90},Yamaha:{count:235}},music:{HMV:{count:81},TSUTAYA:{count:53}},musical_instrument:{"Guitar Center":{count:51}},newsagent:{Edicola:{count:111},Kolporter:{count:56},"Maison de la Presse":{count:132},Relay:{count:246},"Tabac Presse":{count:82},Trafika:{count:60},WHSmith:{count:160},"Белсоюзпечать":{count:52},"Витебскоблсоюзпечать":{count:56},"Первая полоса":{count:57},"Печать":{count:74},"Роспечать":{count:371},"Союзпечать":{count:130}},optician:{"Alain Afflelou":{count:204},Apollo:{count:441},Atol:{count:124},"Boots Opticians":{count:101},Fielmann:{count:477},"General Óptica":{count:53},"Grand Optical":{count:57},"Générale d'Optique":{count:94},"Hakim Optical":{count:73},"Hans Anders":{count:105},Krys:{count:192},"Les Opticiens Mutualistes":{count:103},"Optic 2000":{count:281},"Optical Center":{count:125},Pearle:{count:199},"Pearle Vision":{count:52},Specsavers:{count:384},"Sunglass Hut":{count:61},Synoptik:{count:55},"Vision Express":{count:183},"แว่นท็อปเจริญ":{count:97},"メガネスーパー":{count:62},"眼鏡市場":{count:206}},outdoor:{"Jack Wolfskin":{count:51},"Mountain Warehouse":{count:74},REI:{count:77},"Рыболов":{count:70}},paint:{"Benjamin Moore":{count:58},Comex:{count:68},Jotun:{count:51},"National Paints":{count:53},"Sherwin Williams":{count:323},"Sherwin-Williams Paints":{count:59}},pawnbroker:{"Cash Converters":{count:83},Lombard:{count:55},"Palawan Pawnshop":{count:52}},pet:{"Das Futterhaus":{count:158},Fressnapf:{count:620},"Global Pet Foods":{count:54},"Maxi Zoo":{count:65},"Pet Valu":{count:112},PetSmart:{count:491},Petco:{count:377},"Pets at Home":{count:170},"Бетховен":{count:60},"Зоотовары":{count:79},"Четыре лапы":{count:56}},second_hand:{Goodwill:{count:235},"Value Village":{count:53}},shoes:{Adidas:{count:51},Aldo:{count:74},Bata:{count:281},"Besson Chaussures":{count:124},Brantano:{count:132},CCC:{count:245},Camper:{count:51},Chaussea:{count:102},Clarks:{count:268},Converse:{count:58},Crocs:{count:64},DSW:{count:52},Deichmann:{count:1231},Dosenbach:{count:58},Ecco:{count:185},"Famous Footwear":{count:178},"Foot Locker":{count:240},Geox:{count:151},Kari:{count:66},"La Halle aux Chaussures":{count:158},Mephisto:{count:57},Minelli:{count:55},"New Balance":{count:52},Payless:{count:56},"Payless Shoe Source":{count:316},"Payless ShoeSource":{count:133},"Quick Schuh":{count:116},"Rack Room Shoes":{count:51},Reno:{count:233},Rieker:{count:83},Salamander:{count:103},"San Marina":{count:54},Scapino:{count:67},"Shoe Carnival":{count:66},"Shoe Zone":{count:161},"Siemes Schuhcenter":{count:69},Skechers:{count:83},Tamaris:{count:99},Timberland:{count:51},vanHaren:{count:98},"Éram":{count:88},"Ремонт обуви":{count:71},"ЦентрОбувь":{count:76},"Юничел":{count:73},"東京靴流通センター":{count:81}},sports:{Adidas:{count:132},Aktiesport:{count:61},"Big 5 Sporting Goods":{count:93},Decathlon:{count:409},"Dick's Sporting Goods":{count:222},Hervis:{count:66},Intersport:{count:737},"JD Sports":{count:58},Nike:{count:95},"Sport 2000":{count:209},"Sports Authority":{count:108},"Sports Direct":{count:217},"Спортмастер":{count:208},"Спорттовары":{count:68}},stationery:{"Bureau Vallée":{count:64},Libro:{count:73},McPaper:{count:158},"Office Depot":{count:378},"Office Max":{count:169},Officeworks:{count:73},Pagro:{count:64},Paperchase:{count:54},Ryman:{count:85},Staples:{count:671},"Канцтовары":{count:140}},supermarket:{"7-Eleven":{count:60},"A&O":{count:67},A101:{count:388},"AD Delhaize":{count:80},ADEG:{count:85},"Ahorramás":{count:66},Albert:{count:245},"Albert Heijn":{count:766},Albertsons:{count:316},Aldi:{count:6323},"Aldi Nord":{count:356},"Aldi Süd":{count:916},Alfamart:{count:109},Alimerka:{count:96},Alnatura:{count:97},Asda:{count:474},Atac:{count:53},"Atacadão":{count:80},Auchan:{count:229},BM:{count:52},Biedronka:{count:2348},"Big C":{count:53},Billa:{count:1592},Bim:{count:678},Biocoop:{count:159},"Bodega Aurrera":{count:264},Budgens:{count:77},"Bulk Barn":{count:54},Bunnpris:{count:69},CBA:{count:236},CONAD:{count:67},COOP:{count:255},"COOP Jednota":{count:177},CRAI:{count:66},CU:{count:64},Caprabo:{count:144},"Cargills Food City":{count:79},Carrefour:{count:2544},"Carrefour City":{count:349},"Carrefour Contact":{count:270},"Carrefour Express":{count:921},Centra:{count:63},"Centre Commercial E. Leclerc":{count:385},Checkers:{count:140},Chedraui:{count:80},"Co-Op":{count:62},"Co-op":{count:352},"Co-operative":{count:51},Coles:{count:583},Colmado:{count:103},Colruyt:{count:212},Combi:{count:127},"Comercial Mexicana":{count:59},Conad:{count:560},"Conad City":{count:95},Condis:{count:126},Consum:{count:236},Continente:{count:111},Coop:{count:1665},"Coop Extra":{count:88},"Coop Jednota":{count:101},"Coop Konsum":{count:96},"Costco Gasoline":{count:295},Costcutter:{count:93},Coto:{count:65},Countdown:{count:135},Coviran:{count:124},"Covirán":{count:51},Crai:{count:119},"Cub Foods":{count:57},"Dagli'Brugsen":{count:135},Deen:{count:55},Delhaize:{count:228},"Delikatesy Centrum":{count:209},Denner:{count:412},Despar:{count:209},"Despensa Familiar":{count:81},Dia:{count:1329},"Dia %":{count:181},"Dia Market":{count:60},Dino:{count:298},"Dirk van den Broek":{count:66},Disco:{count:74},Diska:{count:68},"Dollar General":{count:106},"Dollar Tree":{count:52},"Dunnes Stores":{count:72},"E-Center":{count:66},"E. Leclerc":{count:186},"E. Leclerc Drive":{count:97},EKO:{count:78},"EMTÉ":{count:74},Edeka:{count:2231},Ekom:{count:64},Ekono:{count:68},"El Árbol":{count:86},Eroski:{count:351},Esselunga:{count:106},EuroSpin:{count:81},Eurospar:{count:340},Eurospin:{count:328},Extra:{count:149},"Famiglia Cooperativa":{count:89},Famila:{count:167},"Family Dollar":{count:72},Fareway:{count:51},Farmfoods:{count:141},Feneberg:{count:64},"Food Basics":{count:116},"Food Lion":{count:425},Foodland:{count:192},Foodworks:{count:90},Franprix:{count:401},"Fred Meyer":{count:70},Freshmarket:{count:86},Froiz:{count:97},"Føtex":{count:74},G20:{count:71},GS25:{count:72},Gadis:{count:126},Game:{count:59},Giant:{count:276},"Giant Eagle":{count:134},"Grand Frais":{count:70},"Grocery Outlet":{count:128},"Géant Casino":{count:75},"H-E-B":{count:274},HIT:{count:64},Hannaford:{count:95},"Harris Teeter":{count:158},"Hemköp":{count:87},"Heron Foods":{count:55},Hofer:{count:484},Hoogvliet:{count:66},"Hruška":{count:54},"Hy-Vee":{count:121},ICA:{count:255},"ICA Kvantum":{count:51},IDEA:{count:52},IGA:{count:568},Iceland:{count:538},Indomaret:{count:124},"Intermarché":{count:1477},"Intermarché Contact":{count:122},"Intermarché Super":{count:261},Interspar:{count:117},Irma:{count:69},"Jewel-Osco":{count:72},Jumbo:{count:476},"K+K":{count:119},Kaufland:{count:1172},"King Soopers":{count:99},Kiwi:{count:178},Konsum:{count:144},Konzum:{count:370},Kroger:{count:627},Kvickly:{count:60},"La Vie Claire":{count:65},Landi:{count:54},"Leader Price":{count:502},"Leclerc Drive":{count:120},Lewiatan:{count:255},Lider:{count:78},Lidl:{count:8927},Londis:{count:52},Lupa:{count:79},"M&S Simply Food":{count:52},MPREIS:{count:187},Makro:{count:226},Markant:{count:98},"Market Basket":{count:57},Marktkauf:{count:117},Match:{count:139},Maxi:{count:198},"Maxi Dia":{count:52},Maxima:{count:111},"Maxima X":{count:158},"Maxima XX":{count:69},"Mega Image":{count:97},Mego:{count:52},Meijer:{count:129},Meny:{count:105},"Mercado Municipal":{count:52},"Mercado de Abastos":{count:57},Mercadona:{count:1228},Mercator:{count:155},Merkur:{count:132},Metro:{count:395},Migros:{count:641},Mila:{count:90},"Mini Market":{count:81},"Minipreço":{count:213},"Mix Markt":{count:60},Monoprix:{count:283},More:{count:61},Morrisons:{count:443},NORMA:{count:144},NP:{count:251},"Nah & Frisch":{count:107},Nahkauf:{count:324},Netto:{count:4429},"Netto Marken-Discount":{count:706},"New World":{count:89},"No Frills":{count:177},"Norfa XL":{count:66},Norma:{count:1162},Oxxo:{count:278},PENNY:{count:89},PLUS:{count:92},POLOmarket:{count:172},"Palí":{count:69},Pam:{count:77},Penny:{count:2819},"Penny Markt":{count:77},"Petit Casino":{count:146},"Pick n Pay":{count:268},"Piggly Wiggly":{count:103},"Pingo Doce":{count:308},"Piotr i Paweł":{count:112},"Plaza Vea":{count:68},Plodine:{count:67},Poiesz:{count:53},"Price Chopper":{count:132},Prix:{count:53},Profi:{count:203},Proxi:{count:75},"Proxy Delhaize":{count:63},Publix:{count:645},"Punto Simply":{count:54},Puregold:{count:75},"Pão de Açúcar":{count:76},QFC:{count:54},"REMA 1000":{count:89},Ralphs:{count:81},Real:{count:210},"Real Canadian Superstore":{count:69},"Reliance Fresh":{count:95},"Rema 1000":{count:394},Rewe:{count:2808},"Rewe City":{count:78},Rimi:{count:115},"S-Market":{count:110},Safeway:{count:619},"Sainsbury's":{count:595},"Sainsbury's Local":{count:248},"Sam's Club":{count:303},"Santa Isabel":{count:174},"Save-A-Lot":{count:100,tags:{shop:"supermarket"}},ShopRite:{count:53},Shoprite:{count:337},Sigma:{count:107},"Simply Market":{count:541},Sky:{count:113},"Smith's":{count:56},Sobeys:{count:186},Soriana:{count:194},Spar:{count:3381},"Społem":{count:120},"Sprouts Farmers Market":{count:71},Stokrotka:{count:227},"Stop & Shop":{count:147},"Super C":{count:57},"Super U":{count:654},SuperBrugsen:{count:183},SuperValu:{count:80},Superama:{count:51},Supersol:{count:51},Superspar:{count:54},Tegut:{count:118},Tengelmann:{count:155},Tesco:{count:1373},"Tesco Express":{count:566},"Tesco Extra":{count:200},"Tesco Lotus":{count:95},"Tesco Metro":{count:153},"The Co-operative":{count:79},"The Co-operative Food":{count:1261},Tommy:{count:56},Tottus:{count:82},"Trader Joe's":{count:345},"Treff 3000":{count:134},"U Express":{count:129},Unimarc:{count:256},Unimarkt:{count:104},Utile:{count:68},Vea:{count:67},Vival:{count:80},Volg:{count:231},Waitrose:{count:301},Walmart:{count:1164},"Walmart Neighborhood Market":{count:171},"Walmart Supercenter":{count:688},Wasgau:{count:51},Wegmans:{count:89},Wellcome:{count:51},"Whole Foods Market":{count:379,tags:{shop:"supermarket"}},Willys:{count:89},"WinCo Foods":{count:53},"Winn Dixie":{count:168},Woolworths:{count:816},"denn's Biomarkt":{count:147},fakta:{count:296},real:{count:58},tegut:{count:89},"Şok":{count:271},"ΑΒ Βασιλόπουλος":{count:82},"Γαλαξίας":{count:54},"Μασούτης":{count:85},"Σκλαβενίτης":{count:92},"АТБ":{count:618},"Абсолют":{count:51},"Авоська":{count:60},"Азбука Вкуса":{count:66},"Атак":{count:85},"Ашан":{count:80},"Верный":{count:226},"Виктория":{count:74},"Вопак":{count:59},"Гастроном":{count:54},"Гроздь":{count:63},"Десяточка":{count:52},"Дикси":{count:1670},"Евроопт":{count:201},"Карусель":{count:68},"Квартал":{count:77},"Кировский":{count:54},"Командор":{count:75},"Красный Яр":{count:58},"Лента":{count:165},"Магнит":{count:4289},"Магнолия":{count:121},"Мария-Ра":{count:159},"Монетка":{count:363},"Народная 7Я семьЯ":{count:199},"Перекресток":{count:501},"Покупочка":{count:73},"Полушка":{count:213},"Пятёрочка":{count:3622},"Радеж":{count:64},"Рукавичка":{count:78},"Светофор":{count:73},"Седьмой континент":{count:69},"Семейный":{count:52},"Семья":{count:85},"Супермаркет":{count:65},"Сільпо":{count:203},"Таврія‑В":{count:66},"Универсам":{count:77},"Фора":{count:162},"Фуршет":{count:86},"Хүнсний дэлгүүр":{count:63},"Эдельвейс":{count:55},"хүнсний дэлгүүр":{count:73},"بقالة":{count:74},"سوپر مارکت":{count:75},"سوپرمارکت":{count:79},"いなげや":{count:66},"まいばすけっと":{count:162},"イオン":{count:95},"イトーヨーカドー":{count:67},"カスミ":{count:56},"マックスバリュ":{count:143},"マルエツ":{count:99},"ライフ":{count:125},"全聯":{count:74},"全聯福利中心":{count:241},"惠康 Wellcome":{count:57},"業務スーパー":{count:176},"美廉社":{count:74},"西友":{count:137}},tailor:{"Atelier de couture":{count:63}},ticket:{"Boutique Grandes Lignes":{count:60},"Guichet Transilien":{count:243},"Касса":{count:61},"Проездные билеты":{count:65}},tobacco:{"Dohánybolt":{count:109},Estanco:{count:134},"Nemzeti Dohánybolt":{count:926},Tabacos:{count:62},"Табакерка":{count:73}},toys:{"Dráčik":{count:63},Intertoys:{count:242},"King Jouet":{count:102},"La Grande Récré":{count:112},"Maxi Toys":{count:63},"Toys R Us":{count:410,tags:{shop:"toys"}},"Детский мир":{count:186},"Игрушки":{count:95}},travel_agency:{"D-reizen":{count:64},"DER Reisebüro":{count:52},"First Reisebüro":{count:57},"Flight Centre":{count:159},Reiseland:{count:52},TUI:{count:262},"The Co-operative Travel":{count:58},"Thomas Cook":{count:298},Thomson:{count:144}},tyres:{Borracharia:{count:98},Bridgestone:{count:65},"Discount Tire":{count:94},Euromaster:{count:76},Firestone:{count:57},Gomeria:{count:71},"Les Schwab Tire Center":{count:59},Vianor:{count:52},"Вулканизация":{count:113},"Шиномонтаж":{count:419}},variety_store:{Action:{count:147},Bazar:{count:56},"Big Bazar":{count:60},"Big Lots":{count:65},"Dollar General":{count:345},"Dollar Tree":{count:753},Dollarama:{count:404},EuroShop:{count:59},"Family Dollar":{count:590},"Fix Price":{count:97},"Fix price":{count:127},FixPrice:{count:62},GiFi:{count:229},"Home Bargains":{count:68},"Mäc-Geiz":{count:59},NOZ:{count:82},Poundland:{count:197},Poundworld:{count:70},Tedi:{count:611},"ダイソー":{count:226}},video:{Blockbuster:{count:75},"Family Video":{count:113},TSUTAYA:{count:122},"World of Video":{count:53},"ゲオ":{count:81}},video_games:{"EB Games":{count:101},Game:{count:76},GameStop:{count:676},Micromania:{count:83}}};
23615 var tourism = {alpine_hut:{"КОШ":{count:105}},apartment:{"Двухкомнатная квартира на сутки":{count:52}},attraction:{Arch:{count:51},"Kursächsische Postmeilensäule":{count:54},Maibaum:{count:52},"Moab trail":{count:55},Moai:{count:702},"OWŚ":{count:102},Sommerrodelbahn:{count:54},"path contiunes":{count:75},"white blaze":{count:53},"Кладбище еврейское":{count:89},"Колесо обозрения":{count:69},"Приусадебный парк":{count:69},"Усадьба":{count:53},"Хозяйственный двор":{count:72},"Часовня":{count:64},"дольмен":{count:86}},camp_site:{"Camping Municipal":{count:198},"Camping municipal":{count:80}},guest_house:{Casa:{count:61},Home:{count:68},"OW \"Bielanka\"":{count:54}},hostel:{"Albergue de Peregrinos":{count:67},Hospedaje:{count:70},Hostal:{count:124}},hotel:{"B&B Hôtel":{count:104},"B&b Hôtel":{count:78},"Best Western":{count:242},Campanile:{count:145},"Central Hotel":{count:51},"City Hotel":{count:74},"Comfort Inn":{count:283},"Comfort Inn & Suites":{count:67},"Comfort Suites":{count:148},"Country Inn & Suites":{count:83},"Courtyard by Marriott":{count:155},"Crowne Plaza":{count:85},"Days Inn":{count:245},"Econo Lodge":{count:70},"Embassy Suites":{count:68},"Extended Stay America":{count:102},"Fairfield Inn":{count:60},"Fairfield Inn & Suites":{count:67},"Formule 1":{count:74},"Grand Hotel":{count:90},"Hampton Inn":{count:376},"Hampton Inn & Suites":{count:96},"Hilton Garden Inn":{count:183},"Holiday Inn":{count:411},"Holiday Inn Express":{count:479},"Holiday Inn Express & Suites":{count:72},"Homewood Suites":{count:61},"Hotel Central":{count:92},"Hotel Europa":{count:91},"Hotel Ibis":{count:67},"Hotel Krone":{count:58},"Hotel Panorama":{count:61},"Hotel Plaza":{count:62},"Hotel Post":{count:60},"Hotel Royal":{count:62},"Hotel Victoria":{count:71},"Hotel zur Post":{count:60},"Hôtel Ibis":{count:70},"Hôtel de France":{count:61},Ibis:{count:215},"Ibis Budget":{count:188},"Ibis Styles":{count:53},Krone:{count:68},Kyriad:{count:65},"La Quinta":{count:54},Marriott:{count:57},Mercure:{count:109},"Motel 6":{count:83},Novotel:{count:180},"Palace Hotel":{count:54},"Park Hotel":{count:88},Parkhotel:{count:64},"Premier Inn":{count:400},"Première Classe":{count:62},"Quality Inn":{count:178},"Quality Inn & Suites":{count:80},Ramada:{count:97},"Residence Inn":{count:89},"Royal Hotel":{count:94},Sheraton:{count:56},"Sleep Inn":{count:68},"Staybridge Suites":{count:54},"Super 8":{count:229},Travelodge:{count:284},"Гостиница":{count:166},"Уют":{count:58},"東横イン":{count:57}},motel:{"Best Western":{count:59},"Budget Inn":{count:76},"Comfort Inn":{count:131},"Days Inn":{count:103},"Econo Lodge":{count:117},"Motel 6":{count:214},"Quality Inn":{count:113},"Rodeway Inn":{count:102},"Super 8":{count:173},Travelodge:{count:68}},museum:{Heimatmuseum:{count:336},Stadtmuseum:{count:86},"Tájház":{count:93},"Краеведческий музей":{count:247},"Музей":{count:99}}};
23616 var dataSuggestions = {
23619 man_made: man_made,
23624 var dataAddressFormats = [{format:[["housenumber","street"],["city","postcode"]]},{countryCodes:["au"],format:[["unit","housenumber","street"],["suburb","state","postcode"]]},{countryCodes:["gb"],format:[["housename"],["housenumber","street"],["city","postcode"]]},{countryCodes:["ie"],format:[["housename"],["housenumber","street"],["city"],["postcode"]]},{countryCodes:["at","ch","de","si","pl"],format:[["street","housenumber"],["postcode","city"]]},{countryCodes:["ad","ba","be","cz","dk","es","fi","gr","hr","is","it","li","nl","no","pt","se","sk","sm","va"],format:[["street","housenumber","unit"],["postcode","city"]]},{countryCodes:["fr","lu","mo"],format:[["housenumber","street"],["postcode","city"]]},{countryCodes:["br"],format:[["street"],["housenumber","suburb"],["city","postcode"]]},{countryCodes:["vn"],format:[["housenumber","street"],["subdistrict"],["district"],["city"],["province","postcode"]]},{countryCodes:["ca"],format:[["housenumber","street","unit"],["city","province","postcode"]]},{countryCodes:["us"],format:[["housenumber","street","unit"],["city","state","postcode"]]},{countryCodes:["tw"],format:[["postcode","city","district"],["place","street"],["housenumber","floor","unit"]]},{countryCodes:["jp"],format:[["postcode","province","county"],["city","suburb"],["quarter","neighbourhood"],["block_number","housenumber"]],dropdowns:["postcode","province","county","city","suburb","quarter","neighbourhood","block_number"],widths:{postcode:0.3,province:0.35,county:0.35,city:0.65,suburb:0.35,quarter:0.5,neighbourhood:0.5,block_number:0.5,housenumber:0.5}},{countryCodes:["tr"],format:[["neighbourhood"],["street","housenumber"],["postcode","district","city"]]},{countryCodes:["ua"],format:[["housenumber","postcode"],["street"]]},{countryCodes:["cn"],format:[["postcode","province"],["city","district"],["street","housenumber"]]}];
23626 var dataDeprecated = [{old:{amenity:"firepit"},replace:{leisure:"firepit"}},{old:{barrier:"wire_fence"},replace:{barrier:"fence",fence_type:"chain"}},{old:{barrier:"wood_fence"},replace:{barrier:"fence",fence_type:"wood"}},{old:{highway:"ford"},replace:{ford:"yes"}},{old:{highway:"stile"},replace:{barrier:"stile"}},{old:{highway:"incline"},replace:{highway:"road",incline:"up"}},{old:{highway:"incline_steep"},replace:{highway:"road",incline:"up"}},{old:{highway:"unsurfaced"},replace:{highway:"road",incline:"unpaved"}},{old:{landuse:"wood"},replace:{landuse:"forest",natural:"wood"}},{old:{natural:"marsh"},replace:{natural:"wetland",wetland:"marsh"}},{old:{power_source:"*"},replace:{"generator:source":"$1"}},{old:{power_rating:"*"},replace:{"generator:output":"$1"}},{old:{shop:"organic"},replace:{shop:"supermarket",organic:"only"}}];
23628 var dataDiscarded = {created_by:true,odbl:true,"odbl:note":true,"tiger:upload_uuid":true,"tiger:tlid":true,"tiger:source":true,"tiger:separated":true,"geobase:datasetName":true,"geobase:uuid":true,"sub_sea:type":true,"KSJ2:ADS":true,"KSJ2:ARE":true,"KSJ2:AdminArea":true,"KSJ2:COP_label":true,"KSJ2:DFD":true,"KSJ2:INT":true,"KSJ2:INT_label":true,"KSJ2:LOC":true,"KSJ2:LPN":true,"KSJ2:OPC":true,"KSJ2:PubFacAdmin":true,"KSJ2:RAC":true,"KSJ2:RAC_label":true,"KSJ2:RIC":true,"KSJ2:RIN":true,"KSJ2:WSC":true,"KSJ2:coordinate":true,"KSJ2:curve_id":true,"KSJ2:curve_type":true,"KSJ2:filename":true,"KSJ2:lake_id":true,"KSJ2:lat":true,"KSJ2:long":true,"KSJ2:river_id":true,"SK53_bulk:load":true,"yh:LINE_NAME":true,"yh:LINE_NUM":true,"yh:STRUCTURE":true,"yh:TOTYUMONO":true,"yh:TYPE":true,"yh:WIDTH":true,"yh:WIDTH_RANK":true};
23630 var dataLocales = {af:{rtl:false},ar:{rtl:true},"ar-AA":{rtl:true},ast:{rtl:false},be:{rtl:false},bg:{rtl:false},bn:{rtl:false},bs:{rtl:false},ca:{rtl:false},ckb:{rtl:true},cs:{rtl:false},cy:{rtl:false},da:{rtl:false},de:{rtl:false},dv:{rtl:true},el:{rtl:false},"en-AU":{rtl:false},"en-GB":{rtl:false},eo:{rtl:false},es:{rtl:false},et:{rtl:false},eu:{rtl:false},fa:{rtl:true},fi:{rtl:false},fr:{rtl:false},gan:{rtl:false},gl:{rtl:false},gu:{rtl:false},he:{rtl:true},hi:{rtl:false},hr:{rtl:false},hu:{rtl:false},hy:{rtl:false},ia:{rtl:false},id:{rtl:false},is:{rtl:false},it:{rtl:false},ja:{rtl:false},jv:{rtl:false},km:{rtl:false},kn:{rtl:false},ko:{rtl:false},ku:{rtl:false},lij:{rtl:false},lt:{rtl:false},lv:{rtl:false},mg:{rtl:false},mk:{rtl:false},ml:{rtl:false},mn:{rtl:false},ms:{rtl:false},ne:{rtl:false},nl:{rtl:false},nn:{rtl:false},no:{rtl:false},nv:{rtl:false},pl:{rtl:false},pt:{rtl:false},"pt-BR":{rtl:false},rm:{rtl:false},ro:{rtl:false},ru:{rtl:false},sc:{rtl:false},si:{rtl:false},sk:{rtl:false},sl:{rtl:false},so:{rtl:false},sq:{rtl:false},sr:{rtl:false},sv:{rtl:false},ta:{rtl:false},te:{rtl:false},th:{rtl:false},tl:{rtl:false},tr:{rtl:false},uk:{rtl:false},ur:{rtl:true},vi:{rtl:false},yue:{rtl:false},zh:{rtl:false},"zh-CN":{rtl:false},"zh-HK":{rtl:false},"zh-TW":{rtl:false}};
23632 var dataPhoneFormats = {ag:"+1-268-555-1234",ai:"+1-264-555-1234",as:"+1-684-555-1234",at:"+43 1 123 45 67",bb:"+1-246-555-1234",bj:"+229 20 12 34 56",bm:"+1-441-555-1234",br:"+55 11 0982 1098",bs:"+1-242-555-1234",ca:"+1-226-555-1234",ci:"+225 20 12 34 56",cn:"+86 10 12345678",de:"+49 89 1234567",dm:"+1-767-555-1234","do":"+1-809-555-1234",es:"+34 989 12 34 56",fi:"+358 40 123 4567",fr:"+33 1 23 45 67 89",gb:"+44 1632 961234",gd:"+1-473-555-1234",gg:"+44 1632 961234",gu:"+1-671-555-1234",hk:"+852 1234 5678",hr:"+385 01 123 4567",hu:"+36 1 123 45 67",ie:"+353 20 912 3456",im:"+44 1632 961234",it:"+39 01 123 456",je:"+44 1632 961234",jm:"+1-876-555-1234",kn:"+1-869-555-1234",ky:"+1-345-555-1234",kz:"+7 495 1234567",lc:"+1-758-555-1234",mp:"+1-670-555-1234",ms:"+1-664-555-1234",nl:"+31 42 123 4567",no:"+47 22 12 34 56",pl:"+48 42 123 4567",pr:"+1-787-555-1234",pt:"+351 211 123456",ru:"+7 495 1234567",se:"+46 31 123 4567",si:"+386 31 123 4567",sj:"+47 22 12 34 56",sx:"+1-721-555-1234",tc:"+1-649-555-1234",tr:"+90 312 123 4567",tt:"+1-868-555-1234",tw:"+886 1 2345 6789",ua:"+380 44 123 4567",us:"+1-202-555-1234",va:"+39 01 123 456",vc:"+1-784-555-1234",vg:"+1-284-555-1234",vi:"+1-340-555-1234",vn:"+84 1 234 5678",za:"+27 11 907 1111"};
23634 var dataShortcuts = [{tab:"browsing",text:"shortcuts.browsing.title",columns:[{rows:[{section:"navigation",text:"shortcuts.browsing.navigation.title"},{shortcuts:["↓","↑","←","→"],text:"shortcuts.browsing.navigation.pan",separator:","},{modifiers:["⌘"],shortcuts:["↓","↑","←","→"],text:"shortcuts.browsing.navigation.pan_more",separator:","},{shortcuts:["+","-"],text:"shortcuts.browsing.navigation.zoom",separator:","},{modifiers:["⌘"],shortcuts:["+","-"],text:"shortcuts.browsing.navigation.zoom_more",separator:","},{section:"help",text:"shortcuts.browsing.help.title"},{shortcuts:["help.key"],text:"shortcuts.browsing.help.help"},{shortcuts:["shortcuts.toggle.key"],text:"shortcuts.browsing.help.keyboard"},{section:"display_options",text:"shortcuts.browsing.display_options.title"},{shortcuts:["background.key"],text:"shortcuts.browsing.display_options.background"},{modifiers:["⌘"],shortcuts:["background.key"],text:"shortcuts.browsing.display_options.background_switch"},{shortcuts:["map_data.key"],text:"shortcuts.browsing.display_options.map_data"},{modifiers:["⌃","⌘"],shortcuts:["F","F11"],text:"shortcuts.browsing.display_options.fullscreen"},{shortcuts:["area_fill.wireframe.key"],text:"shortcuts.browsing.display_options.wireframe"},{shortcuts:["background.minimap.key"],text:"shortcuts.browsing.display_options.minimap"}]},{rows:[{section:"selecting",text:"shortcuts.browsing.selecting.title"},{shortcuts:["Left-click"],text:"shortcuts.browsing.selecting.select_one"},{modifiers:["⇧"],shortcuts:["Left-click"],text:"shortcuts.browsing.selecting.select_multi"},{modifiers:["⇧"],shortcuts:["Left-click"],gesture:"shortcuts.gesture.drag",text:"shortcuts.browsing.selecting.lasso"},{modifiers:["⌘"],shortcuts:["F"],text:"shortcuts.browsing.selecting.search"},{section:"with_selected",text:"shortcuts.browsing.with_selected.title"},{shortcuts:["Right-click","shortcuts.key.space"],text:"shortcuts.browsing.with_selected.edit_menu"},{shortcuts:[],text:""},{section:"vertex_selected",text:"shortcuts.browsing.vertex_selected.title"},{shortcuts:["[","↖"],text:"shortcuts.browsing.vertex_selected.previous"},{shortcuts:["]","↘"],text:"shortcuts.browsing.vertex_selected.next"},{shortcuts:["{","⇞"],text:"shortcuts.browsing.vertex_selected.first"},{shortcuts:["}","⇟"],text:"shortcuts.browsing.vertex_selected.last"},{shortcuts:["\\","shortcuts.key.pause"],text:"shortcuts.browsing.vertex_selected.change_parent"}]}]},{tab:"editing",text:"shortcuts.editing.title",columns:[{rows:[{section:"drawing",text:"shortcuts.editing.drawing.title"},{shortcuts:["1"],text:"shortcuts.editing.drawing.add_point"},{shortcuts:["2"],text:"shortcuts.editing.drawing.add_line"},{shortcuts:["3"],text:"shortcuts.editing.drawing.add_area"},{shortcuts:["4"],text:"shortcuts.editing.drawing.add_note"},{shortcuts:["Left-click","shortcuts.key.space"],text:"shortcuts.editing.drawing.place_point"},{shortcuts:["⌥"],text:"shortcuts.editing.drawing.disable_snap"},{shortcuts:["↵","⎋"],text:"shortcuts.editing.drawing.stop_line"},{section:"commands",text:"shortcuts.editing.commands.title"},{modifiers:["⌘"],shortcuts:["C"],text:"shortcuts.editing.commands.copy"},{modifiers:["⌘"],shortcuts:["V"],text:"shortcuts.editing.commands.paste"},{modifiers:["⌘"],shortcuts:["Z"],text:"shortcuts.editing.commands.undo"},{modifiers:["⌘","⇧"],shortcuts:["Z"],text:"shortcuts.editing.commands.redo"},{modifiers:["⌘"],shortcuts:["S"],text:"shortcuts.editing.commands.save"}]},{rows:[{section:"operations",text:"shortcuts.editing.operations.title"},{shortcuts:["operations.continue.key"],text:"shortcuts.editing.operations.continue_line"},{shortcuts:["operations.merge.key"],text:"shortcuts.editing.operations.merge"},{shortcuts:["operations.disconnect.key"],text:"shortcuts.editing.operations.disconnect"},{shortcuts:["operations.detach_node.key"],text:"shortcuts.editing.operations.detach_node"},{shortcuts:["operations.split.key"],text:"shortcuts.editing.operations.split"},{shortcuts:["operations.reverse.key"],text:"shortcuts.editing.operations.reverse"},{shortcuts:["operations.move.key"],text:"shortcuts.editing.operations.move"},{shortcuts:["operations.rotate.key"],text:"shortcuts.editing.operations.rotate"},{shortcuts:["operations.orthogonalize.key"],text:"shortcuts.editing.operations.orthogonalize"},{shortcuts:["operations.circularize.key"],text:"shortcuts.editing.operations.circularize"},{shortcuts:["operations.reflect.key.long"],text:"shortcuts.editing.operations.reflect_long"},{shortcuts:["operations.reflect.key.short"],text:"shortcuts.editing.operations.reflect_short"},{modifiers:["⌘"],shortcuts:["⌫"],text:"shortcuts.editing.operations.delete"}]}]},{tab:"tools",text:"shortcuts.tools.title",columns:[{rows:[{section:"info",text:"shortcuts.tools.info.title"},{modifiers:["⌘"],shortcuts:["info_panels.key"],text:"shortcuts.tools.info.all"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.background.key"],text:"shortcuts.tools.info.background"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.history.key"],text:"shortcuts.tools.info.history"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.location.key"],text:"shortcuts.tools.info.location"},{modifiers:["⌘","⇧"],shortcuts:["info_panels.measurement.key"],text:"shortcuts.tools.info.measurement"}]}]}];
23636 var type$2 = "FeatureCollection";
23637 var features = [{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[1.97754,51.13111],[1.8457,63.45051],[-10.45898,57.01681],[-6.82251,55.26503],[-7.25583,55.06525],[-7.26546,55.0665],[-7.26992,55.06419],[-7.2725,55.06346],[-7.27818,55.05362],[-7.2893,55.04735],[-7.29939,55.0561],[-7.31835,55.04475],[-7.3447,55.05079],[-7.38831,55.02389],[-7.40547,55.00292],[-7.39157,54.99507],[-7.40075,54.98892],[-7.40706,54.98291],[-7.40363,54.97963],[-7.40633,54.97813],[-7.39835,54.97013],[-7.40745,54.96357],[-7.40178,54.95961],[-7.40727,54.95515],[-7.3944,54.94376],[-7.44444,54.93858],[-7.45216,54.89793],[-7.44204,54.87532],[-7.4713,54.83431],[-7.48092,54.83093],[-7.49216,54.82185],[-7.55121,54.79054],[-7.5443,54.78609],[-7.54958,54.75653],[-7.5349,54.74917],[-7.54881,54.74068],[-7.55941,54.74556],[-7.57894,54.74221],[-7.57507,54.7494],[-7.58606,54.75039],[-7.58872,54.74377],[-7.60031,54.74603],[-7.60632,54.74405],[-7.61662,54.74459],[-7.63593,54.75108],[-7.68854,54.72968],[-7.72064,54.72155],[-7.75094,54.70469],[-7.79094,54.71942],[-7.8051,54.71932],[-7.83497,54.73632],[-7.85419,54.72745],[-7.91496,54.67582],[-7.90174,54.66182],[-7.83832,54.63401],[-7.7433,54.6188],[-7.70863,54.63485],[-7.70682,54.6189],[-7.69386,54.6188],[-7.69631,54.61125],[-7.75845,54.59509],[-7.78708,54.58],[-7.79446,54.58141],[-7.79969,54.57704],[-7.79673,54.56915],[-7.8184,54.56315],[-7.83334,54.55227],[-7.82737,54.54299],[-7.85007,54.53363],[-7.90741,54.53722],[-7.93213,54.53388],[-8.00487,54.54568],[-8.03727,54.51162],[-8.04285,54.48759],[-8.08027,54.48829],[-8.09988,54.48395],[-8.09126,54.4765],[-8.111,54.47807],[-8.11512,54.46904],[-8.16542,54.46914],[-8.1776,54.46485],[-8.14293,54.45003],[-8.16284,54.4413],[-8.08731,54.4002],[-8.06062,54.37051],[-8.03289,54.35711],[-8.00054,54.34835],[-7.93333,54.30561],[-7.85849,54.29151],[-7.87067,54.28794],[-7.87265,54.26648],[-7.86123,54.25931],[-7.85917,54.21256],[-7.71043,54.20307],[-7.70193,54.20776],[-7.68828,54.202],[-7.67644,54.18906],[-7.66082,54.1871],[-7.62554,54.16545],[-7.62541,54.15319],[-7.61026,54.14353],[-7.57421,54.14142],[-7.57181,54.13287],[-7.56228,54.12704],[-7.51379,54.12998],[-7.47944,54.122],[-7.47169,54.12665],[-7.47075,54.13318],[-7.44684,54.15168],[-7.40792,54.156],[-7.42579,54.14092],[-7.41903,54.13629],[-7.3744,54.14172],[-7.37234,54.13881],[-7.39509,54.12624],[-7.39182,54.12017],[-7.36341,54.13157],[-7.34518,54.11577],[-7.32471,54.12123],[-7.32003,54.11379],[-7.3078,54.11718],[-7.30548,54.12347],[-7.31591,54.12697],[-7.31213,54.13162],[-7.3187,54.13411],[-7.31857,54.13745],[-7.32222,54.13836],[-7.32737,54.13544],[-7.3399,54.14585],[-7.30827,54.16716],[-7.30024,54.16625],[-7.29029,54.1715],[-7.28158,54.16839],[-7.2863,54.14919],[-7.29874,54.14904],[-7.30162,54.14411],[-7.28411,54.13971],[-7.29192,54.13071],[-7.29737,54.133],[-7.30883,54.13242],[-7.30333,54.12251],[-7.29218,54.11929],[-7.27844,54.12282],[-7.27707,54.12986],[-7.26613,54.13624],[-7.2566,54.16354],[-7.24015,54.17125],[-7.2575,54.17678],[-7.2581,54.19257],[-7.25179,54.19403],[-7.23608,54.1935],[-7.23338,54.19792],[-7.24317,54.20076],[-7.24892,54.1977],[-7.25183,54.20201],[-7.24119,54.20623],[-7.23094,54.20578],[-7.23269,54.20912],[-7.22188,54.21607],[-7.20643,54.2117],[-7.18506,54.22485],[-7.17055,54.21742],[-7.14721,54.22488],[-7.14633,54.23008],[-7.15051,54.23165],[-7.14613,54.23983],[-7.15802,54.24434],[-7.13985,54.25298],[-7.15255,54.26235],[-7.16064,54.27405],[-7.17991,54.27144],[-7.17201,54.28627],[-7.21252,54.2985],[-7.19888,54.31117],[-7.17918,54.30946],[-7.1812,54.3397],[-7.15339,54.33514],[-7.10253,54.35811],[-7.10811,54.36677],[-7.06927,54.3899],[-7.05593,54.41056],[-7.02898,54.42135],[-7.00198,54.40832],[-6.98683,54.40829],[-6.97562,54.40014],[-6.96774,54.40145],[-6.90682,54.36966],[-6.89772,54.35075],[-6.87527,54.33853],[-6.86512,54.32568],[-6.85163,54.29137],[-6.87452,54.28677],[-6.87791,54.27918],[-6.86673,54.27522],[-6.85177,54.26489],[-6.83693,54.26658],[-6.82165,54.24346],[-6.81633,54.22299],[-6.80045,54.22108],[-6.80122,54.21338],[-6.77599,54.19965],[-6.75573,54.1987],[-6.74316,54.18258],[-6.73406,54.18566],[-6.72445,54.18127],[-6.70295,54.20036],[-6.69166,54.20018],[-6.68673,54.19398],[-6.669,54.19584],[-6.65248,54.18102],[-6.6433,54.17801],[-6.63467,54.16449],[-6.63179,54.14766],[-6.64081,54.14238],[-6.63935,54.13599],[-6.66149,54.1205],[-6.6481,54.10153],[-6.66119,54.0934],[-6.66458,54.06629],[-6.64681,54.05873],[-6.62501,54.03737],[-6.59291,54.04755],[-6.58905,54.05808],[-6.5597,54.0481],[-6.52897,54.05888],[-6.50442,54.05566],[-6.47824,54.07004],[-6.47919,54.07762],[-6.43601,54.05959],[-6.36314,54.07057],[-6.36589,54.09338],[-6.36293,54.09758],[-6.37104,54.11497],[-6.3522,54.11084],[-6.34242,54.1114],[-6.33589,54.10833],[-6.33636,54.09469],[-6.31808,54.09096],[-6.30903,54.10463],[-6.29165,54.11235],[-6.28246,54.11145],[-6.26272,54.09786],[-5.35583,53.72597],[-7.0752,49.23912],[-1.83472,49.02346],[-2.12036,49.94415],[1.97754,51.13111]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-65.2,18.7],[-65,16.3],[-63.7,19.2],[-65.2,18.7]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-63,-50.5],[-55,-51],[-60,-54],[-63,-50.5]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-139.19952,60.08402],[-141,60.30621],[-141,76],[-169,68.63655],[-169,65.20147],[-180,61],[-180,-4],[-154,9],[-133.76404,54.54021],[-130.73868,54.71986],[-129.96277,55.29163],[-130.15228,55.7758],[-130.01787,55.90688],[-130.00362,56.00798],[-130.10284,56.12336],[-130.24498,56.09656],[-130.42625,56.14249],[-131.87439,56.79787],[-135.02884,59.56285],[-135.11759,59.62306],[-135.15827,59.6261],[-135.47928,59.79822],[-136.28677,59.57955],[-136.30531,59.46462],[-136.36836,59.44898],[-136.47697,59.46558],[-137.19727,59.01935],[-139.19952,60.08402]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-111.96064,48.99841],[-121.22623,49.00049],[-122.26513,49.00246],[-122.7565,49.00208],[-123.32218,49.00218],[-122.97821,48.76524],[-123.2666,48.69821],[-123.21991,48.21186],[-125.80444,48.60749],[-124.32129,31.54109],[-117.125,32.53429],[-116.82417,32.55996],[-115.88036,32.63735],[-115.49738,32.66486],[-114.71984,32.71877],[-114.7649,32.64602],[-114.80885,32.60959],[-114.81481,32.49451],[-112.81743,31.88004],[-111.07481,31.33224],[-109.56051,31.33402],[-108.20847,31.33384],[-108.20838,31.78363],[-106.52847,31.78391],[-106.52781,31.78086],[-106.52249,31.77501],[-106.51249,31.76933],[-106.50988,31.7612],[-106.50709,31.76123],[-106.48896,31.74806],[-106.48473,31.74769],[-106.4719,31.75101],[-106.46816,31.75897],[-106.45434,31.76466],[-106.45035,31.76426],[-106.43516,31.75492],[-106.41484,31.75101],[-106.37864,31.73021],[-106.37225,31.71174],[-106.34924,31.69633],[-106.33289,31.66178],[-106.3068,31.62459],[-106.28079,31.56179],[-106.24775,31.54226],[-106.2329,31.49982],[-106.2105,31.46857],[-106.08201,31.39863],[-106.00554,31.39233],[-105.76401,31.17051],[-105.58548,31.06117],[-105.56419,30.98526],[-104.99153,30.6639],[-104.97162,30.60896],[-104.90639,30.57822],[-104.83772,30.38117],[-104.70177,30.20567],[-104.68048,29.92399],[-104.57611,29.77838],[-104.51157,29.63674],[-104.39758,29.57047],[-104.39278,29.55293],[-104.05769,29.32173],[-103.79883,29.2581],[-103.78196,29.26555],[-103.76759,29.22799],[-103.14102,28.93666],[-102.86087,29.2217],[-102.65076,29.79418],[-101.41068,29.73457],[-101.26511,29.51372],[-101.05997,29.452],[-101.04083,29.38038],[-100.96303,29.34735],[-100.94406,29.34369],[-100.94071,29.33351],[-100.92775,29.32663],[-100.89814,29.30957],[-100.87818,29.28086],[-100.80076,29.2238],[-100.76437,29.15981],[-100.67047,29.08663],[-100.6412,28.91299],[-100.63236,28.90255],[-100.61296,28.89939],[-100.534,28.75622],[-100.51495,28.74531],[-100.50705,28.7143],[-100.51203,28.70666],[-100.51014,28.69127],[-100.50048,28.66186],[-100.45547,28.6381],[-100.44697,28.60743],[-100.35599,28.45239],[-100.34946,28.39653],[-100.29488,28.31315],[-100.29591,28.27324],[-100.17197,28.17493],[-99.93645,27.9568],[-99.87722,27.80173],[-99.79671,27.73338],[-99.772,27.72532],[-99.74556,27.69979],[-99.71947,27.65981],[-99.5957,27.59974],[-99.54094,27.60537],[-99.53055,27.57973],[-99.52034,27.55782],[-99.52802,27.49773],[-99.50141,27.49986],[-99.48755,27.49518],[-99.47897,27.48421],[-99.48661,27.46453],[-99.49534,27.44861],[-99.48927,27.40941],[-99.53957,27.31565],[-99.43588,27.19678],[-99.46404,27.01968],[-99.16698,26.56039],[-99.17474,26.53939],[-99.12698,26.51958],[-99.1135,26.42954],[-99.08355,26.39625],[-99.06007,26.39737],[-99.03634,26.41255],[-99.02042,26.40598],[-99.01291,26.39364],[-98.95686,26.38641],[-98.9566,26.37365],[-98.94523,26.36949],[-98.90013,26.36419],[-98.89905,26.35454],[-98.80305,26.36626],[-98.78254,26.30511],[-98.66667,26.23457],[-98.58496,26.24647],[-98.57951,26.23434],[-98.56519,26.23987],[-98.56294,26.22464],[-98.50599,26.20858],[-98.44806,26.21236],[-98.38617,26.15721],[-98.34176,26.15278],[-98.33579,26.1388],[-98.30626,26.10003],[-98.28841,26.10512],[-98.26524,26.0914],[-98.19898,26.06411],[-98.09577,26.05698],[-98.07568,26.06667],[-98.08302,26.03396],[-97.9771,26.04136],[-97.9532,26.06179],[-97.81643,26.04475],[-97.77017,26.02439],[-97.73884,26.02902],[-97.5289,25.90648],[-97.52151,25.88625],[-97.50615,25.89031],[-97.49851,25.89903],[-97.49637,25.89641],[-97.49748,25.88008],[-97.49422,25.87981],[-97.48847,25.88564],[-97.46409,25.88174],[-97.42607,25.842],[-97.36856,25.8396],[-97.26231,25.94724],[-80.81543,24.00633],[-66.87378,44.77794],[-67.16148,45.16715],[-67.2286,45.16739],[-67.26246,45.18797],[-67.28311,45.19175],[-67.28959,45.18784],[-67.29332,45.17568],[-67.29049,45.17317],[-67.3001,45.16776],[-67.3025,45.16122],[-67.29761,45.14766],[-67.33975,45.1255],[-67.40524,45.16122],[-67.40387,45.17139],[-67.4818,45.27682],[-67.42172,45.38543],[-67.45262,45.41008],[-67.50498,45.4889],[-67.41623,45.50105],[-67.42219,45.55661],[-67.42902,45.56833],[-67.42331,45.57154],[-67.42498,45.57836],[-67.45193,45.60323],[-67.77981,45.6738],[-67.79019,47.06776],[-67.88006,47.1067],[-67.91319,47.14793],[-67.92598,47.15418],[-67.95181,47.1875],[-68.02374,47.23915],[-68.13017,47.29309],[-68.17669,47.32893],[-68.24046,47.35354],[-68.32809,47.36005],[-68.36363,47.35476],[-68.38054,47.34167],[-68.38509,47.30321],[-68.37367,47.28796],[-68.4377,47.28232],[-68.47916,47.29623],[-68.51074,47.29885],[-68.54593,47.28441],[-68.58408,47.28482],[-68.59777,47.27134],[-68.59271,47.25762],[-68.61889,47.24148],[-68.68936,47.24125],[-68.71768,47.23676],[-68.80128,47.21423],[-68.89629,47.17676],[-69.05354,47.24847],[-69.04924,47.41798],[-69.22425,47.45961],[-69.99729,46.69558],[-70.0569,46.4149],[-70.25551,46.10871],[-70.29001,46.09431],[-70.39919,45.80667],[-70.83229,45.40062],[-70.80794,45.37878],[-70.82663,45.2367],[-70.87538,45.23453],[-70.92138,45.28099],[-70.90645,45.30918],[-71.0109,45.34798],[-71.08429,45.30556],[-71.1454,45.24226],[-71.20525,45.25278],[-71.28925,45.30097],[-71.41405,45.23513],[-71.43044,45.12381],[-71.49692,45.06991],[-71.50623,45.04878],[-71.49284,45.03629],[-71.50027,45.01372],[-71.79359,45.01075],[-72.08774,45.00581],[-72.14155,45.00568],[-72.15282,45.00609],[-72.17142,45.00584],[-72.25847,45.00436],[-72.38795,45.00626],[-72.4496,45.00863],[-72.5356,45.00936],[-72.66257,45.01523],[-72.82537,45.01642],[-73.08466,45.01561],[-73.45219,45.00875],[-74.14699,44.99145],[-74.33753,44.9923],[-74.50786,44.99798],[-74.66158,44.99949],[-74.71244,44.99734],[-74.75887,44.98708],[-74.76368,45.00632],[-74.78977,45.00365],[-74.82376,45.01773],[-74.94186,44.98229],[-75.30098,44.83883],[-75.30304,44.82836],[-75.59418,44.6457],[-75.97269,44.33502],[-75.97295,44.34595],[-76.00059,44.34797],[-76.17645,44.2865],[-76.18744,44.22158],[-76.88782,43.82759],[-79.16851,43.32168],[-79.05487,43.25371],[-79.05092,43.169],[-79.04603,43.16093],[-79.04208,43.13942],[-79.07002,43.12038],[-79.06015,43.114],[-79.0568,43.10474],[-79.0774,43.07861],[-78.9996,43.05484],[-79.02311,43.02071],[-79.02552,42.99473],[-78.96235,42.9573],[-78.91188,42.9426],[-78.90398,42.89181],[-82.42767,41.47978],[-83.14316,42.03807],[-83.12805,42.23843],[-83.09715,42.29052],[-83.07252,42.31515],[-82.94575,42.34332],[-82.59676,42.5479],[-82.51368,42.61785],[-82.5108,42.66464],[-82.4675,42.76415],[-82.48055,42.80573],[-82.45497,42.9284],[-82.41334,42.97099],[-82.42596,42.99536],[-82.15851,43.39507],[-83.53729,46.098],[-83.96301,46.05036],[-84.11021,46.23851],[-84.09794,46.25656],[-84.11613,46.26878],[-84.11905,46.31516],[-84.10721,46.3218],[-84.14394,46.41076],[-84.11682,46.51576],[-84.13536,46.53218],[-84.16162,46.5284],[-84.21621,46.53891],[-84.26994,46.49189],[-84.36092,46.50997],[-84.55284,46.4407],[-84.95178,46.77185],[-89.59179,48.00307],[-89.67547,48.00371],[-90.87204,48.25943],[-91.41312,48.06753],[-92.99377,48.62474],[-93.34877,48.62604],[-93.35529,48.61124],[-93.37074,48.60584],[-93.39812,48.60369],[-93.40542,48.61089],[-93.43846,48.59478],[-93.46859,48.59205],[-93.45735,48.56667],[-93.46533,48.54593],[-93.64763,48.51751],[-93.80625,48.51888],[-93.80642,48.58047],[-93.83328,48.62582],[-93.84865,48.63064],[-93.93388,48.6326],[-94.01327,48.64471],[-94.16176,48.64697],[-94.25025,48.65463],[-94.24931,48.67827],[-94.26046,48.69816],[-94.30578,48.71073],[-94.32758,48.70433],[-94.36123,48.70478],[-94.38406,48.71135],[-94.41629,48.71067],[-94.44294,48.69266],[-94.53615,48.7024],[-94.55031,48.71419],[-94.58894,48.71928],[-94.69425,48.77938],[-94.70129,48.83376],[-94.68996,48.83953],[-94.68395,48.99914],[-111.96064,48.99841]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[180,55],[170,53],[180,49],[180,55]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[143,22],[147,22],[147,12],[143,12],[143,22]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-171.5,-10],[-171,-15],[-167,-15],[-171.5,-10]]]}}];
23638 var dataImperial = {
23643 var type$3 = "FeatureCollection";
23644 var features$1 = [{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[113.573,22.186],[114,22.5],[114.05534,22.503],[114.0595,22.51422],[114.07345,22.51934],[114.0786,22.53012],[114.08512,22.53228],[114.09034,22.53717],[114.09611,22.53486],[114.10602,22.53472],[114.1115,22.52929],[114.11522,22.5308],[114.11649,22.53418],[114.11979,22.53511],[114.1244,22.5393],[114.12729,22.53947],[114.13018,22.54132],[114.13807,22.5432],[114.14429,22.54176],[114.14441,22.54114],[114.14846,22.54179],[114.14855,22.54397],[114.15042,22.54593],[114.14964,22.54954],[114.15166,22.55168],[114.15192,22.55438],[114.15642,22.55495],[114.15841,22.55909],[114.16032,22.56153],[114.16162,22.56187],[114.1634,22.55931],[114.16553,22.5593],[114.16733,22.56119],[114.16934,22.56093],[114.17061,22.5597],[114.17702,22.56],[114.17798,22.55546],[114.18401,22.5552],[114.18673,22.55468],[114.1878,22.55545],[114.18979,22.55446],[114.1955,22.55564],[114.19674,22.55691],[114.20005,22.55717],[114.20376,22.55623],[114.20884,22.55672],[114.22438,22.55055],[114.2264,22.5476],[114.22545,22.54528],[114.22661,22.54339],[114.32,22.576],[114.45,22.43],[114.45,22.14],[113.9,22.14],[113.75,22.22],[113.553,22.095],[113.54678,22.1207],[113.5456,22.1207],[113.54076,22.12373],[113.54016,22.13618],[113.54701,22.13651],[113.5475,22.14583],[113.52456,22.17978],[113.53623,22.20191],[113.53299,22.21232],[113.53497,22.21351],[113.53735,22.21377],[113.54156,22.21315],[113.54385,22.21709],[113.55849,22.21565],[113.573,22.186]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-75,18],[-80,20.5],[-83,19],[-77,16],[-75,18]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-64.33594,32.86113],[-79.39819,27.21067],[-80.63965,23.71998],[-73.39966,20.40642],[-65.1709,19.20743],[-65.09399,16.23577],[-59.13391,16.80454],[-62.64404,15.16228],[-59.43054,14.85985],[-62.83081,13.64599],[-61.80359,10.73752],[-62.08649,10.04729],[-61.06201,9.85522],[-59.81369,8.31274],[-59.8027,8.27469],[-59.83498,8.22712],[-59.94141,8.21149],[-59.99771,8.15576],[-59.97986,8.13265],[-59.99771,8.12041],[-60.00183,8.07147],[-60.05127,8.02524],[-60.09933,8.03747],[-60.12268,8.02388],[-60.14053,7.98988],[-60.36163,7.83345],[-60.53467,7.81713],[-60.5896,7.6375],[-60.72144,7.54493],[-60.5896,7.31888],[-60.63904,7.24532],[-60.54703,7.12542],[-60.46875,7.20309],[-60.37262,7.18401],[-60.29984,7.1445],[-60.2916,7.06819],[-60.39871,6.95097],[-60.66513,6.83235],[-60.71869,6.75053],[-60.91232,6.81735],[-60.94254,6.72053],[-61.14441,6.72326],[-61.23093,6.5773],[-61.1554,6.45314],[-61.14441,6.20199],[-61.39709,5.95619],[-60.71045,5.20036],[-60.21606,5.23319],[-59.99634,5.06906],[-60.13916,4.51071],[-59.69971,4.40118],[-59.5459,3.93002],[-59.87549,3.56825],[-59.7876,3.37086],[-60.01831,2.83332],[-59.90845,2.38335],[-59.69971,2.2626],[-59.77661,1.87833],[-59.65302,1.85087],[-59.69147,1.75754],[-59.61456,1.71361],[-59.55139,1.73283],[-59.36188,1.49123],[-59.26575,1.39238],[-58.92242,1.30726],[-58.83728,1.17271],[-58.71918,1.23037],[-58.71094,1.29902],[-58.49121,1.26058],[-58.461,1.37591],[-58.50494,1.38689],[-58.51044,1.46102],[-58.38135,1.4775],[-58.32642,1.57359],[-58.00507,1.49946],[-57.99133,1.65321],[-57.79907,1.69165],[-57.70844,1.71087],[-57.54364,1.68341],[-57.41455,1.94421],[-57.10693,1.97715],[-56.8103,1.85636],[-56.48071,1.92225],[-55.90942,1.81244],[-55.90942,2.04302],[-56.14014,2.26534],[-55.94788,2.53701],[-55.70892,2.39981],[-55.37933,2.43274],[-55.19257,2.53976],[-54.98108,2.57268],[-54.88495,2.43548],[-54.71191,2.46293],[-54.69543,2.34767],[-54.58832,2.32846],[-54.43451,2.43548],[-54.20654,2.76748],[-54.17358,3.12955],[-53.96484,3.57921],[-54.33838,4.00674],[-54.44412,4.52577],[-54.46884,4.91036],[-54.36653,5.13061],[-54.27727,5.26191],[-54.19968,5.3084],[-54.01222,5.54457],[-54.0239,5.64605],[-53.86322,5.94936],[-64.33594,32.86113]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-14.5,-6],[11.79657,-17.27197],[12.03415,-17.14866],[12.38159,-17.22213],[12.58484,-17.22476],[13.01193,-16.97405],[13.24951,-17.00098],[13.38135,-16.98522],[13.93341,-17.38734],[18.42476,-17.38996],[18.47763,-17.46857],[18.62663,-17.64599],[18.79211,-17.76177],[18.92944,-17.82061],[19.33044,-17.84806],[19.66278,-17.8644],[19.74792,-17.90557],[19.85161,-17.87486],[20.10361,-17.90296],[20.18394,-17.88401],[20.34737,-17.88466],[20.44693,-17.91733],[20.51697,-17.96698],[20.83008,-18.03032],[20.95711,-17.97285],[21.16997,-17.93497],[21.42677,-18.0264],[23.45032,-17.63879],[22.00012,-16.38866],[21.99944,-13.00523],[24.03809,-12.99118],[24.03809,-10.91962],[24.43359,-11.09217],[24.45557,-11.48002],[25.37842,-11.19996],[25.42236,-11.60919],[26.96045,-11.97484],[27.18018,-11.60919],[28.125,-12.42048],[29.11377,-13.36824],[29.1687,-13.43771],[29.55872,-13.19716],[29.68506,-13.2239],[29.62463,-13.41099],[29.80591,-13.44305],[29.81415,-12.14809],[29.31152,-12.55456],[28.41064,-11.78133],[28.63037,-10.70379],[28.65234,-9.73071],[28.37219,-9.24309],[28.89748,-8.47916],[30.78644,-8.26857],[29.39941,-6.05316],[29.4873,-4.45595],[29.75922,-4.46759],[29.81415,-4.36421],[29.88007,-4.36832],[30.04074,-4.26699],[30.07919,-4.1629],[30.18356,-4.08311],[30.1918,-4.05126],[30.21566,-4.04595],[30.22923,-4.01136],[30.21326,-3.99612],[30.25978,-3.88755],[30.29274,-3.86288],[30.34424,-3.77245],[30.39848,-3.79095],[30.40878,-3.76765],[30.39548,-3.7304],[30.39054,-3.72821],[30.3896,-3.71918],[30.39093,-3.7101],[30.39514,-3.70444],[30.42028,-3.64963],[30.46886,-3.53501],[30.67108,-3.41335],[30.63297,-3.34892],[30.84206,-3.25535],[30.84549,-3.16108],[30.83485,-3.09698],[30.7933,-3.06235],[30.82111,-3.02258],[30.84515,-2.9739],[30.74764,-2.99618],[30.7037,-2.97013],[30.66422,-2.98967],[30.57632,-2.90738],[30.49393,-2.94441],[30.41016,-2.87172],[30.52002,-2.39432],[30.77545,-2.38883],[30.8606,-2.31199],[30.84961,-2.19398],[30.89081,-2.07322],[30.81116,-1.96068],[30.83862,-1.6587],[30.73425,-1.4418],[30.56259,-1.33884],[30.4541,-1.05737],[30.35797,-1.06287],[30.34149,-1.13152],[30.16571,-1.34296],[29.91852,-1.48024],[29.83887,-1.31824],[29.58344,-1.39238],[29.729,0.05493],[29.96796,0.5136],[29.9707,0.8569],[30.22339,0.92281],[30.24536,1.15349],[30.47745,1.20772],[31.30966,2.15693],[31.20255,2.22211],[31.20255,2.29278],[31.16409,2.27906],[31.13937,2.28318],[31.13113,2.26534],[31.07826,2.30033],[31.0714,2.34767],[31.00479,2.4005],[30.97183,2.40461],[30.94711,2.38746],[30.94849,2.36276],[30.9375,2.33532],[30.88531,2.34012],[30.83038,2.42176],[30.74112,2.43274],[30.76035,2.5864],[30.90179,2.88132],[30.76447,3.04178],[30.93613,3.40239],[30.94059,3.50588],[30.85236,3.48601],[30.90866,3.5936],[30.95055,3.63918],[30.94677,3.65391],[30.9866,3.70187],[31.00582,3.70701],[31.02058,3.69708],[31.16547,3.7954],[31.28838,3.79643],[31.52699,3.66282],[31.7038,3.72449],[31.82671,3.82794],[31.96198,3.65596],[31.95854,3.57099],[32.04987,3.59155],[32.07733,3.57099],[32.0842,3.53672],[32.20093,3.50657],[32.21672,3.56448],[32.19578,3.59977],[32.41516,3.74504],[32.72055,3.76782],[32.89307,3.81219],[33.02782,3.89371],[33.18146,3.7793],[33.51173,3.75258],[33.98758,4.23309],[34.05762,4.28342],[34.38721,4.61065],[35.94452,4.62023],[35.95688,4.53467],[36.04134,4.44568],[36.89621,4.4491],[38.14728,3.62992],[38.55927,3.62033],[38.92181,3.51068],[39.56039,3.43392],[39.87076,3.87522],[40.76752,4.28753],[41.16371,3.94372],[41.89774,3.97797],[41.31271,3.14463],[40.98896,2.82869],[40.99548,-0.84042],[41.7,-1.8],[41.7,-49],[-27,-60],[-65.7,-52.5],[-14.5,-6]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[31.33301,35.47856],[33.0249,33.75175],[35.44189,36.02245],[31.33301,35.47856]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[14,36.5],[15,36],[14,35],[14,36.5]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[0,62],[2.5,51.3],[-2,50],[-1.9,49],[-20,53],[0,62]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[180,-35],[161,-19],[167,-12],[180,-22],[180,4],[170,3.7],[127,5.7],[118,2.7],[119.5,5.4],[117.2,7.5],[102.6,8],[102.9158,11.74099],[102.76268,12.07357],[102.70226,12.17158],[102.74139,12.46474],[102.53128,12.68857],[102.49557,12.9256],[102.49763,13.0064],[102.4597,13.08199],[102.43412,13.09026],[102.39155,13.16407],[102.35481,13.29341],[102.35893,13.30945],[102.34503,13.34837],[102.35928,13.39797],[102.3567,13.48095],[102.36168,13.50582],[102.33559,13.53787],[102.33971,13.56023],[102.35498,13.5649],[102.36511,13.5785],[102.40047,13.5679],[102.42537,13.56891],[102.44614,13.56123],[102.48047,13.57091],[102.53849,13.56757],[102.5699,13.58526],[102.57806,13.60486],[102.62501,13.60845],[102.62132,13.61295],[102.60767,13.61562],[102.57231,13.63331],[102.56922,13.64082],[102.54879,13.658],[102.56252,13.68552],[102.5972,13.70803],[102.67084,13.74472],[102.68818,13.75172],[102.7014,13.7684],[102.73161,13.77082],[102.76543,13.85541],[102.78397,13.93207],[102.80388,13.94406],[102.81607,13.96639],[102.90705,14.02119],[102.89726,14.0535],[102.90095,14.0838],[102.92421,14.10744],[102.92378,14.12838],[102.94147,14.15035],[102.92953,14.17952],[103.17535,14.33774],[103.19939,14.32992],[103.68553,14.44],[103.94508,14.34157],[104.05756,14.34589],[104.06636,14.3419],[104.26025,14.37749],[104.50058,14.36984],[104.57817,14.36019],[104.6422,14.42387],[104.66632,14.40234],[104.68357,14.39877],[104.71138,14.43169],[104.72305,14.42188],[104.71687,14.40043],[104.75344,14.40459],[104.80408,14.43867],[104.83429,14.41573],[104.99239,14.3838],[105.05402,14.19783],[105.47905,14.49186],[105.60883,15.0005],[105.46703,15.13005],[105.48866,15.20237],[105.59269,15.2716],[105.58617,15.32823],[105.50308,15.31912],[105.46703,15.33948],[105.49175,15.37921],[105.59372,15.42869],[105.59372,15.50927],[105.60986,15.54871],[105.62616,15.56492],[105.62702,15.59129],[105.63518,15.62742],[105.63612,15.66056],[105.5975,15.72088],[105.49965,15.76681],[105.46291,15.74517],[105.43819,15.75459],[105.40489,15.79424],[105.34241,15.92039],[105.37811,15.98344],[105.39167,15.99136],[105.41931,15.98608],[105.42652,15.99764],[105.41468,16.01661],[105.21263,16.05076],[105.04955,16.10552],[105.01316,16.24401],[104.88235,16.37812],[104.8391,16.45782],[104.77936,16.49041],[104.73919,16.53287],[104.74228,16.62205],[104.76391,16.70953],[104.73953,16.80323],[104.76425,16.85088],[104.73782,16.90968],[104.744,17.0128],[104.81266,17.21853],[104.79841,17.39274],[104.70348,17.52833],[104.46384,17.65515],[104.34368,17.83564],[104.27776,17.8559],[104.22661,17.98069],[104.1116,18.10735],[104.06525,18.21174],[103.97392,18.33823],[103.9286,18.33237],[103.88809,18.29456],[103.85582,18.28673],[103.83659,18.32715],[103.79128,18.3467],[103.70201,18.34214],[103.60931,18.40405],[103.57292,18.40437],[103.51593,18.42978],[103.45963,18.42587],[103.41568,18.44802],[103.30479,18.43206],[103.24265,18.37082],[103.24333,18.34133],[103.29123,18.32357],[103.28899,18.29521],[103.23595,18.28299],[103.16608,18.25511],[103.02429,17.98135],[102.6535,17.83237],[102.40631,17.99963],[102.10968,18.22413],[101.548,17.81538],[101.30493,17.64991],[101.14563,17.46595],[100.95886,17.61654],[101.01757,17.88858],[101.18752,18.05121],[101.16863,18.10409],[101.18134,18.33595],[101.08727,18.38287],[101.05499,18.43988],[101.23215,18.73015],[101.35265,19.04524],[101.25927,19.12733],[101.2373,19.32637],[101.25824,19.58438],[101.11954,19.56836],[101.08898,19.58777],[101.08624,19.59715],[101.03165,19.6185],[100.89844,19.62125],[100.77827,19.49249],[100.63751,19.56432],[100.58258,19.49313],[100.47478,19.5944],[100.42929,19.67152],[100.43341,19.7024],[100.4147,19.7255],[100.40525,19.7646],[100.43907,19.80345],[100.45555,19.84843],[100.50636,19.87264],[100.51709,19.93027],[100.58653,20.1599],[100.56576,20.1757],[100.54945,20.17473],[100.52731,20.14379],[100.51065,20.14895],[100.48697,20.17956],[100.46774,20.196],[100.45246,20.20147],[100.45521,20.22129],[100.44783,20.23546],[100.41607,20.25286],[100.40594,20.28184],[100.38397,20.31082],[100.37556,20.35187],[100.36165,20.35638],[100.35736,20.37408],[100.33195,20.39902],[100.27805,20.40224],[100.25917,20.39677],[100.2475,20.37263],[100.22535,20.35509],[100.22346,20.31839],[100.16579,20.29988],[100.17162,20.24545],[100.10845,20.25221],[100.09266,20.2696],[100.09798,20.31485],[100.07961,20.3678],[99.9567,20.46417],[99.91636,20.44925],[99.90765,20.44977],[99.89121,20.44511],[99.87276,20.44406],[99.86212,20.44326],[99.80186,20.33948],[99.46472,20.3884],[99.56085,20.20035],[99.43691,20.08882],[99.27727,20.11623],[99.06921,20.1101],[98.97789,19.74538],[98.24387,19.68656],[97.85934,19.57014],[97.76733,18.57336],[97.39655,18.47179],[97.62451,18.30238],[97.73849,17.97743],[97.66502,17.87943],[97.90947,17.56745],[98.52951,16.82557],[98.51303,16.69276],[98.69293,16.26873],[98.87421,16.43609],[98.93394,16.3353],[98.84743,16.13356],[98.74512,16.12037],[98.58307,16.07287],[98.5762,15.79754],[98.54736,15.37557],[98.17383,15.15167],[98.3606,14.63674],[99.08295,13.89208],[99.16534,13.72204],[99.18182,13.00723],[99.39331,12.56797],[99.64153,11.78973],[99.32156,11.30266],[98.77859,10.67849],[98.80597,10.47642],[98.76657,10.40459],[98.74924,10.34194],[96.85547,6.40265],[92.42523,20.54794],[92.2728,20.96272],[92.187,21.16],[92.26,21.36],[92.27,21.4328],[92.62,21.43],[92.6,22],[93.22,22.25],[93.4,23.7],[93.34,23.95],[94.155,23.847],[94.17,23.92],[94.25171,24.07405],[94.28,24.23],[94.30175,24.2371],[94.3256,24.2731],[94.6,24.7],[94.78,25.47],[95.2,26],[95.1,26.6],[97.3,27.9],[96.14,29.38],[95.4,29.1],[94.8,29.2],[92.5,27.8],[91.64,27.76],[91.4,28],[89.58,28.18],[88.9,27.32],[88.74,27.47],[88.9,27.86],[88.7,28.1],[88.1,27.87],[85.93,27.942],[81.6,30.5],[81.2,30],[78.73,31.5],[78.77,31.99],[78.4,32.5],[79.3,32.5],[79,34.3],[78.3,34.6],[78,35.5],[76.1,35.8],[76,36.55],[75.15,37],[72.5,36.9],[71.1,36.1],[71.65,35.44],[71.45,35],[70.985,34.54],[71.18,34.36],[71.092,34.118],[70.88,33.97],[70.5,33.94],[69.908,34.04],[69.869,33.96],[70,33.75],[70.13,33.73],[70.34,33.34],[70.013,33.14],[69.57,33.09],[69.24,32.45],[69.3,31.9],[68.1,31.6],[66.393,30.934],[66.2,29.8],[62.5,29.4],[60.87,29.86],[61.53,29.0165],[61.66,28.77],[61.96,28.54],[62.43,28.42],[62.6,28.25],[62.795,28.28],[62.86,27.25],[63.24,27.25],[63.327,27.13],[63.25,27.1],[63.25,26.84],[63.18,26.83],[63.18,26.65],[62.3,26.5],[62.2,26.28],[61.85,26.22],[61.84,25.75],[61.68,25.67],[56.5,-21],[180,-65],[180,-35]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[138.7,46.7],[145.5,44.5],[145.2,43.7],[146,43.3],[142,18],[122,24.3],[138.7,46.7]]]}},{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-180,7],[-148,7],[-151,-12],[-171.5,-10.75],[-171,-16],[-152,-19],[-180,-55],[-180,7]]]}}];
23645 var dataDriveLeft = {
23647 features: features$1
23650 var en = {icons:{information:"info",remove:"remove",undo:"undo"},modes:{add_area:{title:"Area",description:"Add parks, buildings, lakes or other areas to the map.",tail:"Click on the map to start drawing an area, like a park, lake, or building."},add_line:{title:"Line",description:"Add highways, streets, pedestrian paths, canals or other lines to the map.",tail:"Click on the map to start drawing a road, path, or route."},add_point:{title:"Point",description:"Add restaurants, monuments, postal boxes or other points to the map.",tail:"Click on the map to add a point."},add_note:{title:"Note",description:"Spotted an issue? Let other mappers know.",tail:"Click on the map to add a note."},browse:{title:"Browse",description:"Pan and zoom the map."},draw_area:{tail:"Click to add nodes to your area. Click the first node to finish the area."},draw_line:{tail:"Click to add more nodes to the line. Click on other lines to connect to them, and double-click to end the line."},drag_node:{connected_to_hidden:"This can't be edited because it is connected to a hidden feature."}},operations:{add:{annotation:{point:"Added a point.",vertex:"Added a node to a way.",relation:"Added a relation.",note:"Added a note."}},start:{annotation:{line:"Started a line.",area:"Started an area."}},"continue":{key:"A",title:"Continue",description:"Continue this line.",not_eligible:"No line can be continued here.",multiple:"Several lines can be continued here. To choose a line, press the Shift key and click on it to select it.",annotation:{line:"Continued a line.",area:"Continued an area."}},cancel_draw:{annotation:"Canceled drawing."},change_role:{annotation:"Changed the role of a relation member."},change_tags:{annotation:"Changed tags."},circularize:{title:"Circularize",description:{line:"Make this line circular.",area:"Make this area circular."},key:"O",annotation:{line:"Made a line circular.",area:"Made an area circular."},not_closed:"This can't be made circular because it's not a loop.",too_large:"This can't be made circular because not enough of it is currently visible.",connected_to_hidden:"This can't be made circular because it is connected to a hidden feature."},orthogonalize:{title:"Square",description:{line:"Square the corners of this line.",area:"Square the corners of this area."},key:"S",annotation:{line:"Squared the corners of a line.",area:"Squared the corners of an area."},not_squarish:"This can't be made square because it is not squarish.",too_large:"This can't be made square because not enough of it is currently visible.",connected_to_hidden:"This can't be made square because it is connected to a hidden feature."},straighten:{title:"Straighten",description:"Straighten this line.",key:"S",annotation:"Straightened a line.",too_bendy:"This can't be straightened because it bends too much.",connected_to_hidden:"This line can't be straightened because it is connected to a hidden feature."},"delete":{title:"Delete",description:{single:"Delete this feature permanently.",multiple:"Delete these features permanently."},annotation:{point:"Deleted a point.",vertex:"Deleted a node from a way.",line:"Deleted a line.",area:"Deleted an area.",relation:"Deleted a relation.",multiple:"Deleted {n} features."},too_large:{single:"This feature can't be deleted because not enough of it is currently visible.",multiple:"These features can't be deleted because not enough of them are currently visible."},incomplete_relation:{single:"This feature can't be deleted because it hasn't been fully downloaded.",multiple:"These features can't be deleted because they haven't been fully downloaded."},part_of_relation:{single:"This feature can't be deleted because it is part of a larger relation. You must remove it from the relation first.",multiple:"These features can't be deleted because they are part of larger relations. You must remove them from the relations first."},connected_to_hidden:{single:"This feature can't be deleted because it is connected to a hidden feature.",multiple:"These features can't be deleted because some are connected to hidden features."}},add_member:{annotation:"Added a member to a relation."},delete_member:{annotation:"Removed a member from a relation."},connect:{annotation:{point:"Connected a way to a point.",vertex:"Connected a way to another.",line:"Connected a way to a line.",area:"Connected a way to an area."},relation:"These features can't be connected because they have conflicting relation roles.",restriction:"These features can't be connected because it would damage a \"{relation}\" relation."},disconnect:{title:"Disconnect",description:"Disconnect these lines/areas from each other.",key:"D",annotation:"Disconnected lines/areas.",not_connected:"There aren't enough lines/areas here to disconnect.",connected_to_hidden:"This can't be disconnected because it is connected to a hidden feature.",relation:"This can't be disconnected because it connects members of a relation."},merge:{title:"Merge",description:"Merge these features.",key:"C",annotation:"Merged {n} features.",not_eligible:"These features can't be merged.",not_adjacent:"These features can't be merged because their endpoints aren't connected.",restriction:"These features can't be merged because it would damage a \"{relation}\" relation.",relation:"These features can't be merged because they have conflicting relation roles.",incomplete_relation:"These features can't be merged because at least one hasn't been fully downloaded.",conflicting_tags:"These features can't be merged because some of their tags have conflicting values."},move:{title:"Move",description:{single:"Move this feature to a different location.",multiple:"Move these features to a different location."},key:"M",annotation:{point:"Moved a point.",vertex:"Moved a node in a way.",line:"Moved a line.",area:"Moved an area.",multiple:"Moved multiple features."},incomplete_relation:{single:"This feature can't be moved because it hasn't been fully downloaded.",multiple:"These features can't be moved because they haven't been fully downloaded."},too_large:{single:"This feature can't be moved because not enough of it is currently visible.",multiple:"These features can't be moved because not enough of them are currently visible."},connected_to_hidden:{single:"This feature can't be moved because it is connected to a hidden feature.",multiple:"These features can't be moved because some are connected to hidden features."}},reflect:{title:{long:"Reflect Long",short:"Reflect Short"},description:{long:{single:"Reflect this feature across its long axis.",multiple:"Reflect these features across their long axis."},short:{single:"Reflect this feature across its short axis.",multiple:"Reflect these features across their short axis."}},key:{long:"T",short:"Y"},annotation:{long:{single:"Reflected a feature across its long axis.",multiple:"Reflected multiple features across their long axis."},short:{single:"Reflected a feature across its short axis.",multiple:"Reflected multiple features across their short axis."}},incomplete_relation:{single:"This feature can't be reflected because it hasn't been fully downloaded.",multiple:"These features can't be reflected because they haven't been fully downloaded."},too_large:{single:"This feature can't be reflected because not enough of it is currently visible.",multiple:"These features can't be reflected because not enough of them are currently visible."},connected_to_hidden:{single:"This feature can't be reflected because it is connected to a hidden feature.",multiple:"These features can't be reflected because some are connected to hidden features."}},rotate:{title:"Rotate",description:{single:"Rotate this feature around its center point.",multiple:"Rotate these features around their center point."},key:"R",annotation:{line:"Rotated a line.",area:"Rotated an area.",multiple:"Rotated multiple features."},incomplete_relation:{single:"This feature can't be rotated because it hasn't been fully downloaded.",multiple:"These features can't be rotated because they haven't been fully downloaded."},too_large:{single:"This feature can't be rotated because not enough of it is currently visible.",multiple:"These features can't be rotated because not enough of them are currently visible."},connected_to_hidden:{single:"This feature can't be rotated because it is connected to a hidden feature.",multiple:"These features can't be rotated because some are connected to hidden features."}},reverse:{title:"Reverse",description:"Make this line go in the opposite direction.",key:"V",annotation:"Reversed a line."},split:{title:"Split",description:{line:"Split this line into two at this node.",area:"Split the boundary of this area into two.",multiple:"Split the lines/area boundaries at this node into two."},key:"X",annotation:{line:"Split a line.",area:"Split an area boundary.",multiple:"Split {n} lines/area boundaries."},not_eligible:"Lines can't be split at their beginning or end.",multiple_ways:"There are too many lines here to split.",connected_to_hidden:"This can't be split because it is connected to a hidden feature."},restriction:{annotation:{create:"Added a turn restriction","delete":"Deleted a turn restriction"}},detach_node:{title:"Detach",key:"E",description:"Detach this node from these lines/areas.",annotation:"Detached a node from parent lines/areas.",restriction:"This node can't be detached because it would damage a \"{relation}\" relation.",connected_to_hidden:"This node can't be detached because it is connected to a hidden feature."}},restriction:{controls:{distance:"Distance",distance_up_to:"Up to {distance}",via:"Via",via_node_only:"Node only",via_up_to_one:"Up to 1 way",via_up_to_two:"Up to 2 ways"},help:{indirect:"(indirect)",turn:{no_left_turn:"NO Left Turn {indirect}",no_right_turn:"NO Right Turn {indirect}",no_u_turn:"NO U-Turn {indirect}",no_straight_on:"NO Straight On {indirect}",only_left_turn:"ONLY Left Turn {indirect}",only_right_turn:"ONLY Right Turn {indirect}",only_u_turn:"ONLY U-Turn {indirect}",only_straight_on:"ONLY Straight On {indirect}",allowed_left_turn:"Left Turn Allowed {indirect}",allowed_right_turn:"Right Turn Allowed {indirect}",allowed_u_turn:"U-Turn Allowed {indirect}",allowed_straight_on:"Straight On Allowed {indirect}"},from:"FROM",via:"VIA",to:"TO",from_name:"{from} {fromName}",from_name_to_name:"{from} {fromName} {to} {toName}",via_names:"{via} {viaNames}",select_from:"Click to select a {from} segment",select_from_name:"Click to select {from} {fromName}",toggle:"Click for \"{turn}\""}},undo:{tooltip:"Undo: {action}",nothing:"Nothing to undo."},redo:{tooltip:"Redo: {action}",nothing:"Nothing to redo."},tooltip_keyhint:"Shortcut:",browser_notice:"This editor is supported in Firefox, Chrome, Safari, Opera, and Internet Explorer 11 and above. Please upgrade your browser or use Potlatch 2 to edit the map.",translate:{translate:"Translate",localized_translation_label:"Multilingual name",localized_translation_language:"Choose language",localized_translation_name:"Name"},zoom_in_edit:"Zoom in to edit",login:"Log In",logout:"Log Out",loading_auth:"Connecting to OpenStreetMap...",report_a_bug:"Report a bug",help_translate:"Help translate",feature_info:{hidden_warning:"{count} hidden features",hidden_details:"These features are currently hidden: {details}"},status:{error:"Unable to connect to API.",offline:"The API is offline. Please try editing later.",readonly:"The API is read-only. You will need to wait to save your changes.",rateLimit:"The API is limiting anonymous connections. You can fix this by logging in."},commit:{title:"Upload to OpenStreetMap",upload_explanation:"The changes you upload will be visible on all maps that use OpenStreetMap data.",upload_explanation_with_user:"The changes you upload as {user} will be visible on all maps that use OpenStreetMap data.",request_review:"I would like someone to review my edits.",save:"Upload",cancel:"Cancel",changes:"{count} Changes",download_changes:"Download osmChange file",warnings:"Warnings",modified:"Modified",deleted:"Deleted",created:"Created",about_changeset_comments:"About changeset comments",about_changeset_comments_link:"//wiki.openstreetmap.org/wiki/Good_changeset_comments",google_warning:"You mentioned Google in this comment: remember that copying from Google Maps is strictly forbidden.",google_warning_link:"https://www.openstreetmap.org/copyright"},contributors:{list:"Edits by {users}",truncated_list:"Edits by {users} and {count} others"},info_panels:{key:"I",background:{key:"B",title:"Background",zoom:"Zoom",vintage:"Vintage",source:"Source",description:"Description",resolution:"Resolution",accuracy:"Accuracy",unknown:"Unknown",show_tiles:"Show Tiles",hide_tiles:"Hide Tiles",show_vintage:"Show Vintage",hide_vintage:"Hide Vintage"},history:{key:"H",title:"History",selected:"{n} selected",no_history:"No History (New Feature)",version:"Version",last_edit:"Last Edit",edited_by:"Edited By",changeset:"Changeset",unknown:"Unknown",link_text:"History on openstreetmap.org",note_no_history:"No History (New Note)",note_comments:"Comments",note_created_date:"Created Date",note_created_user:"Created By",note_link_text:"Note on openstreetmap.org"},location:{key:"L",title:"Location",unknown_location:"Unknown Location"},measurement:{key:"M",title:"Measurement",selected:"{n} selected",geometry:"Geometry",closed_line:"closed line",closed_area:"closed area",center:"Center",perimeter:"Perimeter",length:"Length",area:"Area",centroid:"Centroid",location:"Location",metric:"Metric",imperial:"Imperial",node_count:"Number of nodes"}},geometry:{point:"point",vertex:"vertex",line:"line",area:"area",relation:"relation",note:"note"},geocoder:{search:"Search worldwide...",no_results_visible:"No results in visible map area",no_results_worldwide:"No results found"},geolocate:{title:"Show My Location",locating:"Locating, please wait..."},inspector:{no_documentation_combination:"There is no documentation available for this tag combination",no_documentation_key:"There is no documentation available for this key",documentation_redirect:"This documentation has been redirected to a new page",show_more:"Show More",view_on_osm:"View on openstreetmap.org",all_fields:"All fields",all_tags:"All tags",all_members:"All members",all_relations:"All relations",new_relation:"New relation...",role:"Role",choose:"Select feature type",results:"{n} results for {search}",reference:"View on OpenStreetMap Wiki",back_tooltip:"Change feature",remove:"Remove",search:"Search",multiselect:"Selected features",unknown:"Unknown",incomplete:"<not downloaded>",feature_list:"Search features",edit:"Edit feature",check:{yes:"Yes",no:"No",reverser:"Change Direction"},radio:{structure:{type:"Type","default":"Default",layer:"Layer"}},add:"Add",none:"None",node:"Node",way:"Way",relation:"Relation",location:"Location",add_fields:"Add field:"},background:{title:"Background",description:"Background settings",key:"B",backgrounds:"Backgrounds",none:"None",best_imagery:"Best known imagery source for this location","switch":"Switch back to this background",custom:"Custom",overlays:"Overlays",imagery_source_faq:"Imagery Info / Report a Problem",reset:"reset",display_options:"Display Options",brightness:"Brightness",contrast:"Contrast",saturation:"Saturation",sharpness:"Sharpness",minimap:{description:"Show Minimap",tooltip:"Show a zoomed out map to help locate the area currently displayed.",key:"/"},fix_misalignment:"Adjust imagery offset",offset:"Drag anywhere in the gray area below to adjust the imagery offset, or enter the offset values in meters."},map_data:{title:"Map Data",description:"Map Data",key:"F",data_layers:"Data Layers",layers:{osm:{tooltip:"Map data from OpenStreetMap",title:"OpenStreetMap data"},notes:{tooltip:"Note data from OpenStreetMap",title:"OpenStreetMap notes"},custom:{tooltip:"Drag and drop a data file onto the page, or click the button to setup",title:"Custom Map Data",zoom:"Zoom to data"}},fill_area:"Fill Areas",map_features:"Map Features",autohidden:"These features have been automatically hidden because too many would be shown on the screen. You can zoom in to edit them.",osmhidden:"These features have been automatically hidden because the OpenStreetMap layer is hidden."},feature:{points:{description:"Points",tooltip:"Points of Interest"},traffic_roads:{description:"Traffic Roads",tooltip:"Highways, Streets, etc."},service_roads:{description:"Service Roads",tooltip:"Service Roads, Parking Aisles, Tracks, etc."},paths:{description:"Paths",tooltip:"Sidewalks, Foot Paths, Cycle Paths, etc."},buildings:{description:"Buildings",tooltip:"Buildings, Shelters, Garages, etc."},landuse:{description:"Landuse Features",tooltip:"Forests, Farmland, Parks, Residential, Commercial, etc."},boundaries:{description:"Boundaries",tooltip:"Administrative Boundaries"},water:{description:"Water Features",tooltip:"Rivers, Lakes, Ponds, Basins, etc."},rail:{description:"Rail Features",tooltip:"Railways"},power:{description:"Power Features",tooltip:"Power Lines, Power Plants, Substations, etc."},past_future:{description:"Past/Future",tooltip:"Proposed, Construction, Abandoned, Demolished, etc."},others:{description:"Others",tooltip:"Everything Else"}},area_fill:{wireframe:{description:"No Fill (Wireframe)",tooltip:"Enabling wireframe mode makes it easy to see the background imagery.",key:"W"},partial:{description:"Partial Fill",tooltip:"Areas are drawn with fill only around their inner edges. (Recommended for beginner mappers)"},full:{description:"Full Fill",tooltip:"Areas are drawn fully filled."}},settings:{custom_background:{tooltip:"Edit custom background",header:"Custom Background Settings",instructions:"Enter a tile URL template. Valid tokens are:\n {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme\n {-y} or {ty} for flipped TMS-style Y coordinates\n {u} for quadtile scheme\n {switch:a,b,c} for DNS server multiplexing\n\nExample:\n{example}",template:{placeholder:"Enter a url template"}},custom_data:{tooltip:"Edit custom data layer",header:"Custom Map Data Settings",file:{instructions:"Choose a local data file. Supported types are:\n .gpx, .kml, .geojson, .json",label:"Browse files"},or:"Or",url:{instructions:"Enter a data file URL or vector tile URL template. Valid tokens are:\n {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme",placeholder:"Enter a url"}}},restore:{heading:"You have unsaved changes",description:"Do you wish to restore unsaved changes from a previous editing session?",restore:"Restore my changes",reset:"Discard my changes"},save:{title:"Save",help:"Review your changes and upload them to OpenStreetMap, making them visible to other users.",no_changes:"No changes to save.",error:"Errors occurred while trying to save",status_code:"Server returned status code {code}",unknown_error_details:"Please ensure you are connected to the internet.",uploading:"Uploading changes to OpenStreetMap...",conflict_progress:"Checking for conflicts: {num} of {total}",unsaved_changes:"You have unsaved changes",conflict:{header:"Resolve conflicting edits",count:"Conflict {num} of {total}",previous:"< Previous",next:"Next >",keep_local:"Keep mine",keep_remote:"Use theirs",restore:"Restore","delete":"Leave Deleted",download_changes:"Or download osmChange file",done:"All conflicts resolved!",help:"Another user changed some of the same map features you changed.\nClick on each feature below for more details about the conflict, and choose whether to keep\nyour changes or the other user's changes.\n"}},merge_remote_changes:{conflict:{deleted:"This feature has been deleted by {user}.",location:"This feature was moved by both you and {user}.",nodelist:"Nodes were changed by both you and {user}.",memberlist:"Relation members were changed by both you and {user}.",tags:"You changed the <b>{tag}</b> tag to \"{local}\" and {user} changed it to \"{remote}\"."}},success:{just_edited:"You just edited OpenStreetMap!",thank_you:"Thank you for improving the map.",thank_you_location:"Thank you for improving the map around {where}.",help_html:"Your changes should appear on OpenStreetMap within a few minutes. It may take longer for maps elsewhere to receive updates.",help_link_text:"Details",help_link_url:"https://wiki.openstreetmap.org/wiki/FAQ#I_have_just_made_some_changes_to_the_map._How_do_I_get_to_see_my_changes.3F",view_on_osm:"View Changes on OSM",changeset_id:"Your changeset #: {changeset_id}",like_osm:"Like OpenStreetMap? Connect with others:",more:"More",events:"Events",languages:"Languages: {languages}",missing:"Is something missing from this list?",tell_us:"Tell us!"},confirm:{okay:"OK",cancel:"Cancel"},splash:{welcome:"Welcome to the iD OpenStreetMap editor",text:"iD is a friendly but powerful tool for contributing to the world's best free world map. This is version {version}. For more information see {website} and report bugs at {github}.",walkthrough:"Start the Walkthrough",start:"Edit now"},source_switch:{live:"live",lose_changes:"You have unsaved changes. Switching the map server will discard them. Are you sure you want to switch servers?",dev:"dev"},version:{whats_new:"What's new in iD {version}"},tag_reference:{description:"Description",on_wiki:"{tag} on wiki.osm.org",used_with:"used with {type}"},validations:{disconnected_highway:"Disconnected highway",disconnected_highway_tooltip:"Roads should be connected to other roads or building entrances.",old_multipolygon:"Multipolygon tags on outer way",old_multipolygon_tooltip:"This style of multipolygon is deprecated. Please assign the tags to the parent multipolygon instead of the outer way.",untagged_point:"Untagged point",untagged_point_tooltip:"Select a feature type that describes what this point is.",untagged_line:"Untagged line",untagged_line_tooltip:"Select a feature type that describes what this line is.",untagged_area:"Untagged area",untagged_area_tooltip:"Select a feature type that describes what this area is.",untagged_relation:"Untagged relation",untagged_relation_tooltip:"Select a feature type that describes what this relation is.",many_deletions:"You're deleting {n} features: {p} nodes, {l} lines, {a} areas, {r} relations. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.",tag_suggests_area:"The tag {tag} suggests line should be area, but it is not an area",deprecated_tags:"Deprecated tags: {tags}"},zoom:{"in":"Zoom in",out:"Zoom out"},cannot_zoom:"Cannot zoom out further in current mode.",full_screen:"Toggle Full Screen",streetside:{tooltip:"Streetside photos from Microsoft",title:"Photo Overlay (Bing Streetside)",report:"Report a privacy concern with this image",view_on_bing:"View on Bing Maps",hires:"High resolution"},mapillary_images:{tooltip:"Street-level photos from Mapillary",title:"Photo Overlay (Mapillary)"},mapillary_signs:{tooltip:"Traffic signs from Mapillary (must enable Photo Overlay)",title:"Traffic Sign Overlay (Mapillary)"},mapillary:{view_on_mapillary:"View this image on Mapillary"},openstreetcam_images:{tooltip:"Street-level photos from OpenStreetCam",title:"Photo Overlay (OpenStreetCam)"},openstreetcam:{view_on_openstreetcam:"View this image on OpenStreetCam"},note:{note:"Note",title:"Edit note",anonymous:"anonymous",closed:"(Closed)",commentTitle:"Comments",status:{opened:"opened {when}",reopened:"reopened {when}",commented:"commented {when}",closed:"closed {when}"},newComment:"New Comment",inputPlaceholder:"Enter a comment to share with other users.",close:"Close Note",open:"Reopen Note",comment:"Comment",close_comment:"Close and Comment",open_comment:"Reopen and Comment",report:"Report","new":"New Note",newDescription:"Describe the issue.",save:"Save Note",login:"You must log in to change or comment on this note.",upload_explanation:"Your comments will be publicly visible to all OpenStreetMap users.",upload_explanation_with_user:"Your comments as {user} will be publicly visible to all OpenStreetMap users."},help:{title:"Help",key:"H",help:{title:"Help",welcome:"Welcome to the iD editor for [OpenStreetMap](https://www.openstreetmap.org/). With this editor you can update OpenStreetMap right from your web browser.",open_data_h:"Open Data",open_data:"Edits that you make on this map will be visible to everyone who uses OpenStreetMap. Your edits can be based on personal knowledge, on-the-ground surveying, or imagery collected from aerial or street level photos. Copying from commercial sources, like Google Maps, [is strictly forbidden](https://www.openstreetmap.org/copyright).",before_start_h:"Before you start",before_start:"You should be familiar with OpenStreetMap and this editor before you start editing. iD contains a walkthrough to teach you the basics of editing OpenStreetMap. Click \"Start the Walkthrough\" on this screen to take the tutorial - it takes only about 15 minutes.",open_source_h:"Open Source",open_source:"The iD editor is a collaborative open source project, and you are using version {version} now. The source code is available [on GitHub](https://github.com/openstreetmap/iD).",open_source_help:"You can help iD by [translating](https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating) or [reporting bugs](https://github.com/openstreetmap/iD/issues)."},overview:{title:"Overview",navigation_h:"Navigation",navigation_drag:"You can drag the map by pressing and holding down the {leftclick} left mouse button and moving the mouse around. You can also use the `↓`, `↑`, `←`, `→` arrow keys on your keyboard.",navigation_zoom:"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons along the side of the map. You can also use the `+`, `-` keys on your keyboard.",features_h:"Map Features",features:"We use the word *features* to describe things that appear on the map, such as roads, buildings, or points of interest. Anything in the real world can be mapped as a feature on OpenStreetMap. Map features are represented on the map using *points*, *lines*, or *areas*.",nodes_ways:"In OpenStreetmap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*."},editing:{title:"Editing & Saving",select_h:"Select",select_left_click:"{leftclick} Left-click on a feature to select it. This will highlight it with a pulsing glow, and the sidebar will display details about that feature, such as its name or address.",select_right_click:"{rightclick} Right-click on a feature to display the editing menu, which shows the commands that are available, such as rotating, moving, and deleting.",multiselect_h:"Multiselect",multiselect_shift_click:"`{shift}`+{leftclick} left-click to select several features together. This makes it easier to move or delete multiple items.",multiselect_lasso:"Another way to select multiple features is to hold down the `{shift}` key, then press and hold down the {leftclick} left mouse button and drag the mouse to draw a selection lasso. All of the points inside the lasso area will be selected.",undo_redo_h:"Undo & Redo",undo_redo:"Your edits are stored locally in your browser until you choose to save them to the OpenStreetMap server. You can undo edits by clicking the {undo} **Undo** button, and redo them by clicking the {redo} **Redo** button.",save_h:"Save",save:"Click {save} **Save** to finish your edits and send them to OpenStreetMap. You should remember to save your work frequently!",save_validation:"On the save screen, you'll have a chance to review what you've done. iD will also perform some basic checks for missing data and may offer helpful suggestions and warnings if something doesn't seem right.",upload_h:"Upload",upload:"Before uploading your changes you must enter a [changeset comment](https://wiki.openstreetmap.org/wiki/Good_changeset_comments). Then click **Upload** to send your changes to OpenStreetMap, where they will be merged into the map and publicly visible to everyone.",backups_h:"Automatic Backups",backups:"If you can't finish your edits in one sitting, for example if your computer crashes or you close the browser tab, your edits are still saved in your browser's storage. You can come back later (on the same browser and computer), and iD will offer to restore your work.",keyboard_h:"Keyboard Shortcuts",keyboard:"You can view a list of keyboard shortcuts by pressing the `?` key."},feature_editor:{title:"Feature Editor",intro:"The *feature editor* appears alongside the map, and allows you to see and edit all of the information for the selected feature.",definitions:"The top section displays the feature's type. The middle section contains *fields* showing the feature's attributes, such as its name or address.",type_h:"Feature Type",type:"You can click on the feature type to change the feature to a different type. Everything that exists in the real world can be added to OpenStreetMap, so there are thousands of feature types to choose from.",type_picker:"The type picker displays the most common feature types, such as parks, hospitals, restaurants, roads, and buildings. You can search for anything by typing what you're looking for in the search box. You can also click the {inspect} **Info** icon next to the feature type to learn more about it.",fields_h:"Fields",fields_all_fields:"The \"All fields\" section contains all of the feature's details that you may edit. In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.",fields_example:"Each feature type will display different fields. For example, a road may display fields for its surface and speed limit, but a restaurant may display fields for the type of food it serves and the hours it is open.",fields_add_field:"You can also click the \"Add field\" dropdown to add more fields, such as a description, Wikipedia link, wheelchair access, and more.",tags_h:"Tags",tags_all_tags:"Below the fields section, you can expand the \"All tags\" section to edit any of the OpenStreetMap *tags* for the selected feature. Each tag consists of a *key* and *value*, data elements that define all of the features stored in OpenStreetMap.",tags_resources:"Editing a feature's tags requires intermediate knowledge about OpenStreetMap. You should consult resources like the [OpenStreetMap Wiki](https://wiki.openstreetmap.org/wiki/Main_Page) or [Taginfo](https://taginfo.openstreetmap.org/) to learn more about accepted OpenStreetMap tagging practices."},points:{title:"Points",intro:"*Points* can be used to represent features such as shops, restaurants, and monuments. They mark a specific location, and describe what's there.",add_point_h:"Adding Points",add_point:"To add a point, click the {point} **Point** button on the toolbar above the map, or press the shortcut key `1`. This will change the mouse cursor to a cross symbol.",add_point_finish:"To place the new point on the map, position the mouse cursor where the point should go, then {leftclick} left-click or press `Space`.",move_point_h:"Moving Points",move_point:"To move a point, place the mouse cursor over the point, then press and hold the {leftclick} left mouse button while dragging the point to its new location.",delete_point_h:"Deleting Points",delete_point:"It's OK to delete features that don't exist in the real world. Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it.",delete_point_command:"To delete a point, {rightclick} right-click on the point to select it and show the edit menu, then use the {delete} **Delete** command."},lines:{title:"Lines",intro:"*Lines* are used to represent features such as roads, railroads, and rivers. Lines should be drawn down the center of the feature that they represent.",add_line_h:"Adding Lines",add_line:"To add a line, click the {line} **Line** button on the toolbar above the map, or press the shortcut key `2`. This will change the mouse cursor to a cross symbol.",add_line_draw:"Next, position the mouse cursor where the line should begin and {leftclick} left-click or press `Space` to begin placing nodes along the line. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",add_line_finish:"To finish a line, press `{return}` or click again on the last node.",modify_line_h:"Modifying Lines",modify_line_dragnode:"Often you'll see lines that aren't shaped correctly, for example a road that does not match up with the background imagery. To adjust the shape of a line, first {leftclick} left-click to select it. All nodes of the line will be drawn as small circles. You can then drag the nodes to better locations.",modify_line_addnode:"You can also create new nodes along a line either by {leftclick}**x2** double-clicking on the line or by dragging the small triangles at the midpoints between nodes.",connect_line_h:"Connecting Lines",connect_line:"Having roads connected properly is important for the map and essential for providing driving directions.",connect_line_display:"The connections between roads are drawn with gray circles. The endpoints of a line are drawn with larger white circles if they don't connect to anything.",connect_line_drag:"To connect a line to another feature, drag one of the line's nodes onto the other feature until both features snap together. Tip: You can hold down the `{alt}` key to prevent nodes from connecting to other features.",connect_line_tag:"If you know that the connection has traffic lights or crosswalks, you can add them by selecting the connecting node and using the feature editor to select the correct feature's type.",disconnect_line_h:"Disconnecting Lines",disconnect_line_command:"To disconnect a road from another feature, {rightclick} right-click the connecting node and select the {disconnect} **Disconnect** command from the editing menu.",move_line_h:"Moving Lines",move_line_command:"To move an entire line, {rightclick} right-click the line and select the {move} **Move** command from the editing menu. Then move the mouse, and {leftclick} left-click to place the line in a new location.",move_line_connected:"Lines that are connected to other features will stay connected as you move the line to a new location. iD may prevent you from moving a line across another connected line.",delete_line_h:"Deleting Lines",delete_line:"If a line is entirely incorrect, for example a road that doesn't exist in the real world, it's OK to delete it. Be careful when deleting features: the background imagery you are using might be outdated, and a road that looks wrong could simply be newly built.",delete_line_command:"To delete a line, {rightclick} right-click on the line to select it and show the edit menu, then use the {delete} **Delete** command."},areas:{title:"Areas",intro:"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas. Areas should be traced around the edge of the feature that they represent, for example, around the base of a building.",point_or_area_h:"Points or Areas?",point_or_area:"Many features can be represented as points or areas. You should map buildings and property outlines as areas whenever possible. Place points inside a building area to represent businesses, amenities, and other features located inside the building.",add_area_h:"Adding Areas",add_area_command:"To add an area, click the {area} **Area** button on the toolbar above the map, or press the shortcut key `3`. This will change the mouse cursor to a cross symbol.",add_area_draw:"Next, position the mouse cursor at one of the corners of the feature and {leftclick} left-click or press `Space` to begin placing nodes around the outer edge of the area. Continue placing more nodes by clicking or pressing `Space`. While drawing, you can zoom in or drag the map in order to add more detail.",add_area_finish:"To finish an area, press `{return}` or click again on either the first or last node.",square_area_h:"Square Corners",square_area_command:"Many area features like buildings have square corners. To square the corners of an area, {rightclick} right-click the edge of the area and select the {orthogonalize} **Square** command from the editing menu.",modify_area_h:"Modifying Areas",modify_area_dragnode:"Often you'll see areas that aren't shaped correctly, for example a building that does not match up with the background imagery. To adjust the shape of an area, first {leftclick} left-click to select it. All nodes of the area will be drawn as small circles. You can then drag the nodes to better locations.",modify_area_addnode:"You can also create new nodes along an area either by {leftclick}**x2** double-clicking on the edge of the area or by dragging the small triangles at the midpoints between nodes.",delete_area_h:"Deleting Areas",delete_area:"If an area is entirely incorrect, for example a building that doesn't exist in the real world, it's OK to delete it. Be cautious when deleting features - the background imagery you are using might be outdated, and a building that looks wrong could simply be newly built.",delete_area_command:"To delete an area, {rightclick} right-click on the area to select it and show the edit menu, then use the {delete} **Delete** command."},relations:{title:"Relations",intro:"A *relation* is a special type of feature in OpenStreetMap that groups together other features. The features that belong to a relation are called *members*, and each member can have a *role* in the relation.",edit_relation_h:"Editing Relations",edit_relation:"At the bottom of the feature editor, you can expand the \"All relations\" section to see if the selected feature is a member of any relations. You can then click on the relation to select and edit it.",edit_relation_add:"To add a feature to a relation, select the feature, then click the {plus} add button in the \"All relations\" section of the feature editor. You can choose from a list of nearby relations, or choose the \"New relation...\" option.",edit_relation_delete:"You can also click the {delete} **Delete** button to remove the selected feature from the relation. If you remove all of the members from a relation, the relation will be deleted automatically.",maintain_relation_h:"Maintaining Relations",maintain_relation:"For the most part, iD will maintain relations automatically as you edit. You should take care when replacing features that might be members of relations. For example if you delete a section of road and draw a new section of road to replace it, you should add the new section to the same relations (routes, turn restrictions, etc.) as the original.",relation_types_h:"Relation Types",multipolygon_h:"Multipolygons",multipolygon:"A *multipolygon* relation is a group of one or more *outer* features and one or more inner features. The outer features define the outer edges of the multipolygon, and the inner features define sub-areas or holes cut out from the inside of the multipolygon.",multipolygon_create:"To create a multipolygon, for example a building with a hole in it, draw the outer edge as an area and the inner edge as a line or different kind of area. Then `{shift}`+{leftclick} left-click to select both features, {rightclick} right-click to show the edit menu, and select the {merge} **Merge** command.",multipolygon_merge:"Merging several lines or areas will create a new multipolygon relation with all selected areas as members. iD will choose the inner and outer roles automatically, based on which features are contained inside other features.",turn_restriction_h:"Turn restrictions",turn_restriction:"A *turn restriction* relation is a group of several road segments in an intersection. Turn restrictions consist of a *from* road, *via* node or roads, and a *to* road.",turn_restriction_field:"To edit turn restrictions, select a junction node where two or more roads meet. The feature editor will display a special \"Turn Restrictions\" field containing a model of the intersection.",turn_restriction_editing:"In the \"Turn Restrictions\" field, click to select a \"from\" road, and see whether turns are allowed or restricted to any of the \"to\" roads. You can click on the turn icons to toggle them between allowed and restricted. iD will create relations automatically and set the from, via, and to roles based on your choices.",route_h:"Routes",route:"A *route* relation is a group of one or more line features that together form a route network, like a bus route, train route, or highway route.",route_add:"To add a feature to a route relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation.",boundary_h:"Boundaries",boundary:"A *boundary* relation is a group of one or more line features that together form an administrative boundary.",boundary_add:"To add a feature to a boundary relation, select the feature and scroll down to the \"All relations\" section of the feature editor, then click the {plus} add button to add this feature to a nearby existing relation or a new relation."},notes:{title:"Notes",intro:"*Notes* are used to alert other users that a feature requires fixing or attention. Notes mark a specific location on the map. To view existing notes or add new ones, click the {data} **Map data** panel to enable the OpenStreetMap notes layer.",add_note_h:"Adding Notes",add_note:"To add a new note, click the {note} **Note** button on the toolbar above the map, or press the shortcut key `4`. This will change the mouse cursor to a cross symbol. To place the new note on the map, position the mouse cursor where the note should go, then {leftclick} left-click or press `Space`.",move_note:"Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location.",update_note_h:"Closing, Reopening, and Commenting",update_note:"An existing note can be updated by closing it, reopening it, or adding a comment to it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original issue is not resolved.",save_note_h:"Saving Notes",save_note:"You must save any note edits individually by clicking the buttons below the note comments. Note edits are **not** included in changesets that you upload to OpenStreetMap."},imagery:{title:"Background Imagery",intro:"The background imagery that appears beneath the map data is an important resource for mapping. This imagery can be aerial photos collected from satellites, airplanes, and drones, or it can be scanned historical maps or other freely available source data.",sources_h:"Imagery Sources",choosing:"To see which imagery sources are available for editing, click the {layers} **Background settings** button on the side of the map.",sources:"By default, a [Bing Maps](https://www.bing.com/maps/) satellite layer is chosen as the background image. Depending on where you are editing, other imagery sources will be available. Some may be newer or have higher resolution, so it is always useful to check and see which layer is the best one to use as a mapping reference.",offsets_h:"Adjusting Imagery Offset",offset:"Imagery is sometimes offset slightly from accurate map data. If you see a lot of roads or buildings shifted from the background imagery, it may be the imagery that's incorrect, so don't move them all to match the background. Instead, you can adjust the background so that it matches the existing data by expanding the \"Adjust Imagery Offset\" section at the bottom of the Background Settings pane.",offset_change:"Click on the small triangles to adjust the imagery offset in small steps, or hold the left mouse button and drag within the gray square to slide the imagery into alignment."},streetlevel:{title:"Street Level Photos",intro:"Street level photos are useful for mapping traffic signs, businesses, and other details that you can't see from satellite and aerial images. The iD editor supports street level photos from [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [Mapillary](https://www.mapillary.com), and [OpenStreetCam](https://www.openstreetcam.org).",using_h:"Using Street Level Photos",using:"To use street level photos for mapping, click the {data} **Map data** panel on the side of the map to enable or disable the available photo layers.",photos:"When enabled, the photo layer displays a line along the sequence of photos. At higher zoom levels, a circle marks at each photo location, and at even higher zoom levels, a cone indicates the direction the camera was facing when the photo was taken.",viewer:"When you click on one of the photo locations, a photo viewer appears in the bottom corner of the map. The photo viewer contains controls to step forward and backward in the image sequence. It also shows the username of the person who captured the image, the date it was captured, and a link to view the image on the original site."},gps:{title:"GPS Traces",intro:"Collected GPS traces are a valuable source of data for OpenStreetMap. This editor supports *.gpx*, *.geojson*, and *.kml* files on your local computer. You can collect GPS traces with a smartphone, sports watch, or other GPS device.",survey:"For information on how to perform a GPS survey, read [Mapping with a smartphone, GPS, or paper](http://learnosm.org/en/mobile-mapping/).",using_h:"Using GPS Traces",using:"To use a GPS trace for mapping, drag and drop the data file onto the map editor. If it's recognized, it will be drawn on the map as a bright purple line. Click the {data} **Map data** panel on the side of the map to enable, disable, or zoom to your GPS data.",tracing:"The GPS track isn't sent to OpenStreetMap - the best way to use it is to draw on the map, using it as a guide for the new features that you add.",upload:"You can also [upload your GPS data to OpenStreetMap](https://www.openstreetmap.org/trace/create) for other users to use."},field:{restrictions:{title:"Turn Restrictions Help",about:{title:"About",about:"This field allows you to inspect and modify turn restrictions. It displays a model of the selected intersection including other nearby connected roads.",from_via_to:"A turn restriction always contains: one **FROM way**, one **TO way**, and either one **VIA node** or one or more **VIA ways**.",maxdist:"The \"{distField}\" slider controls how far to search for additional connected roads.",maxvia:"The \"{viaField}\" slider adjusts how many via ways may be included in the search. (Tip: simple is better)"},inspecting:{title:"Inspecting",about:"Hover over any **FROM** segment to see whether it has any turn restrictions. Each possible **TO** destination will be drawn with a colored shadow showing whether a restriction exists.",from_shadow:"{fromShadow} **FROM segment**",allow_shadow:"{allowShadow} **TO Allowed**",restrict_shadow:"{restrictShadow} **TO Restricted**",only_shadow:"{onlyShadow} **TO Only**",restricted:"\"Restricted\" means that there is a turn restriction, for example \"No Left Turn\".",only:"\"Only\" means that a vehicle taking that path may only make that choice, for example \"Only Straight On\"."},modifying:{title:"Modifying",about:"To modify turn restrictions, first click on any starting **FROM** segment to select it. The selected segment will pulse, and all possible **TO** destinations will appear as turn symbols.",indicators:"Then, click on a turn symbol to toggle it between \"Allowed\", \"Restricted\", and \"Only\".",allow_turn:"{allowTurn} **TO Allowed**",restrict_turn:"{restrictTurn} **TO Restricted**",only_turn:"{onlyTurn} **TO Only**"},tips:{title:"Tips",simple:"**Prefer simple restrictions over complex ones.**",simple_example:"For example, avoid creating a via-way restriction if a simpler via-node turn restriction will do.",indirect:"**Some restrictions display the text \"(indirect)\" and are drawn lighter.**",indirect_example:"These restrictions exist because of another nearby restriction. For example, an \"Only Straight On\" restriction will indirectly create \"No Turn\" restrictions for all other paths through the intersection.",indirect_noedit:"You may not edit indirect restrictions. Instead, edit the nearby direct restriction."}}}},intro:{done:"done",ok:"OK",graph:{block_number:"<value for addr:block_number>",city:"Three Rivers",county:"<value for addr:county>",district:"<value for addr:district>",hamlet:"<value for addr:hamlet>",neighbourhood:"<value for addr:neighbourhood>",postcode:"49093",province:"<value for addr:province>",quarter:"<value for addr:quarter>",state:"MI",subdistrict:"<value for addr:subdistrict>",suburb:"<value for addr:suburb>",countrycode:"us",name:{"1st-avenue":"1st Avenue","2nd-avenue":"2nd Avenue","4th-avenue":"4th Avenue","5th-avenue":"5th Avenue","6th-avenue":"6th Avenue","6th-street":"6th Street","7th-avenue":"7th Avenue","8th-avenue":"8th Avenue","9th-avenue":"9th Avenue","10th-avenue":"10th Avenue","11th-avenue":"11th Avenue","12th-avenue":"12th Avenue","access-point-employment":"Access Point Employment","adams-street":"Adams Street","andrews-elementary-school":"Andrews Elementary School","andrews-street":"Andrews Street","armitage-street":"Armitage Street","barrows-school":"Barrows School","battle-street":"Battle Street","bennett-street":"Bennett Street","bowman-park":"Bowman Park","collins-drive":"Collins Drive","conrail-railroad":"Conrail Railroad","conservation-park":"Conservation Park","constantine-street":"Constantine Street","cushman-street":"Cushman Street","dollar-tree":"Dollar Tree","douglas-avenue":"Douglas Avenue","east-street":"East Street","elm-street":"Elm Street","flower-street":"Flower Street","foster-street":"Foster Street","french-street":"French Street","garden-street":"Garden Street","gem-pawnbroker":"Gem Pawnbroker","golden-finch-framing":"Golden Finch Framing","grant-avenue":"Grant Avenue","hoffman-pond":"Hoffman Pond","hoffman-street":"Hoffman Street","hook-avenue":"Hook Avenue","jefferson-street":"Jefferson Street","kelsey-street":"Kelsey Street","lafayette-park":"LaFayette Park","las-coffee-cafe":"L.A.'s Coffee Cafe","lincoln-avenue":"Lincoln Avenue","lowrys-books":"Lowry's Books","lynns-garage":"Lynn's Garage","main-street-barbell":"Main Street Barbell","main-street-cafe":"Main Street Cafe","main-street-fitness":"Main Street Fitness","main-street":"Main Street","maple-street":"Maple Street","marina-park":"Marina Park","market-street":"Market Street","memory-isle-park":"Memory Isle Park","memory-isle":"Memory Isle","michigan-avenue":"Michigan Avenue","middle-street":"Middle Street","millard-street":"Millard Street","moore-street":"Moore Street","morris-avenue":"Morris Avenue","mural-mall":"Mural Mall","paisanos-bar-and-grill":"Paisano's Bar and Grill","paisley-emporium":"Paisley Emporium","paparazzi-tattoo":"Paparazzi Tattoo","pealer-street":"Pealer Street","pine-street":"Pine Street","pizza-hut":"Pizza Hut","portage-avenue":"Portage Avenue","portage-river":"Portage River","preferred-insurance-services":"Preferred Insurance Services","railroad-drive":"Railroad Drive","river-city-appliance":"River City Appliance","river-drive":"River Drive","river-road":"River Road","river-street":"River Street","riverside-cemetery":"Riverside Cemetery","riverwalk-trail":"Riverwalk Trail","riviera-theatre":"Riviera Theatre","rocky-river":"Rocky River","saint-joseph-river":"Saint Joseph River","scidmore-park-petting-zoo":"Scidmore Park Petting Zoo","scidmore-park":"Scidmore Park","scouter-park":"Scouter Park","sherwin-williams":"Sherwin-Williams","south-street":"South Street","southern-michigan-bank":"Southern Michigan Bank","spring-street":"Spring Street","sturgeon-river-road":"Sturgeon River Road","three-rivers-city-hall":"Three Rivers City Hall","three-rivers-elementary-school":"Three Rivers Elementary School","three-rivers-fire-department":"Three Rivers Fire Department","three-rivers-high-school":"Three Rivers High School","three-rivers-middle-school":"Three Rivers Middle School","three-rivers-municipal-airport":"Three Rivers Municipal Airport","three-rivers-post-office":"Three Rivers Post Office","three-rivers-public-library":"Three Rivers Public Library","three-rivers":"Three Rivers","unique-jewelry":"Unique Jewelry","walnut-street":"Walnut Street","washington-street":"Washington Street","water-street":"Water Street","west-street":"West Street","wheeler-street":"Wheeler Street","william-towing":"William Towing","willow-drive":"Willow Drive","wood-street":"Wood Street","world-fare":"World Fare"}},welcome:{title:"Welcome",welcome:"Welcome! This walkthrough will teach you the basics of editing on OpenStreetMap.",practice:"All of the data in this walkthrough is just for practicing, and any edits that you make in the walkthrough will not be saved.",words:"This walkthrough will introduce some new words and concepts. When we introduce a new word, we'll use *italics*.",mouse:"You can use any input device to edit the map, but this walkthrough assumes you have a mouse with left and right buttons. **If you want to attach a mouse, do so now, then click OK.**",leftclick:"When this tutorial asks you to click or double-click, we mean with the left button. On a trackpad it might be a single-click or single-finger tap. **Left-click {num} times.**",rightclick:"Sometimes we'll also ask you to right-click. This might be the same as control-click, or two-finger tap on a trackpad. Your keyboard might even have a 'menu' key that works like right-click. **Right-click {num} times.**",chapters:"So far, so good! You can use the buttons below to skip chapters at any time or to restart a chapter if you get stuck. Let's begin! **Click '{next}' to continue.**"},navigation:{title:"Navigation",drag:"The main map area shows OpenStreetMap data on top of a background.{br}You can drag the map by pressing and holding the left mouse button while moving the mouse around. You can also use the arrow keys on your keyboard. **Drag the map!**",zoom:"You can zoom in or out by scrolling with the mouse wheel or trackpad, or by clicking the {plus} / {minus} buttons. **Zoom the map!**",features:"We use the word *features* to describe the things that appear on the map. Anything in the real world can be mapped as a feature on OpenStreetMap.",points_lines_areas:"Map features are represented using *points, lines, or areas.*",nodes_ways:"In OpenStreetMap, points are sometimes called *nodes*, and lines and areas are sometimes called *ways*.",click_townhall:"All features on the map can be selected by clicking on them. **Click on the point to select it.**",selected_townhall:"Great! The point is now selected. Selected features are drawn with a pulsing glow.",editor_townhall:"When a feature is selected, the *feature editor* is displayed alongside the map.",preset_townhall:"The top part of the feature editor shows the feature's type. This point is a {preset}.",fields_townhall:"The middle part of the feature editor contains *fields* showing the feature's attributes, such as its name and address.",close_townhall:"**Close the feature editor by hitting escape or pressing the {button} button in the upper corner.**",search_street:"You can also search for features in the current view, or worldwide. **Search for '{name}'.**",choose_street:"**Choose {name} from the list to select it.**",selected_street:"Great! {name} is now selected.",editor_street:"The fields shown for a street are different than the fields that were shown for the town hall.{br}For this selected street, the feature editor shows fields like '{field1}' and '{field2}'. **Close the feature editor by hitting escape or pressing the {button} button.**",play:"Try moving the map and clicking on some other features to see what kinds of things can be added to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},points:{title:"Points",add_point:"*Points* can be used to represent features such as shops, restaurants, and monuments.{br}They mark a specific location, and describe what's there. **Click the {button} Point button to add a new point.**",place_point:"To place the new point on the map, position your mouse cursor where the point should go, then left-click or press the spacebar. **Move the mouse pointer over this building, then left-click or press the spacebar.**",search_cafe:"There are many different features that can be represented by points. The point you just added is a cafe. **Search for '{preset}'.**",choose_cafe:"**Choose {preset} from the list.**",feature_editor:"The point is now marked as a cafe. Using the feature editor, we can add more information about the cafe.",add_name:"In OpenStreetMap, all of the fields are optional, and it's OK to leave a field blank if you are unsure.{br}Let's pretend that you have local knowledge of this cafe, and you know its name. **Add a name for the cafe.**",add_close:"The feature editor will remember all of your changes automatically. **When you are finished adding the name, hit escape, enter, or click the {button} button to close the feature editor.**",reselect:"Often points will already exist, but have mistakes or be incomplete. We can edit existing points. **Click to select the cafe you just created.**",update:"Let's fill in some more details for this cafe. You can change its name, add a cuisine, or add an address. **Change the cafe details.**",update_close:"**When you are finished updating the cafe, hit escape, enter, or click the {button} button to close the feature editor.**",rightclick:"You can right-click on any feature to see the *edit menu*, which shows a list of editing operations that can be performed. **Right-click to select the point you created and show the edit menu.**","delete":"It's OK to delete features that don't exist in the real world.{br}Deleting a feature from OpenStreetMap removes it from the map that everyone uses, so you should make sure a feature is really gone before you delete it. **Click on the {button} button to delete the point.**",undo:"You can always undo any changes up until you save your edits to OpenStreetMap. **Click on the {button} button to undo the delete and get the point back.**",play:"Now that you know how to create and edit points, try creating a few more points for practice! **When you are ready to continue to the next chapter, click '{next}'.**"},areas:{title:"Areas",add_playground:"*Areas* are used to show the boundaries of features like lakes, buildings, and residential areas.{br}They can also be used for more detailed mapping of many features you might normally map as points. **Click the {button} Area button to add a new area.**",start_playground:"Let's add this playground to the map by drawing an area. Areas are drawn by placing *nodes* along the outer edge of the feature. **Click or press spacebar to place a starting node on one of the corners of the playground.**",continue_playground:"Continue drawing the area by placing more nodes along the playground's edge. It is OK to connect the area to the existing walking paths.{br}Tip: You can hold down the '{alt}' key to prevent nodes from connecting to other features. **Continue drawing an area for the playground.**",finish_playground:"Finish the area by pressing enter, or clicking again on either the first or last node. **Finish drawing an area for the playground.**",search_playground:"**Search for '{preset}'.**",choose_playground:"**Choose {preset} from the list.**",add_field:"This playground doesn't have an official name, so we won't add anything in the Name field.{br}Instead let's add some additional details about the playground to the Description field. **Open the Add Field list.**",choose_field:"**Choose {field} from the list.**",retry_add_field:"You didn't select the {field} field. Let's try again.",describe_playground:"**Add a description, then click the {button} button to close the feature editor.**",play:"Good job! Try drawing a few more areas, and see what other kinds of area features you can add to OpenStreetMap. **When you are ready to continue to the next chapter, click '{next}'.**"},lines:{title:"Lines",add_line:"*Lines* are used to represent features such as roads, railroads, and rivers. **Click the {button} Line button to add a new line.**",start_line:"Here is a road that is missing. Let's add it!{br}In OpenStreetMap, lines should be drawn down the center of the road. You can drag and zoom the map while drawing if necessary. **Start a new line by clicking at the top end of this missing road.**",intersect:"Click or press spacebar to add more nodes to the line.{br}Roads, and many other types of lines, are part of a larger network. It is important for these lines to be connected properly in order for routing applications to work. **Click on {name} to create an intersection connecting the two lines.**",retry_intersect:"The road needs to intersect {name}. Let's try again!",continue_line:"Continue drawing the line for the new road. Remember that you can drag and zoom the map if needed.{br}When you are finished drawing, click on the last node again. **Finish drawing the road.**",choose_category_road:"**Select {category} from the list.**",choose_preset_residential:"There are many different types of roads, but this one is a residential road. **Choose the {preset} type.**",retry_preset_residential:"You didn't select the {preset} type. **Click here to choose again.**",name_road:"**Give this road a name, then hit escape, enter, or click the {button} button to close the feature editor.**",did_name_road:"Looks good! Next we will learn how to update the shape of a line.",update_line:"Sometimes you will need to change the shape of an existing line. Here is a road that doesn't look quite right.",add_node:"We can add some nodes to this line to improve its shape. One way to add a node is to double-click the line where you want to add a node. **Double-click on the line to create a new node.**",start_drag_endpoint:"When a line is selected, you can drag any of its nodes by clicking and holding down the left mouse button while you drag. **Drag the endpoint to the place where these roads should intersect.**",finish_drag_endpoint:"This spot looks good. **Release the left mouse button to finish dragging.**",start_drag_midpoint:"Small triangles are drawn at the *midpoints* between nodes. Another way to create a new node is to drag a midpoint to a new location. **Drag the midpoint triangle to create a new node along the curve of the road.**",continue_drag_midpoint:"This line is looking much better! Continue to adjust this line by double-clicking or dragging midpoints until the curve matches the road shape. **When you're happy with how the line looks, click OK.**",delete_lines:"It's OK to delete lines for roads that don't exist in the real world.{br}Here's an example where the city planned a {street} but never built it. We can improve this part of the map by deleting the extra lines.",rightclick_intersection:"The last real street is {street1}, so we will *split* {street2} at this intersection and remove everything above it. **Right click on the intersection node.**",split_intersection:"**Click on the {button} button to split {street}.**",retry_split:"You didn't click the Split button. Try again.",did_split_multi:"Good job! {street1} is now split into two pieces. The top part can be removed. **Click the top part of {street2} to select it.**",did_split_single:"**Click the top part of {street2} to select it.**",multi_select:"{selected} is now selected. Let's also select {other1}. You can shift-click to select multiple things. **Shift-click on {other2}.**",multi_rightclick:"Good! Both lines to delete are now selected. **Right-click on one of the lines to show the edit menu.**",multi_delete:"**Click on the {button} button to delete the extra lines.**",retry_delete:"You didn't click the Delete button. Try again.",play:"Great! Use the skills that you've learned in this chapter to practice editing some more lines. **When you are ready to continue to the next chapter, click '{next}'.**"},buildings:{title:"Buildings",add_building:"OpenStreetMap is the world's largest database of buildings.{br}You can help improve this database by tracing buildings that aren't already mapped. **Click the {button} Area button to add a new area.**",start_building:"Let's add this house to the map by tracing its outline.{br}Buildings should be traced around their footprint as accurately as possible. **Click or press spacebar to place a starting node on one of the corners of the building.**",continue_building:"Continue adding more nodes to trace the outline of the building. Remember that you can zoom in if you want to add more details.{br}Finish the building by pressing enter, or clicking again on either the first or last node. **Finish tracing the building.**",retry_building:"It looks like you had some trouble placing the nodes at the building corners. Try again!",choose_category_building:"**Choose {category} from the list.**",choose_preset_house:"There are many different types of buildings, but this one is clearly a house.{br}If you're not sure of the type, it's OK to just choose the generic Building type. **Choose the {preset} type.**",close:"**Hit escape or click the {button} button to close the feature editor.**",rightclick_building:"**Right-click to select the building you created and show the edit menu.**",square_building:"The house that you just added will look even better with perfectly square corners. **Click on the {button} button to square the building shape.**",retry_square:"You didn't click the Square button. Try again.",done_square:"See how the corners of the building moved into place? Let's learn another useful trick.",add_tank:"Next we'll trace this circular storage tank. **Click the {button} Area button to add a new area.**",start_tank:"Don't worry, you won't need to draw a perfect circle. Just draw an area inside the tank that touches its edge. **Click or press spacebar to place a starting node on the edge of the tank.**",continue_tank:"Add a few more nodes around the edge. The circle will be created outside the nodes that you draw.{br}Finish the area by pressing enter, or clicking again on either the first or last node. **Finish tracing the tank.**",search_tank:"**Search for '{preset}'.**",choose_tank:"**Choose {preset} from the list.**",rightclick_tank:"**Right-click to select the storage tank you created and show the edit menu.**",circle_tank:"**Click on the {button} button to make the tank a circle.**",retry_circle:"You didn't click the Circularize button. Try again.",play:"Great Job! Practice tracing a few more buildings, and try some of the other commands on the edit menu. **When you are ready to continue to the next chapter, click '{next}'.**"},startediting:{title:"Start Editing",help:"You're now ready to edit OpenStreetMap!{br}You can replay this walkthrough anytime or view more documentation by clicking the {button} Help button or pressing the '{key}' key.",shortcuts:"You can view a list of commands along with their keyboard shortcuts by pressing the '{key}' key.",save:"Don't forget to regularly save your changes!",start:"Start mapping!"}},shortcuts:{title:"Keyboard shortcuts",tooltip:"Show the keyboard shortcuts screen.",toggle:{key:"?"},key:{alt:"Alt",backspace:"Backspace",cmd:"Cmd",ctrl:"Ctrl","delete":"Delete",del:"Del",end:"End",enter:"Enter",esc:"Esc",home:"Home",option:"Option",pause:"Pause",pgdn:"PgDn",pgup:"PgUp","return":"Return",shift:"Shift",space:"Space"},gesture:{drag:"drag"},or:"-or-",browsing:{title:"Browsing",navigation:{title:"Navigation",pan:"Pan map",pan_more:"Pan map by one screenful",zoom:"Zoom in / Zoom out",zoom_more:"Zoom in / Zoom out by a lot"},help:{title:"Help",help:"Show help/documentation",keyboard:"Show keyboard shortcuts"},display_options:{title:"Display options",background:"Show background options",background_switch:"Switch back to last background",map_data:"Show map data options",fullscreen:"Enter full screen mode",wireframe:"Toggle wireframe mode",minimap:"Toggle minimap"},selecting:{title:"Selecting features",select_one:"Select a single feature",select_multi:"Select multiple features",lasso:"Draw a selection lasso around features",search:"Find features matching search text"},with_selected:{title:"With feature selected",edit_menu:"Toggle edit menu"},vertex_selected:{title:"With node selected",previous:"Jump to previous node",next:"Jump to next node",first:"Jump to first node",last:"Jump to last node",change_parent:"Switch parent way"}},editing:{title:"Editing",drawing:{title:"Drawing",add_point:"'Add point' mode",add_line:"'Add line' mode",add_area:"'Add area' mode",add_note:"'Add note' mode",place_point:"Place a point or note",disable_snap:"Hold to disable point snapping",stop_line:"Finish drawing a line or area"},operations:{title:"Operations",continue_line:"Continue a line at the selected node",merge:"Combine (merge) selected features",disconnect:"Disconnect features at the selected node",detach_node:"Detach selected node from parent lines/areas",split:"Split a line into two at the selected node",reverse:"Reverse a line",move:"Move selected features",rotate:"Rotate selected features",orthogonalize:"Straighten line / Square area corners",circularize:"Circularize a closed line or area",reflect_long:"Reflect features across the longer axis",reflect_short:"Reflect features across the shorter axis","delete":"Delete selected features"},commands:{title:"Commands",copy:"Copy selected features",paste:"Paste copied features",undo:"Undo last action",redo:"Redo last action",save:"Save changes"}},tools:{title:"Tools",info:{title:"Information",all:"Toggle all information panels",background:"Toggle background panel",history:"Toggle history panel",location:"Toggle location panel",measurement:"Toggle measurement panel"}}},units:{feet:"{quantity} ft",miles:"{quantity} mi",square_feet:"{quantity} sq ft",square_miles:"{quantity} sq mi",acres:"{quantity} ac",meters:"{quantity} m",kilometers:"{quantity} km",square_meters:"{quantity} m²",square_kilometers:"{quantity} km²",hectares:"{quantity} ha",area_pair:"{area1} ({area2})",arcdegrees:"{quantity}°",arcminutes:"{quantity}′",arcseconds:"{quantity}″",north:"N",south:"S",east:"E",west:"W",coordinate:"{coordinate}{direction}",coordinate_pair:"{latitude}, {longitude}"},presets:{categories:{"category-barrier":{name:"Barrier Features"},"category-building":{name:"Building Features"},"category-golf":{name:"Golf Features"},"category-landuse":{name:"Land Use Features"},"category-natural-area":{name:"Natural Features"},"category-natural-line":{name:"Natural Features"},"category-natural-point":{name:"Natural Features"},"category-path":{name:"Path Features"},"category-rail":{name:"Rail Features"},"category-restriction":{name:"Restriction Features"},"category-road":{name:"Road Features"},"category-route":{name:"Route Features"},"category-water-area":{name:"Water Features"},"category-water-line":{name:"Water Features"}},fields:{access_simple:{label:"Allowed Access"},access:{label:"Allowed Access",placeholder:"Not Specified",types:{access:"All",foot:"Foot",motor_vehicle:"Motor Vehicles",bicycle:"Bicycles",horse:"Horses"},options:{yes:{title:"Allowed",description:"Access allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}},address:{label:"Address",placeholders:{block_number:"Block Number","block_number!jp":"Block No.",city:"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town",conscriptionnumber:"123",country:"Country",county:"County","county!jp":"District",district:"District","district!vn":"Arrondissement/Town/District",floor:"Floor",hamlet:"Hamlet",housename:"Housename",housenumber:"123","housenumber!jp":"Building No./Lot No.",neighbourhood:"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza",place:"Place",postcode:"Postcode",province:"Province","province!jp":"Prefecture",quarter:"Quarter","quarter!jp":"Ōaza/Machi",state:"State",street:"Street",subdistrict:"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet",suburb:"Suburb","suburb!jp":"Ward",unit:"Unit"}},admin_level:{label:"Admin Level"},aerialway:{label:"Type"},"aerialway/access":{label:"Access",options:{entry:"Entry",exit:"Exit",both:"Both"}},"aerialway/bubble":{label:"Bubble"},"aerialway/capacity":{label:"Capacity (per hour)",placeholder:"500, 2500, 5000..."},"aerialway/duration":{label:"Duration (minutes)",placeholder:"1, 2, 3..."},"aerialway/heating":{label:"Heated"},"aerialway/occupancy":{label:"Occupancy",placeholder:"2, 4, 8..."},"aerialway/summer/access":{label:"Access (summer)",options:{entry:"Entry",exit:"Exit",both:"Both"}},aeroway:{label:"Type"},agrarian:{label:"Products"},amenity:{label:"Type"},animal_boarding:{label:"For Animals"},animal_breeding:{label:"For Animals"},animal_shelter:{label:"For Animals"},"area/highway":{label:"Type"},artist:{label:"Artist"},artwork_type:{label:"Type"},atm:{label:"ATM"},backrest:{label:"Backrest"},barrier:{label:"Type"},"bath/open_air":{label:"Open Air"},"bath/sand_bath":{label:"Sand Bath"},"bath/type":{label:"Specialty",options:{onsen:"Japanese Onsen",foot_bath:"Foot Bath",hot_spring:"Hot Spring"}},beauty:{label:"Shop Type"},bench:{label:"Bench"},bicycle_parking:{label:"Type"},bin:{label:"Waste Bin"},blood_components:{label:"Blood Components",options:{whole:"whole blood",plasma:"plasma",platelets:"platelets",stemcells:"stem cell samples"}},board_type:{label:"Type"},booth:{label:"Booth"},boules:{label:"Type"},boundary:{label:"Type"},brand:{label:"Brand"},brewery:{label:"Draft Beers"},bridge:{label:"Type",placeholder:"Default"},building_area:{label:"Building"},building:{label:"Building"},bunker_type:{label:"Type"},cables:{label:"Cables",placeholder:"1, 2, 3..."},"camera/direction":{label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},"camera/mount":{label:"Camera Mount"},"camera/type":{label:"Camera Type",options:{fixed:"Fixed",panning:"Panning",dome:"Dome"}},capacity:{label:"Capacity",placeholder:"50, 100, 200..."},cash_in:{label:"Cash In"},castle_type:{label:"Type"},clothes:{label:"Clothes"},club:{label:"Type"},collection_times:{label:"Collection Times"},comment:{label:"Changeset Comment",placeholder:"Brief description of your contributions (required)"},communication_multi:{label:"Communication Types"},construction:{label:"Type"},"contact/webcam":{label:"Webcam URL",placeholder:"http://example.com/"},content:{label:"Content"},country:{label:"Country"},covered:{label:"Covered"},craft:{label:"Type"},"crane/type":{label:"Crane Type",options:{portal_crane:"Portal Crane","floor-mounted_crane":"Floor-mounted Crane",travel_lift:"Travel Lift"}},crop:{label:"Crops"},crossing:{label:"Type"},cuisine:{label:"Cuisines"},currency_multi:{label:"Currency Types"},cutting:{label:"Type",placeholder:"Default"},cycle_network:{label:"Network"},cycleway:{label:"Bike Lanes",placeholder:"none",types:{"cycleway:left":"Left side","cycleway:right":"Right side"},options:{none:{title:"None",description:"No bike lane"},lane:{title:"Standard bike lane",description:"A bike lane separated from auto traffic by a painted line"},shared_lane:{title:"Shared bike lane",description:"A bike lane with no separation from auto traffic"},track:{title:"Bike track",description:"A bike lane separated from traffic by a physical barrier"},share_busway:{title:"Bike lane shared with bus",description:"A bike lane shared with a bus lane"},opposite_lane:{title:"Opposite bike lane",description:"A bike lane that travels in the opposite direction of traffic"},opposite:{title:"Contraflow bike lane",description:"A bike lane that travels in both directions on a one-way street"}}},"dance/style":{label:"Dance Styles"},date:{label:"Date"},delivery:{label:"Delivery"},denomination:{label:"Denomination"},denotation:{label:"Denotation"},description:{label:"Description"},devices:{label:"Devices",placeholder:"1, 2, 3..."},diaper:{label:"Diaper Changing Available"},direction_cardinal:{label:"Direction",options:{N:"North",E:"East",S:"South",W:"West",NE:"Northeast",SE:"Southeast",SW:"Southwest",NW:"Northwest",NNE:"North-northeast",ENE:"East-northeast",ESE:"East-southeast",SSE:"South-southeast",SSW:"South-southwest",WSW:"West-southwest",WNW:"West-northwest",NNW:"North-northwest"}},direction_clock:{label:"Direction",options:{clockwise:"Clockwise",anticlockwise:"Counterclockwise"}},direction_vertex:{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},direction:{label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},dispensing:{label:"Dispenses Prescriptions"},display:{label:"Display"},distance:{label:"Total Distance"},dock:{label:"Type"},drive_through:{label:"Drive-Through"},duration:{label:"Duration",placeholder:"00:00"},electrified:{label:"Electrification",placeholder:"Contact Line, Electrified Rail...",options:{contact_line:"Contact Line",rail:"Electrified Rail",yes:"Yes (unspecified)",no:"No"}},elevation:{label:"Elevation"},email:{label:"Email",placeholder:"example@example.com"},embankment:{label:"Type",placeholder:"Default"},emergency:{label:"Emergency"},entrance:{label:"Type"},except:{label:"Exceptions"},faces:{label:"Faces"},fax:{label:"Fax",placeholder:"+31 42 123 4567"},fee:{label:"Fee"},fence_type:{label:"Type"},"fire_hydrant/position":{label:"Position",options:{lane:"Lane",parking_lot:"Parking Lot",sidewalk:"Sidewalk",green:"Green"}},"fire_hydrant/type":{label:"Type",options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pond:"Pond"}},fitness_station:{label:"Equipment Type"},fixme:{label:"Fix Me"},ford:{label:"Type",placeholder:"Default"},frequency:{label:"Operating Frequency"},fuel_multi:{label:"Fuel Types"},fuel:{label:"Fuel"},gauge:{label:"Gauge"},gender:{label:"Gender",placeholder:"Unknown",options:{male:"Male",female:"Female",unisex:"Unisex"}},"generator/method":{label:"Method"},"generator/output/electricity":{label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW..."},"generator/source":{label:"Source"},"generator/type":{label:"Type"},government:{label:"Type"},grape_variety:{label:"Grape Varieties"},handicap:{label:"Handicap",placeholder:"1-18"},handrail:{label:"Handrail"},hashtags:{label:"Suggested Hashtags",placeholder:"#example"},healthcare:{label:"Type"},"healthcare/speciality":{label:"Specialties"},height:{label:"Height (Meters)"},highway:{label:"Type"},historic:{label:"Type"},"historic/civilization":{label:"Historic Civilization"},hoops:{label:"Hoops",placeholder:"1, 2, 4..."},horse_dressage:{label:"Dressage Riding",options:{"undefined":"No",equestrian:"Yes"}},horse_riding:{label:"Horseback Riding",options:{"undefined":"No",horse_riding:"Yes"}},horse_scale:{label:"Horseback Riding Difficulty",placeholder:"Difficult, Dangerous...",options:{common:"Easy: No problems or difficulties. (default)",demanding:"Use with caution: Uneven way, occasional difficult passages.",difficult:"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.",critical:"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.",dangerous:"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.",impossible:"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}},horse_stables:{label:"Riding Stable",options:{"undefined":"No",stables:"Yes"}},iata:{label:"IATA"},icao:{label:"ICAO"},incline_steps:{label:"Incline",options:{up:"Up",down:"Down"}},incline:{label:"Incline"},indoor:{label:"Indoor"},industrial:{label:"Type"},information:{label:"Type"},inscription:{label:"Inscription"},intermittent:{label:"Intermittent"},internet_access:{label:"Internet Access",options:{yes:"Yes",no:"No",wlan:"Wifi",wired:"Wired",terminal:"Terminal"}},"internet_access/fee":{label:"Internet Access Fee"},"internet_access/ssid":{label:"SSID (Network Name)"},kerb:{label:"Curb"},label:{label:"Label"},lamp_type:{label:"Type"},landuse:{label:"Type"},lanes:{label:"Lanes",placeholder:"1, 2, 3..."},layer:{label:"Layer",placeholder:"0"},leaf_cycle_singular:{label:"Leaf Cycle",options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous"}},leaf_cycle:{label:"Leaf Cycle",options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous",mixed:"Mixed"}},leaf_type_singular:{label:"Leaf Type",options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",leafless:"Leafless"}},leaf_type:{label:"Leaf Type",options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",mixed:"Mixed",leafless:"Leafless"}},leisure:{label:"Type"},length:{label:"Length (Meters)"},level:{label:"Level"},levels:{label:"Levels",placeholder:"2, 4, 6..."},lit:{label:"Lit"},location:{label:"Location"},man_made:{label:"Type"},manhole:{label:"Type"},map_size:{label:"Coverage"},map_type:{label:"Type"},maxheight:{label:"Max Height",placeholder:"4, 4.5, 5, 14'0\", 14'6\", 15'0\""},maxspeed:{label:"Speed Limit",placeholder:"40, 50, 60..."},"maxspeed/advisory":{label:"Advisory Speed Limit",placeholder:"40, 50, 60..."},maxstay:{label:"Max Stay"},maxweight:{label:"Max Weight"},memorial:{label:"Type"},monitoring_multi:{label:"Monitoring"},"mtb/scale":{label:"Mountain Biking Difficulty",placeholder:"0, 1, 2, 3...",options:{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}},"mtb/scale/imba":{label:"IMBA Trail Difficulty",placeholder:"Easy, Medium, Difficult...",options:{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}},"mtb/scale/uphill":{label:"Mountain Biking Uphill Difficulty",placeholder:"0, 1, 2, 3...",options:{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}},name:{label:"Name",placeholder:"Common name (if any)"},natural:{label:"Natural"},network_bicycle:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lcn:"Local",rcn:"Regional",ncn:"National",icn:"International"}},network_foot:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lwn:"Local",rwn:"Regional",nwn:"National",iwn:"International"}},network_horse:{label:"Network Type",placeholder:"Local, Regional, National, International",options:{lhn:"Local",rhn:"Regional",nhn:"National",ihn:"International"}},network_road:{label:"Network"},network:{label:"Network"},note:{label:"Note"},office:{label:"Type"},oneway_yes:{label:"One Way",options:{"undefined":"Assumed to be Yes",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}},oneway:{label:"One Way",options:{"undefined":"Assumed to be No",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}},opening_hours:{label:"Hours"},operator:{label:"Operator"},outdoor_seating:{label:"Outdoor Seating"},par:{label:"Par",placeholder:"3, 4, 5..."},park_ride:{label:"Park and Ride"},parking:{label:"Type",options:{surface:"Surface","multi-storey":"Multilevel",underground:"Underground",sheds:"Sheds",carports:"Carports",garage_boxes:"Garage Boxes",lane:"Roadside Lane"}},passenger_information_display:{label:"Passenger information display"},payment_multi:{label:"Payment Types"},phases:{label:"Phases",placeholder:"1, 2, 3..."},phone:{label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice (instructional)",easy:"Easy (green circle)",intermediate:"Intermediate (blue square)",advanced:"Advanced (black diamond)",expert:"Expert (double black diamond)",freeride:"Freeride (off-piste)",extreme:"Extreme (climbing equipment required)"}},"piste/grooming":{label:"Grooming",options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}},"piste/type":{label:"Type",options:{downhill:"Downhill",nordic:"Nordic",skitour:"Skitour",sled:"Sled",hike:"Hike",sleigh:"Sleigh",ice_skate:"Ice Skate",snow_park:"Snow Park",playground:"Playground"}},place:{label:"Type"},plant:{label:"Plant"},"plant/output/electricity":{label:"Power Output",placeholder:"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{label:"Baby Seat"},"playground/max_age":{label:"Maximum Age"},"playground/min_age":{label:"Minimum Age"},population:{label:"Population"},power_supply:{label:"Power Supply"},power:{label:"Type"},produce:{label:"Produce"},product:{label:"Products"},railway:{label:"Type"},"railway/position":{label:"Milestone Position",placeholder:"Distance to one decimal (123.4)"},"railway/signal/direction":{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},rating:{label:"Power Rating"},recycling_accepts:{label:"Accepts"},ref_aeroway_gate:{label:"Gate Number"},ref_golf_hole:{label:"Hole Number",placeholder:"1-18"},ref_highway_junction:{label:"Junction Number"},ref_platform:{label:"Platform Number"},ref_road_number:{label:"Road Number"},ref_route:{label:"Route Number"},ref_runway:{label:"Runway Number",placeholder:"e.g. 01L/19R"},ref_stop_position:{label:"Stop Number"},ref_taxiway:{label:"Taxiway Name",placeholder:"e.g. A5"},ref:{label:"Reference Code"},"ref/isil":{label:"ISIL Code"},relation:{label:"Type"},religion:{label:"Religion"},restriction:{label:"Type"},restrictions:{label:"Turn Restrictions"},rooms:{label:"Rooms"},route_master:{label:"Type"},route:{label:"Type"},sac_scale:{label:"Hiking Difficulty",placeholder:"Mountain Hiking, Alpine Hiking...",options:{hiking:"T1: Hiking",mountain_hiking:"T2: Mountain Hiking",demanding_mountain_hiking:"T3: Demanding Mountain Hiking",alpine_hiking:"T4: Alpine Hiking",demanding_alpine_hiking:"T5: Demanding Alpine Hiking",difficult_alpine_hiking:"T6: Difficult Alpine Hiking"}},sanitary_dump_station:{label:"Toilet Disposal"},seasonal:{label:"Seasonal"},second_hand:{label:"Sells Used",placeholder:"Yes, No, Only",options:{yes:"Yes",no:"No",only:"Only"}},service_rail:{label:"Service Type",options:{spur:"Spur",yard:"Yard",siding:"Siding",crossover:"Crossover"}},service_times:{label:"Service Times"},service:{label:"Type"},"service/bicycle":{label:"Services"},"service/vehicle":{label:"Services"},shelter_type:{label:"Type"},shelter:{label:"Shelter"},shop:{label:"Type"},"siren/purpose":{label:"Purpose"},"siren/type":{label:"Type",options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}},site_type:{label:"Site Type"},site:{label:"Type"},smoking:{label:"Smoking",placeholder:"No, Separated, Yes...",options:{no:"No smoking anywhere",separated:"In smoking areas, not physically isolated",isolated:"In smoking areas, physically isolated",outside:"Allowed outside",yes:"Allowed everywhere",dedicated:"Dedicated to smokers (e.g. smokers' club)"}},smoothness:{label:"Smoothness",placeholder:"Thin Rollers, Wheels, Off-Road...",options:{excellent:"Thin Rollers: rollerblade, skateboard",good:"Thin Wheels: racing bike",intermediate:"Wheels: city bike, wheelchair, scooter",bad:"Robust Wheels: trekking bike, car, rickshaw",very_bad:"High Clearance: light duty off-road vehicle",horrible:"Off-Road: heavy duty off-road vehicle",very_horrible:"Specialized off-road: tractor, ATV",impassable:"Impassable / No wheeled vehicle"}},social_facility_for:{label:"People Served"},social_facility:{label:"Type"},source:{label:"Sources"},sport_ice:{label:"Sports"},sport_racing_motor:{label:"Sports"},sport_racing_nonmotor:{label:"Sports"},sport:{label:"Sports"},stars:{label:"Stars"},start_date:{label:"Start Date"},step_count:{label:"Number of Steps"},stop:{label:"Stop Type",options:{all:"All Ways",minor:"Minor Road"}},structure_waterway:{label:"Structure",placeholder:"Unknown",options:{tunnel:"Tunnel"}},structure:{label:"Structure",placeholder:"Unknown",options:{bridge:"Bridge",tunnel:"Tunnel",embankment:"Embankment",cutting:"Cutting",ford:"Ford"}},studio:{label:"Type"},substance:{label:"Substance"},substation:{label:"Type"},supervised:{label:"Supervised"},support:{label:"Support"},surface:{label:"Surface"},surveillance:{label:"Surveillance Kind"},"surveillance/type":{label:"Surveillance Type",options:{camera:"Camera",guard:"Guard",ALPR:"Automatic License Plate Reader"}},"surveillance/zone":{label:"Surveillance Zone"},"switch":{label:"Type",options:{mechanical:"Mechanical",circuit_breaker:"Circuit Breaker",disconnector:"Disconnector",earthing:"Earthing"}},tactile_paving:{label:"Tactile Paving"},takeaway:{label:"Takeaway",placeholder:"Yes, No, Takeaway Only...",options:{yes:"Yes",no:"No",only:"Takeaway Only"}},"toilets/disposal":{label:"Disposal",options:{flush:"Flush",pitlatrine:"Pit/Latrine",chemical:"Chemical",bucket:"Bucket"}},toll:{label:"Toll"},tomb:{label:"Type"},tourism_attraction:{label:"Tourism"},tourism:{label:"Type"},"tower/construction":{label:"Construction",placeholder:"Guyed, Lattice, Concealed, ..."},"tower/type":{label:"Type"},tracktype:{label:"Track Type",placeholder:"Solid, Mostly Solid, Soft...",options:{grade1:"Solid: paved or heavily compacted hardcore surface",grade2:"Mostly Solid: gravel/rock with some soft material mixed in",grade3:"Even mixture of hard and soft materials",grade4:"Mostly Soft: soil/sand/grass with some hard material mixed in",grade5:"Soft: soil/sand/grass"}},trade:{label:"Type"},traffic_calming:{label:"Type"},traffic_signals:{label:"Type"},"traffic_signals/direction":{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},trail_visibility:{label:"Trail Visibility",placeholder:"Excellent, Good, Bad...",options:{excellent:"Excellent: unambiguous path or markers everywhere",good:"Good: markers visible, sometimes require searching",intermediate:"Intermediate: few markers, path mostly visible",bad:"Bad: no markers, path sometimes invisible/pathless",horrible:"Horrible: often pathless, some orientation skills required",no:"No: pathless, excellent orientation skills required"}},transformer:{label:"Type",options:{distribution:"Distribution",generator:"Generator",converter:"Converter",traction:"Traction",auto:"Autotransformer",phase_angle_regulator:"Phase Angle Regulator",auxiliary:"Auxiliary",yes:"Unknown"}},trees:{label:"Trees"},tunnel:{label:"Type",placeholder:"Default"},usage_rail:{label:"Usage Type",options:{main:"Main",branch:"Branch",industrial:"Industrial",military:"Military",test:"Test",tourism:"Tourism"}},vending:{label:"Types of Goods"},visibility:{label:"Visibility",options:{house:"Up to 5m (16ft)",street:"5 to 20m (16 to 65ft)",area:"Over 20m (65ft)"}},"volcano/status":{label:"Volcano Status",options:{active:"Active",dormant:"Dormant",extinct:"Extinct"}},"volcano/type":{label:"Volcano Type",options:{stratovolcano:"Stratovolcano",shield:"Shield",scoria:"Scoria"}},voltage:{label:"Voltage"},"voltage/primary":{label:"Primary Voltage"},"voltage/secondary":{label:"Secondary Voltage"},"voltage/tertiary":{label:"Tertiary Voltage"},wall:{label:"Type"},water_point:{label:"Water Point"},water:{label:"Type"},waterway:{label:"Type"},website:{label:"Website",placeholder:"http://example.com/"},wetland:{label:"Type"},wheelchair:{label:"Wheelchair Access"},wholesale:{label:"Wholesale"},width:{label:"Width (Meters)"},wikipedia:{label:"Wikipedia"},windings:{label:"Windings",placeholder:"1, 2, 3..."},"windings/configuration":{label:"Windings Configuration",options:{star:"Star / Wye",delta:"Delta","open-delta":"Open Delta",zigzag:"Zig Zag",open:"Open",scott:"Scott",leblanc:"Leblanc"}}},presets:{aerialway:{name:"Aerialway",terms:"ski lift,funifor,funitel"},aeroway:{name:"Aeroway",terms:""},amenity:{name:"Amenity",terms:""},circular:{name:"Traffic Circle",terms:""},highway:{name:"Highway",terms:""},place:{name:"Place",terms:""},power:{name:"Power",terms:""},railway:{name:"Railway",terms:""},roundabout:{name:"Roundabout",terms:""},waterway:{name:"Waterway",terms:""},address:{name:"Address",terms:""},"advertising/billboard":{name:"Billboard",terms:""},"advertising/column":{name:"Advertising Column",terms:""},"aerialway/station":{name:"Aerialway Station",terms:""},"aerialway/cable_car":{name:"Cable Car",terms:"tramway,ropeway"},"aerialway/chair_lift":{name:"Chair Lift",terms:""},"aerialway/drag_lift":{name:"Drag Lift",terms:""},"aerialway/gondola":{name:"Gondola",terms:""},"aerialway/goods":{name:"Goods Aerialway",terms:""},"aerialway/magic_carpet":{name:"Magic Carpet Lift",terms:""},"aerialway/mixed_lift":{name:"Mixed Lift",terms:""},"aerialway/platter":{name:"Platter Lift",terms:"button lift,poma lift"},"aerialway/pylon":{name:"Aerialway Pylon",terms:""},"aerialway/rope_tow":{name:"Rope Tow Lift",terms:"handle tow,bugel lift"},"aerialway/t-bar":{name:"T-bar Lift",terms:"tbar"},"aeroway/aerodrome":{name:"Airport",terms:"aerodrome,aeroway,airplane,airport,jet,plane"},"aeroway/apron":{name:"Apron",terms:"ramp"},"aeroway/gate":{name:"Airport Gate",terms:""},"aeroway/hangar":{name:"Hangar",terms:""},"aeroway/helipad":{name:"Helipad",terms:"helicopter,helipad,heliport"},"aeroway/runway":{name:"Runway",terms:"landing strip"},"aeroway/taxiway":{name:"Taxiway",terms:""},"aeroway/terminal":{name:"Airport Terminal",terms:"airport,aerodrome"},"allotments/plot":{name:"Community Garden Plot",terms:""},"amenity/bus_station":{name:"Bus Station / Terminal",terms:""},"amenity/coworking_space":{name:"Coworking Space",terms:""},"amenity/ferry_terminal":{name:"Ferry Station / Terminal",terms:""},"amenity/nursing_home":{name:"Nursing Home",terms:""},"amenity/register_office":{name:"Register Office",terms:""},"amenity/scrapyard":{name:"Scrap Yard",terms:""},"amenity/swimming_pool":{name:"Swimming Pool",terms:""},"amenity/animal_boarding":{name:"Animal Boarding Facility",terms:"boarding,cat,cattery,dog,horse,kennel,kitten,pet,pet boarding,pet care,pet hotel,puppy,reptile"},"amenity/animal_breeding":{name:"Animal Breeding Facility",terms:"breeding,bull,cat,cow,dog,horse,husbandry,kitten,livestock,pet breeding,puppy,reptile"},"amenity/animal_shelter":{name:"Animal Shelter",terms:"adoption,aspca,cat,dog,horse,kitten,pet care,pet rescue,puppy,raptor,reptile,rescue,spca"},"amenity/arts_centre":{name:"Arts Center",terms:""},"amenity/atm":{name:"ATM",terms:"money,cash,machine"},"amenity/bank":{name:"Bank",terms:"credit union,check,deposit,fund,investment,repository,reserve,safe,savings,stock,treasury,trust,vault"},"amenity/bar":{name:"Bar",terms:"dive,beer,bier,booze"},"amenity/bbq":{name:"Barbecue/Grill",terms:"bbq,grill"},"amenity/bench":{name:"Bench",terms:"seat"},"amenity/bicycle_parking":{name:"Bicycle Parking",terms:"bike"},"amenity/bicycle_rental":{name:"Bicycle Rental",terms:"bike"},"amenity/bicycle_repair_station":{name:"Bicycle Repair Tool Stand",terms:"bike,repair,chain,pump"},"amenity/biergarten":{name:"Biergarten",terms:"beer,bier,booze"},"amenity/boat_rental":{name:"Boat Rental",terms:""},"amenity/bureau_de_change":{name:"Currency Exchange",terms:"bureau de change,money changer"},"amenity/cafe":{name:"Cafe",terms:"bistro,coffee,tea"},"amenity/car_pooling":{name:"Car Pooling",terms:""},"amenity/car_rental":{name:"Car Rental",terms:""},"amenity/car_sharing":{name:"Car Sharing",terms:""},"amenity/car_wash":{name:"Car Wash",terms:""},"amenity/casino":{name:"Casino",terms:"gambling,roulette,craps,poker,blackjack"},"amenity/charging_station":{name:"Charging Station",terms:"EV,Electric Vehicle,Supercharger"},"amenity/childcare":{name:"Nursery/Childcare",terms:"daycare,orphanage,playgroup"},"amenity/cinema":{name:"Cinema",terms:"drive-in,film,flick,movie,theater,picture,show,screen"},"amenity/clinic":{name:"Clinic",terms:"medical,urgentcare"},"amenity/clinic/abortion":{name:"Abortion Clinic",terms:""},"amenity/clinic/fertility":{name:"Fertility Clinic",terms:"egg,fertility,reproductive,sperm,ovulation"},"amenity/clock":{name:"Clock",terms:""},"amenity/college":{name:"College Grounds",terms:"university"},"amenity/community_centre":{name:"Community Center",terms:"event,hall"},"amenity/compressed_air":{name:"Compressed Air",terms:""},"amenity/courthouse":{name:"Courthouse",terms:""},"amenity/crematorium":{name:"Crematorium",terms:"cemetery,funeral"},"amenity/dentist":{name:"Dentist",terms:"tooth,teeth"},"amenity/doctors":{name:"Doctor",terms:"medic*,physician"},"amenity/dojo":{name:"Dojo / Martial Arts Academy",terms:"martial arts,dojang"},"amenity/drinking_water":{name:"Drinking Water",terms:"fountain,potable"},"amenity/driving_school":{name:"Driving School",terms:""},"amenity/embassy":{name:"Embassy",terms:""},"amenity/fast_food":{name:"Fast Food",terms:"restaurant,takeaway"},"amenity/fire_station":{name:"Fire Station",terms:""},"amenity/food_court":{name:"Food Court",terms:"fast food,restaurant,food"},"amenity/fountain":{name:"Fountain",terms:""},"amenity/fuel":{name:"Gas Station",terms:"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/grave_yard":{name:"Graveyard",terms:""},"amenity/grit_bin":{name:"Grit Bin",terms:"salt,sand"},"amenity/hospital":{name:"Hospital Grounds",terms:"clinic,doctor,emergency room,health,infirmary,institution,sanatorium,sanitarium,sick,surgery,ward"},"amenity/hunting_stand":{name:"Hunting Stand",terms:"game,gun,lookout,rifle,shoot*,wild,watch"},"amenity/ice_cream":{name:"Ice Cream Shop",terms:"gelato,sorbet,sherbet,frozen,yogurt"},"amenity/internet_cafe":{name:"Internet Cafe",terms:"cybercafe,taxiphone,teleboutique,coffee,cafe,net,lanhouse"},"amenity/kindergarten":{name:"Preschool/Kindergarten Grounds",terms:"kindergarden,pre-school"},"amenity/library":{name:"Library",terms:"book"},"amenity/love_hotel":{name:"Love Hotel",terms:""},"amenity/marketplace":{name:"Marketplace",terms:""},"amenity/monastery":{name:"Monastery Grounds",terms:"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,monastery,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/motorcycle_parking":{name:"Motorcycle Parking",terms:""},"amenity/music_school":{name:"Music School",terms:"school of music"},"amenity/nightclub":{name:"Nightclub",terms:"disco*,night club,dancing,dance club"},"amenity/parking_entrance":{name:"Parking Garage Entrance/Exit",terms:""},"amenity/parking_space":{name:"Parking Space",terms:""},"amenity/parking":{name:"Car Parking",terms:""},"amenity/pavilion":{name:"Pavilion",terms:""},"amenity/pharmacy":{name:"Pharmacy",terms:"apothecary,drug*,med*,prescription"},"amenity/place_of_worship":{name:"Place of Worship",terms:"abbey,basilica,bethel,cathedral,chancel,chantry,chapel,church,fold,house of God,house of prayer,house of worship,minster,mission,mosque,oratory,parish,sacellum,sanctuary,shrine,synagogue,tabernacle,temple"},"amenity/place_of_worship/buddhist":{name:"Buddhist Temple",terms:"stupa,vihara,monastery,temple,pagoda,zendo,dojo"},"amenity/place_of_worship/christian":{name:"Church",terms:"christian,abbey,basilica,bethel,cathedral,chancel,chantry,chapel,fold,house of God,house of prayer,house of worship,minster,mission,oratory,parish,sacellum,sanctuary,shrine,tabernacle,temple"},"amenity/place_of_worship/hindu":{name:"Hindu Temple",terms:"kovil,devasthana,mandir,kshetram,alayam,shrine,temple"},"amenity/place_of_worship/jewish":{name:"Synagogue",terms:"jewish"},"amenity/place_of_worship/muslim":{name:"Mosque",terms:"muslim"},"amenity/place_of_worship/shinto":{name:"Shinto Shrine",terms:"kami,torii"},"amenity/place_of_worship/sikh":{name:"Sikh Temple",terms:"gurudwara,temple"},"amenity/place_of_worship/taoist":{name:"Taoist Temple",terms:"daoist,monastery,temple"},"amenity/planetarium":{name:"Planetarium",terms:"museum,astronomy,observatory"},"amenity/police":{name:"Police",terms:"badge,constable,constabulary,cop,detective,fed,law,enforcement,officer,patrol"},"amenity/post_box":{name:"Mailbox",terms:"letter,post"},"amenity/post_office":{name:"Post Office",terms:"letter,mail"},"amenity/prison":{name:"Prison Grounds",terms:"cell,jail"},"amenity/pub":{name:"Pub",terms:"alcohol,drink,dive,beer,bier,booze"},"amenity/public_bath":{name:"Public Bath",terms:"onsen,foot bath,hot springs"},"amenity/public_bookcase":{name:"Public Bookcase",terms:"library,bookcrossing"},"amenity/ranger_station":{name:"Ranger Station",terms:"visitor center,visitor centre,permit center,permit centre,backcountry office,warden office,warden center"},"amenity/recycling_centre":{name:"Recycling Center",terms:"bottle,can,dump,glass,garbage,rubbish,scrap,trash"},"amenity/recycling":{name:"Recycling Container",terms:"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"amenity/restaurant":{name:"Restaurant",terms:"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/sanitary_dump_station":{name:"RV Toilet Disposal",terms:"Motor Home,Camper,Sanitary,Dump Station,Elsan,CDP,CTDP,Chemical Toilet"},"amenity/school":{name:"School Grounds",terms:"academy,elementary school,middle school,high school"},"amenity/shelter":{name:"Shelter",terms:"lean-to,gazebo,picnic"},"amenity/shower":{name:"Shower",terms:"rain closet"},"amenity/smoking_area":{name:"Smoking Area",terms:""},"amenity/social_facility":{name:"Social Facility",terms:""},"amenity/social_facility/food_bank":{name:"Food Bank",terms:""},"amenity/social_facility/group_home":{name:"Elderly Group Home",terms:"old,senior,living,care home,assisted living"},"amenity/social_facility/homeless_shelter":{name:"Homeless Shelter",terms:"houseless,unhoused,displaced"},"amenity/social_facility/nursing_home":{name:"Nursing Home",terms:"elderly,living,nursing,old,senior,assisted living"},"amenity/studio":{name:"Studio",terms:"recording,radio,television"},"amenity/taxi":{name:"Taxi Stand",terms:"cab"},"amenity/telephone":{name:"Telephone",terms:"phone"},"amenity/theatre":{name:"Theater",terms:"theatre,performance,play,musical"},"amenity/toilets":{name:"Toilets",terms:"bathroom,restroom,outhouse,privy,head,lavatory,latrine,water closet,WC,W.C."},"amenity/townhall":{name:"Town Hall",terms:"village,city,government,courthouse,municipal"},"amenity/university":{name:"University Grounds",terms:"college"},"amenity/vending_machine":{name:"Vending Machine",terms:""},"amenity/vending_machine/news_papers":{name:"Newspaper Vending Machine",terms:"newspaper"},"amenity/vending_machine/cigarettes":{name:"Cigarette Vending Machine",terms:"cigarette"},"amenity/vending_machine/coffee":{name:"Coffee Vending Machine",terms:"coffee"},"amenity/vending_machine/condoms":{name:"Condom Vending Machine",terms:"condom"},"amenity/vending_machine/drinks":{name:"Drink Vending Machine",terms:"drink,soda,beverage,juice,pop"},"amenity/vending_machine/electronics":{name:"Electronics Vending Machine",terms:"cable,charger,earbud,headphone,phone,tablet"},"amenity/vending_machine/elongated_coin":{name:"Flat Coin Vending Machine",terms:"coin,crush,elongated,flatten,penny,souvenir"},"amenity/vending_machine/excrement_bags":{name:"Excrement Bag Vending Machine",terms:"excrement bags,poop,dog,animal"},"amenity/vending_machine/feminine_hygiene":{name:"Feminine Hygiene Vending Machine",terms:"condom,tampon,pad,woman,women,menstrual hygiene products,personal care"},"amenity/vending_machine/food":{name:"Food Vending Machine",terms:"food"},"amenity/vending_machine/fuel":{name:"Gas Pump",terms:"petrol,fuel,gasoline,propane,diesel,lng,cng,biodiesel"},"amenity/vending_machine/ice_cream":{name:"Ice Cream Vending Machine",terms:"chocolate,ice cream,frozen,popsicle,vanilla"},"amenity/vending_machine/newspapers":{name:"Newspaper Vending Machine",terms:"newspaper"},"amenity/vending_machine/parcel_pickup_dropoff":{name:"Parcel Pickup/Dropoff Vending Machine",terms:"parcel,mail,pickup"},"amenity/vending_machine/parking_tickets":{name:"Parking Ticket Vending Machine",terms:"parking,ticket"},"amenity/vending_machine/public_transport_tickets":{name:"Transit Ticket Vending Machine",terms:"bus,train,ferry,rail,ticket,transportation"},"amenity/vending_machine/stamps":{name:"Postage Vending Machine",terms:"mail,postage,stamp"},"amenity/vending_machine/sweets":{name:"Snack Vending Machine",terms:"candy,gum,chip,pretzel,cookie,cracker"},"amenity/veterinary":{name:"Veterinary",terms:"pet clinic,veterinarian,animal hospital,pet doctor"},"amenity/waste_basket":{name:"Waste Basket",terms:"bin,garbage,rubbish,litter,trash"},"amenity/waste_disposal":{name:"Garbage Dumpster",terms:"garbage,rubbish,litter,trash"},"amenity/waste_transfer_station":{name:"Waste Transfer Station",terms:"dump,garbage,recycling,rubbish,scrap,trash"},"amenity/waste/dog_excrement":{name:"Dog Excrement Bin",terms:"bin,garbage,rubbish,litter,trash,poo,dog"},"amenity/water_point":{name:"RV Drinking Water",terms:""},"amenity/watering_place":{name:"Animal Watering Place",terms:""},area:{name:"Area",terms:""},"area/highway":{name:"Road Surface",terms:""},"attraction/amusement_ride":{name:"Amusement Ride",terms:"theme park,carnival ride"},"attraction/animal":{name:"Animal",terms:"zoo,theme park,animal park,lion,tiger,bear"},"attraction/big_wheel":{name:"Big Wheel",terms:"ferris wheel,theme park,amusement ride"},"attraction/bumper_car":{name:"Bumper Car",terms:"theme park,dodgem cars,autoscooter"},"attraction/bungee_jumping":{name:"Bungee Jumping",terms:"theme park,bungy jumping,jumping platform"},"attraction/carousel":{name:"Carousel",terms:"theme park,roundabout,merry-go-round,galloper,jumper,horseabout,flying horses"},"attraction/dark_ride":{name:"Dark Ride",terms:"theme park,ghost train"},"attraction/drop_tower":{name:"Drop Tower",terms:"theme park,amusement ride,gondola,tower,big drop"},"attraction/maze":{name:"Maze",terms:"theme park,amusement ride,labyrinth"},"attraction/pirate_ship":{name:"Pirate Ship",terms:"theme park,carnival ride,amusement ride"},"attraction/river_rafting":{name:"River Rafting",terms:"theme park,aquatic park,water park,rafting simulator,river rafting ride,river rapids ride"},"attraction/roller_coaster":{name:"Roller Coaster",terms:"theme park,amusement ride"},"attraction/train":{name:"Tourist Train",terms:"theme park,rackless train,road train,Tschu-Tschu train,dotto train,park train"},"attraction/water_slide":{name:"Water Slide",terms:"theme park,aquatic park,water park,flumes,water chutes,hydroslides"},barrier:{name:"Barrier",terms:""},"barrier/entrance":{name:"Entrance",terms:""},"barrier/block":{name:"Block",terms:""},"barrier/bollard":{name:"Bollard",terms:""},"barrier/border_control":{name:"Border Control",terms:""},"barrier/cattle_grid":{name:"Cattle Grid",terms:""},"barrier/city_wall":{name:"City Wall",terms:""},"barrier/cycle_barrier":{name:"Cycle Barrier",terms:""},"barrier/ditch":{name:"Trench",terms:""},"barrier/fence":{name:"Fence",terms:""},"barrier/gate":{name:"Gate",terms:""},"barrier/hedge":{name:"Hedge",terms:""},"barrier/kerb":{name:"Kerb",terms:""},"barrier/kissing_gate":{name:"Kissing Gate",terms:""},"barrier/lift_gate":{name:"Lift Gate",terms:""},"barrier/retaining_wall":{name:"Retaining Wall",terms:""},"barrier/stile":{name:"Stile",terms:""},"barrier/toll_booth":{name:"Toll Booth",terms:""},"barrier/wall":{name:"Wall",terms:""},"boundary/administrative":{name:"Administrative Boundary",terms:""},building:{name:"Building",terms:""},"building/bunker":{name:"Bunker",terms:""},"building/entrance":{name:"Entrance/Exit",terms:""},"building/train_station":{name:"Train Station",terms:""},"building/apartments":{name:"Apartments",terms:""},"building/barn":{name:"Barn",terms:""},"building/boathouse":{name:"Boathouse",terms:""},"building/bungalow":{name:"Bungalow",terms:"home,detached"},"building/cabin":{name:"Cabin",terms:""},"building/cathedral":{name:"Cathedral Building",terms:""},"building/chapel":{name:"Chapel Building",terms:""},"building/church":{name:"Church Building",terms:""},"building/civic":{name:"Civic Building",terms:""},"building/college":{name:"College Building",terms:"university"},"building/commercial":{name:"Commercial Building",terms:""},"building/construction":{name:"Building Under Construction",terms:""},"building/detached":{name:"Detached House",terms:"home,single,family,residence,dwelling"},"building/dormitory":{name:"Dormitory",terms:""},"building/farm_auxiliary":{name:"Farm Building",terms:""},"building/farm":{name:"Farm House",terms:""},"building/garage":{name:"Garage",terms:""},"building/garages":{name:"Garages",terms:""},"building/grandstand":{name:"Grandstand",terms:"tribune,stand,stands,bleachers"},"building/greenhouse":{name:"Greenhouse",terms:""},"building/hospital":{name:"Hospital Building",terms:""},"building/hotel":{name:"Hotel Building",terms:""},"building/house":{name:"House",terms:"home,family,residence,dwelling"},"building/hut":{name:"Hut",terms:""},"building/industrial":{name:"Industrial Building",terms:""},"building/kindergarten":{name:"Preschool/Kindergarten Building",terms:"kindergarden,pre-school"},"building/mosque":{name:"Mosque Building",terms:""},"building/public":{name:"Public Building",terms:""},"building/residential":{name:"Residential Building",terms:""},"building/retail":{name:"Retail Building",terms:""},"building/roof":{name:"Roof",terms:""},"building/ruins":{name:"Building Ruins",terms:""},"building/school":{name:"School Building",terms:"academy,elementary school,middle school,high school"},"building/semidetached_house":{name:"Semi-Detached House",terms:"home,double,duplex,twin,family,residence,dwelling"},"building/service":{name:"Service Building",terms:""},"building/shed":{name:"Shed",terms:""},"building/stable":{name:"Stable",terms:""},"building/stadium":{name:"Stadium Building",terms:""},"building/static_caravan":{name:"Static Mobile Home",terms:""},"building/temple":{name:"Temple Building",terms:""},"building/terrace":{name:"Row Houses",terms:"home,terrace,brownstone,family,residence,dwelling"},"building/transportation":{name:"Transportation Building",terms:""},"building/university":{name:"University Building",terms:"college"},"building/warehouse":{name:"Warehouse",terms:""},"camp_site/camp_pitch":{name:"Camp Pitch",terms:"tent,rv"},club:{name:"Club",terms:"social"},craft:{name:"Craft",terms:""},"craft/jeweler":{name:"Jeweler",terms:""},"craft/locksmith":{name:"Locksmith",terms:""},"craft/optician":{name:"Optician",terms:""},"craft/tailor":{name:"Tailor",terms:"clothes,suit"},"craft/basket_maker":{name:"Basket Maker",terms:""},"craft/beekeeper":{name:"Beekeeper",terms:""},"craft/blacksmith":{name:"Blacksmith",terms:""},"craft/boatbuilder":{name:"Boat Builder",terms:""},"craft/bookbinder":{name:"Bookbinder",terms:"book repair"},"craft/brewery":{name:"Brewery",terms:"alcohol,beer,beverage,bier,booze,cider"},"craft/carpenter":{name:"Carpenter",terms:"woodworker"},"craft/carpet_layer":{name:"Carpet Layer",terms:""},"craft/caterer":{name:"Caterer",terms:""},"craft/chimney_sweeper":{name:"Chimney Sweeper",terms:""},"craft/clockmaker":{name:"Clockmaker",terms:""},"craft/confectionery":{name:"Candy Maker",terms:"sweet,candy"},"craft/distillery":{name:"Distillery",terms:"alcohol,beverage,bourbon,booze,brandy,gin,hooch,liquor,mezcal,moonshine,rum,scotch,spirits,still,tequila,vodka,whiskey,whisky"},"craft/dressmaker":{name:"Dressmaker",terms:"seamstress"},"craft/electrician":{name:"Electrician",terms:"power,wire"},"craft/electronics_repair":{name:"Electronics Repair Shop",terms:""},"craft/gardener":{name:"Gardener",terms:"landscaper,grounds keeper"},"craft/glaziery":{name:"Glaziery",terms:"glass,stained-glass,window"},"craft/handicraft":{name:"Handicraft",terms:""},"craft/hvac":{name:"HVAC",terms:"heat*,vent*,air conditioning"},"craft/insulator":{name:"Insulator",terms:""},"craft/key_cutter":{name:"Key Cutter",terms:""},"craft/metal_construction":{name:"Metal Construction",terms:""},"craft/painter":{name:"Painter",terms:""},"craft/photographer":{name:"Photographer",terms:""},"craft/photographic_laboratory":{name:"Photographic Laboratory",terms:"film"},"craft/plasterer":{name:"Plasterer",terms:""},"craft/plumber":{name:"Plumber",terms:"pipe"},"craft/pottery":{name:"Pottery",terms:"ceramic"},"craft/rigger":{name:"Rigger",terms:""},"craft/roofer":{name:"Roofer",terms:""},"craft/saddler":{name:"Saddler",terms:""},"craft/sailmaker":{name:"Sailmaker",terms:""},"craft/sawmill":{name:"Sawmill",terms:"lumber"},"craft/scaffolder":{name:"Scaffolder",terms:""},"craft/sculptor":{name:"Sculptor",terms:""},"craft/shoemaker":{name:"Shoemaker",terms:"cobbler"},"craft/stonemason":{name:"Stonemason",terms:"masonry"},"craft/tiler":{name:"Tiler",terms:""},"craft/tinsmith":{name:"Tinsmith",terms:""},"craft/upholsterer":{name:"Upholsterer",terms:""},"craft/watchmaker":{name:"Watchmaker",terms:""},"craft/window_construction":{name:"Window Construction",terms:"glass"},"craft/winery":{name:"Winery",terms:""},embankment:{name:"Embankment",terms:""},"emergency/designated":{name:"Emergency Access Designated",terms:""},"emergency/destination":{name:"Emergency Access Destination",terms:""},"emergency/no":{name:"Emergency Access No",terms:""},"emergency/official":{name:"Emergency Access Official",terms:""},"emergency/private":{name:"Emergency Access Private",terms:""},"emergency/yes":{name:"Emergency Access Yes",terms:""},"emergency/ambulance_station":{name:"Ambulance Station",terms:"EMS,EMT,rescue"},"emergency/defibrillator":{name:"Defibrillator",terms:"AED"},"emergency/fire_alarm":{name:"Fire Alarm Call Box",terms:""},"emergency/fire_extinguisher":{name:"Fire Extinguisher",terms:""},"emergency/fire_hydrant":{name:"Fire Hydrant",terms:"fire plug"},"emergency/first_aid_kit":{name:"First Aid Kit",terms:"bandage,first aid,med,med kit,medic*,medkit"},"emergency/life_ring":{name:"Life Ring",terms:"life buoy,kisby ring,kisbie ring,perry buoy"},"emergency/lifeguard":{name:"Lifeguard",terms:"CPR,rescue"},"emergency/phone":{name:"Emergency Phone",terms:""},"emergency/siren":{name:"Siren",terms:"air raid,loud,noise,storm,tornado,warning"},"emergency/water_tank":{name:"Emergency Water Tank",terms:"water tank,cistern,reservoir"},entrance:{name:"Entrance/Exit",terms:"entrance,exit,door"},"footway/crossing-raised":{name:"Raised Street Crossing",terms:"flat top,hump,speed,slow"},"footway/crossing":{name:"Street Crossing",terms:""},"footway/crosswalk-raised":{name:"Raised Pedestrian Crosswalk",terms:"zebra crossing,flat top,hump,speed,slow"},"footway/crosswalk":{name:"Pedestrian Crosswalk",terms:"zebra crossing"},"footway/sidewalk":{name:"Sidewalk",terms:""},ford:{name:"Ford",terms:""},"golf/bunker":{name:"Sand Trap",terms:"hazard,bunker"},"golf/fairway":{name:"Fairway",terms:""},"golf/green":{name:"Putting Green",terms:""},"golf/hole":{name:"Golf Hole",terms:""},"golf/lateral_water_hazard_area":{name:"Lateral Water Hazard",terms:""},"golf/lateral_water_hazard_line":{name:"Lateral Water Hazard",terms:""},"golf/rough":{name:"Rough",terms:""},"golf/tee":{name:"Tee Box",terms:"teeing ground"},"golf/water_hazard_area":{name:"Water Hazard",terms:""},"golf/water_hazard_line":{name:"Water Hazard",terms:""},healthcare:{name:"Healthcare Facility",terms:"clinic,doctor,disease,health,institution,sick,surgery,wellness"},"healthcare/alternative":{name:"Alternative Medicine",terms:"acupuncture,anthroposophical,applied kinesiology,aromatherapy,ayurveda,herbalism,homeopathy,hydrotherapy,hypnosis,naturopathy,osteopathy,reflexology,reiki,shiatsu,traditional,tuina,unani"},"healthcare/alternative/chiropractic":{name:"Chiropractor",terms:"back,pain,spine"},"healthcare/audiologist":{name:"Audiologist",terms:"ear,hearing,sound"},"healthcare/birthing_center":{name:"Birthing Center",terms:"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/blood_donation":{name:"Blood Donor Center",terms:"blood bank,blood donation,blood transfusion,apheresis,plasmapheresis,plateletpheresis,stem cell donation"},"healthcare/hospice":{name:"Hospice",terms:"terminal,illness"},"healthcare/laboratory":{name:"Medical Laboratory",terms:"medical_laboratory,medical_lab,blood_check"},"healthcare/midwife":{name:"Midwife",terms:"baby,childbirth,delivery,labour,labor,pregnancy"},"healthcare/occupational_therapist":{name:"Occupational Therapist",terms:"therapist,therapy"},"healthcare/optometrist":{name:"Optometrist",terms:"eye,glasses,lasik,lenses,vision"},"healthcare/physiotherapist":{name:"Physiotherapist",terms:"physical,therapist,therapy"},"healthcare/podiatrist":{name:"Podiatrist",terms:"foot,feet,nails"},"healthcare/psychotherapist":{name:"Psychotherapist",terms:"anxiety,counselor,depression,mental health,mind,suicide,therapist,therapy"},"healthcare/rehabilitation":{name:"Rehabilitation Facility",terms:"rehab,therapist,therapy"},"healthcare/speech_therapist":{name:"Speech Therapist",terms:"speech,therapist,therapy,voice"},"highway/bus_stop":{name:"Bus Stop / Platform",terms:""},"highway/bridleway":{name:"Bridle Path",terms:"bridleway,equestrian,horse,trail"},"highway/bus_guideway":{name:"Bus Guideway",terms:""},"highway/corridor":{name:"Indoor Corridor",terms:"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing-raised":{name:"Raised Street Crossing",terms:"flat top,hump,speed,slow"},"highway/crossing":{name:"Street Crossing",terms:""},"highway/crosswalk-raised":{name:"Raised Pedestrian Crosswalk",terms:"zebra crossing,flat top,hump,speed,slow"},"highway/crosswalk":{name:"Pedestrian Crosswalk",terms:"zebra crossing"},"highway/cycleway":{name:"Cycle Path",terms:"bike"},"highway/elevator":{name:"Elevator",terms:"lift"},"highway/footway":{name:"Foot Path",terms:"hike,hiking,trackway,trail,walk"},"highway/give_way":{name:"Yield Sign",terms:"give way,yield,sign"},"highway/living_street":{name:"Living Street",terms:""},"highway/mini_roundabout":{name:"Mini-Roundabout",terms:""},"highway/motorway_junction":{name:"Motorway Junction / Exit",terms:"exit"},"highway/motorway_link":{name:"Motorway Link",terms:"exit,ramp,road,street,on ramp,off ramp"},"highway/motorway":{name:"Motorway",terms:"autobahn,expressway,freeway,highway,interstate,parkway,road,street,thruway,turnpike"},"highway/passing_place":{name:"Passing Place",terms:"turnout, pullout"},"highway/path":{name:"Path",terms:"hike,hiking,trackway,trail,walk"},"highway/pedestrian_area":{name:"Pedestrian Area",terms:"center,centre,plaza,quad,square,walkway"},"highway/pedestrian_line":{name:"Pedestrian Street",terms:"center,centre,plaza,quad,square,walkway"},"highway/primary_link":{name:"Primary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/primary":{name:"Primary Road",terms:"road,street"},"highway/raceway":{name:"Racetrack (Motorsport)",terms:"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{name:"Residential Road",terms:"road,street"},"highway/rest_area":{name:"Rest Area",terms:"rest stop"},"highway/road":{name:"Unknown Road",terms:"road,street"},"highway/secondary_link":{name:"Secondary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/secondary":{name:"Secondary Road",terms:"road,street"},"highway/service":{name:"Service Road",terms:"road,street"},"highway/service/alley":{name:"Alley",terms:""},"highway/service/drive-through":{name:"Drive-Through",terms:""},"highway/service/driveway":{name:"Driveway",terms:""},"highway/service/emergency_access":{name:"Emergency Access",terms:""},"highway/service/parking_aisle":{name:"Parking Aisle",terms:""},"highway/services":{name:"Service Area",terms:"services,travel plaza,service station"},"highway/speed_camera":{name:"Speed Camera",terms:""},"highway/steps":{name:"Steps",terms:"stairs,staircase"},"highway/stop":{name:"Stop Sign",terms:"stop,halt,sign"},"highway/street_lamp":{name:"Street Lamp",terms:"streetlight,street light,lamp,light,gaslight"},"highway/tertiary_link":{name:"Tertiary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/tertiary":{name:"Tertiary Road",terms:"road,street"},"highway/track":{name:"Unmaintained Track Road",terms:"woods road,forest road,logging road,fire road,farm road,agricultural road,ranch road,carriage road,primitive,unmaintained,rut,offroad,4wd,4x4,four wheel drive,atv,quad,jeep,double track,two track"},"highway/traffic_mirror":{name:"Traffic Mirror",terms:"blind spot,convex,corner,curved,roadside,round,safety,sphere,visibility"},"highway/traffic_signals":{name:"Traffic Signals",terms:"light,stoplight,traffic light"},"highway/trunk_link":{name:"Trunk Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/trunk":{name:"Trunk Road",terms:"road,street"},"highway/turning_circle":{name:"Turning Circle",terms:"cul-de-sac"},"highway/turning_loop":{name:"Turning Loop (Island)",terms:"cul-de-sac"},"highway/unclassified":{name:"Minor/Unclassified Road",terms:"road,street"},historic:{name:"Historic Site",terms:""},"historic/archaeological_site":{name:"Archaeological Site",terms:""},"historic/boundary_stone":{name:"Boundary Stone",terms:""},"historic/castle":{name:"Castle",terms:""},"historic/memorial":{name:"Memorial",terms:"dedicatory,epitaph,remember,remembrance,memory,monument,stolperstein"},"historic/monument":{name:"Monument",terms:""},"historic/ruins":{name:"Ruins",terms:""},"historic/tomb":{name:"Tomb",terms:""},"historic/wayside_cross":{name:"Wayside Cross",terms:""},"historic/wayside_shrine":{name:"Wayside Shrine",terms:""},junction:{name:"Junction",terms:""},landuse:{name:"Land Use",terms:""},"landuse/farm":{name:"Farmland",terms:""},"landuse/allotments":{name:"Community Garden",terms:"allotment,garden"},"landuse/aquaculture":{name:"Aquaculture",terms:"fish farm,crustacean,algae,aquafarming,shrimp farm,oyster farm,mariculture,algaculture"},"landuse/basin":{name:"Basin",terms:""},"landuse/brownfield":{name:"Brownfield",terms:""},"landuse/cemetery":{name:"Cemetery",terms:""},"landuse/churchyard":{name:"Churchyard",terms:""},"landuse/commercial":{name:"Commercial Area",terms:""},"landuse/construction":{name:"Construction",terms:""},"landuse/farmland":{name:"Farmland",terms:"crop,grow,plant"},"landuse/farmyard":{name:"Farmyard",terms:"crop,grow,plant"},"landuse/forest":{name:"Forest",terms:"cut,forest,lumber,tree"},"landuse/garages":{name:"Garage Landuse",terms:""},"landuse/grass":{name:"Grass",terms:""},"landuse/greenfield":{name:"Greenfield",terms:""},"landuse/greenhouse_horticulture":{name:"Greenhouse Horticulture",terms:"flower,greenhouse,horticulture,grow,vivero"},"landuse/harbour":{name:"Harbor",terms:"boat"},"landuse/industrial":{name:"Industrial Area",terms:""},"landuse/industrial/scrap_yard":{name:"Scrap Yard",terms:"car,junk,metal,salvage,scrap,u-pull-it,vehicle,wreck,yard"},"landuse/industrial/slaughterhouse":{name:"Slaughterhouse",terms:"abattoir,beef,butchery,calf,chicken,cow,killing house,meat,pig,pork,poultry,shambles,stockyard"},"landuse/landfill":{name:"Landfill",terms:"dump"},"landuse/meadow":{name:"Meadow",terms:""},"landuse/military":{name:"Military Area",terms:""},"landuse/military/airfield":{name:"Military Airfield",terms:"aerodrome,aeroway,air force,airplane,airport,army,base,bomb,fight,force,guard,heli*,jet,marine,navy,plane,troop,war"},"landuse/military/barracks":{name:"Barracks",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/bunker":{name:"Military Bunker",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/checkpoint":{name:"Checkpoint",terms:"air force,army,base,force,guard,marine,navy,troop,war"},"landuse/military/danger_area":{name:"Danger Area",terms:"air force,army,base,blast,bomb,explo*,force,guard,mine,marine,navy,troop,war"},"landuse/military/naval_base":{name:"Naval Base",terms:"base,fight,force,guard,marine,navy,ship,sub,troop,war"},"landuse/military/nuclear_explosion_site":{name:"Nuclear Explosion Site",terms:"atom,blast,bomb,detonat*,nuke,site,test"},"landuse/military/obstacle_course":{name:"Obstacle Course",terms:"army,base,force,guard,marine,navy,troop,war"},"landuse/military/office":{name:"Military Office",terms:"air force,army,base,enlist,fight,force,guard,marine,navy,recruit,troop,war"},"landuse/military/range":{name:"Military Range",terms:"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/military/training_area":{name:"Training Area",terms:"air force,army,base,fight,fire,force,guard,gun,marine,navy,rifle,shoot*,snip*,train,troop,war"},"landuse/orchard":{name:"Orchard",terms:"fruit"},"landuse/plant_nursery":{name:"Plant Nursery",terms:"flower,garden,grow,vivero"},"landuse/quarry":{name:"Quarry",terms:""},"landuse/railway":{name:"Railway Corridor",terms:"rail,train,track"},"landuse/recreation_ground":{name:"Recreation Ground",terms:"playing fields"},"landuse/religious":{name:"Religious Area",terms:""},"landuse/residential":{name:"Residential Area",terms:""},"landuse/retail":{name:"Retail Area",terms:""},"landuse/vineyard":{name:"Vineyard",terms:"grape,wine"},leisure:{name:"Leisure",terms:""},"leisure/adult_gaming_centre":{name:"Adult Gaming Center",terms:"gambling,slot machine"},"leisure/amusement_arcade":{name:"Amusement Arcade",terms:"pay-to-play games,video games,driving simulators,pinball machines"},"leisure/beach_resort":{name:"Beach Resort",terms:""},"leisure/bird_hide":{name:"Bird Hide",terms:"machan,ornithology"},"leisure/bleachers":{name:"Bleachers",terms:"crowd,bench,sports,stand,stands,seat,seating"},"leisure/bowling_alley":{name:"Bowling Alley",terms:"bowling center"},"leisure/common":{name:"Common",terms:"open space"},"leisure/dance":{name:"Dance Hall",terms:"ballroom,jive,swing,tango,waltz"},"leisure/dancing_school":{name:"Dance School",terms:"jive,swing,tango,waltz,dance teaching"},"leisure/dog_park":{name:"Dog Park",terms:""},"leisure/firepit":{name:"Firepit",terms:"fireplace,campfire"},"leisure/fitness_centre":{name:"Gym / Fitness Center",terms:"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{name:"Yoga Studio",terms:"studio"},"leisure/fitness_station":{name:"Outdoor Fitness Station",terms:"exercise,fitness,gym,trim trail"},"leisure/fitness_station/balance_beam":{name:"Exercise Balance Beam",terms:"balance,exercise,fitness,gym,trim trail"},"leisure/fitness_station/box":{name:"Exercise Box",terms:"box,exercise,fitness,gym,jump,trim trail"},"leisure/fitness_station/horizontal_bar":{name:"Exercise Horizontal Bar",terms:"bar,chinup,chin up,exercise,fitness,gym,pullup,pull up,trim trail"},"leisure/fitness_station/horizontal_ladder":{name:"Exercise Monkey Bars",terms:"bar,chinup,chin up,exercise,fitness,gym,ladder,monkey bars,pullup,pull up,trim trail"},"leisure/fitness_station/hyperextension":{name:"Hyperextension Station",terms:"back,exercise,extension,fitness,gym,roman chair,trim trail"},"leisure/fitness_station/parallel_bars":{name:"Parallel Bars",terms:"bar,dip,exercise,fitness,gym,trim trail"},"leisure/fitness_station/push-up":{name:"Push-Up Station",terms:"bar,exercise,fitness,gym,pushup,push up,trim trail"},"leisure/fitness_station/rings":{name:"Exercise Rings",terms:"exercise,fitness,gym,muscle up,pullup,pull up,trim trail"},"leisure/fitness_station/sign":{name:"Exercise Instruction Sign",terms:"exercise,fitness,gym,trim trail"},"leisure/fitness_station/sit-up":{name:"Sit-Up Station",terms:"crunch,exercise,fitness,gym,situp,sit up,trim trail"},"leisure/fitness_station/stairs":{name:"Exercise Stairs",terms:"exercise,fitness,gym,steps,trim trail"},"leisure/garden":{name:"Garden",terms:""},"leisure/golf_course":{name:"Golf Course",terms:"links"},"leisure/hackerspace":{name:"Hackerspace",terms:"makerspace,hackspace,hacklab"},"leisure/horse_riding":{name:"Horseback Riding Facility",terms:"equestrian,stable"},"leisure/ice_rink":{name:"Ice Rink",terms:"hockey,skating,curling"},"leisure/marina":{name:"Marina",terms:"boat"},"leisure/miniature_golf":{name:"Miniature Golf",terms:"crazy golf,mini golf,putt-putt"},"leisure/nature_reserve":{name:"Nature Reserve",terms:"protected,wildlife"},"leisure/outdoor_seating":{name:"Outdoor Seating Area",terms:"al fresco,beer garden,dining,cafe,restaurant,pub,bar,patio"},"leisure/park":{name:"Park",terms:"esplanade,estate,forest,garden,grass,green,grounds,lawn,lot,meadow,parkland,place,playground,plaza,pleasure garden,recreation area,square,tract,village green,woodland"},"leisure/picnic_table":{name:"Picnic Table",terms:"bench"},"leisure/pitch":{name:"Sport Pitch",terms:"field"},"leisure/pitch/american_football":{name:"American Football Field",terms:""},"leisure/pitch/badminton":{name:"Badminton Court",terms:""},"leisure/pitch/baseball":{name:"Baseball Diamond",terms:""},"leisure/pitch/basketball":{name:"Basketball Court",terms:""},"leisure/pitch/beachvolleyball":{name:"Beach Volleyball Court",terms:"volleyball"},"leisure/pitch/boules":{name:"Boules/Bocce Court",terms:"bocce,lyonnaise,pétanque"},"leisure/pitch/bowls":{name:"Bowling Green",terms:""},"leisure/pitch/cricket":{name:"Cricket Field",terms:""},"leisure/pitch/equestrian":{name:"Riding Arena",terms:"dressage,equestrian,horse,horseback,riding"},"leisure/pitch/rugby_league":{name:"Rugby League Field",terms:""},"leisure/pitch/rugby_union":{name:"Rugby Union Field",terms:""},"leisure/pitch/skateboard":{name:"Skate Park",terms:""},"leisure/pitch/soccer":{name:"Soccer Field",terms:"football"},"leisure/pitch/table_tennis":{name:"Ping Pong Table",terms:"table tennis,ping pong"},"leisure/pitch/tennis":{name:"Tennis Court",terms:""},"leisure/pitch/volleyball":{name:"Volleyball Court",terms:""},"leisure/playground":{name:"Playground",terms:"jungle gym,play area"},"leisure/resort":{name:"Resort",terms:""},"leisure/running_track":{name:"Racetrack (Running)",terms:"race*,running,sprint,track"},"leisure/sauna":{name:"Sauna",terms:""},"leisure/slipway":{name:"Slipway",terms:"boat launch,boat ramp"},"leisure/sports_centre":{name:"Sports Center / Complex",terms:""},"leisure/sports_centre/swimming":{name:"Swimming Pool Facility",terms:"dive,water"},"leisure/stadium":{name:"Stadium",terms:""},"leisure/swimming_pool":{name:"Swimming Pool",terms:"dive,water"},"leisure/track":{name:"Racetrack (Non-Motorsport)",terms:"cycle,dog,greyhound,horse,race*,track"},"leisure/water_park":{name:"Water Park",terms:"swim,pool,dive"},line:{name:"Line",terms:""},man_made:{name:"Man Made",terms:""},"man_made/embankment":{name:"Embankment",terms:""},"man_made/adit":{name:"Adit",terms:"entrance,underground,mine,cave"},"man_made/antenna":{name:"Antenna",terms:"broadcast,cell phone,cell,communication,mobile phone,radio,television,transmission,tv"},"man_made/breakwater":{name:"Breakwater",terms:""},"man_made/bridge":{name:"Bridge",terms:""},"man_made/bunker_silo":{name:"Bunker Silo",terms:"Silage,Storage"},"man_made/chimney":{name:"Chimney",terms:""},"man_made/clearcut":{name:"Clearcut Forest",terms:"cut,forest,lumber,tree,wood"},"man_made/crane":{name:"Crane",terms:""},"man_made/cutline":{name:"Cut line",terms:""},"man_made/flagpole":{name:"Flagpole",terms:""},"man_made/gasometer":{name:"Gasometer",terms:"gas holder"},"man_made/groyne":{name:"Groyne",terms:""},"man_made/lighthouse":{name:"Lighthouse",terms:""},"man_made/mast":{name:"Mast",terms:"antenna,broadcast tower,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,radio mast,radio tower,television tower,transmission mast,transmission tower,tv tower"},"man_made/monitoring_station":{name:"Monitoring Station",terms:"weather,earthquake,seismology,air,gps"},"man_made/observation":{name:"Observation Tower",terms:"lookout tower,fire tower"},"man_made/observatory":{name:"Observatory",terms:"astronomical,meteorological"},"man_made/petroleum_well":{name:"Oil Well",terms:"drilling rig,oil derrick,oil drill,oil horse,oil rig,oil pump,petroleum well,pumpjack"},"man_made/pier":{name:"Pier",terms:"dock,jetty"},"man_made/pipeline":{name:"Pipeline",terms:""},"man_made/pumping_station":{name:"Pumping Station",terms:""},"man_made/silo":{name:"Silo",terms:"grain,corn,wheat"},"man_made/storage_tank":{name:"Storage Tank",terms:"water,oil,gas,petrol"},"man_made/surveillance_camera":{name:"Surveillance Camera",terms:"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/surveillance":{name:"Surveillance",terms:"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"man_made/survey_point":{name:"Survey Point",terms:"trig point,triangulation pillar,trigonometrical station"},"man_made/tower":{name:"Tower",terms:""},"man_made/wastewater_plant":{name:"Wastewater Plant",terms:"sewage*,water treatment plant,reclamation plant"},"man_made/water_tower":{name:"Water Tower",terms:""},"man_made/water_well":{name:"Water Well",terms:""},"man_made/water_works":{name:"Water Works",terms:""},"man_made/watermill":{name:"Watermill",terms:"water,wheel,mill"},"man_made/windmill":{name:"Windmill",terms:"wind,wheel,mill"},"man_made/works":{name:"Factory",terms:"assembly,build,brewery,car,plant,plastic,processing,manufacture,refinery"},manhole:{name:"Manhole",terms:"cover,hole,sewer,sewage,telecom"},"manhole/drain":{name:"Storm Drain",terms:"cover,drain,hole,rain,sewer,sewage,storm"},"manhole/telecom":{name:"Telecom Manhole",terms:"cover,phone,hole,telecom,telephone,bt"},natural:{name:"Natural",terms:""},"natural/bare_rock":{name:"Bare Rock",terms:"rock"},"natural/bay":{name:"Bay",terms:""},"natural/beach":{name:"Beach",terms:"shore"},"natural/cave_entrance":{name:"Cave Entrance",terms:"cavern,hollow,grotto,shelter,cavity"},"natural/cliff":{name:"Cliff",terms:"crag,escarpment,rock face,scarp"},"natural/coastline":{name:"Coastline",terms:"shore"},"natural/fell":{name:"Fell",terms:""},"natural/glacier":{name:"Glacier",terms:""},"natural/grassland":{name:"Grassland",terms:"prairie,savanna"},"natural/heath":{name:"Heath",terms:""},"natural/mud":{name:"Mud",terms:"wetland"},"natural/peak":{name:"Peak",terms:"acme,aiguille,alp,climax,crest,crown,hill,mount,mountain,pinnacle,summit,tip,top"},"natural/reef":{name:"Reef",terms:"barrier,coral,ocean,sand,shoal"},"natural/ridge":{name:"Ridge",terms:"crest"},"natural/saddle":{name:"Saddle",terms:"pass,mountain pass,top"},"natural/sand":{name:"Sand",terms:"desert"},"natural/scree":{name:"Scree",terms:"loose rocks"},"natural/scrub":{name:"Scrub",terms:"bush,shrubs"},"natural/spring":{name:"Spring",terms:""},"natural/tree_row":{name:"Tree row",terms:""},"natural/tree":{name:"Tree",terms:""},"natural/volcano":{name:"Volcano",terms:"mountain,crater"},"natural/water":{name:"Water",terms:""},"natural/water/lake":{name:"Lake",terms:"lakelet,loch,mere"},"natural/water/pond":{name:"Pond",terms:"lakelet,millpond,tarn,pool,mere"},"natural/water/reservoir":{name:"Reservoir",terms:""},"natural/wetland":{name:"Wetland",terms:"bog,marsh,reedbed,swamp,tidalflat"},"natural/wood":{name:"Wood",terms:"tree"},"noexit/yes":{name:"No Exit",terms:"no exit,road end,dead end"},office:{name:"Office",terms:""},"office/administrative":{name:"Administrative Office",terms:""},"office/physician":{name:"Physician",terms:""},"office/travel_agent":{name:"Travel Agency",terms:""},"office/accountant":{name:"Accountant Office",terms:""},"office/adoption_agency":{name:"Adoption Agency",terms:""},"office/advertising_agency":{name:"Advertising Agency",terms:"ad,ad agency,advert agency,advertising,marketing"},"office/architect":{name:"Architect Office",terms:""},"office/association":{name:"Nonprofit Organization Office",terms:"association,non-profit,nonprofit,organization,society"},"office/charity":{name:"Charity Office",terms:"charitable organization"},"office/company":{name:"Corporate Office",terms:""},"office/coworking":{name:"Coworking Space",terms:"coworking,office"},"office/educational_institution":{name:"Educational Institution",terms:""},"office/employment_agency":{name:"Employment Agency",terms:"job"},"office/energy_supplier":{name:"Energy Supplier Office",terms:"electricity,energy company,energy utility,gas utility"},"office/estate_agent":{name:"Real Estate Office",terms:""},"office/financial":{name:"Financial Office",terms:""},"office/forestry":{name:"Forestry Office",terms:"forest,ranger"},"office/foundation":{name:"Foundation Office",terms:""},"office/government":{name:"Government Office",terms:""},"office/government/register_office":{name:"Register Office",terms:"clerk,marriage,death,birth,certificate"},"office/government/tax":{name:"Tax and Revenue Office",terms:"fiscal authorities,revenue office,tax office"},"office/guide":{name:"Tour Guide Office",terms:"dive guide,mountain guide,tour guide"},"office/insurance":{name:"Insurance Office",terms:""},"office/it":{name:"Information Technology Office",terms:"computer,information,software,technology"},"office/lawyer":{name:"Law Office",terms:""},"office/lawyer/notary":{name:"Notary Office",terms:""},"office/moving_company":{name:"Moving Company Office",terms:"relocation"},"office/newspaper":{name:"Newspaper Office",terms:""},"office/ngo":{name:"NGO Office",terms:"ngo,non government,non-government,organization,organisation"},"office/notary":{name:"Notary Office",terms:"clerk,deeds,estate,signature,wills"},"office/political_party":{name:"Political Party",terms:""},"office/private_investigator":{name:"Private Investigator Office",terms:"PI,private eye,private detective"},"office/quango":{name:"Quasi-NGO Office",terms:"ngo,non government,non-government,organization,organisation,quasi autonomous,quasi-autonomous"},"office/research":{name:"Research Office",terms:""},"office/surveyor":{name:"Surveyor Office",terms:""},"office/tax_advisor":{name:"Tax Advisor Office",terms:"tax,tax consultant"},"office/telecommunication":{name:"Telecom Office",terms:"communication,internet,phone,voice"},"office/therapist":{name:"Therapist Office",terms:"therapy"},"office/water_utility":{name:"Water Utility Office",terms:"water board,utility"},piste:{name:"Piste/Ski Trail",terms:"ski,sled,sleigh,snowboard,nordic,downhill,snowmobile"},"place/farm":{name:"Farm",terms:""},"place/city":{name:"City",terms:""},"place/hamlet":{name:"Hamlet",terms:""},"place/island":{name:"Island",terms:"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/islet":{name:"Islet",terms:"archipelago,atoll,bar,cay,isle,islet,key,reef"},"place/isolated_dwelling":{name:"Isolated Dwelling",terms:""},"place/locality":{name:"Locality",terms:""},"place/neighbourhood":{name:"Neighborhood",terms:"neighbourhood"},"place/plot":{name:"Plot",terms:"tract,land,lot,parcel"},"place/quarter":{name:"Sub-Borough / Quarter",terms:"boro,borough,quarter"},"place/square":{name:"Square",terms:""},"place/suburb":{name:"Borough / Suburb",terms:"boro,borough,quarter"},"place/town":{name:"Town",terms:""},"place/village":{name:"Village",terms:""},"playground/balance_beam":{name:"Play Balance Beam",terms:""},"playground/basket_spinner":{name:"Basket Spinner",terms:"basket rotator"},"playground/basket_swing":{name:"Basket Swing",terms:""},"playground/climbing_frame":{name:"Climbing Frame",terms:""},"playground/cushion":{name:"Bouncy Cushion",terms:""},"playground/horizontal_bar":{name:"Play Horizontal Bar",terms:"high bar"},"playground/rocker":{name:"Spring Rider",terms:"spring rocker,springy rocker"},"playground/roundabout":{name:"Play Roundabout",terms:"merry-go-round"},"playground/sandpit":{name:"Sandpit",terms:""},"playground/seesaw":{name:"Seesaw",terms:""},"playground/slide":{name:"Slide",terms:""},"playground/structure":{name:"Play Structure",terms:""},"playground/swing":{name:"Swing",terms:""},"playground/zipwire":{name:"Zip Wire",terms:""},point:{name:"Point",terms:""},"power/sub_station":{name:"Substation",terms:""},"power/generator":{name:"Power Generator",terms:"hydro,solar,turbine,wind"},"power/generator/source_nuclear":{name:"Nuclear Reactor",terms:"fission,generator,nuclear,nuke,reactor"},"power/generator/source_wind":{name:"Wind Turbine",terms:"generator,turbine,windmill,wind"},"power/line":{name:"Power Line",terms:""},"power/minor_line":{name:"Minor Power Line",terms:""},"power/plant":{name:"Power Station Grounds",terms:"coal,gas,generat*,hydro,nuclear,power,station"},"power/pole":{name:"Power Pole",terms:""},"power/substation":{name:"Substation",terms:""},"power/switch":{name:"Power Switch",terms:""},"power/tower":{name:"High-Voltage Tower",terms:""},"power/transformer":{name:"Transformer",terms:""},"public_transport/linear_platform_aerialway":{name:"Aerialway Stop / Platform",terms:"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_bus":{name:"Bus Stop / Platform",terms:"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_ferry":{name:"Ferry Stop / Platform",terms:"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/linear_platform_light_rail":{name:"Light Rail Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/linear_platform_monorail":{name:"Monorail Stop / Platform",terms:"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/linear_platform_subway":{name:"Subway Stop / Platform",terms:"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/linear_platform_train":{name:"Train Stop / Platform",terms:"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/linear_platform_tram":{name:"Tram Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/linear_platform_trolleybus":{name:"Trolleybus Stop / Platform",terms:"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/linear_platform":{name:"Transit Stop / Platform",terms:"platform,public transit,public transportation,transit,transportation"},"public_transport/platform_aerialway":{name:"Aerialway Stop / Platform",terms:"aerialway,cable car,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_bus":{name:"Bus Stop / Platform",terms:"bus,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_ferry":{name:"Ferry Stop / Platform",terms:"boat,dock,ferry,pier,platform,public transit,public transportation,transit,transportation"},"public_transport/platform_light_rail":{name:"Light Rail Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/platform_monorail":{name:"Monorail Stop / Platform",terms:"monorail,platform,public transit,public transportation,rail,transit,transportation"},"public_transport/platform_subway":{name:"Subway Stop / Platform",terms:"metro,platform,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/platform_train":{name:"Train Stop / Platform",terms:"platform,public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/platform_tram":{name:"Tram Stop / Platform",terms:"electric,light rail,platform,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/platform_trolleybus":{name:"Trolleybus Stop / Platform",terms:"bus,electric,platform,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/platform":{name:"Transit Stop / Platform",terms:"platform,public transit,public transportation,transit,transportation"},"public_transport/station_aerialway":{name:"Aerialway Station",terms:"aerialway,cable car,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_bus":{name:"Bus Station / Terminal",terms:"bus,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_ferry":{name:"Ferry Station / Terminal",terms:"boat,dock,ferry,pier,public transit,public transportation,station,terminal,transit,transportation"},"public_transport/station_light_rail":{name:"Light Rail Station",terms:"electric,light rail,public transit,public transportation,rail,station,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_monorail":{name:"Monorail Station",terms:"monorail,public transit,public transportation,rail,station,terminal,transit,transportation"},"public_transport/station_subway":{name:"Subway Station",terms:"metro,public transit,public transportation,rail,station,subway,terminal,track,transit,transportation,underground"},"public_transport/station_train_halt":{name:"Train Station (Halt / Request)",terms:"halt,public transit,public transportation,rail,station,track,train,transit,transportation,whistle stop"},"public_transport/station_train":{name:"Train Station",terms:"public transit,public transportation,rail,station,terminal,track,train,transit,transportation"},"public_transport/station_tram":{name:"Tram Station",terms:"electric,light rail,public transit,public transportation,rail,station,streetcar,terminal,track,tram,trolley,transit,transportation"},"public_transport/station_trolleybus":{name:"Trolleybus Station / Terminal",terms:"bus,electric,public transit,public transportation,station,streetcar,terminal,trackless,tram,trolley,transit,transportation"},"public_transport/station":{name:"Transit Station",terms:"public transit,public transportation,station,terminal,transit,transportation"},"public_transport/stop_area":{name:"Transit Stop Area",terms:""},"public_transport/stop_position_aerialway":{name:"Aerialway Stopping Location",terms:"aerialway,cable car,public transit,public transportation,transit,transportation"},"public_transport/stop_position_bus":{name:"Bus Stopping Location",terms:"bus,public transit,public transportation,transit,transportation"},"public_transport/stop_position_ferry":{name:"Ferry Stopping Location",terms:"boat,dock,ferry,pier,public transit,public transportation,transit,transportation"},"public_transport/stop_position_light_rail":{name:"Light Rail Stopping Location",terms:"electric,light rail,public transit,public transportation,rail,track,tram,trolley,transit,transportation"},"public_transport/stop_position_monorail":{name:"Monorail Stopping Location",terms:"monorail,public transit,public transportation,rail,transit,transportation"},"public_transport/stop_position_subway":{name:"Subway Stopping Location",terms:"metro,public transit,public transportation,rail,subway,track,transit,transportation,underground"},"public_transport/stop_position_train":{name:"Train Stopping Location",terms:"public transit,public transportation,rail,track,train,transit,transportation"},"public_transport/stop_position_tram":{name:"Tram Stopping Location",terms:"electric,light rail,public transit,public transportation,rail,streetcar,track,tram,trolley,transit,transportation"},"public_transport/stop_position_trolleybus":{name:"Trolleybus Stopping Location",terms:"bus,electric,public transit,public transportation,streetcar,trackless,tram,trolley,transit,transportation"},"public_transport/stop_position":{name:"Transit Stopping Location",terms:"public transit,public transportation,transit,transportation"},"railway/halt":{name:"Train Station (Halt / Request)",terms:"break,interrupt,rest,wait,interruption"},"railway/platform":{name:"Train Stop / Platform",terms:""},"railway/station":{name:"Train Station",terms:"train station,station"},"railway/tram_stop":{name:"Tram Stopping Position",terms:"light rail,streetcar,tram,trolley"},"railway/abandoned":{name:"Abandoned Railway",terms:""},"railway/buffer_stop":{name:"Buffer Stop",terms:"stop,halt,buffer"},"railway/crossing":{name:"Railway Crossing (Path)",terms:"crossing,pedestrian crossing,railroad crossing,level crossing,grade crossing,path through railroad,train crossing"},"railway/derail":{name:"Railway Derailer",terms:"derailer"},"railway/disused":{name:"Disused Railway",terms:""},"railway/funicular":{name:"Funicular",terms:"venicular,cliff railway,cable car,cable railway,funicular railway"},"railway/level_crossing":{name:"Railway Crossing (Road)",terms:"crossing,railroad crossing,level crossing,grade crossing,road through railroad,train crossing"},"railway/light_rail":{name:"Light Rail",terms:"light rail,streetcar,trolley"},"railway/milestone":{name:"Railway Milestone",terms:"milestone,marker"},"railway/miniature":{name:"Miniature Railway",terms:"rideable miniature railway,narrow gauge railway,minimum gauge railway"},"railway/monorail":{name:"Monorail",terms:""},"railway/narrow_gauge":{name:"Narrow Gauge Rail",terms:"narrow gauge railway,narrow gauge railroad"},"railway/rail":{name:"Rail",terms:""},"railway/signal":{name:"Railway Signal",terms:"signal,lights"},"railway/subway_entrance":{name:"Subway Entrance",terms:"metro,transit"},"railway/subway":{name:"Subway",terms:"metro,transit"},"railway/switch":{name:"Railway Switch",terms:"switch,points"},"railway/train_wash":{name:"Train Wash",terms:"wash,clean"},"railway/tram":{name:"Tram",terms:"light rail,streetcar,tram,trolley"},relation:{name:"Relation",terms:""},"route/ferry":{name:"Ferry Route",terms:""},shop:{name:"Shop",terms:""},"shop/fishmonger":{name:"Fishmonger",terms:""},"shop/furnace":{name:"Furnace Store",terms:"oven,stove"},"shop/vacant":{name:"Vacant Shop",terms:""},"shop/agrarian":{name:"Farm Supply Shop",terms:"agricultural inputs,agricultural machines,seeds,pesticides,fertilizer,agricultural tools"},"shop/alcohol":{name:"Liquor Store",terms:"alcohol,beer,booze,wine"},"shop/anime":{name:"Anime Shop",terms:"manga,japan,cosplay,figurine,dakimakura"},"shop/antiques":{name:"Antiques Shop",terms:""},"shop/appliance":{name:"Appliance Store",terms:"air conditioner,appliance,dishwasher,dryer,freezer,fridge,grill,kitchen,oven,refrigerator,stove,washer,washing machine"},"shop/art":{name:"Art Store",terms:"art*,exhibit*,gallery"},"shop/baby_goods":{name:"Baby Goods Store",terms:""},"shop/bag":{name:"Bag/Luggage Store",terms:"handbag,purse"},"shop/bakery":{name:"Bakery",terms:""},"shop/bathroom_furnishing":{name:"Bathroom Furnishing Store",terms:""},"shop/beauty":{name:"Beauty Shop",terms:"spa,salon,tanning"},"shop/beauty/nails":{name:"Nail Salon",terms:"manicure,pedicure"},"shop/beauty/tanning":{name:"Tanning Salon",terms:""},"shop/bed":{name:"Bedding/Mattress Store",terms:""},"shop/beverages":{name:"Beverage Store",terms:""},"shop/bicycle":{name:"Bicycle Shop",terms:"bike,repair"},"shop/bookmaker":{name:"Bookmaker",terms:"betting"},"shop/books":{name:"Book Store",terms:""},"shop/boutique":{name:"Boutique",terms:""},"shop/butcher":{name:"Butcher",terms:"meat"},"shop/candles":{name:"Candle Shop",terms:""},"shop/car_parts":{name:"Car Parts Store",terms:"auto"},"shop/car_repair":{name:"Car Repair Shop",terms:"auto,garage,service"},"shop/car":{name:"Car Dealership",terms:"auto"},"shop/carpet":{name:"Carpet Store",terms:"rug"},"shop/charity":{name:"Charity Store",terms:"thrift,op shop,nonprofit"},"shop/cheese":{name:"Cheese Store",terms:""},"shop/chemist":{name:"Drugstore",terms:"apothecary,med*,drug*,gift"},"shop/chocolate":{name:"Chocolate Store",terms:""},"shop/clothes":{name:"Clothing Store",terms:""},"shop/coffee":{name:"Coffee Store",terms:""},"shop/computer":{name:"Computer Store",terms:""},"shop/confectionery":{name:"Candy Store",terms:"sweet"},"shop/convenience":{name:"Convenience Store",terms:""},"shop/copyshop":{name:"Copy Store",terms:""},"shop/cosmetics":{name:"Cosmetics Store",terms:""},"shop/craft":{name:"Arts and Crafts Store",terms:"art*,paint*,frame"},"shop/curtain":{name:"Curtain Store",terms:"drape*,window"},"shop/dairy":{name:"Dairy Store",terms:"milk,egg,cheese"},"shop/deli":{name:"Deli",terms:"lunch,meat,sandwich"},"shop/department_store":{name:"Department Store",terms:""},"shop/doityourself":{name:"DIY Store",terms:""},"shop/dry_cleaning":{name:"Dry Cleaner",terms:""},"shop/e-cigarette":{name:"E-Cigarette Shop",terms:"electronic,vapor"},"shop/electronics":{name:"Electronics Store",terms:"appliance,audio,blueray,camera,computer,dvd,home theater,radio,speaker,tv,video"},"shop/erotic":{name:"Erotic Store",terms:"sex,porn"},"shop/fabric":{name:"Fabric Store",terms:"sew"},"shop/farm":{name:"Produce Stand",terms:"farm shop,farm stand"},"shop/fashion":{name:"Fashion Store",terms:""},"shop/florist":{name:"Florist",terms:"flower"},"shop/frame":{name:"Framing Shop",terms:"art*,paint*,photo*,frame"},"shop/funeral_directors":{name:"Funeral Home",terms:"undertaker,memorial home"},"shop/furniture":{name:"Furniture Store",terms:"chair,sofa,table"},"shop/garden_centre":{name:"Garden Center",terms:"landscape,mulch,shrub,tree"},"shop/gas":{name:"Bottled Gas Shop",terms:"cng,lpg,natural gas,propane,refill,tank"},"shop/gift":{name:"Gift Shop",terms:"souvenir"},"shop/greengrocer":{name:"Greengrocer",terms:"fruit,vegetable"},"shop/hairdresser":{name:"Hairdresser",terms:"barber"},"shop/hardware":{name:"Hardware Store",terms:""},"shop/health_food":{name:"Health Food Shop",terms:"wholefood,vitamins,vegetarian,vegan"},"shop/hearing_aids":{name:"Hearing Aids Store",terms:""},"shop/herbalist":{name:"Herbalist",terms:""},"shop/hifi":{name:"Hifi Store",terms:"stereo,video"},"shop/houseware":{name:"Houseware Store",terms:"home,household"},"shop/interior_decoration":{name:"Interior Decoration Store",terms:""},"shop/jewelry":{name:"Jeweler",terms:"diamond,gem,ring"},"shop/kiosk":{name:"Kiosk",terms:""},"shop/kitchen":{name:"Kitchen Design Store",terms:""},"shop/laundry":{name:"Laundry",terms:""},"shop/leather":{name:"Leather Store",terms:""},"shop/locksmith":{name:"Locksmith",terms:"key,lockpick"},"shop/lottery":{name:"Lottery Shop",terms:""},"shop/mall":{name:"Mall",terms:"shopping"},"shop/massage":{name:"Massage Shop",terms:""},"shop/medical_supply":{name:"Medical Supply Store",terms:""},"shop/mobile_phone":{name:"Mobile Phone Store",terms:""},"shop/money_lender":{name:"Money Lender",terms:""},"shop/motorcycle_repair":{name:"Motorcycle Repair Shop",terms:"auto,bike,garage,motorcycle,repair,service"},"shop/motorcycle":{name:"Motorcycle Dealership",terms:"bike"},"shop/music":{name:"Music Store",terms:"CD,vinyl"},"shop/musical_instrument":{name:"Musical Instrument Store",terms:"guitar"},"shop/newsagent":{name:"Newspaper/Magazine Shop",terms:""},"shop/nutrition_supplements":{name:"Nutrition Supplements Store",terms:""},"shop/optician":{name:"Optician",terms:"eye,glasses"},"shop/organic":{name:"Organic Goods Store",terms:""},"shop/outdoor":{name:"Outdoors Store",terms:"camping,climbing,hiking"},"shop/paint":{name:"Paint Store",terms:""},"shop/pastry":{name:"Pastry Shop",terms:"patisserie,cake shop,cakery"},"shop/pawnbroker":{name:"Pawn Shop",terms:""},"shop/perfumery":{name:"Perfume Store",terms:""},"shop/pet_grooming":{name:"Pet Grooming Store",terms:"dog"},"shop/pet":{name:"Pet Store",terms:"animal,cat,dog,fish,kitten,puppy,reptile"},"shop/photo":{name:"Photography Store",terms:"camera,film"},"shop/pyrotechnics":{name:"Fireworks Store",terms:""},"shop/radiotechnics":{name:"Radio/Electronic Component Store",terms:""},"shop/religion":{name:"Religious Store",terms:""},"shop/scuba_diving":{name:"Scuba Diving Shop",terms:""},"shop/seafood":{name:"Seafood Shop",terms:"fishmonger"},"shop/second_hand":{name:"Consignment/Thrift Store",terms:"secondhand,second hand,resale,thrift,used"},"shop/shoes":{name:"Shoe Store",terms:""},"shop/sports":{name:"Sporting Goods Store",terms:""},"shop/stationery":{name:"Stationery Store",terms:"card,paper"},"shop/storage_rental":{name:"Storage Rental",terms:""},"shop/supermarket":{name:"Supermarket",terms:"grocery,store,shop"},"shop/tailor":{name:"Tailor",terms:"clothes,suit"},"shop/tattoo":{name:"Tattoo Parlor",terms:""},"shop/tea":{name:"Tea Store",terms:""},"shop/ticket":{name:"Ticket Seller",terms:""},"shop/tiles":{name:"Tile Shop",terms:""},"shop/tobacco":{name:"Tobacco Shop",terms:""},"shop/toys":{name:"Toy Store",terms:""},"shop/trade":{name:"Trade Shop",terms:""},"shop/travel_agency":{name:"Travel Agency",terms:""},"shop/tyres":{name:"Tire Store",terms:""},"shop/vacuum_cleaner":{name:"Vacuum Cleaner Store",terms:""},"shop/variety_store":{name:"Variety Store",terms:""},"shop/video_games":{name:"Video Game Store",terms:""},"shop/video":{name:"Video Store",terms:"DVD"},"shop/watches":{name:"Watches Shop",terms:""},"shop/water_sports":{name:"Watersport/Swim Shop",terms:""},"shop/weapons":{name:"Weapon Shop",terms:"ammo,gun,knife,knives"},"shop/wholesale":{name:"Wholesale Store",terms:"warehouse club,cash and carry"},"shop/window_blind":{name:"Window Blind Store",terms:""},"shop/wine":{name:"Wine Shop",terms:""},tourism:{name:"Tourism",terms:""},"tourism/alpine_hut":{name:"Alpine Hut",terms:"climbing hut"},"tourism/apartment":{name:"Guest Apartment / Condo",terms:""},"tourism/aquarium":{name:"Aquarium",terms:"fish,sea,water"},"tourism/artwork":{name:"Artwork",terms:"mural,sculpture,statue"},"tourism/attraction":{name:"Tourist Attraction",terms:""},"tourism/camp_site":{name:"Campground",terms:"tent,rv"},"tourism/caravan_site":{name:"RV Park",terms:"Motor Home,Camper"},"tourism/chalet":{name:"Holiday Cottage",terms:"holiday,holiday cottage,holiday home,vacation,vacation home"},"tourism/gallery":{name:"Art Gallery",terms:"art*,exhibit*,paint*,photo*,sculpt*"},"tourism/guest_house":{name:"Guest House",terms:"B&B,Bed and Breakfast"},"tourism/hostel":{name:"Hostel",terms:""},"tourism/hotel":{name:"Hotel",terms:""},"tourism/information":{name:"Information",terms:""},"tourism/information/board":{name:"Information Board",terms:""},"tourism/information/guidepost":{name:"Guidepost",terms:"signpost"},"tourism/information/map":{name:"Map",terms:""},"tourism/information/office":{name:"Tourist Information Office",terms:""},"tourism/motel":{name:"Motel",terms:""},"tourism/museum":{name:"Museum",terms:"art*,exhibit*,gallery,foundation,hall,institution,paint*,photo*,sculpt*"},"tourism/picnic_site":{name:"Picnic Site",terms:"camp"},"tourism/theme_park":{name:"Theme Park",terms:""},"tourism/trail_riding_station":{name:"Trail Riding Station",terms:""},"tourism/viewpoint":{name:"Viewpoint",terms:""},"tourism/wilderness_hut":{name:"Wilderness Hut",terms:"wilderness hut,backcountry hut,bothy"},"tourism/zoo":{name:"Zoo",terms:"animal"},traffic_calming:{name:"Traffic Calming",terms:"bump,hump,slow,speed"},"traffic_calming/bump":{name:"Speed Bump",terms:"hump,speed,slow"},"traffic_calming/chicane":{name:"Traffic Chicane",terms:"driveway link,speed,slow"},"traffic_calming/choker":{name:"Traffic Choker",terms:"speed,slow"},"traffic_calming/cushion":{name:"Speed Cushion",terms:"bump,hump,speed,slow"},"traffic_calming/dip":{name:"Dip",terms:"speed,slow"},"traffic_calming/hump":{name:"Speed Hump",terms:"bump,speed,slow"},"traffic_calming/island":{name:"Traffic Island",terms:"circle,roundabout,slow"},"traffic_calming/rumble_strip":{name:"Rumble Strip",terms:"audible lines,sleeper lines,growlers"},"traffic_calming/table":{name:"Speed Table",terms:"flat top,hump,speed,slow"},"type/multipolygon":{name:"Multipolygon",terms:""},"type/boundary":{name:"Boundary",terms:""},"type/boundary/administrative":{name:"Administrative Boundary",terms:""},"type/restriction":{name:"Restriction",terms:""},"type/restriction/no_left_turn":{name:"No Left Turn",terms:""},"type/restriction/no_right_turn":{name:"No Right Turn",terms:""},"type/restriction/no_straight_on":{name:"No Straight On",terms:""},"type/restriction/no_u_turn":{name:"No U-turn",terms:""},"type/restriction/only_left_turn":{name:"Only Left Turn",terms:""},"type/restriction/only_right_turn":{name:"Only Right Turn",terms:""},"type/restriction/only_straight_on":{name:"Only Straight On",terms:""},"type/restriction/only_u_turn":{name:"Only U-turn",terms:""},"type/route_master":{name:"Route Master",terms:""},"type/route":{name:"Route",terms:""},"type/route/bicycle":{name:"Cycle Route",terms:""},"type/route/bus":{name:"Bus Route",terms:""},"type/route/detour":{name:"Detour Route",terms:""},"type/route/ferry":{name:"Ferry Route",terms:""},"type/route/foot":{name:"Foot Route",terms:""},"type/route/hiking":{name:"Hiking Route",terms:""},"type/route/horse":{name:"Riding Route",terms:""},"type/route/light_rail":{name:"Light Rail Route",terms:""},"type/route/pipeline":{name:"Pipeline Route",terms:""},"type/route/piste":{name:"Piste/Ski Route",terms:""},"type/route/power":{name:"Power Route",terms:""},"type/route/road":{name:"Road Route",terms:""},"type/route/subway":{name:"Subway Route",terms:""},"type/route/train":{name:"Train Route",terms:""},"type/route/tram":{name:"Tram Route",terms:""},"type/site":{name:"Site",terms:""},"type/waterway":{name:"Waterway",terms:""},vertex:{name:"Other",terms:""},"waterway/boatyard":{name:"Boatyard",terms:""},"waterway/canal":{name:"Canal",terms:""},"waterway/dam":{name:"Dam",terms:""},"waterway/ditch":{name:"Ditch",terms:""},"waterway/dock":{name:"Wet Dock / Dry Dock",terms:"boat,ship,vessel,marine"},"waterway/drain":{name:"Drain",terms:""},"waterway/fuel":{name:"Marine Fuel Station",terms:"petrol,gas,diesel,boat"},"waterway/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"waterway/riverbank":{name:"Riverbank",terms:""},"waterway/sanitary_dump_station":{name:"Marine Toilet Disposal",terms:"Boat,Watercraft,Sanitary,Dump Station,Pumpout,Pump out,Elsan,CDP,CTDP,Chemical Toilet"},"waterway/stream_intermittent":{name:"Intermittent Stream",terms:"arroyo,beck,branch,brook,burn,course,creek,drift,flood,flow,gully,run,runnel,rush,spate,spritz,tributary,wadi,wash,watercourse"},"waterway/stream":{name:"Stream",terms:"beck,branch,brook,burn,course,creek,current,drift,flood,flow,freshet,race,rill,rindle,rivulet,run,runnel,rush,spate,spritz,surge,tide,torrent,tributary,watercourse"},"waterway/water_point":{name:"Marine Drinking Water",terms:""},"waterway/waterfall":{name:"Waterfall",terms:"fall"},"waterway/weir":{name:"Weir",terms:""}}},imagery:{AGIV:{attribution:{text:"Orthophoto Flanders most recent © AGIV"},name:"AGIV Flanders most recent aerial imagery"},AGIV10cm:{attribution:{text:"Orthophoto Flanders © AGIV"},name:"AGIV Flanders 2013-2015 aerial imagery 10cm"},AGIVFlandersGRB:{attribution:{text:"GRB Flanders © AGIV"},name:"AGIV Flanders GRB"},Bing:{description:"Satellite and aerial imagery.",name:"Bing aerial imagery"},"DigitalGlobe-Premium":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",name:"DigitalGlobe Premium Imagery"},"DigitalGlobe-Premium-vintage":{attribution:{text:"Terms & Feedback"},description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",name:"DigitalGlobe Premium Imagery Vintage"},"DigitalGlobe-Standard":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",name:"DigitalGlobe Standard Imagery"},"DigitalGlobe-Standard-vintage":{attribution:{text:"Terms & Feedback"},description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",name:"DigitalGlobe Standard Imagery Vintage"},EsriWorldImagery:{attribution:{text:"Terms & Feedback"},description:"Esri world imagery.",name:"Esri World Imagery"},EsriWorldImageryClarity:{attribution:{text:"Terms & Feedback"},description:"Esri archive imagery that may be clearer and more accurate than the default layer.",name:"Esri World Imagery (Clarity) Beta"},MAPNIK:{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},description:"The default OpenStreetMap layer.",name:"OpenStreetMap (Standard)"},Mapbox:{attribution:{text:"Terms & Feedback"},description:"Satellite and aerial imagery.",name:"Mapbox Satellite"},"OSM_Inspector-Addresses":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Addresses"},"OSM_Inspector-Geometry":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Geometry"},"OSM_Inspector-Highways":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Highways"},"OSM_Inspector-Multipolygon":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Area"},"OSM_Inspector-Places":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Places"},"OSM_Inspector-Routing":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Routing"},"OSM_Inspector-Tagging":{attribution:{text:"© Geofabrik GmbH, OpenStreetMap contributors, CC-BY-SA"},name:"OSM Inspector: Tagging"},SPW_ORTHO_LAST:{name:"SPW(allonie) most recent aerial imagery"},SPW_PICC:{name:"SPW(allonie) PICC numerical imagery"},"US-TIGER-Roads-2012":{name:"TIGER Roads 2012"},"US-TIGER-Roads-2014":{description:"At zoom level 16+, public domain map data from the US Census. At lower zooms, only changes since 2006 minus changes already incorporated into OpenStreetMap",name:"TIGER Roads 2014"},"US-TIGER-Roads-2017":{description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",name:"TIGER Roads 2017"},US_Forest_Service_roads_overlay:{description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",name:"U.S. Forest Roads Overlay"},UrbISOrtho2016:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2016"},UrbISOrtho2017:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2017"},UrbisAdmFR:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm FR"},UrbisAdmNL:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm NL"},"Waymarked_Trails-Cycling":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Cycling"},"Waymarked_Trails-Hiking":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Hiking"},"Waymarked_Trails-MTB":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: MTB"},"Waymarked_Trails-Skating":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Skating"},"Waymarked_Trails-Winter_Sports":{attribution:{text:"© waymarkedtrails.org, OpenStreetMap contributors, CC by-SA 3.0"},name:"Waymarked Trails: Winter Sports"},"basemap.at":{attribution:{text:"basemap.at"},description:"Basemap of Austria, based on government data.",name:"basemap.at"},"basemap.at-orthofoto":{attribution:{text:"basemap.at"},description:"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.",name:"basemap.at Orthofoto"},hike_n_bike:{attribution:{text:"© OpenStreetMap contributors"},name:"Hike & Bike"},kelkkareitit:{attribution:{text:"© Kelkkareitit.fi"},description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",name:"Nordic snowmobile overlay"},"lantmateriet-orto1960":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.",name:"Lantmäteriet Historic Orthophoto 1960"},"lantmateriet-orto1975":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.",name:"Lantmäteriet Historic Orthophoto 1975"},mapbox_locator_overlay:{attribution:{text:"Terms & Feedback"},description:"Shows major features to help orient you.",name:"Locator Overlay"},openpt_map:{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenPT Map (overlay)"},"osm-gps":{attribution:{text:"© OpenStreetMap contributors"},description:"Public GPS traces uploaded to OpenStreetMap.",name:"OpenStreetMap GPS traces"},"osm-mapnik-black_and_white":{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenStreetMap (Standard Black & White)"},"osm-mapnik-german_style":{attribution:{text:"© OpenStreetMap contributors, CC-BY-SA"},name:"OpenStreetMap (German Style)"},"osmse-ekonomiska":{attribution:{text:"© Lantmäteriet"},description:"Scan of \"Economic maps\" ca. 1950–1980",name:"Lantmäteriet Economic Map 1950–1980"},qa_no_address:{attribution:{text:"Simon Poole, Data ©OpenStreetMap contributors"},name:"QA No Address"},skobbler:{attribution:{text:"© Tiles: skobbler Map data: OpenStreetMap contributors"},name:"skobbler"},skoterleder:{attribution:{text:"© Skoterleder.org"},description:"Snowmobile trails",name:"Snowmobile map Sweden"},"stamen-terrain-background":{attribution:{text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL"},name:"Stamen Terrain"},"tf-cycle":{attribution:{text:"Maps © Thunderforest, Data © OpenStreetMap contributors"},name:"Thunderforest OpenCycleMap"},"tf-landscape":{attribution:{text:"Maps © Thunderforest, Data © OpenStreetMap contributors"},name:"Thunderforest Landscape"},"trafikverket-baninfo":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network, including sidings",name:"Trafikverket Railway Network"},"trafikverket-baninfo-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network with several options for map layers",name:"Trafikverket Railway Network options"},"trafikverket-vagnat":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network",name:"Trafikverket Road Network"},"trafikverket-vagnat-extra":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera",name:"Trafikverket Road Network extra"},"trafikverket-vagnat-navn":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB street names",name:"Trafikverket Street Names"},"trafikverket-vagnat-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network with several options for map layers",name:"Trafikverket Road Network options"}},community:{"bw-facebook":{name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana"},"bw-twitter":{name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana"},"cape-coast-youthmappers":{name:"University of Cape Coast YouthMappers",description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable."},"osm-gh-facebook":{name:"OpenStreetMap Ghana on Facebook",description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us."},"osm-gh-twitter":{name:"OpenStreetMap Ghana on Twitter",description:"Follow us on Twitter: {url}"},"talk-gh":{name:"Talk-gh Mailing List",description:"Talk-gh is the official mailing list for Ghana OSM community."},"osm-mg-facebook":{name:"OpenStreetMap Madagascar Facebook Group",description:"Malagasy Facebook group for people interested in OpenStreetMap."},"talk-mg":{name:"Talk-mg Mailing List",description:"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss."},"OSM-BGD-facebook":{name:"OpenStreetMap Bangladesh",description:"Improve OpenStreetMap in Bangladesh",extendedDescription:"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {url}. All are welcome!"},"OSM-India-facebook":{name:"OpenStreetMap India - Participatory neighborhood mapping",description:"Improve OpenStreetMap in India",extendedDescription:"Mapping in India? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",events:{sotmasia2018:{name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India"}}},"OSM-india-mailinglist":{name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community"},"OSM-india-twitter":{name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}"},"OSM-India-Puducherry-Facebook":{name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events."},"OSM-India-Puducherry-Matrix":{name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism."},"OSM-IDN-facebook":{name:"OpenStreetMap Indonesia",description:"Improve OpenStreetMap in Indonesia",extendedDescription:"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-japan-facebook":{name:"OpenStreetMap Japan Community",description:"Mappers and OpenStreetMap users in Japan"},"OSM-japan-mailinglist":{name:"OpenStreetMap Japan Mailinglist",description:"Talk-ja is an Official Mailinglist for Japanese Community"},"OSM-japan-twitter":{name:"OpenStreetMap Japan Twitter",description:"Hashtag on Twitter: {url}"},"OSM-japan-website":{name:"OpenStreetMap Japan",description:"Mappers and OpenStreetMap users in Japan"},"OSM-korea-telegram":{name:"OSM Korea Telegram Channel",description:"Unofficial Channnel for OpenStreetMap contributors, communities and users in Korea to share and discuss."},"OSM-MY-facebook":{name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!"},"OSM-MY-forum":{name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum"},"OSM-MY-matrix":{name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}"},"OSM-MNG-facebook":{name:"OpenStreetMap Mongolia",description:"Improve OpenStreetMap in Mongolia",extendedDescription:"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-MMR-facebook":{name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-Nepal-facebook":{name:"OpenStreetMap Nepal",description:"Improve OpenStreetMap in Nepal",extendedDescription:"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-PH-facebook":{name:"OpenStreetMap PH Facebook",description:"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project."},"OSM-PH-mailinglist":{name:"Talk-ph Mailing List",description:"A mailing list to discuss OpenStreetMap in the Philippines"},"OSM-PH-slack":{name:"OpenStreetMap PH Slack",description:"All are welcome! Sign up at {signupUrl}"},"OSM-PH-telegram":{name:"OpenStreetMap PH Telegram",description:"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines"},"OSM-RU-forum":{name:"OpenStreetMap RU forum",description:"OpenStreetMap Russia web forum"},"OSM-RU-telegram":{name:"OpenStreetMap RU telegram",description:"OpenStreetMap Russia telegram chat"},"OSM-LKA-facebook":{name:"OpenStreetMap Sri Lanka",description:"Improve OpenStreetMap in Sri Lanka",extendedDescription:"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!"},"OSM-TW-facebook":{name:"OpenStreetMap Taiwan Community",description:"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan."},"OSM-TW-mailinglist":{name:"OpenStreetMap Taiwan Mailinglist",description:"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan"},"OSM-TH-CNX-meetup":{name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled"},"OSM-TH-facebook":{name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand"},"OSM-TH-forum":{name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum"},"al-forum":{name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum"},"al-maptime-tirana":{name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time."},"al-telegram":{name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel"},"at-forum":{name:"OpenStreetMap Austria Forum",description:"The official forum for OpenStreetMap questions in and around Austria"},"at-mailinglist":{name:"Talk-at Mailing List",description:"Talk-at is the official mailing list for the Austrian OSM community"},"at-twitter":{name:"OpenStreetMap Austria Twitter",description:"OpenStreetMap Austria On Twitter: {url}"},"osmgraz-meetup":{name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz"},"osmgraz-twitter":{name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter"},"osm-at":{name:"OpenStreetMap Austria",description:"The platform for information on OpenStreetMap in Austria"},byosm:{name:"OpenStreetMap Belarus",description:"OpenStreetMap Belarus telegram chat"},"be-facebook":{name:"OpenStreetMap BE Community",description:"Mappers and OpenStreetMap on Facebook in Belgium"},"be-forum":{name:"OpenStreetMap BE forum",description:"OpenStreetMap Belgium web forum"},"be-irc":{name:"OpenStreetMap Belgium IRC",description:"Join #osmbe on irc.oftc.net (port 6667)",extendedDescription:"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the Matrix chat channel"},"be-mailinglist":{name:"Talk-be Mailing List",description:"Talk-be is the official mailing list for the Belgian OSM community"},"be-maptime":{name:"Maptime Belgium",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time."},"be-matrix":{name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects."},"be-meetup":{name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!"},"be-twitter":{name:"OpenStreetMap Belgium Twitter",description:"OSM Belgium on Twitter: @osm_be"},"hr-facebook":{name:"OpenStreetMap Croatia Facebook group",description:"OpenStreetMap Croatia Facebook group"},"hr-irc":{name:"OpenStreetMap Croatia on IRC",description:"Join #osm-hr on irc.freenode.org (port 6667)"},"hr-mailinglist":{name:"Talk-hr Mailing List",description:"Talk-hr mailing list"},"czech-community":{name:"Czech OSM community",description:"Map portal, website and contacts on OSM members in Czechia"},"osmcz-facebook":{name:"OpenStreetMap CZ on Facebook",description:"Follow czech community on Facebook - including translated WeeklyOSM!"},"osmcz-twitter":{name:"Czech twitter @osmcz",description:"Follow czech community on Twitter - including translated WeeklyOSM!"},"talk-cz-mailinglist":{name:"Czech mailing list (talk-cz)",description:"Talk-cz is the official mailing list for Czech community"},"dk-forum":{name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum"},"dk-irc":{name:"OpenStreetMap Denmark IRC",description:"Join #osm-dk on irc.oftc.net (port 6667)"},"dk-mailinglist":{name:"Talk-dk Mailing List",description:"A mailing list to discuss OpenStreetMap in Denmark"},"fi-forum":{name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum"},"fi-irc":{name:"OpenStreetMap Finland IRC",description:"Join #osm-fi on irc.oftc.net (port 6667)"},"fi-mailinglist":{name:"Talk-fi Mailing List",description:"Talk-fi is the official mailing list for the Finnish OSM community"},"fr-facebook":{name:"OpenStreetMap France Facebook page",description:"OpenStreetMap France Facebook page"},"fr-forum":{name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum"},"fr-irc":{name:"OpenStreetMap France on IRC",description:"Join #osm-fr on irc.oftc.net (port 6667)"},"fr-mailinglist":{name:"Talk-fr Mailing List",description:"Talk-fr mailing list"},"fr-twitter":{name:"OpenStreetMap France on Twitter",description:"OpenStreetMap France on Twitter: {url}"},"de-berlin-mailinglist":{name:"Berlin Mailing List",description:"This is the mailing list for the Berlin OSM community"},"de-berlin-meetup":{name:"OpenStreetMap Berlin-Brandenburg Meetup",description:"Mappers and OpenStreetMap users in the Berlin area"},"de-berlin-telegram":{name:"@osmberlin on Telegram",description:"OpenStreetMap Berlin Telegram chat"},"de-berlin-twitter":{name:"OpenStreetMap Berlin Twitter",description:"Follow us on Twitter: {url}"},"de-forum":{name:"OpenStreetMap DE forum",description:"OpenStreetMap Germany web forum"},"de-irc":{name:"OpenStreetMap Germany IRC",description:"Join #osm-de on irc.oftc.net (port 6667)"},"de-mailinglist":{name:"Talk-de Mailing List",description:"Talk-de is the official mailing list for the German OSM community"},"de-ostwestfalen-lippe-mailinglist":{name:"OWL Mailing List",description:"This is the mailing list for the Ostwestfalen-Lippe OSM community"},"de-telegram":{name:"OpenStreetMap Germany Telegram",description:"Join the OpenStreetMap Germany Telegram supergroup at {url}"},"osm-de":{name:"OpenStreetMap Germany",description:"The platform for information on OpenStreetMap in Germany"},"hu-facebook":{name:"OpenStreetMap HU on Facebook",description:"Mappers and OpenStreetMap Facebook in Hungary"},"hu-forum":{name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum"},"hu-meetup":{name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary"},"is-facebook":{name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland"},"is-mailinglist":{name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community"},"is-twitter":{name:"OSM Iceland on Twittter",description:"Twitter of OpenStreetMap in Iceland"},"it-facebook":{name:"OpenStreetMap Italy Facebook",description:"Join the OpenStreetMap Italy community on Facebook"},"it-irc":{name:"OpenStreetMap Italy IRC",description:"Join #osm-it on irc.oftc.net (port 6667)"},"it-mailinglist":{name:"Talk-it Mailing List",description:"Talk-it is the official mailing list for the Italian OSM community"},"it-telegram":{name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat"},"it-twitter":{name:"OpenStreetMap Italy Twitter",description:"Follow us on Twitter at {url}"},"OSM-Rome-meetup":{name:"Incontro Mappatori Romani",description:"Improve OpenStreetMap in the Rome area",extendedDescription:"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio."},"South-Tyrol-Mailing-List":{name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol"},"talk-it-lazio":{name:"OpenStreetMap IT Lazio",description:"All are welcome! Sign up at {signupUrl}",extendedDescription:"Mailinglist for Rome and Lazio area."},"Trentino-Mailing-List":{name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino"},"no-forum":{name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum"},"no-irc":{name:"OpenStreetMap Norway on IRC",description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"no-mailinglist":{name:"OpenStreetMap Norway mailing list",description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"OSM-PL-facebook-group":{name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland"},"OSM-PL-forum":{name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community"},"si-forum":{name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia"},"si-mailinglist":{name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia"},"OSM-ES-mailinglist":{name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain"},"OSM-ES-telegram":{name:"@OSMes on Telegram",description:"OpenStreetMap Spain Telegram chat"},"osm-se":{name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden"},"se-facebook":{name:"OpenStreetMap Sweden Facebook",description:"OpenStreetMap Sweden on Facebook"},"se-forum":{name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum"},"se-irc":{name:"OpenStreetMap Sweden IRC",description:"Join #osm.se on irc.oftc.net (port 6667)"},"se-mailinglist":{name:"Talk-se Mailing List",description:"A mailing list to discuss OpenStreetMap in Sweden"},"se-twitter":{name:"OpenStreetMap Sweden on Twitter",description:"Follow us on Twitter: {url}"},"Nottingham-OSM-pub-meetup":{name:"East Midlands (Nottingham) Monthly pub meet-up",description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose."},"gb-mailinglist":{name:"Talk-gb Mailing List",description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community"},"mappa-mercia-group":{name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data."},"gb-irc":{name:"OpenStreetMap United Kingdom IRC",description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question"},"OSM-CA-Slack":{name:"OSM-CA Slack",description:"All are welcome! Sign up at {signupUrl}."},"OSM-Vancouver-meetup":{name:"OpenStreetMap Vancouver",description:"Mappers and OpenStreetMap users in the Vancouver, BC area"},"OSM-CU-telegram":{name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat"},"OSM-NI-telegram":{name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat"},"Bay-Area-OpenStreetMappers":{name:"Bay Area OpenStreetMappers",description:"Improve OpenStreetMap in the Bay Area",extendedDescription:"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events."},"Central-Pennsylvania-OSM":{name:"Central Pennsylvania OSM",description:"Online mapping community based out of State College, PA"},"Code-for-San-Jose-Slack":{name:"Code for San Jose Slack",description:"All are welcome! Sign up at {signupUrl}, then join the #osm channel."},"Dallas-Fort-Worth-OSM":{name:"Dallas-Fort Worth OSM",description:"The OpenStreetMap user group for Dallas-Fort Worth",extendedDescription:"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM."},GeoPhilly:{name:"GeoPhilly",description:"Meetup for map enthusiasts in the Philadelphia area",extendedDescription:"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you! Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!"},MapMinnesota:{name:"MapMinnesota",description:"Mappers and OpenStreetMap enthusiasts in the Twin Cities area",extendedDescription:"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!"},"Mapping-DC-meetup":{name:"Mapping DC",description:"Improve OpenStreetMap in the DC area",extendedDescription:"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city."},"Maptime-ME-meetup":{name:"MaptimeME",description:"Mappers and OpenStreetMap users, around Portland, ME",extendedDescription:"Maptime is, rather literally, time for mapmaking. Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies."},"us-ma-mailinglist":{name:"Talk-us-massachusetts Mailing List",description:"Email mailing list for the Massachusetts OSM community"},"OpenCleveland-meetup":{name:"Open Cleveland",description:"Improve OpenStreetMap in the Cleveland area",extendedDescription:"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)"},"OSM-Boston":{name:"OpenStreetMap Boston",description:"Mappers and OpenStreetMap users in the Boston area",extendedDescription:"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!"},"OSM-Central-Salish-Sea":{name:"OpenStreetMap Central Salish Sea",description:"Mappers and OpenStreetMap users around Mount Vernon, WA",extendedDescription:"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!"},"OSM-Chattanooga":{name:"OSM Chattanooga",description:"The OpenStreetMap user group for Chattanooga"},"OSM-Colorado":{name:"OpenStreetMap Colorado",description:"Mappers and OpenStreetMap users in the state of Colorado, USA",extendedDescription:"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"OSM-NYC":{name:"OpenStreetMap NYC",description:"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area"},"OSM-Portland-forum":{name:"OpenStreetMap PDX Google Group",description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner."},"OSM-Portland":{name:"OpenStreetMap Portland",description:"Mappers and OpenStreetMap users in the Portland area",extendedDescription:"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!"},"OSM-Seattle":{name:"OpenStreetMap Seattle",description:"Mappers and OpenStreetMap users in the Seattle area"},"OSM-SoCal":{name:"OpenStreetMap Southern California",description:"Let's have some fun, contribute something to Los Angeles, and learn about mapping!",extendedDescription:"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap. OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe. Everyone is welcome. If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!"},"OSM-South-Bay":{name:"OSM South Bay",description:"Map Nights hosted by Code for San Jose",extendedDescription:"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required."},"OSM-Tampa-Bay":{name:"OpenStreetMap Tampa Bay",description:"Mappers and OpenStreetMap users in the Tampa Bay area",extendedDescription:"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world. If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so."},"OSM-US-Slack":{name:"OpenStreetMap US Slack",description:"All are welcome! Sign up at {signupUrl}"},"OSM-US":{name:"OpenStreetMap US",description:"We help grow and improve OpenStreetMap in the United States.",extendedDescription:"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}",events:{sotmus2018:{name:"State of the Map US 2018",description:"Join the OpenStreetMap community at State of the Map US in Detroit, Michigan. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Detroit, Michigan"}}},"OSM-Utah":{name:"OpenStreetMap Utah",description:"Mappers and OpenStreetMap users in the Salt Lake City area",extendedDescription:"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially. We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!"},"OSM-Wyoming":{name:"OpenStreetMap Wyoming",description:"Mappers and OpenStreetMap users in the state of Wyoming",extendedDescription:"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties."},"PHXGeo-meetup":{name:"PHXGeo Meetup",description:"Mappers and OpenStreetMap users in the Phoenix, AZ area",extendedDescription:"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between."},"PHXGeo-twitter":{name:"PHXGeo Twitter",description:"Follow us on Twitter at {url}"},"Western-Slope-facebook":{name:"Western Slope OSM Facebook",description:"Mappers and OpenStreetMap users around Grand Junction, CO"},"Western-Slope-meetup":{name:"Western Slope OSM Meetup",description:"Mappers and OpenStreetMap users around Grand Junction, CO",extendedDescription:"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!"},"Maptime-Australia-Slack":{name:"Maptime Australia Slack",description:"Sign up at {signupUrl}"},"talk-au":{name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat"},"OSM-AR-facebook":{name:"OpenStreetMap Argentina Facebook",description:"Join the OpenStreetMap Argentina community on Facebook",extendedDescription:"News from the local community"},"OSM-AR-forum":{name:"OpenStreetMap Argentina web forum",description:"Join the OpenStreetMap Argentina web forum",extendedDescription:"Ideal for long or important discussions. Slow response time."},"OSM-AR-irc":{name:"OpenStreetMap Argentina IRC",description:"Join #osm-ar on irc.oftc.net (port 6667)",extendedDescription:"You may find the most geeky user in the community."},"OSM-AR-mailinglist":{name:"Talk-ar Mailing List",description:"Historic mailing list. Almost unused today."},"OSM-AR-telegram":{name:"OpenStreetMap Argentina Telegram",description:"Join the OpenStreetMap Argentina community on Telegram",extendedDescription:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. Everyone is welcome!"},"OSM-AR-twitter":{name:"OpenStreetMap Argentina Twitter",description:"Follow us on Twitter at {url}",extendedDescription:"News from the local community and OpenStreetMap in general."},"OSM-BO-mailinglist":{name:"Talk-bo Mailing List",description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!"},"Bahia-telegram":{name:"OpenStreetMap Bahia Telegram Group",description:"Join the OpenStreetMap Bahia community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"DF-telegram":{name:"OpenStreetMap Brasília Telegram Group",description:"Join the OpenStreetMap Brasília community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-mailinglist":{name:"Talk-br Mailing List",description:"A mailing list to discuss OpenStreetMap in Brazil"},"OSM-br-telegram":{name:"OpenStreetMap Brasil Telegram",description:"Join the OpenStreetMap Brasil community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-br-twitter":{name:"OpenStreetMap Brasil Twitter",description:"Follow us on Twitter at {url}"},"RS-telegram":{name:"OpenStreetMap Rio Grande do Sul Telegram Group",description:"Join the OpenStreetMap Rio Grande do Sul community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-facebook":{name:"OpenStreetMap Chile Facebook",description:"Join the OpenStreetMap Chile community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-mailinglist":{name:"Talk-cl Mailing List",description:"A mailing list to discuss OpenStreetMap in Chile"},"OSM-CL-telegram":{name:"OpenStreetMap Chile Telegram",description:"Join the OpenStreetMap Chile community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"OSM-CL-twitter":{name:"OpenStreetMap Chile Twitter",description:"Follow us on Twitter at {url}"},"Maptime-Bogota":{name:"Maptime Bogotá",description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap. It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun."},"OSM-CO-facebook":{name:"OpenStreetMap Colombia Facebook",description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!"},"OSM-CO-mailinglist":{name:"Talk-co Mailing List",description:"A mailing list to discuss OpenStreetMap in Colombia"},"OSM-CO-telegram":{name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat"},"OSM-CO-twitter":{name:"OpenStreetMap Colombia Twitter",description:"Follow us on Twitter at {url}"},"OSM-CO":{name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation"},"OSM-EC-telegram":{name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat"},"OSM-PY-telegram":{name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat"},"OSM-PE-facebook":{name:"OpenStreetMap Peru Facebook",description:"Join the OpenStreetMap Peru community on Facebook"},"OSM-PE-mailinglist":{name:"Talk-pe Mailing List",description:"The official mailing list for the OpenStreetMap Peru community"},"OSM-PE-matrix":{name:"OpenStreetMap Peru Matrix Chat",description:"Chat with other members of the OpenStreetMap Peru community in Matrix."},"OSM-PE-telegram":{name:"OpenStreetMap Peru Telegram",description:"Join the OpenStreetMap Peru community on Telegram"},"OSM-PE-twitter":{name:"OpenStreetMap Peru Twitter",description:"Follow us on Twitter at {url}"},"OSM-PE":{name:"OpenStreetMap Peru",description:"News and resources for the OpenStreetMap Peru community"},"LATAM-Facebook":{name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook"},"LATAM-Telegram":{name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America"},"LATAM-Twitter":{name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}"},"osm-latam":{name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",events:{"sotm-latam-2018":{name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina"}}},"OSM-Facebook":{name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap."},"OSM-help":{name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap. Whether you are a beginner mapper or have a technical question, we're here to help!"},"OSM-Reddit":{name:"OpenStreetMap on Reddit",description:"/r/openstreetmap/ is a great place to learn more about OpenStreetMap. Ask us anything!"},"OSM-Telegram":{name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}"},"OSM-Twitter":{name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}"},OSMF:{name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",events:{sotm2018:{name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy"}}}}};
23652 var features$2 = {botswana:{type:"Feature",id:"botswana",properties:{},geometry:{type:"Polygon",coordinates:[[[25.65423,-18.48085],[25.70131,-18.56629],[25.79198,-18.60814],[25.83557,-18.82958],[25.95414,-18.89236],[26.00296,-19.02313],[25.9925,-19.058],[26.17908,-19.52356],[26.25057,-19.57064],[26.32554,-19.57064],[26.37611,-19.62121],[26.35344,-19.64562],[26.70741,-19.87404],[26.73356,-19.91763],[26.97419,-20.00133],[27.04394,-19.99784],[27.13984,-20.06585],[27.22005,-20.07456],[27.30723,-20.22626],[27.31769,-20.45643],[27.73269,-20.4913],[27.74664,-20.70926],[27.71525,-21.07718],[27.9088,-21.2777],[28.02562,-21.55668],[28.19825,-21.5933],[28.37261,-21.59679],[28.50339,-21.65433],[28.58011,-21.62643],[28.8033,-21.71362],[29.08577,-21.80603],[29.03346,-21.90193],[29.06659,-22.02399],[29.17645,-22.07107],[29.25665,-22.05189],[29.38569,-22.19312],[29.32117,-22.21231],[29.0387,-22.23323],[29.01428,-22.27159],[28.97941,-22.31344],[28.98115,-22.34482],[28.94105,-22.45991],[28.52257,-22.59766],[28.36041,-22.58371],[28.18255,-22.70053],[28.18255,-22.74761],[28.06747,-22.89931],[27.95239,-22.9708],[27.96285,-23.03532],[27.74838,-23.24107],[27.68561,-23.21666],[27.62109,-23.23758],[27.56006,-23.36836],[27.2741,-23.49565],[27.08578,-23.66304],[27.00034,-23.70489],[26.88875,-24.10593],[26.87654,-24.26635],[26.74228,-24.31343],[26.57663,-24.45292],[26.42842,-24.64821],[25.8844,-24.77724],[25.89486,-24.88012],[25.76585,-25.17485],[25.66467,-25.48682],[25.58448,-25.64908],[25.3456,-25.78509],[25.11021,-25.76939],[25.02517,-25.71967],[24.92538,-25.81822],[24.69696,-25.83042],[24.46156,-25.74324],[24.37786,-25.76765],[24.21127,-25.67022],[23.92974,-25.64036],[23.66819,-25.44158],[23.3121,-25.26869],[22.88179,-25.50087],[22.72835,-26.01351],[22.63768,-26.10767],[22.56793,-26.2367],[22.48424,-26.21054],[22.35521,-26.33609],[22.24971,-26.35352],[22.07317,-26.63251],[21.9668,-26.67131],[21.79767,-26.66956],[21.77761,-26.69223],[21.80377,-26.78465],[21.6913,-26.87096],[21.59889,-26.8605],[21.5274,-26.86224],[21.32339,-26.84349],[21.14248,-26.87375],[21.00386,-26.84873],[20.98729,-26.81621],[20.85826,-26.80575],[20.68477,-26.92022],[20.61677,-26.79293],[20.61589,-26.68718],[20.622,-26.60461],[20.5941,-26.47558],[20.82252,-26.153],[20.78939,-25.92458],[20.63769,-25.63862],[20.63595,-25.55143],[20.36045,-25.06321],[20.25583,-24.93766],[20.11982,-24.89756],[19.98556,-24.76853],[19.99602,-21.99435],[20.9934,-22.00132],[20.99514,-18.30648],[21.45547,-18.31171],[23.10324,-17.98913],[23.31422,-17.98913],[23.43105,-18.18268],[23.54439,-18.26289],[23.60542,-18.48085],[23.77455,-18.36577],[23.91928,-18.20884],[24.18606,-18.01355],[24.36915,-17.94031],[24.47377,-17.956],[24.51038,-18.03621],[24.57839,-18.05714],[24.615,-17.98565],[24.71439,-17.89498],[24.97594,-17.77466],[25.09102,-17.82174],[25.15903,-17.76246],[25.27411,-17.79559],[25.25493,-17.91241],[25.31596,-18.06062],[25.40489,-18.1077],[25.5374,-18.37972],[25.65423,-18.48085]]]}},cape_coast_gh:{type:"Feature",id:"cape_coast_gh",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.6,5],[-1.6,5.4],[-1,5.4],[-1,5],[-1.6,5]]]}},ghana:{type:"Feature",properties:{},id:"ghana",geometry:{type:"Polygon",coordinates:[[[-3.11256,5.13335],[-2.97215,5.11112],[-2.94811,5.12753],[-2.75757,5.10599],[-2.7253,5.14087],[-2.78641,5.28242],[-2.78297,5.29541],[-2.76993,5.2937],[-2.76546,5.31797],[-2.77748,5.33079],[-2.77319,5.35557],[-2.72495,5.34224],[-2.78023,5.60642],[-2.86022,5.65049],[-2.92889,5.61838],[-2.96631,5.64127],[-2.95292,5.71643],[-3.02639,5.7096],[-3.01987,5.8575],[-3.07411,5.98624],[-3.10226,6.15284],[-3.15514,6.25114],[-3.17574,6.25182],[-3.17162,6.29755],[-3.23753,6.54183],[-3.23341,6.60049],[-3.26157,6.61959],[-3.21007,6.73417],[-3.24028,6.83031],[-2.95326,7.23817],[-2.97558,7.27018],[-2.92236,7.61436],[-2.77611,7.94432],[-2.60513,8.03747],[-2.62985,8.11769],[-2.48978,8.20877],[-2.64221,9.00988],[-2.77679,9.03972],[-2.76581,9.15633],[-2.66968,9.26478],[-2.93884,10.66601],[-2.82898,11.0113],[-0.68939,11.00051],[-0.60974,10.91962],[-0.43121,11.04095],[-0.43396,11.10295],[-0.27843,11.17672],[-0.13424,11.13967],[-0.14214,11.10632],[-0.05905,11.08341],[-0.0388,11.10733],[-0.01339,11.11204],[0.02369,11.05308],[0.03296,10.97793],[-0.00549,10.96411],[-0.02266,10.81914],[-0.07141,10.76856],[-0.07999,10.69806],[-0.05905,10.63294],[0.04257,10.60257],[0.0618,10.56207],[0.14351,10.52629],[0.17097,10.42265],[0.26711,10.41151],[0.28633,10.42096],[0.34264,10.31357],[0.39757,10.31492],[0.39722,10.30546],[0.37148,10.28283],[0.35225,10.10746],[0.41817,10.06487],[0.40924,10.01822],[0.36461,10.03174],[0.34676,9.66506],[0.26779,9.64678],[0.24994,9.44771],[0.42847,9.48564],[0.56168,9.40977],[0.48203,8.80501],[0.3804,8.74122],[0.47653,8.59324],[0.65369,8.49546],[0.65781,8.42347],[0.70862,8.38339],[0.72784,8.28964],[0.60425,8.21693],[0.62004,7.70623],[0.59464,7.70283],[0.5809,7.62253],[0.52322,7.5953],[0.52734,7.45099],[0.56168,7.39243],[0.62759,7.40741],[0.66055,7.30935],[0.59395,7.11248],[0.61317,7.09306],[0.59601,7.00549],[0.52322,6.97823],[0.52322,6.94006],[0.56442,6.92234],[0.53284,6.82962],[0.65094,6.73962],[0.63446,6.63733],[0.74707,6.57048],[0.71411,6.51864],[0.90242,6.33355],[1.00405,6.33543],[1.02516,6.25319],[1.05537,6.22964],[1.1,6.17],[1.2,6.17],[1.2,4],[-3,4.5],[-3.11256,5.13335]]]}},madagascar:{type:"Feature",id:"madagascar",properties:{},geometry:{type:"Polygon",coordinates:[[[51,-15],[47.5,-26],[42,-26],[43.5,-16],[49.5,-11],[51,-15]]]}},BGD:{type:"Feature",id:"BGD",properties:{name:"Bangladesh"},geometry:{type:"Polygon",coordinates:[[[92.67272,22.04124],[92.65226,21.32405],[92.30323,21.47548],[92.36855,20.67088],[92.08289,21.1922],[92.02522,21.70157],[91.83489,22.18294],[91.41709,22.76502],[90.49601,22.80502],[90.58696,22.39279],[90.27297,21.83637],[89.84747,22.03915],[89.70205,21.85712],[89.41886,21.96618],[89.03196,22.05571],[88.87631,22.87915],[88.52977,23.63114],[88.69994,24.23372],[88.08442,24.50166],[88.30637,24.86608],[88.93155,25.23869],[88.20979,25.76807],[88.56305,26.44653],[89.35509,26.01441],[89.83248,25.96508],[89.92069,25.26975],[90.87221,25.1326],[91.7996,25.14743],[92.3762,24.97669],[91.91509,24.13041],[91.46773,24.07264],[91.15896,23.50353],[91.70647,22.98526],[91.86993,23.62435],[92.14603,23.6275],[92.67272,22.04124]]]}},india_full:{type:"Feature",id:"india_full",properties:{name:"India"},geometry:{type:"MultiPolygon",coordinates:[[[[77.83745,35.49401],[78.91227,34.32194],[78.81109,33.5062],[79.20889,32.99439],[79.17613,32.48378],[78.45845,32.61816],[78.73889,31.51591],[79.72137,30.88272],[81.11126,30.18348],[80.47672,29.72987],[80.08843,28.79447],[81.0572,28.41609],[81.99999,27.92548],[83.30425,27.36451],[84.67502,27.2349],[85.25178,26.7262],[86.02439,26.63098],[87.22747,26.3979],[88.06024,26.41462],[88.1748,26.8104],[88.04313,27.44582],[88.12044,27.87654],[88.73033,28.08686],[88.81425,27.29932],[88.83564,27.09897],[89.74453,26.7194],[90.37328,26.87572],[91.21751,26.80865],[92.03348,26.83831],[92.10371,27.45261],[91.69666,27.77174],[92.50312,27.89688],[93.41335,28.64063],[94.56599,29.27744],[95.4048,29.03172],[96.11768,29.4528],[96.58659,28.83098],[96.24883,28.41103],[97.32711,28.26158],[97.40256,27.88254],[97.05199,27.69906],[97.134,27.08377],[96.41937,27.26459],[95.12477,26.57357],[95.15515,26.00131],[94.60325,25.16249],[94.55266,24.67524],[94.10674,23.85074],[93.32519,24.07856],[93.28633,23.04366],[93.06029,22.70311],[93.16613,22.27846],[92.67272,22.04124],[92.14603,23.6275],[91.86993,23.62435],[91.70647,22.98526],[91.15896,23.50353],[91.46773,24.07264],[91.91509,24.13041],[92.3762,24.97669],[91.7996,25.14743],[90.87221,25.1326],[89.92069,25.26975],[89.83248,25.96508],[89.35509,26.01441],[88.56305,26.44653],[88.20979,25.76807],[88.93155,25.23869],[88.30637,24.86608],[88.08442,24.50166],[88.69994,24.23372],[88.52977,23.63114],[88.87631,22.87915],[89.03196,22.05571],[88.88877,21.69059],[88.2085,21.70317],[86.9757,21.49556],[87.03317,20.74331],[86.49935,20.15164],[85.06027,19.47858],[83.94101,18.30201],[83.18922,17.67122],[82.19279,17.01664],[82.19124,16.55666],[81.69272,16.31022],[80.792,15.95197],[80.3249,15.89918],[80.02507,15.13641],[80.23327,13.83577],[80.28629,13.00626],[79.86255,12.05621],[79.858,10.35727],[79.34051,10.30885],[78.88535,9.54614],[79.18972,9.21654],[78.27794,8.93305],[77.94116,8.25296],[77.5399,7.96554],[76.59298,8.89928],[76.13006,10.29963],[75.74647,11.30825],[75.3961,11.78125],[74.86482,12.74194],[74.61672,13.99258],[74.44386,14.61722],[73.5342,15.99065],[73.11991,17.92857],[72.82091,19.20823],[72.82448,20.4195],[72.63053,21.35601],[71.17527,20.75744],[70.47046,20.87733],[69.16413,22.0893],[69.64493,22.45078],[69.3496,22.84318],[68.17664,23.69196],[68.8426,24.35913],[71.04324,24.35652],[70.8447,25.2151],[70.28287,25.72223],[70.16893,26.49187],[69.51439,26.94097],[70.6165,27.9892],[71.77767,27.91318],[72.82375,28.96159],[73.45064,29.97641],[74.42138,30.97981],[74.40593,31.69264],[75.25864,32.2711],[74.45156,32.7649],[74.10429,33.44147],[73.74995,34.3177],[74.2402,34.74889],[75.75706,34.50492],[76.87172,34.65354],[77.83745,35.49401]]]]}},india_puducherry:{type:"Feature",id:"india_puducherry",properties:{name:"Puducherry"},geometry:{type:"Polygon",coordinates:[[[79.87782,12.04973],[79.84726,11.95536],[79.83593,11.90229],[79.81979,11.85761],[79.81464,11.79006],[79.79645,11.7736],[79.77036,11.77191],[79.74564,11.78065],[79.6804,11.7988],[79.61655,11.82434],[79.58702,11.88549],[79.65672,11.93152],[79.64745,11.9594],[79.6423,12.0138],[79.66599,12.03865],[79.72813,12.04201],[79.79885,12.0457],[79.8452,12.05644],[79.87782,12.04973]]]}},IDN:{type:"Feature",id:"IDN",properties:{},geometry:{type:"Polygon",coordinates:[[[109.538,1.92671],[109.58606,1.79192],[109.68554,1.78179],[109.66224,1.61881],[109.82759,1.48148],[109.93117,1.42466],[109.97919,1.29865],[110.09758,1.19756],[110.1922,1.18303],[110.30096,0.99575],[110.39497,0.99668],[110.49064,0.87637],[110.59486,0.858],[110.85815,0.94998],[110.9055,1.02835],[111.19759,1.06475],[111.22607,1.08799],[111.40504,1.0094],[111.48916,1.03442],[111.52219,0.95868],[111.66704,1.04281],[111.82599,0.98538],[111.934,1.10284],[112.13391,1.13752],[112.22581,1.39272],[112.20003,1.43709],[112.5171,1.57395],[112.77536,1.56153],[112.87744,1.58118],[113.05767,1.55877],[113.106,1.44495],[113.35493,1.35908],[113.41908,1.28549],[113.53549,1.32127],[113.63068,1.21597],[113.81508,1.30294],[113.85093,1.38715],[113.97573,1.45005],[114.14945,1.46149],[114.2027,1.4213],[114.41581,1.51111],[114.52646,1.44179],[114.58583,1.44665],[114.61498,1.57508],[114.71115,1.67148],[114.69469,1.81063],[114.74372,1.86954],[114.87834,1.91463],[114.80632,2.02438],[114.78024,2.14454],[114.79949,2.24936],[114.90604,2.25697],[114.95039,2.35132],[115.09508,2.41123],[115.13965,2.4776],[115.23743,2.50599],[115.09278,2.69409],[115.14115,2.74432],[115.11387,2.83327],[115.15001,2.90895],[115.24912,2.9667],[115.48328,3.01964],[115.56423,3.17109],[115.51617,3.26111],[115.53779,3.36201],[115.6344,3.45571],[115.57652,3.6094],[115.57965,3.74752],[115.61864,3.84247],[115.58177,3.88792],[115.64991,3.98828],[115.70731,4.19935],[115.8296,4.24118],[115.8779,4.39102],[116.00607,4.34818],[116.07901,4.27643],[116.18028,4.38255],[116.34851,4.39138],[116.43275,4.32567],[116.53602,4.37566],[116.61942,4.33622],[116.89887,4.36704],[116.97351,4.34488],[117.28899,4.31595],[117.52934,4.1615],[117.8992,4.16585],[117.95861,4.19058],[118.26478,4.09696],[127.3,5.2],[129,2.7],[141,-2.4],[141,-6.3],[140.83,-6.7],[141.02,-6.95],[141.02,-9.5],[128.5,-9.5],[127.3,-8.2],[125,-8.5],[123.96,-9.2],[124.11,-9.42],[124.22,-9.37],[124.269,-9.4],[124.287,-9.5],[124.358,-9.48564],[124.355,-9.43281],[124.383,-9.361],[124.444,-9.31899],[124.48,-9.15],[124.95,-8.9],[124.94064,-9.03565],[124.99695,-9.06413],[125.11368,-8.98275],[125.18234,-9.03293],[125.18234,-9.17396],[124.98459,-9.19429],[124.99283,-9.28646],[125.04913,-9.33254],[125.16,-9.7],[123,-11.4],[100,-7],[93.5,6.3],[96.6,6.1],[103,1.4],[103.75,1.14],[103.9,1.2],[104.5,1.3],[105,3],[108,5.1],[109.64501,2.08141],[109.62041,1.98321],[109.538,1.92671]]]}},japan:{type:"Feature",id:"japan",properties:{},geometry:{type:"Polygon",coordinates:[[[141.11938,45.69083],[142.28497,45.56863],[145.39307,44.48867],[145.57983,44.11125],[145.27222,43.79291],[145.47821,43.46289],[145.68695,43.4589],[145.91217,43.39108],[145.44903,42.69934],[143.91094,41.8376],[142.48272,39.3181],[142.1751,38.15265],[141.38409,35.69383],[140.94463,35.21056],[140.55908,32.1198],[139.38457,31.87843],[138.98907,33.1752],[138.01025,34.29807],[135.99976,33.17434],[133.53882,32.71336],[132.48516,32.06483],[131.56128,31.04352],[131.03497,29.53613],[129.94629,27.50827],[127.78301,25.4442],[126.47461,25.42343],[125.86487,24.52713],[124.92657,23.88678],[123.37921,23.82053],[122.67883,24.31456],[122.7293,24.64795],[124.67834,25.02588],[125.36602,25.52354],[126.24493,26.35342],[127.56329,27.13828],[128.57403,28.73003],[128.74981,31.46703],[128.36426,32.62087],[128.92559,33.76174],[129.21021,34.62417],[129.56177,34.84086],[136.69739,37.9312],[139.1209,38.85762],[139.04297,42.04929],[140.13165,43.58114],[140.5711,45.64549],[141.11938,45.69083]]]}},korea:{type:"Feature",id:"korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,33],[124,39.5],[124.38171,40.12429],[124.87061,40.47202],[126.04614,40.95294],[126.60095,41.57231],[126.90308,41.79179],[127.24915,41.50446],[128.19397,41.41802],[128.28186,41.56614],[128.0127,42.0097],[128.8751,42.04521],[129.2926,42.43967],[129.67438,42.45589],[129.87762,43],[130.19348,42.92023],[130.31433,42.66224],[130.50385,42.59555],[130.68237,42.2895],[131.3,36.6],[127.3,33],[125,33]]]}},malaysia:{type:"Feature",id:"malaysia",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[109.538,1.92671],[109.62041,1.98321],[109.64501,2.08141],[113.8,4.8],[114.26015,4.50701],[114.33278,4.34889],[114.31645,4.26363],[114.45418,4.24183],[114.49579,4.14668],[114.6492,4.00624],[114.80762,4.14929],[114.85775,4.26957],[114.87758,4.42656],[114.82955,4.42966],[114.80229,4.67536],[114.85851,4.79751],[114.97133,4.80824],[115.02238,4.74977],[115.09879,4.4685],[115.15547,4.38302],[115.24582,4.34118],[115.28924,4.60384],[115.2375,4.79584],[115.15038,4.87204],[115.15825,5.02512],[115,5.3],[116.9,7.6],[117.5,7.4],[119.35011,5.53088],[119.43909,5.11578],[118.83773,4.45269],[118.26478,4.09696],[117.95861,4.19058],[117.8992,4.16585],[117.52934,4.1615],[117.28899,4.31595],[116.97351,4.34488],[116.89887,4.36704],[116.61942,4.33622],[116.53602,4.37566],[116.43275,4.32567],[116.34851,4.39138],[116.18028,4.38255],[116.07901,4.27643],[116.00607,4.34818],[115.8779,4.39102],[115.8296,4.24118],[115.70731,4.19935],[115.64991,3.98828],[115.58177,3.88792],[115.61864,3.84247],[115.57965,3.74752],[115.57652,3.6094],[115.6344,3.45571],[115.53779,3.36201],[115.51617,3.26111],[115.56423,3.17109],[115.48328,3.01964],[115.24912,2.9667],[115.15001,2.90895],[115.11387,2.83327],[115.14115,2.74432],[115.09278,2.69409],[115.23743,2.50599],[115.13965,2.4776],[115.09508,2.41123],[114.95039,2.35132],[114.90604,2.25697],[114.79949,2.24936],[114.78024,2.14454],[114.80632,2.02438],[114.87834,1.91463],[114.74372,1.86954],[114.69469,1.81063],[114.71115,1.67148],[114.61498,1.57508],[114.58583,1.44665],[114.52646,1.44179],[114.41581,1.51111],[114.2027,1.4213],[114.14945,1.46149],[113.97573,1.45005],[113.85093,1.38715],[113.81508,1.30294],[113.63068,1.21597],[113.53549,1.32127],[113.41908,1.28549],[113.35493,1.35908],[113.106,1.44495],[113.05767,1.55877],[112.87744,1.58118],[112.77536,1.56153],[112.5171,1.57395],[112.20003,1.43709],[112.22581,1.39272],[112.13391,1.13752],[111.934,1.10284],[111.82599,0.98538],[111.66704,1.04281],[111.52219,0.95868],[111.48916,1.03442],[111.40504,1.0094],[111.22607,1.08799],[111.19759,1.06475],[110.9055,1.02835],[110.85815,0.94998],[110.59486,0.858],[110.49064,0.87637],[110.39497,0.99668],[110.30096,0.99575],[110.1922,1.18303],[110.09758,1.19756],[109.97919,1.29865],[109.93117,1.42466],[109.82759,1.48148],[109.66224,1.61881],[109.68554,1.78179],[109.58606,1.79192],[109.538,1.92671]]],[[[99.45833,6.30667],[99.51167,6.48167],[99.68908,6.47146],[99.91691,6.5233],[100.07588,6.40615],[100.15906,6.48065],[100.17157,6.69376],[100.32605,6.6597],[100.36648,6.53967],[100.4962,6.52128],[100.66237,6.45103],[100.73937,6.49207],[100.81258,6.44219],[100.83515,6.29654],[100.90398,6.23379],[100.98414,6.27884],[101.0943,6.26044],[101.12667,6.19264],[101.0868,5.9109],[101.03707,5.91804],[100.98946,5.78393],[101.1192,5.67031],[101.25999,5.71155],[101.27615,5.81155],[101.39691,5.87241],[101.48454,5.86993],[101.58131,5.93436],[101.66236,5.86871],[101.69082,5.75576],[101.79332,5.75066],[101.94402,5.87247],[101.94265,5.98109],[102.05204,6.0785],[102.08029,6.22537],[102.2,6.5],[103.6,5.8],[104.8,2.5],[104.5,1.5],[104.31571,1.28352],[104.12518,1.27582],[104.07647,1.43092],[103.89786,1.42794],[103.81267,1.47847],[103.67389,1.42814],[103.56667,1.1955],[103,1.325],[99,4.5],[99.45833,6.30667]]]]}},MNG:{type:"Feature",id:"MNG",properties:{name:"Mongolia"},geometry:{type:"Polygon",coordinates:[[[87.75126,49.2972],[88.80557,49.47052],[90.71367,50.33181],[92.23471,50.80217],[93.10422,50.49529],[94.14757,50.48054],[94.81595,50.01343],[95.81403,49.97747],[97.25973,49.72606],[98.23176,50.4224],[97.82574,51.011],[98.86149,52.04737],[99.98173,51.63401],[100.88948,51.51686],[102.06522,51.25992],[102.25591,50.51056],[103.67655,50.08997],[104.62155,50.27533],[105.88659,50.40602],[106.8888,50.2743],[107.86818,49.79371],[108.47517,49.28255],[109.40245,49.29296],[110.66201,49.13013],[111.58123,49.37797],[112.89774,49.54357],[114.36246,50.2483],[114.96211,50.14025],[115.4857,49.80518],[116.6788,49.88853],[116.1918,49.1346],[115.48528,48.13538],[115.74284,47.72655],[116.30895,47.85341],[117.29551,47.69771],[118.06414,48.06673],[118.86657,47.74706],[119.77282,47.04806],[119.66327,46.69268],[118.87433,46.80541],[117.4217,46.67273],[116.71787,46.3882],[115.9851,45.72724],[114.46033,45.33982],[113.46391,44.80889],[112.43606,45.01165],[111.87331,45.10208],[111.34838,44.45744],[111.66774,44.07318],[111.82959,43.74312],[111.12968,43.40683],[110.4121,42.87123],[109.2436,42.51945],[107.74477,42.48152],[106.12932,42.13433],[104.96499,41.59741],[104.52228,41.90835],[103.31228,41.90747],[101.83304,42.51487],[100.84587,42.6638],[99.51582,42.52469],[97.45176,42.74889],[96.3494,42.72563],[95.76246,43.31945],[95.30688,44.24133],[94.68893,44.35233],[93.48073,44.97547],[92.13389,45.11508],[90.94554,45.28607],[90.58577,45.71972],[90.97081,46.88815],[90.28083,47.69355],[88.8543,48.06908],[88.01383,48.59946],[87.75126,49.2972]]]}},MMR:{type:"Feature",id:"MMR",properties:{name:"Myanmar"},geometry:{type:"Polygon",coordinates:[[[92.10937,20.85881],[92.3291,21.49396],[92.68066,21.28937],[92.63672,22.08564],[92.98828,22.06528],[93.18604,22.22809],[93.14209,23.09994],[93.38379,23.22115],[93.36182,24.1267],[94.19678,23.92601],[94.70215,25.04579],[94.57031,25.26457],[95.20752,26.03704],[95.05371,26.49024],[97.66846,28.51697],[98.65723,27.50827],[98.56934,25.85922],[97.62451,24.8665],[97.73438,23.88584],[98.83301,24.14675],[98.85498,23.18076],[99.49219,23.05952],[99.1626,22.04491],[100.0415,21.96342],[100.32715,21.49396],[101.09619,21.71868],[101.16211,21.41216],[99.99756,20.36523],[97.91016,19.49766],[97.53662,18.29195],[98.83301,16.21467],[98.50342,15.32657],[98.21777,15.11455],[98.65723,14.24309],[99.18457,13.66734],[99.22852,12.85465],[99.66797,11.65224],[98.4375,9.90392],[97.77832,14.34955],[97.00928,16.80454],[95.42725,15.55954],[94.021,16.04581],[94.21875,18.0832],[92.10937,20.85881]]]}},NPL:{type:"Feature",id:"NPL",properties:{name:"Nepal"},geometry:{type:"Polygon",coordinates:[[[88.12044,27.87654],[88.04313,27.44582],[88.1748,26.8104],[88.06024,26.41462],[87.22747,26.3979],[86.02439,26.63098],[85.25178,26.7262],[84.67502,27.2349],[83.30425,27.36451],[81.99999,27.92548],[81.0572,28.41609],[80.08843,28.79447],[80.47672,29.72987],[81.11126,30.18348],[81.5258,30.42272],[82.32751,30.11527],[83.33711,29.46373],[83.89899,29.32023],[84.23458,28.83989],[85.01164,28.64277],[85.82332,28.20358],[86.95452,27.97426],[88.12044,27.87654]]]}},philippines:{type:"Feature",id:"philippines",properties:{},geometry:{type:"Polygon",coordinates:[[[114.93896,8.23324],[122.01416,21.71868],[127.6062,7.39515],[125.50781,5.14566],[118.89954,4.41761],[119.49829,5.28789],[117.53174,7.39515],[114.93896,8.23324]]]}},russia:{type:"Feature",id:"russia",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[22.7311,54.32754],[20.89224,54.31253],[19.66064,54.42608],[19.88848,54.86616],[21.26845,55.19048],[22.31572,55.0153],[22.75776,54.85657],[22.65105,54.58274],[22.7311,54.32754]]],[[[-180,83],[-169,66.5],[-171,64],[-180,64],[-180,83]]],[[[180,83],[180,64.97971],[179.99281,64.97433],[178.7072,64.53493],[177.41128,64.60821],[178.313,64.07593],[178.90825,63.25197],[179.37034,62.98262],[179.48636,62.56894],[179.22825,62.3041],[177.3643,62.5219],[174.56929,61.76915],[173.68013,61.65261],[172.15,60.95],[170.6985,60.33618],[170.33085,59.88177],[168.90046,60.57355],[166.29498,59.78855],[165.84,60.16],[164.87674,59.7316],[163.53929,59.86871],[163.21711,59.21101],[162.01733,58.24328],[162.05297,57.83912],[163.19191,57.61503],[163.05794,56.15924],[162.12958,56.12219],[161.70146,55.28568],[162.11749,54.85514],[160.36877,54.34433],[160.02173,53.20257],[158.53094,52.95868],[158.23118,51.94269],[156.78979,51.01105],[156.42,51.7],[155.99182,53.15895],[155.43366,55.38103],[155.91442,56.76792],[156.75815,57.3647],[156.81035,57.83204],[158.36433,58.05575],[160.15064,59.31477],[161.87204,60.343],[163.66969,61.1409],[164.47355,62.55061],[163.25842,62.46627],[162.65791,61.6425],[160.12148,60.54423],[159.30232,61.77396],[156.72068,61.43442],[154.21806,59.75818],[155.04375,59.14495],[152.81185,58.88385],[151.26573,58.78089],[151.33815,59.50396],[149.78371,59.65573],[148.54481,59.16448],[145.48722,59.33637],[142.19782,59.03998],[138.95848,57.08805],[135.12619,54.72959],[136.70171,54.60355],[137.19342,53.97732],[138.1647,53.75501],[138.80463,54.25455],[139.90151,54.18968],[141.34531,53.08957],[141.37923,52.23877],[140.59742,51.23967],[140.51308,50.04553],[140.06193,48.44671],[138.55472,46.99965],[138.21971,46.30795],[136.86232,45.1435],[135.51535,43.989],[134.86939,43.39821],[133.53687,42.81147],[132.90627,42.79849],[132.27807,43.28456],[130.93587,42.55274],[130.78,42.22],[130.64,42.395],[130.63387,42.90302],[131.14469,42.92999],[131.28856,44.11152],[131.02519,44.96796],[131.88345,45.32116],[133.09712,45.14409],[133.76964,46.11693],[134.11235,47.21248],[134.50081,47.57845],[135.02631,48.47823],[133.3736,48.18344],[132.50669,47.78896],[130.98726,47.79013],[130.58229,48.72969],[129.39782,49.4406],[127.6574,49.76027],[127.28746,50.7398],[126.93916,51.35389],[126.5644,51.78426],[125.94635,52.7928],[125.06821,53.16105],[123.57147,53.4588],[122.24575,53.43173],[121.00308,53.2514],[120.17709,52.75389],[120.72579,52.51623],[120.7382,51.96411],[120.18208,51.64355],[119.27939,50.58292],[119.28846,50.14288],[117.87924,49.51098],[116.6788,49.88853],[115.4857,49.80518],[114.96211,50.14025],[114.36246,50.2483],[112.89774,49.54357],[111.58123,49.37797],[110.66201,49.13013],[109.40245,49.29296],[108.47517,49.28255],[107.86818,49.79371],[106.8888,50.2743],[105.88659,50.40602],[104.62158,50.27532],[103.67655,50.08997],[102.25589,50.51056],[102.06521,51.25991],[100.88948,51.51686],[99.98173,51.63401],[98.86149,52.04737],[97.82574,51.011],[98.23176,50.4224],[97.25976,49.72605],[95.81402,49.97746],[94.81595,50.01343],[94.14757,50.48054],[93.10421,50.49529],[92.23471,50.80217],[90.71367,50.33181],[88.80557,49.47052],[87.75126,49.2972],[87.35997,49.21498],[86.82936,49.82668],[85.54127,49.69286],[85.11556,50.1173],[84.41638,50.3114],[83.93511,50.88925],[83.383,51.06918],[81.94599,50.8122],[80.56845,51.38834],[80.03556,50.86475],[77.80092,53.40442],[76.52518,54.177],[76.8911,54.49052],[74.38482,53.54685],[73.42568,53.48981],[73.50852,54.03562],[72.22415,54.37665],[71.18013,54.13329],[70.86527,55.16973],[69.06817,55.38525],[68.1691,54.97039],[65.66687,54.60125],[65.17853,54.35423],[61.4366,54.00625],[60.97807,53.66499],[61.69999,52.98],[60.73999,52.71999],[60.92727,52.44755],[59.96753,51.96042],[61.588,51.27266],[61.33742,50.79907],[59.93281,50.84219],[59.64228,50.54544],[58.36332,51.06364],[56.77798,51.04355],[55.71694,50.62171],[54.53288,51.02624],[52.32872,51.71865],[50.76665,51.69276],[48.70238,50.60513],[48.57784,49.87476],[47.54948,50.4547],[46.7516,49.35601],[47.04367,49.15204],[46.46645,48.39415],[47.31524,47.71585],[48.05725,47.74377],[48.69473,47.07563],[48.59325,46.56104],[49.10116,46.39933],[48.64541,45.80629],[47.67591,45.64149],[46.68201,44.6092],[47.59094,43.66016],[47.49252,42.98658],[48.58437,41.80888],[47.98728,41.40582],[47.81567,41.15142],[47.37331,41.21973],[46.68607,41.82714],[46.40495,41.86068],[45.7764,42.09244],[45.47028,42.50278],[44.53762,42.71199],[43.93121,42.55496],[43.75599,42.74083],[42.3944,43.2203],[40.92219,43.38215],[40.07697,43.5531],[39.95501,43.435],[38.68,44.28],[37.53912,44.65721],[36.67546,45.24469],[37.40317,45.40451],[38.23295,46.24087],[37.67372,46.63657],[39.14767,47.04475],[39.1212,47.26336],[38.22354,47.10219],[38.25511,47.5464],[38.77057,47.82562],[39.73828,47.89894],[39.89562,48.23241],[39.67465,48.78382],[40.08079,49.30743],[40.06904,49.60105],[38.59499,49.92646],[38.01063,49.91566],[37.39346,50.38395],[36.62617,50.22559],[35.35612,50.5772],[35.37791,50.77394],[35.02218,51.20757],[34.22482,51.25599],[34.14198,51.56641],[34.39173,51.76888],[33.7527,52.33508],[32.71576,52.23846],[32.41206,52.28869],[32.15944,52.06125],[31.78597,52.10168],[31.54002,52.74205],[31.3052,53.074],[31.49764,53.16743],[32.30452,53.13273],[32.69364,53.35142],[32.4056,53.61805],[31.73127,53.79403],[31.79142,53.97464],[31.38447,54.15706],[30.75753,54.81177],[30.97184,55.08155],[30.87391,55.55098],[29.89629,55.78946],[29.37157,55.67009],[29.22951,55.91834],[28.17671,56.16913],[27.85528,56.75933],[27.77002,57.24426],[27.28818,57.47453],[27.71669,57.7919],[27.42015,58.72457],[28.1317,59.30083],[27.98112,59.47537],[29.1177,60.02805],[28.07,60.50352],[30.21111,61.78003],[31.13999,62.35769],[31.51609,62.86769],[30.03587,63.55281],[30.44468,64.20445],[29.54443,64.94867],[30.21765,65.80598],[29.05459,66.94429],[29.97743,67.6983],[28.44594,68.36461],[28.59193,69.06478],[35,71],[40,83],[180,83]]]]}},LKA:{type:"Feature",id:"LKA",properties:{name:"Sri Lanka"},geometry:{type:"Polygon",coordinates:[[[81.78796,7.52306],[81.63732,6.48177],[81.21802,6.19714],[80.34836,5.96837],[79.87247,6.76346],[79.69517,8.20084],[80.1478,9.82408],[80.83882,9.26843],[81.30432,8.56421],[81.78796,7.52306]]]}},taiwan:{type:"Feature",id:"taiwan",properties:{},geometry:{type:"Polygon",coordinates:[[[119,23.5],[121.7,26],[122.5,25.5],[121.8,21.8],[120,21.5],[119,23.5]]]}},thailand_cnx:{type:"Feature",id:"thailand_cnx",properties:{},geometry:{type:"Polygon",coordinates:[[[98.4375,18.2319],[98.4375,19.2255],[99.5306,19.2255],[99.5306,18.2319],[98.4375,18.2319]]]}},thailand_full:{type:"Feature",id:"thailand_full",properties:{},geometry:{type:"Polygon",coordinates:[[[97.50366,8.39358],[97.7124,9.60075],[99.47021,11.8566],[98.05298,14.84923],[98.32764,16.15137],[97.21802,18.39623],[97.38281,19.73568],[100.2832,20.66363],[101.37085,19.69431],[101.40381,18.27109],[104.08447,18.58377],[105.76538,16.06693],[105.52368,14.15788],[102.854,13.82741],[103.00781,11.69527],[102.12891,5.81276],[101.11542,5.4875],[100.66498,6.42448],[99.13788,6.34806],[97.50366,8.39358]]]}},"al-tirana":{type:"Feature",id:"al-tirana",properties:{},geometry:{type:"Polygon",coordinates:[[[19.77796,41.36244],[19.78028,41.36267],[19.78123,41.36014],[19.78004,41.35915],[19.78099,41.35803],[19.77752,41.35682],[19.78082,41.35409],[19.77658,41.35122],[19.78029,41.34936],[19.7832,41.35026],[19.7899,41.34976],[19.79536,41.34793],[19.80046,41.3502],[19.81074,41.35213],[19.81874,41.35044],[19.82238,41.35173],[19.83428,41.35186],[19.84174,41.35434],[19.84682,41.3589],[19.84829,41.35842],[19.85095,41.36008],[19.85159,41.35903],[19.8561,41.35843],[19.85488,41.3545],[19.85784,41.35167],[19.85518,41.35228],[19.85275,41.35145],[19.85276,41.34956],[19.85151,41.34955],[19.85462,41.34419],[19.85876,41.33995],[19.8642,41.33947],[19.86465,41.33789],[19.86829,41.33772],[19.86999,41.33882],[19.87262,41.33794],[19.87259,41.33606],[19.87543,41.3355],[19.87644,41.33126],[19.87554,41.33042],[19.87232,41.33102],[19.87095,41.32999],[19.86659,41.33088],[19.86535,41.32664],[19.86164,41.32543],[19.85813,41.3214],[19.85489,41.32066],[19.85575,41.31876],[19.84532,41.314],[19.84458,41.31212],[19.85095,41.30156],[19.84975,41.29748],[19.8457,41.29559],[19.83906,41.29791],[19.82955,41.29568],[19.82738,41.29791],[19.82504,41.29827],[19.82605,41.29986],[19.82333,41.30509],[19.82032,41.30525],[19.81821,41.3037],[19.81168,41.30787],[19.81162,41.31002],[19.80709,41.31302],[19.79827,41.31487],[19.79767,41.31238],[19.79374,41.313],[19.78954,41.31035],[19.7852,41.31117],[19.78057,41.3142],[19.77976,41.31244],[19.78765,41.30887],[19.78369,41.30473],[19.77721,41.30247],[19.77515,41.30039],[19.77077,41.30363],[19.76019,41.29972],[19.75706,41.30651],[19.75854,41.30874],[19.75473,41.31208],[19.75643,41.31314],[19.75571,41.31548],[19.76586,41.3199],[19.76813,41.32266],[19.77017,41.32139],[19.76811,41.31882],[19.76922,41.31754],[19.77559,41.31854],[19.77323,41.32284],[19.77378,41.32422],[19.77893,41.32349],[19.77968,41.32518],[19.78451,41.32399],[19.78734,41.32541],[19.78321,41.33328],[19.78343,41.33578],[19.77659,41.33783],[19.78083,41.34567],[19.76839,41.35239],[19.75832,41.35489],[19.76053,41.35931],[19.75484,41.3598],[19.75767,41.36542],[19.76169,41.36185],[19.76434,41.36249],[19.76411,41.36393],[19.76775,41.36369],[19.76857,41.36459],[19.77145,41.364],[19.77204,41.36125],[19.77796,41.36244]]]}},albania:{type:"Feature",id:"albania",properties:{},geometry:{type:"Polygon",coordinates:[[[19.39087,41.86138],[19.40186,42.09007],[19.27002,42.18376],[19.69849,42.67436],[19.81384,42.46399],[20.07202,42.55713],[20.25879,42.33824],[20.34668,42.32606],[20.51697,42.23665],[20.61584,41.92272],[20.52795,41.71803],[20.56091,41.57847],[20.44556,41.54559],[20.56091,41.40566],[20.50049,41.3397],[20.58289,41.09177],[20.65979,41.07521],[20.71472,40.90521],[20.95642,40.92181],[20.98389,40.7431],[21.07178,40.60978],[20.95093,40.47202],[20.85205,40.47202],[20.68726,40.10329],[20.43457,40.07387],[20.33569,39.99396],[20.43457,39.82119],[20.38513,39.77899],[20.28625,39.8001],[20.31921,39.72831],[20.20386,39.63954],[19.97314,39.69451],[20.0116,39.86759],[19.86328,40.04444],[19.35791,40.2921],[19.25354,40.51798],[19.4458,40.3298],[19.50073,40.43859],[19.31396,40.65564],[19.41833,40.90936],[19.53918,40.92181],[19.4458,41.00063],[19.43481,41.15384],[19.50623,41.2489],[19.4458,41.32733],[19.41284,41.4139],[19.51721,41.52092],[19.45129,41.60312],[19.52271,41.57847],[19.58862,41.62366],[19.59961,41.7836],[19.39087,41.86138]]]}},austria:{type:"Feature",id:"austria",properties:{},geometry:{type:"Polygon",coordinates:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]]}},graz:{type:"Feature",id:"graz",properties:{},geometry:{type:"Polygon",coordinates:[[[15.26276,46.94182],[15.26276,47.16918],[15.62943,47.16918],[15.62943,46.94182],[15.26276,46.94182]]]}},belarus:{type:"Feature",id:"belarus",properties:{},geometry:{type:"Polygon",coordinates:[[[23.19351,52.37811],[23.38715,52.57134],[23.67554,52.61806],[23.87329,52.72215],[23.75656,53.20027],[23.42148,53.83956],[23.43521,53.97467],[24.33609,53.99082],[24.73022,54.03762],[24.70825,54.16967],[24.95682,54.18253],[25.48004,54.37176],[25.63385,54.95239],[26.53748,55.24468],[26.27655,55.26973],[26.48804,55.71009],[26.89728,55.87993],[27.56195,55.82597],[27.56195,55.97226],[27.98218,56.20976],[29.64935,55.96304],[30.28107,55.89303],[30.95398,55.64815],[31.20941,54.67065],[32.47009,53.7617],[32.83539,53.3866],[32.22839,53.02635],[31.51978,53.16159],[31.84662,52.06262],[30.8139,51.93411],[30.4953,51.21032],[27.71301,51.46085],[25.85083,51.88666],[24.5874,51.81541],[23.51898,51.41634],[23.45581,51.99841],[23.15918,52.1874],[23.19351,52.37811]]]}},belgium:{type:"Feature",id:"belgium",properties:{},geometry:{type:"Polygon",coordinates:[[[3.08167,51.55146],[3.30963,51.43346],[3.36834,51.36996],[3.37761,51.35956],[3.37589,51.34841],[3.38482,51.34337],[3.38722,51.33887],[3.38688,51.33286],[3.36096,51.31527],[3.3819,51.30207],[3.37641,51.29928],[3.36782,51.29681],[3.38293,51.28726],[3.38327,51.2806],[3.37915,51.27824],[3.38121,51.27598],[3.39031,51.27416],[3.39598,51.26686],[3.40439,51.26449],[3.40937,51.25923],[3.41795,51.26127],[3.42138,51.25848],[3.4267,51.25482],[3.42894,51.24709],[3.44679,51.24279],[3.52592,51.24677],[3.51425,51.2878],[3.52927,51.28935],[3.53434,51.28474],[3.53811,51.28479],[3.54266,51.29177],[3.55717,51.29187],[3.5588,51.2959],[3.56163,51.29644],[3.56489,51.29569],[3.5727,51.29225],[3.57253,51.29107],[3.57571,51.28946],[3.57905,51.28951],[3.58206,51.28876],[3.58214,51.29247],[3.58618,51.29316],[3.58026,51.29869],[3.58987,51.30663],[3.62626,51.29413],[3.64145,51.28914],[3.64411,51.29069],[3.6581,51.29096],[3.6781,51.28345],[3.67905,51.28168],[3.69063,51.28173],[3.69424,51.27668],[3.71801,51.27217],[3.71827,51.27368],[3.72273,51.274],[3.75054,51.27061],[3.75286,51.27104],[3.75681,51.26986],[3.76342,51.26261],[3.76848,51.26106],[3.77123,51.26218],[3.77355,51.2646],[3.79698,51.25665],[3.79071,51.24553],[3.79063,51.21608],[3.80453,51.2143],[3.80796,51.21398],[3.82479,51.21086],[3.8356,51.21516],[3.85225,51.21484],[3.85895,51.21291],[3.89002,51.22473],[3.89568,51.21968],[3.89482,51.2143],[3.88298,51.20764],[3.88762,51.20301],[3.89345,51.20527],[3.89929,51.20398],[3.91542,51.20989],[3.91388,51.21764],[3.92349,51.21989],[3.93105,51.22194],[3.9374,51.21398],[3.94323,51.21721],[3.95748,51.21764],[3.96023,51.22527],[3.97654,51.22667],[3.9846,51.2357],[3.99473,51.23914],[4.00469,51.24311],[4.01636,51.24623],[4.03851,51.24687],[4.04125,51.24397],[4.05842,51.24505],[4.06082,51.24773],[4.16365,51.29391],[4.23815,51.35345],[4.22373,51.35881],[4.21686,51.36878],[4.21635,51.37435],[4.33685,51.37842],[4.34235,51.35988],[4.35093,51.35967],[4.36861,51.35795],[4.38543,51.35592],[4.39505,51.35753],[4.42114,51.36707],[4.42818,51.36642],[4.42337,51.37242],[4.42904,51.37521],[4.38852,51.40702],[4.38097,51.42137],[4.38904,51.42597],[4.39093,51.43304],[4.3935,51.43486],[4.39161,51.44416],[4.37891,51.44502],[4.37719,51.44716],[4.38131,51.45165],[4.38509,51.4508],[4.44157,51.47005],[4.46354,51.4723],[4.47487,51.47978],[4.48654,51.4786],[4.53856,51.48416],[4.55074,51.47283],[4.53238,51.44877],[4.53701,51.42522],[4.57512,51.43411],[4.63469,51.42651],[4.64087,51.42372],[4.65048,51.42747],[4.6673,51.42779],[4.66473,51.44556],[4.69236,51.45326],[4.70146,51.46845],[4.71416,51.47026],[4.71519,51.47304],[4.72781,51.48486],[4.74524,51.48988],[4.74721,51.49368],[4.74781,51.49651],[4.75047,51.49945],[4.75648,51.50196],[4.77253,51.50682],[4.79485,51.5034],[4.82025,51.49784],[4.82643,51.48609],[4.84737,51.48352],[4.84291,51.46449],[4.84909,51.46085],[4.84463,51.4478],[4.83089,51.44438],[4.83742,51.42683],[4.8563,51.41805],[4.88171,51.43325],[4.91741,51.4127],[4.93389,51.42083],[4.90162,51.44053],[4.9387,51.46192],[4.97646,51.44545],[5.02419,51.48523],[5.03225,51.48919],[5.04187,51.4878],[5.04135,51.48053],[5.04856,51.47433],[5.08032,51.47475],[5.10658,51.43047],[5.07294,51.39358],[5.11765,51.36149],[5.12074,51.35592],[5.13268,51.3475],[5.13525,51.31608],[5.1622,51.31135],[5.17241,51.31688],[5.19001,51.32069],[5.19585,51.32123],[5.19988,51.32348],[5.24331,51.30594],[5.2276,51.26841],[5.23842,51.26208],[5.26357,51.26782],[5.29584,51.26267],[5.31567,51.26449],[5.33755,51.26428],[5.34107,51.26686],[5.34399,51.27309],[5.34554,51.27668],[5.4172,51.2632],[5.43222,51.27706],[5.43806,51.27695],[5.44132,51.2827],[5.46398,51.28549],[5.47608,51.29209],[5.47608,51.29536],[5.48226,51.29923],[5.48201,51.301],[5.51625,51.29612],[5.52011,51.28957],[5.54363,51.27298],[5.55711,51.26718],[5.55874,51.2631],[5.55745,51.25316],[5.55651,51.24472],[5.56131,51.22301],[5.63667,51.20355],[5.65401,51.19812],[5.65513,51.1936],[5.65212,51.1929],[5.65753,51.1865],[5.66834,51.18671],[5.67624,51.18548],[5.67761,51.18435],[5.6856,51.18542],[5.68946,51.18623],[5.69815,51.1842],[5.70201,51.18397],[5.70165,51.18275],[5.70645,51.18248],[5.70815,51.18223],[5.70987,51.1812],[5.71431,51.1839],[5.7177,51.18475],[5.72948,51.18601],[5.73031,51.18553],[5.73274,51.18564],[5.73274,51.18615],[5.7345,51.18657],[5.73993,51.18757],[5.74576,51.19032],[5.75769,51.18618],[5.75821,51.1851],[5.76731,51.18413],[5.77821,51.1787],[5.77477,51.17337],[5.7801,51.17289],[5.78078,51.17208],[5.77992,51.17052],[5.77673,51.1702],[5.77585,51.17028],[5.77321,51.16967],[5.77274,51.16925],[5.77192,51.16924],[5.77093,51.1698],[5.76993,51.16905],[5.77059,51.16458],[5.77383,51.16453],[5.77385,51.16558],[5.77638,51.16565],[5.77701,51.16306],[5.7775,51.16298],[5.77808,51.16353],[5.77975,51.16356],[5.78025,51.15935],[5.77797,51.15803],[5.77677,51.15554],[5.77829,51.15502],[5.77907,51.15319],[5.78456,51.15421],[5.79005,51.15798],[5.79512,51.15798],[5.80095,51.15954],[5.80027,51.16094],[5.80361,51.1632],[5.80619,51.16352],[5.8134,51.16051],[5.8146,51.16325],[5.82473,51.16874],[5.83434,51.16314],[5.83589,51.15905],[5.84078,51.15819],[5.84129,51.15523],[5.8564,51.15071],[5.86258,51.14446],[5.85674,51.14037],[5.85159,51.13671],[5.84816,51.12938],[5.83374,51.12744],[5.82241,51.12249],[5.81211,51.11387],[5.82275,51.11171],[5.84026,51.10611],[5.83683,51.0936],[5.82584,51.08929],[5.80559,51.09102],[5.81142,51.07851],[5.80421,51.07031],[5.80868,51.06233],[5.797,51.05564],[5.77709,51.05693],[5.76576,51.03384],[5.78568,51.02412],[5.77263,51.01354],[5.77332,51.00555],[5.76885,50.99345],[5.7589,50.98912],[5.74654,50.97767],[5.72765,50.9647],[5.72834,50.95843],[5.73761,50.96145],[5.75306,50.96232],[5.76851,50.9541],[5.7589,50.94567],[5.73521,50.92446],[5.73177,50.91061],[5.7177,50.90563],[5.70362,50.9078],[5.70122,50.89545],[5.68954,50.88224],[5.68096,50.87726],[5.67169,50.87574],[5.65453,50.87054],[5.64766,50.86274],[5.64766,50.84757],[5.65453,50.83435],[5.66448,50.82437],[5.6971,50.81353],[5.71838,50.80333],[5.72113,50.77642],[5.78018,50.79639],[5.82962,50.77294],[5.9079,50.77381],[6.00403,50.76947],[6.04248,50.76252],[6.05621,50.75123],[6.129,50.73385],[6.16745,50.69037],[6.21689,50.66252],[6.2471,50.65991],[6.28143,50.64424],[6.28693,50.62333],[6.27045,50.59631],[6.24847,50.58542],[6.24058,50.56078],[6.22719,50.5538],[6.21586,50.54965],[6.20419,50.53591],[6.21552,50.52063],[6.22993,50.50295],[6.23989,50.50513],[6.2598,50.50338],[6.27766,50.50731],[6.29139,50.50076],[6.3089,50.50513],[6.3216,50.49923],[6.35078,50.49377],[6.35765,50.48722],[6.34838,50.47936],[6.35147,50.46188],[6.37756,50.45925],[6.38065,50.44657],[6.37619,50.40786],[6.36383,50.39561],[6.35387,50.38028],[6.36246,50.37634],[6.41155,50.34415],[6.41499,50.33363],[6.40675,50.31982],[6.38718,50.31763],[6.36829,50.3025],[6.35765,50.30338],[6.33018,50.31565],[6.31645,50.31478],[6.30444,50.30601],[6.29585,50.29044],[6.29414,50.27354],[6.27628,50.26411],[6.22856,50.25511],[6.21483,50.25094],[6.20659,50.24062],[6.19869,50.23403],[6.17947,50.23139],[6.18221,50.22678],[6.17672,50.22151],[6.19251,50.21206],[6.19801,50.18437],[6.19217,50.17646],[6.15166,50.16656],[6.15509,50.15491],[6.16058,50.14633],[6.15578,50.13554],[6.14376,50.13224],[6.13243,50.12454],[6.10737,50.13378],[6.11012,50.16282],[6.09947,50.16502],[6.08677,50.15425],[6.06583,50.14875],[6.02943,50.15579],[6.01639,50.17294],[5.97931,50.16898],[5.96832,50.12542],[5.94566,50.12278],[5.90378,50.10473],[5.89073,50.06948],[5.86876,50.06243],[5.87837,50.03289],[5.83168,50.01039],[5.84404,49.99935],[5.84747,49.98214],[5.81932,49.95785],[5.78773,49.95255],[5.77263,49.91144],[5.74722,49.89994],[5.7843,49.88977],[5.7946,49.87473],[5.76645,49.86012],[5.75203,49.834],[5.76645,49.80121],[5.79941,49.79855],[5.84404,49.74977],[5.83923,49.72847],[5.87906,49.72892],[5.89622,49.70672],[5.87563,49.67963],[5.91176,49.66218],[5.90567,49.65779],[5.9073,49.65479],[5.90429,49.65213],[5.90507,49.64735],[5.90567,49.64262],[5.90876,49.63868],[5.89854,49.63362],[5.89374,49.63573],[5.88524,49.6319],[5.88799,49.62645],[5.87837,49.62],[5.87829,49.61305],[5.8776,49.60737],[5.84996,49.59675],[5.85202,49.58824],[5.86318,49.58773],[5.86524,49.58974],[5.86962,49.59013],[5.87279,49.58913],[5.87502,49.58295],[5.87073,49.58134],[5.87288,49.57961],[5.87314,49.57677],[5.87451,49.5736],[5.86387,49.56965],[5.86164,49.56603],[5.85288,49.56347],[5.85168,49.56185],[5.84661,49.5608],[5.84773,49.55896],[5.84722,49.55567],[5.84224,49.55233],[5.8267,49.54933],[5.82524,49.55066],[5.82026,49.54599],[5.81623,49.54599],[5.81245,49.54582],[5.80765,49.5486],[5.79941,49.54816],[5.78859,49.55194],[5.77263,49.56141],[5.76181,49.55963],[5.75941,49.54203],[5.7407,49.53724],[5.73521,49.53813],[5.72971,49.54225],[5.7189,49.53802],[5.70156,49.5378],[5.6904,49.54392],[5.67993,49.54348],[5.67787,49.54715],[5.66757,49.54682],[5.66002,49.5505],[5.64526,49.54437],[5.62878,49.53579],[5.6262,49.52287],[5.62346,49.5144],[5.61298,49.50292],[5.60217,49.50671],[5.59359,49.51953],[5.56904,49.52565],[5.56372,49.52409],[5.55462,49.52744],[5.54192,49.51384],[5.50329,49.50504],[5.4875,49.50526],[5.48458,49.50113],[5.47085,49.49322],[5.46209,49.49679],[5.46055,49.50738],[5.45214,49.51083],[5.44304,49.51841],[5.46158,49.52788],[5.46209,49.53735],[5.4372,49.55283],[5.45368,49.56542],[5.44458,49.56586],[5.43549,49.56887],[5.42673,49.5899],[5.42862,49.59358],[5.41523,49.59947],[5.40871,49.60748],[5.39892,49.6096],[5.39652,49.6146],[5.3742,49.62128],[5.37025,49.62105],[5.36047,49.62428],[5.34897,49.62895],[5.34279,49.61505],[5.33781,49.61427],[5.32957,49.61494],[5.32064,49.61271],[5.31378,49.6096],[5.31034,49.61071],[5.30863,49.61694],[5.30279,49.62317],[5.30245,49.62962],[5.30794,49.63851],[5.31738,49.64807],[5.33043,49.65318],[5.30708,49.67085],[5.29284,49.67607],[5.27962,49.68496],[5.2791,49.6884],[5.26829,49.69495],[5.25782,49.69295],[5.2482,49.68529],[5.24117,49.68429],[5.24134,49.68851],[5.23104,49.69007],[5.2173,49.6864],[5.21421,49.68784],[5.20666,49.69451],[5.19722,49.69062],[5.18932,49.6924],[5.17542,49.6924],[5.16306,49.69218],[5.1622,49.6995],[5.1646,49.71083],[5.15963,49.71438],[5.15327,49.71671],[5.15087,49.71249],[5.14263,49.70739],[5.14006,49.71194],[5.13147,49.71205],[5.12529,49.71105],[5.12032,49.71704],[5.12358,49.72637],[5.11723,49.73757],[5.09302,49.76297],[5.08796,49.76475],[5.08452,49.76186],[5.07963,49.76164],[5.07611,49.76109],[5.07139,49.75987],[5.06727,49.76081],[5.06144,49.76192],[5.06092,49.76624],[5.04908,49.76741],[5.00599,49.7816],[5.00547,49.7832],[5.00504,49.78719],[5.00041,49.79312],[4.99741,49.79379],[4.99603,49.79506],[4.99715,49.79672],[4.99672,49.79955],[4.9938,49.79977],[4.98539,49.79888],[4.97895,49.79972],[4.96977,49.8011],[4.96779,49.79756],[4.96179,49.79717],[4.95569,49.80027],[4.94865,49.79811],[4.94814,49.79473],[4.94368,49.79035],[4.94213,49.79035],[4.94132,49.79226],[4.93887,49.7926],[4.93286,49.78977],[4.9329,49.78825],[4.93114,49.78661],[4.92939,49.78686],[4.92102,49.78805],[4.91793,49.78708],[4.91269,49.78573],[4.90475,49.78492],[4.89947,49.78597],[4.89741,49.78836],[4.88913,49.78769],[4.88724,49.78786],[4.88244,49.79049],[4.87939,49.79249],[4.87591,49.79282],[4.87068,49.79268],[4.87188,49.78922],[4.87081,49.78839],[4.86227,49.78805],[4.85712,49.78966],[4.85201,49.79035],[4.84909,49.79368],[4.8563,49.79722],[4.86076,49.80354],[4.86214,49.81373],[4.87364,49.81883],[4.86712,49.82071],[4.86712,49.82625],[4.86506,49.83444],[4.8654,49.83964],[4.85304,49.84042],[4.84943,49.84894],[4.84789,49.86278],[4.84463,49.8703],[4.85561,49.87096],[4.87484,49.89618],[4.87347,49.90459],[4.87999,49.90879],[4.87553,49.92006],[4.85424,49.92957],[4.84325,49.94636],[4.82849,49.94724],[4.78558,49.9563],[4.78523,49.9828],[4.80995,49.99626],[4.81647,50.02671],[4.83021,50.04127],[4.81441,50.04788],[4.8127,50.06794],[4.8357,50.07014],[4.83192,50.09085],[4.84291,50.10363],[4.86626,50.10318],[4.85836,50.1164],[4.88274,50.13664],[4.87072,50.14875],[4.8278,50.14963],[4.82025,50.15579],[4.76875,50.1296],[4.75262,50.10539],[4.70352,50.08424],[4.70112,50.01502],[4.69803,49.99229],[4.63383,49.98037],[4.56963,49.96712],[4.53255,49.94857],[4.51401,49.93973],[4.44122,49.93178],[4.35745,49.94327],[4.31145,49.95564],[4.22974,49.94945],[4.18785,49.95034],[4.16725,49.96801],[4.12331,49.97286],[4.12193,50.01215],[4.14734,50.05273],[4.18167,50.05493],[4.22012,50.07301],[4.1906,50.10252],[4.18922,50.1263],[4.16382,50.1219],[4.11644,50.13158],[4.13841,50.21734],[4.20708,50.25555],[4.1827,50.27025],[4.16382,50.28298],[4.15901,50.27596],[4.17309,50.2685],[4.17309,50.25994],[4.16519,50.25401],[4.13258,50.25489],[4.1312,50.26433],[4.13017,50.27091],[4.11644,50.27464],[4.12262,50.2821],[4.1185,50.2957],[4.09653,50.30864],[4.07696,50.30579],[4.07215,50.31807],[4.05533,50.32946],[4.03679,50.33998],[4.02512,50.35291],[3.98598,50.33911],[3.95748,50.33845],[3.8974,50.32267],[3.88264,50.32377],[3.88092,50.33494],[3.85448,50.33911],[3.84933,50.34875],[3.82942,50.35028],[3.82633,50.34217],[3.80711,50.3413],[3.80608,50.35072],[3.74256,50.34393],[3.73604,50.31149],[3.72437,50.30272],[3.70583,50.29921],[3.68076,50.31894],[3.66428,50.34152],[3.65227,50.37087],[3.66634,50.39123],[3.66325,50.42143],[3.65398,50.4551],[3.62995,50.46712],[3.60832,50.49006],[3.59974,50.48657],[3.55476,50.48853],[3.49915,50.47936],[3.48198,50.48635],[3.50945,50.52085],[3.4758,50.52478],[3.45726,50.50513],[3.43735,50.49945],[3.36662,50.48416],[3.27324,50.52609],[3.25951,50.60154],[3.2341,50.65251],[3.24097,50.67862],[3.24783,50.70037],[3.19565,50.70776],[3.1311,50.77642],[3.06725,50.76296],[2.99652,50.74428],[2.95807,50.67035],[2.82898,50.68602],[2.68341,50.77816],[2.57629,50.81114],[2.5708,50.93939],[2.51862,51.05866],[2.36755,51.2516],[3.08167,51.55146]]]}},be_brussels:{type:"Feature",id:"be_brussels",properties:{},geometry:{type:"Polygon",coordinates:[[[4.37973,50.76382],[4.37853,50.76811],[4.34522,50.77337],[4.34205,50.77164],[4.32952,50.77381],[4.31621,50.78624],[4.31458,50.79454],[4.30282,50.79709],[4.29802,50.80593],[4.28901,50.80691],[4.2854,50.80506],[4.27579,50.80696],[4.27218,50.81011],[4.25802,50.80935],[4.25519,50.8151],[4.24403,50.81548],[4.24343,50.82182],[4.25227,50.82697],[4.25107,50.83288],[4.25467,50.83695],[4.27193,50.84036],[4.28094,50.84215],[4.28042,50.85721],[4.27802,50.85911],[4.27699,50.86713],[4.28274,50.87227],[4.29561,50.88094],[4.29553,50.88262],[4.29149,50.88495],[4.29004,50.88982],[4.30634,50.89274],[4.31647,50.89605],[4.32892,50.90249],[4.34025,50.90411],[4.34857,50.90341],[4.36213,50.9033],[4.3726,50.90032],[4.38119,50.90319],[4.38462,50.91093],[4.39578,50.91407],[4.41543,50.91342],[4.41655,50.90757],[4.4296,50.90103],[4.43595,50.89502],[4.43106,50.89014],[4.44007,50.87845],[4.43183,50.87628],[4.4253,50.86615],[4.44599,50.85992],[4.44968,50.85591],[4.46238,50.85396],[4.46899,50.84573],[4.46959,50.83537],[4.47972,50.82036],[4.45947,50.81661],[4.45921,50.80626],[4.48238,50.79617],[4.4817,50.79134],[4.46427,50.78645],[4.435,50.775],[4.43028,50.77517],[4.38917,50.76377],[4.37973,50.76382]]]}},be_flanders:{type:"Feature",id:"be_flanders",properties:{},geometry:{type:"Polygon",coordinates:[[[2.52239,51.10172],[3.12606,51.34118],[3.17493,51.38246],[3.37615,51.38784],[3.41065,51.3304],[3.40202,51.28548],[3.49114,51.2567],[3.48251,51.30345],[3.57737,51.32322],[3.81309,51.27289],[3.82172,51.23691],[3.93095,51.23691],[4.05456,51.27469],[4.20116,51.35195],[4.16954,51.38067],[4.34202,51.39502],[4.36502,51.46491],[4.53749,51.50072],[4.57199,51.47924],[4.56049,51.44879],[4.63811,51.45058],[4.75022,51.52397],[4.83645,51.50787],[5.0808,51.49893],[5.13541,51.447],[5.10667,51.39143],[5.26477,51.31783],[5.26477,51.28727],[5.4085,51.29267],[5.48612,51.32501],[5.58098,51.28368],[5.58385,51.23511],[5.76783,51.2045],[5.87706,51.16125],[5.70459,50.80293],[5.90581,50.78657],[5.93743,50.73202],[5.90293,50.70108],[5.81382,50.69379],[5.61547,50.76112],[5.50049,50.712],[5.2044,50.7029],[5.16416,50.67558],[5.03768,50.70108],[4.98881,50.75021],[4.91694,50.72656],[4.79046,50.76658],[4.68122,50.77021],[4.66973,50.73566],[4.2874,50.67922],[3.91083,50.6774],[3.71823,50.75203],[3.65499,50.712],[3.53426,50.71018],[3.51413,50.74112],[3.45664,50.74384],[3.37328,50.69562],[3.31004,50.70745],[3.28991,50.73657],[3.16487,50.74294],[3.13181,50.77203],[3.08007,50.76021],[2.87453,50.7393],[2.89609,50.71109],[2.87453,50.69562],[2.79692,50.7029],[2.69918,50.8002],[2.62013,50.79747],[2.56982,50.8583],[2.56695,50.92358],[2.60288,50.94985],[2.5497,50.99601],[2.52239,51.10172]]]}},be_wallonia:{type:"Feature",id:"be_wallonia",properties:{},geometry:{type:"Polygon",coordinates:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]]]}},croatia:{type:"Feature",id:"croatia",properties:{},geometry:{type:"LineString",coordinates:[[18.55316,42.39709],[18.43575,42.48273],[18.44437,42.56076],[18.3609,42.61526],[18.24898,42.61375],[17.90239,42.81647],[17.85896,42.89458],[17.80815,42.92073],[17.7903,42.89961],[17.67975,42.92174],[17.64267,42.88351],[17.53967,42.93531],[17.71339,42.97351],[17.63424,43.09863],[17.43805,43.18365],[17.44734,43.1998],[17.37488,43.2502],[17.26227,43.39108],[17.30151,43.4393],[17.282,43.47769],[17.22656,43.49776],[17.1476,43.49677],[16.39709,44.06983],[16.15253,44.38405],[16.14789,44.48088],[15.90458,44.75089],[15.82858,44.72686],[15.74818,44.81311],[15.78598,44.84029],[15.7338,44.9371],[15.78598,44.96966],[15.75505,45.05587],[15.80439,45.1121],[15.77283,45.16143],[15.81894,45.2072],[15.99747,45.21978],[16.11145,45.08758],[16.29175,44.9865],[16.36047,44.99622],[16.40374,45.10639],[16.46738,45.13326],[16.5105,45.20898],[16.81812,45.17296],[16.92275,45.23503],[17.16882,45.13674],[17.59713,45.09425],[17.66404,45.12204],[17.84756,45.03242],[17.93891,45.07086],[17.93745,45.09903],[18.0011,45.14282],[18.11746,45.06832],[18.2011,45.0684],[18.22841,45.09274],[18.41889,45.09637],[18.46602,45.05359],[18.66267,45.04785],[18.72157,44.98326],[18.77858,44.98426],[18.78491,44.94261],[18.75375,44.95245],[18.73803,44.94119],[18.75065,44.90197],[18.83764,44.84591],[19.01991,44.84386],[18.99843,44.89696],[19.06865,44.88961],[19.16343,44.94855],[19.1011,44.98811],[19.11231,45.08359],[19.08464,45.11852],[19.09331,45.13091],[19.14345,45.119],[19.2041,45.17236],[19.45198,45.16219],[19.42108,45.23622],[19.2687,45.24886],[19.10972,45.30469],[19.09424,45.3367],[18.9792,45.37883],[19.03735,45.40735],[18.99315,45.44969],[19.00341,45.48553],[19.08125,45.47585],[19.10858,45.5144],[19.01686,45.56369],[18.94817,45.54136],[18.89717,45.56551],[18.96652,45.66972],[18.9164,45.70714],[18.82507,45.91724],[18.77838,45.88666],[18.68019,45.91486],[18.43522,45.74655],[18.15765,45.79625],[17.86118,45.77993],[17.66574,45.84483],[17.58087,45.93874],[17.31102,45.97167],[17.17232,46.1551],[16.97456,46.22688],[16.86058,46.35783],[16.72462,46.39715],[16.66077,46.45725],[16.36894,46.55083],[16.24191,46.49508],[16.30028,46.38152],[16.15145,46.40378],[16.04759,46.3891],[16.073,46.34266],[15.79422,46.26439],[15.78049,46.21928],[15.67131,46.23068],[15.60059,46.16509],[15.61913,46.08657],[15.71043,46.04506],[15.68573,45.84315],[15.55939,45.85272],[15.24587,45.72718],[15.34584,45.65341],[15.28061,45.60731],[15.36301,45.48661],[15.16462,45.43061],[14.55276,45.65149],[14.4841,45.54339],[14.33098,45.47073],[14.23361,45.51383],[14.19361,45.48114],[14.07402,45.49231],[13.99868,45.52812],[13.95607,45.5049],[13.98354,45.46061],[13.87695,45.43477],[13.78445,45.47445],[13.67282,45.45244],[13.6,45.46],[13.48,45.55],[13,45],[16,42.2],[18.487,42.33],[18.55316,42.39709]]}},czechia:{type:"Feature",id:"czechia",properties:{},geometry:{type:"Polygon",coordinates:[[[14.3811,51.06902],[15.13916,51.08282],[16.42456,50.70863],[16.68823,50.32442],[16.78711,50.49246],[17.75391,50.35247],[18.58887,49.96536],[18.92944,49.51808],[18.1604,48.98022],[17.00684,48.61839],[15.13916,48.85749],[14.67773,48.55298],[13.85376,48.58206],[12.00806,50.05008],[11.92017,50.35948],[14.3811,51.06902]]]}},denmark:{type:"Feature",id:"denmark",properties:{},geometry:{type:"Polygon",coordinates:[[[7.99805,55.11608],[7.9541,56.94497],[10.62378,57.94401],[12.65625,56.01681],[12.65625,55.91535],[12.82928,55.5566],[12.60956,55.42122],[12.66449,55.25095],[14.82605,55.37911],[15.28198,55.22902],[15.11719,54.85448],[12.87598,54.85922],[12.07672,54.44769],[10.849,54.73414],[10.67871,54.58002],[9.88083,54.83708],[9.73972,54.82265],[9.60823,54.8525],[9.63158,54.87996],[9.59038,54.88668],[9.4994,54.83886],[9.43176,54.82601],[9.41013,54.84242],[9.38198,54.83827],[9.37443,54.82047],[9.34422,54.80108],[9.25152,54.80979],[9.23985,54.84993],[9.13822,54.87483],[9.06338,54.87048],[8.90167,54.90386],[8.85532,54.89517],[8.82408,54.90662],[8.79765,54.90445],[8.77602,54.893],[8.72761,54.89181],[8.67645,54.91195],[8.66066,54.90859],[8.55698,54.92063],[8.47355,55.05537],[7.99805,55.11608]]]}},finland:{type:"Feature",id:"finland",properties:{},geometry:{type:"Polygon",coordinates:[[[24.16992,65.34851],[23.90625,66.14274],[23.68652,66.44311],[23.99414,66.80922],[23.51074,67.27204],[23.37891,67.44123],[23.73047,67.97463],[20.74219,69.03714],[21.18164,69.28726],[21.70898,69.27171],[22.45605,68.73638],[23.15918,68.65655],[23.90625,68.8318],[25.00488,68.59249],[25.40039,68.87936],[25.75195,68.95839],[25.97168,69.70287],[26.45508,69.96044],[27.20215,69.90012],[27.50977,70.0506],[27.86133,70.08056],[28.38867,69.82447],[29.04785,69.71811],[29.26758,69.53452],[28.87207,69.225],[29.0918,69.02141],[28.52051,68.89519],[28.78418,68.84767],[28.52051,68.56038],[28.69629,68.17156],[29.26758,68.0733],[30.05859,67.69277],[29.17969,67.0503],[29.0918,66.8956],[30.14648,65.73063],[29.66309,65.20147],[29.70703,64.79285],[30.05859,64.79285],[30.10254,64.41592],[30.4541,64.30182],[30.05859,63.74363],[31.59668,63.01511],[30.27832,61.89758],[27.81738,60.56538],[27.33398,60.19616],[24.65332,59.88894],[21.84082,59.46741],[20.43457,59.46741],[19.11621,60.19616],[19.2041,60.58697],[20.08301,60.75916],[20.69824,61.14324],[20.96191,61.73153],[19.99512,63.27318],[21.44531,63.66576],[22.93945,64.20638],[23.24707,64.51064],[23.81836,64.66152],[24.16992,65.34851]]]}},france:{type:"Feature",id:"france",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[9.9,42.64836],[9.9,42.02785],[9.63227,41.43244],[9.36968,41.35052],[9.32602,41.3036],[9.27311,41.29196],[9.07196,41.26129],[8.94186,41.27688],[8.8742,41.26232],[8.84542,41.26311],[8.78782,41.25725],[7.3114,41.4242],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24593,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.26331,50.92504],[1.76605,51.17762],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.26696,43.39308],[9.8,43.1],[9.9,42.64836]]]]}},"de-berlin-brandenburg":{type:"Feature",id:"de-berlin-brandenburg",properties:{},geometry:{type:"Polygon",coordinates:[[[11.32141,53.11711],[12.09595,53.36694],[12.88147,53.20274],[13.78235,53.50765],[14.16687,53.41608],[14.10645,53.28164],[14.29871,53.27507],[14.41956,53.32431],[14.19434,52.93871],[14.19434,52.82932],[14.57336,52.60972],[14.57336,52.36218],[14.71619,52.05249],[14.61182,51.84257],[14.76563,51.54975],[14.36462,51.519],[14.1449,51.54975],[13.99109,51.36835],[13.2605,51.39578],[13.07373,51.65211],[13.13965,51.86971],[12.67273,52.01532],[12.40356,52.03222],[12.22229,52.14697],[12.32117,52.50619],[12.16736,52.51956],[12.23877,52.87245],[11.60156,52.96849],[11.32141,53.11711]]]}},"de-ostwestfalen-lippe":{type:"Feature",id:"de-ostwestfalen-lippe",properties:{},geometry:{type:"Polygon",coordinates:[[[8.04337,52.05756],[8.42583,52.19919],[8.43846,52.35394],[8.30866,52.39929],[8.28438,52.4581],[8.67096,52.56967],[9.22028,52.49616],[9.06097,52.28328],[9.47365,51.86716],[9.46266,51.64103],[9.26285,51.46641],[9.15648,51.43569],[8.80348,51.43218],[8.54444,51.46003],[8.42239,51.55658],[8.31076,51.72252],[8.12645,51.86844],[8.04337,52.05756]]]}},germany:{type:"Feature",id:"germany",properties:{},geometry:{type:"Polygon",coordinates:[[[7.05048,52.62973],[7.21252,53.20274],[6.56982,53.61858],[8.30772,55.1467],[8.6483,54.96421],[9.45305,54.83313],[9.95018,54.82838],[11.99913,54.44689],[13.3889,54.89162],[14.15245,54.47562],[14.26231,53.78037],[14.44359,53.27096],[14.36119,53.0668],[14.16344,52.97097],[14.13597,52.84508],[14.62486,52.60555],[14.5919,52.35463],[14.71825,52.24042],[14.74571,52.06516],[14.60838,51.83153],[14.74571,51.69554],[14.76768,51.54206],[14.98741,51.43261],[15.03136,51.27824],[14.94347,51.04744],[14.85558,50.88138],[14.77867,50.81548],[14.64684,50.85017],[14.5974,50.99215],[14.32823,51.07506],[14.32823,50.88138],[13.01537,50.49508],[12.48253,50.38663],[12.33421,50.18305],[12.1804,50.30952],[12.12547,50.25686],[12.22984,50.09856],[12.55394,49.92912],[12.4276,49.75199],[12.5045,49.68807],[12.77916,49.35286],[12.93297,49.36002],[13.03185,49.28841],[13.57018,48.96489],[13.80089,48.81319],[13.75694,48.52297],[13.52074,48.58842],[13.45482,48.57388],[13.40538,48.36994],[13.23509,48.28959],[12.99889,48.24571],[12.75169,48.12118],[12.9879,47.86385],[12.91649,47.71623],[13.04832,47.72362],[13.09776,47.67186],[13.0648,47.50885],[12.93846,47.47173],[12.77367,47.5793],[12.8286,47.60894],[12.70226,47.70144],[12.1859,47.70514],[12.16942,47.62005],[11.86729,47.60524],[11.63109,47.59412],[11.25755,47.40114],[10.98839,47.40486],[10.88402,47.52369],[10.67528,47.55707],[10.45006,47.54594],[10.46654,47.41973],[10.34019,47.3081],[10.19737,47.27457],[10.21385,47.38998],[10.10948,47.3751],[10.08202,47.46431],[9.84581,47.55336],[9.40636,47.55336],[9.09874,47.68388],[8.90236,47.65521],[8.85292,47.70329],[8.80348,47.74025],[8.76915,47.71993],[8.80486,47.70329],[8.79524,47.68388],[8.7307,47.69867],[8.73482,47.7227],[8.71284,47.7384],[8.7513,47.76887],[8.69637,47.76425],[8.65654,47.8067],[8.63594,47.76518],[8.61122,47.80947],[8.57002,47.79286],[8.48763,47.77902],[8.41621,47.71808],[8.41347,47.68111],[8.46428,47.65891],[8.53706,47.67001],[8.60985,47.67741],[8.63457,47.64966],[8.59886,47.64319],[8.61122,47.6219],[8.56865,47.60061],[8.56865,47.6219],[8.52745,47.64041],[8.45879,47.60801],[8.50273,47.58672],[8.38463,47.57004],[8.33107,47.57375],[8.29399,47.61542],[8.2061,47.62653],[8.10173,47.56819],[7.96852,47.5617],[7.92046,47.55429],[7.89024,47.59505],[7.8257,47.58949],[7.81197,47.56726],[7.6815,47.54038],[7.6403,47.56448],[7.69386,47.5756],[7.6815,47.59412],[7.64854,47.60061],[7.61421,47.58394],[7.50641,47.70237],[7.79205,48.60749],[8.22876,48.97481],[6.84174,49.17093],[6.37482,49.48597],[6.53961,49.80963],[6.1441,50.01833],[6.19835,50.21119],[6.41808,50.35159],[6.19835,50.63117],[6.02257,50.77034],[6.02257,51.07506],[6.24229,51.37778],[5.97862,51.81456],[6.1496,51.90022],[6.44073,51.85105],[6.828,51.95611],[6.68518,52.05587],[7.04773,52.23957],[6.99554,52.45768],[6.70166,52.48445],[6.72913,52.64973],[7.05048,52.62973]]]}},hungary:{type:"Feature",id:"hungary",properties:{},geometry:{type:"Polygon",coordinates:[[[18.43643,45.73111],[17.67426,45.83454],[17.57675,45.92823],[17.35153,45.94303],[17.14966,46.16081],[16.52756,46.50028],[16.3147,46.86582],[16.11969,46.86582],[16.28448,46.99337],[16.48224,47.01584],[16.5152,47.1505],[16.42731,47.2177],[16.43829,47.41136],[16.66763,47.44852],[16.67587,47.60616],[16.43829,47.65614],[16.54816,47.75964],[16.71844,47.73563],[16.75003,47.68111],[17.08099,47.70791],[17.04254,47.86293],[17.09473,47.96234],[17.20734,48.02484],[17.75665,47.74486],[18.71246,47.76702],[18.85529,47.82606],[18.77838,47.87767],[18.75641,47.98808],[18.82233,48.04687],[19.50348,48.1056],[19.55566,48.25028],[19.92096,48.14227],[20.34943,48.30329],[20.54718,48.54389],[20.82184,48.58751],[21.14044,48.50751],[21.47003,48.58751],[21.70074,48.36902],[21.8367,48.34073],[22.2171,48.42282],[22.38327,48.24205],[22.50549,48.24845],[22.61948,48.1056],[22.83371,48.11843],[22.90649,47.95406],[22.59064,47.75779],[22.48077,47.81131],[22.42584,47.74486],[22.32147,47.75779],[22.02759,47.51442],[22.03033,47.38161],[21.9397,47.3658],[21.48926,46.75868],[21.52908,46.73233],[21.4151,46.61737],[21.33133,46.61549],[21.10611,46.23875],[20.79575,46.27863],[20.7106,46.15035],[20.25055,46.13227],[19.82758,46.16461],[19.54742,46.17793],[19.51447,46.1018],[18.80997,45.87567],[18.70285,45.91294],[18.43643,45.73111]]]}},iceland:{type:"Feature",id:"iceland",properties:{},geometry:{type:"Polygon",coordinates:[[[-25.21,65.81],[-23.17,66.89],[-19.51,66.29],[-19.09,67.46],[-17.98,67.34],[-17.38,66.83],[-14.01,66.72],[-12.36,64.54],[-17.21,62.92],[-23.63,63.15],[-25.21,65.81]]]}},italy:{type:"Feature",id:"italy",properties:{},geometry:{type:"Polygon",coordinates:[[[7.6,43.5],[7.49542,43.86523],[7.69043,44.0718],[7.69043,44.19796],[7.42676,44.15068],[6.9873,44.26094],[6.85547,44.55916],[7.03125,44.73113],[7.00928,44.87144],[6.72363,44.91814],[6.5918,45.12005],[7.09717,45.25942],[7.14111,45.41388],[6.96533,45.61404],[6.76758,45.79817],[7.03125,45.9053],[7.55859,45.9817],[7.77832,45.93587],[8.12988,46.13417],[8.08594,46.30141],[8.48145,46.46813],[8.61328,46.13417],[8.81104,46.10371],[9.05273,45.8288],[9.07471,46.11894],[9.27246,46.25585],[9.25049,46.43786],[9.44824,46.49839],[9.49219,46.31658],[9.68994,46.31658],[9.95361,46.36209],[10.06348,46.17983],[10.17334,46.25585],[10.0415,46.453],[10.08545,46.60417],[10.26123,46.66452],[10.45898,46.49839],[10.50293,46.61926],[10.39307,46.70974],[10.41504,46.86019],[10.61279,46.87521],[11.03027,46.76997],[11.16211,46.93526],[11.27197,46.99524],[11.53564,47.01023],[11.7334,46.99524],[12.2168,47.10004],[12.15088,46.93526],[12.43652,46.70974],[12.96387,46.61926],[13.73291,46.54375],[13.71094,46.42271],[13.40332,46.33176],[13.40332,46.22545],[13.66699,46.17983],[13.51318,46.05799],[13.64502,45.96642],[13.5791,45.85941],[13.93066,45.64477],[13.82629,45.5756],[13.6,45.6294],[12.9,45.4],[12.8,45],[18.9,40.3],[18.5,39],[15,36],[11,38],[9.6,43.2],[7.6,43.5]]]}},IT_Lazio:{type:"Feature",id:"IT_Lazio",properties:{},geometry:{type:"Polygon",coordinates:[[[13.23814,42.1301],[13.19363,42.15923],[13.17062,42.15169],[13.12434,42.17797],[13.08798,42.17886],[13.08575,42.14318],[13.0317,42.12309],[13.01946,42.07634],[13.05545,42.01736],[13.10194,42.00898],[13.10589,42.02698],[13.36437,41.92475],[13.384,41.90419],[13.35751,41.8694],[13.38052,41.81709],[13.4169,41.83467],[13.50508,41.8016],[13.52044,41.77297],[13.57182,41.7543],[13.66214,41.81144],[13.70555,41.78747],[13.72956,41.7989],[13.7629,41.7488],[13.81162,41.75426],[13.85645,41.73124],[13.89541,41.73405],[13.98311,41.66238],[14.01182,41.60835],[13.99895,41.57448],[14.02596,41.55567],[14.00526,41.53875],[14.0275,41.52321],[13.97291,41.49404],[13.99278,41.48208],[13.9779,41.46249],[13.90257,41.42273],[13.86123,41.41763],[13.8886,41.40081],[13.8688,41.36272],[13.88974,41.29748],[13.82898,41.28154],[13.83083,41.2502],[13.77126,41.24136],[13.45667,40.77769],[11.52381,41.03693],[11.44922,42.37798],[11.48889,42.43937],[11.61771,42.43604],[11.61626,42.48862],[11.56011,42.51595],[11.58852,42.54226],[11.57917,42.56803],[11.61401,42.55723],[11.64337,42.56635],[11.71111,42.61091],[11.73597,42.60666],[11.74975,42.63965],[11.80478,42.644],[11.77554,42.70951],[11.80156,42.70719],[11.81949,42.74543],[11.74602,42.78576],[11.77424,42.82107],[11.80685,42.79485],[11.8137,42.82267],[11.84851,42.84008],[11.90558,42.8325],[11.92743,42.78092],[11.97948,42.76459],[11.96293,42.72669],[11.9301,42.71295],[11.94133,42.6833],[12.03,42.64324],[12.10666,42.66464],[12.12406,42.64929],[12.16101,42.67691],[12.20434,42.66046],[12.24292,42.62906],[12.22819,42.61077],[12.24626,42.60256],[12.23866,42.57218],[12.27504,42.55991],[12.26676,42.53347],[12.29027,42.51904],[12.27477,42.50921],[12.30735,42.4973],[12.29041,42.49164],[12.32537,42.49476],[12.35123,42.47365],[12.39017,42.49819],[12.41905,42.49765],[12.41244,42.46756],[12.43038,42.45802],[12.41368,42.45517],[12.41365,42.4256],[12.4636,42.42909],[12.44469,42.39882],[12.51169,42.40311],[12.52874,42.36445],[12.60642,42.40245],[12.61481,42.46511],[12.64109,42.4678],[12.6495,42.44331],[12.67465,42.44242],[12.74156,42.47053],[12.71114,42.50079],[12.89273,42.5635],[12.88052,42.60935],[13.00524,42.61622],[13.02522,42.64],[13.06423,42.62427],[13.13,42.66053],[13.14645,42.64714],[13.17506,42.66707],[13.19025,42.73363],[13.25415,42.72145],[13.2645,42.74019],[13.28589,42.74049],[13.35851,42.69533],[13.35059,42.66968],[13.37022,42.6507],[13.4092,42.64383],[13.39493,42.59223],[13.29421,42.5705],[13.28454,42.58349],[13.24686,42.57367],[13.19228,42.58849],[13.15673,42.54102],[13.17934,42.48031],[13.11708,42.44489],[13.19508,42.39017],[13.15427,42.35797],[13.22737,42.32031],[13.23563,42.27871],[13.28229,42.23874],[13.33653,42.22338],[13.34238,42.19939],[13.3808,42.18142],[13.34871,42.17689],[13.35488,42.16769],[13.32819,42.16483],[13.30621,42.13923],[13.23814,42.1301]]]}},IT_Roma_Capitale:{type:"Feature",id:"IT_Roma_Capitale",properties:{},geometry:{type:"Polygon",coordinates:[[[11.6,42.16],[12.28,42.2],[12.52,42.31],[13.27,41.92],[13.15,41.58],[12.6,41.16],[11.6,42.16]]]}},south_tyrol:{type:"Feature",id:"south_tyrol",properties:{},geometry:{type:"Polygon",coordinates:[[[10.45624,46.86582],[10.73639,46.89211],[10.82977,46.80946],[10.96161,46.81322],[11.1319,46.99149],[11.49067,47.01233],[11.68121,47.04018],[11.7691,47.01023],[12.16736,47.115],[12.28546,47.08322],[12.18384,46.98213],[12.30469,46.85831],[12.37335,46.73421],[12.49969,46.67017],[12.34039,46.61737],[12.08771,46.64944],[12.0163,46.52297],[11.8515,46.49272],[11.66336,46.48657],[11.56929,46.34077],[11.399,46.25585],[11.18958,46.21072],[11.13739,46.2867],[11.20193,46.44732],[10.91904,46.42603],[10.61966,46.43833],[10.44113,46.49036],[10.36766,46.68854],[10.45624,46.86582]]]}},trentino:{type:"Feature",id:"trentino",properties:{},geometry:{type:"Polygon",coordinates:[[[10.49332,46.35641],[10.59219,46.46624],[10.76317,46.49697],[10.84076,46.45536],[11.07971,46.54469],[11.23627,46.50123],[11.21086,46.32559],[11.1779,46.27341],[11.23352,46.2473],[11.32416,46.30235],[11.5583,46.40378],[11.62628,46.5069],[11.83502,46.54233],[11.91399,46.44306],[11.85356,46.34124],[11.99158,46.18363],[11.84464,46.08466],[11.72791,46.07704],[11.69907,45.95592],[11.51093,45.97979],[11.28845,45.8814],[11.21567,45.76273],[11.16074,45.68316],[10.90256,45.66013],[10.82016,45.71097],[10.84076,45.81827],[10.51529,45.76752],[10.41504,46.00269],[10.51941,46.2112],[10.49332,46.35641]]]}},norway:{type:"Feature",id:"norway",properties:{},geometry:{type:"Polygon",coordinates:[[[25.98816,69.6179],[25.24109,68.60752],[20.42908,68.97318],[16.9519,67.9499],[13.77686,64.59561],[14.28223,64.47279],[14.08447,63.99524],[13.02979,64.10101],[12.00806,63.2633],[12.14813,61.6586],[12.87323,61.31245],[12.67548,61.0636],[12.26074,61.00241],[12.60681,60.50593],[12.49146,60.08128],[12.17285,59.88756],[11.87622,59.84895],[11.94214,59.69547],[11.6922,59.58998],[11.84601,59.25044],[11.64276,58.89471],[11.45325,58.88194],[11.44775,59.00168],[11.34888,59.11254],[11.18134,59.08009],[11.06186,58.97054],[8,57.5],[3,57.5],[3,83],[40,83],[35,71],[29.61365,69.28629],[27.98767,69.99711],[25.98816,69.6179]]]}},poland:{type:"Feature",id:"poland",properties:{},geometry:{type:"Polygon",coordinates:[[[14.03,52.84],[14.34,53.26],[14.13,54.16],[15.95,54.52],[16.31,54.76],[17.13,54.97],[18.29,55.08],[18.9,54.98],[19.69,54.5],[21.47,54.37],[22.9,54.46],[23.39,54.3],[24.01,53.17],[24.03,52.71],[23.29,52.3],[23.74,52.09],[23.64,51.61],[24.24,50.86],[24.11,50.41],[23.78,50.34],[22.77,49.55],[22.96,48.97],[22.18,49.1],[21.6,49.38],[20.93,49.24],[20.47,49.34],[20.12,49.13],[19.76,49.14],[19.45,49.51],[18.94,49.34],[18.48,49.85],[17.83,49.92],[17.54,50.21],[17.06,50.35],[17.08,50.18],[16.65,50.05],[16.11,50.41],[16.3,50.6],[16.01,50.54],[15.34,50.73],[15.14,50.93],[14.78,50.82],[14.94,51.27],[14.5,51.81],[14.66,52.05],[14.53,52.57],[14.03,52.84]]]}},slovenia:{type:"Feature",id:"slovenia",properties:{},geometry:{type:"Polygon",coordinates:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.37688,45.56647],[13.63953,45.6426],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]]}},spain:{type:"Feature",id:"spain",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-19,29],[-13,30],[-13,29],[-14,27.8],[-19,27],[-19,29]]],[[[-8.89106,41.82289],[-10,44],[-4,44],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[5,40],[4,39],[-2.2,36.5],[-5.6,35.95],[-6,36],[-7.37535,37.15354],[-7.40832,37.16822],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]]]}},sweden:{type:"Feature",id:"sweden",properties:{},geometry:{type:"Polygon",coordinates:[[[10.57159,58.2445],[10.63202,58.9245],[11.35712,59.12804],[11.53839,58.91174],[11.62079,58.92308],[11.75812,59.24341],[11.65649,59.61777],[11.85974,59.7121],[11.82129,59.84481],[11.95862,59.91098],[12.15363,59.91235],[12.44476,60.0895],[12.48322,60.32151],[12.56012,60.50458],[12.36511,60.71217],[12.19482,61.01572],[12.64801,61.09415],[12.82928,61.34276],[12.55463,61.55018],[12.42828,61.54495],[12.12341,61.71331],[12.28546,62.26664],[12.03278,62.60851],[12.10968,62.74718],[12.06024,62.89772],[12.18658,62.99765],[11.95587,63.28183],[12.18109,63.47873],[12.1344,63.59012],[12.659,63.9856],[12.90619,64.0722],[13.20831,64.10461],[13.9801,64.03014],[14.06525,64.46214],[13.60382,64.56968],[14.26025,65.11608],[14.31519,65.23831],[14.45251,65.31412],[14.47998,65.62656],[14.57886,65.80953],[14.49097,66.15163],[14.99634,66.17161],[15.4248,66.29337],[15.33691,66.51107],[16.04004,66.93221],[16.37512,67.06743],[16.35864,67.21467],[16.06201,67.42015],[16.1499,67.52957],[16.37512,67.55266],[16.70471,67.91688],[17.25952,68.13067],[17.88025,67.99523],[18.09448,68.19809],[18.06702,68.54432],[18.39661,68.58848],[19.00085,68.52019],[19.89075,68.39109],[20.13245,68.48798],[19.89075,68.55637],[20.28076,68.78613],[19.99512,69.06268],[20.62134,69.08033],[20.86853,69.03518],[21.24756,68.8437],[21.92322,68.60652],[22.90649,68.39514],[23.73596,67.96639],[23.5437,67.8362],[23.62061,67.47492],[23.79639,67.44544],[23.81287,67.26992],[23.63159,67.23806],[24.04358,66.82868],[23.91174,66.57448],[23.71399,66.31986],[24.22485,65.97333],[24.04358,65.64469],[21.00586,63.63894],[18.57239,61.83023],[19.18762,60.53297],[19.11346,60.18387],[19.66827,59.82687],[19.90173,58.07788],[18.78662,56.9869],[16.73218,56.05977],[15.0238,55.72711],[14.36462,55.31977],[13.1163,55.22276],[12.7002,55.30414],[12.82654,55.57834],[12.84851,55.72402],[12.79358,55.83214],[12.6123,56.0751],[12.49146,56.13331],[12.07947,56.30435],[11.35437,57.67185],[10.57159,58.2445]]]}},east_midlands_uk:{type:"Feature",id:"east_midlands_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.03031,53.53488],[0.28564,53.56315],[0.48889,53.10722],[0.27299,52.82421],[0.24507,52.7845],[0.27219,52.77279],[0.18631,52.73533],[0.14206,52.7399],[0.08901,52.72361],[0.06361,52.72737],[0.04413,52.71436],[0.04883,52.68175],[0.02104,52.66476],[-0.03129,52.66151],[-0.06373,52.67521],[-0.08777,52.66676],[-0.10221,52.67218],[-0.14108,52.65149],[-0.18003,52.66054],[-0.19288,52.65242],[-0.20605,52.66805],[-0.26064,52.65139],[-0.28925,52.67025],[-0.335,52.67485],[-0.35023,52.66159],[-0.40569,52.64802],[-0.45065,52.65411],[-0.49897,52.63931],[-0.52006,52.64143],[-0.55014,52.61223],[-0.54419,52.59287],[-0.55813,52.59447],[-0.57192,52.58579],[-0.58149,52.59587],[-0.58865,52.58679],[-0.60303,52.58857],[-0.66093,52.56893],[-0.69783,52.5457],[-0.71564,52.52237],[-0.75723,52.51093],[-0.77488,52.51826],[-0.82013,52.51552],[-0.86871,52.52699],[-0.88346,52.51395],[-0.88214,52.49315],[-0.89806,52.4869],[-0.88241,52.47127],[-0.90065,52.45994],[-0.94219,52.46777],[-0.95192,52.47741],[-1.0007,52.47092],[-1.04452,52.44573],[-1.03429,52.43627],[-1.04987,52.42225],[-1.08439,52.43628],[-1.12928,52.41609],[-1.14947,52.39701],[-1.20141,52.39648],[-1.30715,52.49423],[-1.52226,52.57033],[-1.52716,52.58272],[-1.56075,52.59612],[-1.55447,52.61472],[-1.57139,52.6353],[-1.54714,52.64218],[-1.54245,52.65362],[-1.55281,52.66845],[-1.58965,52.68724],[-1.59082,52.69801],[-1.65505,52.69878],[-1.65662,52.72173],[-1.70372,52.7298],[-1.69687,52.75272],[-1.66654,52.78471],[-1.61113,52.78139],[-1.61435,52.78826],[-1.58887,52.79985],[-1.59183,52.80947],[-1.6105,52.81639],[-1.58536,52.8317],[-1.62672,52.85441],[-1.69028,52.86445],[-1.70061,52.86057],[-1.70435,52.86666],[-1.72527,52.85964],[-1.77712,52.88377],[-1.79092,52.88023],[-1.80186,52.88613],[-1.81171,52.88058],[-1.83295,52.8869],[-1.85422,52.93063],[-1.82982,52.94565],[-1.82678,52.97707],[-1.76257,52.99965],[-1.75775,53.01698],[-1.75978,53.03869],[-1.7847,53.04991],[-1.77566,53.05933],[-1.79424,53.08837],[-1.78373,53.10281],[-1.82144,53.13579],[-1.81254,53.15432],[-1.8393,53.1769],[-1.87403,53.19536],[-1.95671,53.21373],[-1.96237,53.22622],[-1.9896,53.21572],[-1.97486,53.23106],[-2.00948,53.26065],[-2.00679,53.35457],[-2.009,53.36201],[-2.03173,53.36573],[-2.03385,53.37517],[-2.00464,53.38633],[-1.99233,53.41519],[-2.02371,53.42055],[-2.02738,53.43233],[-2.01366,53.43988],[-2.00422,53.43592],[-2.00823,53.44155],[-1.98579,53.45523],[-1.98809,53.48033],[-1.97428,53.48838],[-1.97159,53.50434],[-1.92197,53.50995],[-1.92678,53.52095],[-1.91189,53.53803],[-1.89411,53.5336],[-1.87349,53.54041],[-1.84182,53.51989],[-1.82223,53.52108],[-1.80428,53.537],[-1.77188,53.53384],[-1.74155,53.54105],[-1.72318,53.55991],[-1.66945,53.5532],[-1.65103,53.56166],[-1.61581,53.56305],[-1.59636,53.57692],[-1.59109,53.60677],[-1.55023,53.60421],[-1.53078,53.59311],[-1.51867,53.5997],[-1.49656,53.59736],[-1.49512,53.60317],[-1.48371,53.59485],[-1.44763,53.61272],[-1.40036,53.59865],[-1.3767,53.60646],[-1.35612,53.59535],[-1.35143,53.58106],[-1.30782,53.57535],[-1.25803,53.59198],[-1.24825,53.61634],[-1.21778,53.62429],[-1.21602,53.642],[-1.1886,53.63583],[-1.15503,53.64319],[-1.13504,53.63254],[-1.12095,53.64688],[-0.99046,53.6612],[-0.94448,53.65868],[-0.86533,53.63769],[-0.89792,53.58325],[-0.90111,53.5687],[-0.89099,53.56654],[-0.90126,53.54788],[-0.89233,53.53738],[-0.94654,53.52732],[-0.95001,53.51363],[-0.93209,53.51065],[-0.93557,53.5025],[-0.90047,53.47513],[-0.92046,53.46446],[-0.87373,53.46146],[-0.87192,53.46629],[-0.79748,53.45504],[-0.78436,53.46336],[-0.78439,53.47665],[-0.77157,53.47918],[-0.76811,53.4989],[-0.75211,53.50051],[-0.73959,53.51991],[-0.62449,53.51282],[-0.62975,53.45819],[-0.55179,53.4595],[-0.47175,53.47485],[-0.48663,53.48045],[-0.48838,53.50484],[-0.40507,53.51759],[-0.40814,53.53208],[-0.43066,53.54631],[-0.50123,53.53744],[-0.46702,53.54894],[-0.429,53.5745],[-0.41967,53.56375],[-0.33594,53.5586],[-0.30342,53.59077],[-0.30093,53.61636],[-0.24847,53.59364],[-0.25139,53.58463],[-0.23466,53.58623],[-0.22255,53.56799],[-0.19169,53.56844],[-0.21988,53.53258],[-0.21059,53.53168],[-0.20408,53.51174],[-0.2106,53.48626],[-0.18856,53.48451],[-0.1818,53.46862],[-0.15368,53.46565],[-0.14923,53.44667],[-0.13188,53.43591],[-0.12034,53.43357],[-0.08221,53.45112],[-0.10786,53.46987],[-0.0898,53.47765],[-0.09548,53.48596],[-0.07526,53.48931],[-0.06493,53.51878],[-0.01452,53.51538],[0.03031,53.53488]]]}},"england-west-midlands":{type:"Feature",id:"england-west-midlands",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.28493,52.44175],[-3.12706,52.96995],[-1.95817,53.27605],[-1.1222,52.36367],[-1.59859,51.90733],[-2.65611,51.7761],[-3.10848,51.95414],[-3.28493,52.44175]]]}},london_uk:{type:"Feature",id:"london_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.23926,51.43251],[0.23923,51.43329],[0.23926,51.43251],[0.23717,51.4241],[0.205,51.39919],[0.18385,51.37628],[0.16188,51.36621],[0.15614,51.3539],[0.1603,51.31026],[0.14958,51.30173],[0.14213,51.29098],[0.06692,51.27361],[-0.01594,51.26864],[-0.05766,51.2586],[-0.10949,51.25943],[-0.16628,51.26848],[-0.19872,51.25854],[-0.22666,51.2587],[-0.27352,51.28757],[-0.31813,51.30077],[-0.33644,51.31532],[-0.40313,51.30581],[-0.44436,51.31987],[-0.47985,51.3302],[-0.50762,51.37142],[-0.53414,51.39494],[-0.54109,51.42774],[-0.53264,51.43923],[-0.5152,51.46248],[-0.49617,51.48894],[-0.50203,51.53945],[-0.5278,51.55474],[-0.53166,51.5611],[-0.53569,51.57289],[-0.53596,51.5778],[-0.53455,51.58275],[-0.53376,51.58792],[-0.51516,51.6337],[-0.49776,51.65205],[-0.4901,51.66912],[-0.45924,51.67692],[-0.44684,51.69442],[-0.42579,51.71213],[-0.39306,51.715],[-0.38079,51.71654],[-0.34459,51.70948],[-0.2838,51.71515],[-0.26707,51.71395],[-0.23509,51.69056],[-0.22093,51.68445],[-0.17729,51.68441],[-0.10644,51.69165],[-0.05899,51.68257],[0.02324,51.678],[0.0691,51.68854],[0.10856,51.68336],[0.19863,51.65015],[0.25714,51.61353],[0.28187,51.57813],[0.29039,51.55903],[0.26811,51.50265],[0.26882,51.49783],[0.26782,51.49042],[0.2659,51.47443],[0.25509,51.46053],[0.23586,51.44791],[0.23926,51.43251]]]}},united_kingdom:{type:"Feature",id:"united_kingdom",properties:{name:"United Kingdom",source:"OpenStreetMap"},geometry:{type:"Polygon",coordinates:[[[-7.24863,55.06999],[-6.96705,55.19847],[-6.59182,55.36664],[-9.93166,58.01975],[0.32957,61.43878],[2.43894,51.64531],[0.72508,50.42953],[-7.66848,49.03788],[-5.93264,51.46771],[-5.4053,53.54032],[-6.07527,54.0096],[-6.28173,54.11135],[-6.309,54.10669],[-6.31788,54.09098],[-6.33629,54.09472],[-6.33993,54.11189],[-6.3662,54.11374],[-6.36237,54.0766],[-6.37492,54.06914],[-6.37907,54.06909],[-6.37911,54.06907],[-6.37918,54.06902],[-6.39105,54.05885],[-6.41198,54.06306],[-6.44345,54.05649],[-6.45607,54.07252],[-6.47779,54.07709],[-6.4713,54.0663],[-6.51051,54.05268],[-6.53187,54.05968],[-6.55772,54.04917],[-6.58643,54.05757],[-6.59499,54.04462],[-6.62381,54.03646],[-6.66426,54.06917],[-6.66202,54.09283],[-6.64506,54.096],[-6.66127,54.12266],[-6.64886,54.12138],[-6.63961,54.13187],[-6.63436,54.16317],[-6.66539,54.19316],[-6.70601,54.20005],[-6.72106,54.18197],[-6.74076,54.18192],[-6.75617,54.19926],[-6.77562,54.19895],[-6.80097,54.21317],[-6.80042,54.2211],[-6.81617,54.22302],[-6.82774,54.26149],[-6.87804,54.27924],[-6.87229,54.28794],[-6.859,54.28191],[-6.85087,54.29728],[-6.87594,54.34641],[-6.90626,54.3503],[-6.91129,54.37474],[-6.93074,54.37575],[-6.9237,54.38284],[-6.95963,54.39221],[-6.98165,54.40946],[-6.99601,54.40538],[-7.0291,54.42137],[-7.05724,54.41108],[-7.07234,54.38839],[-7.10979,54.36824],[-7.10388,54.35574],[-7.15344,54.33501],[-7.18882,54.33765],[-7.17974,54.32046],[-7.17949,54.30924],[-7.19789,54.31106],[-7.21219,54.29962],[-7.17302,54.28613],[-7.17937,54.2726],[-7.16092,54.27371],[-7.14225,54.25559],[-7.15893,54.24396],[-7.14594,54.23957],[-7.14503,54.22473],[-7.17104,54.2176],[-7.18808,54.22492],[-7.1986,54.21578],[-7.22085,54.21581],[-7.23182,54.20557],[-7.24806,54.20446],[-7.24915,54.19817],[-7.233,54.19784],[-7.25942,54.19225],[-7.25828,54.17737],[-7.24028,54.1697],[-7.25812,54.16451],[-7.26296,54.13741],[-7.29195,54.11911],[-7.30891,54.13211],[-7.28551,54.13626],[-7.30149,54.14421],[-7.28379,54.15386],[-7.27997,54.16797],[-7.2913,54.17196],[-7.33956,54.14672],[-7.30533,54.12336],[-7.31867,54.11329],[-7.32713,54.12458],[-7.34602,54.11645],[-7.3632,54.1316],[-7.39181,54.12013],[-7.37279,54.13963],[-7.42078,54.13705],[-7.40959,54.15646],[-7.44192,54.15409],[-7.46841,54.14081],[-7.47919,54.12227],[-7.5281,54.13574],[-7.54738,54.12214],[-7.56576,54.12659],[-7.57454,54.14151],[-7.61043,54.14378],[-7.62966,54.1703],[-7.66425,54.18797],[-7.67659,54.18196],[-7.68829,54.20197],[-7.68543,54.20776],[-7.7394,54.20353],[-7.74858,54.20942],[-7.80368,54.20707],[-7.81173,54.20073],[-7.86017,54.21728],[-7.86046,54.26026],[-7.87322,54.27945],[-7.86187,54.29343],[-7.88087,54.29188],[-7.9017,54.30143],[-7.91095,54.29595],[-7.9616,54.31247],[-8.00093,54.35846],[-8.03129,54.35671],[-8.05733,54.36572],[-8.08416,54.39741],[-8.16026,54.44028],[-8.14291,54.45092],[-8.17751,54.46476],[-8.11467,54.46903],[-8.11324,54.4764],[-8.09148,54.47653],[-8.09868,54.48433],[-8.08933,54.48708],[-8.04265,54.48763],[-8.04185,54.50638],[-8.00601,54.54594],[-7.9703,54.54705],[-7.94973,54.53363],[-7.85055,54.53313],[-7.82402,54.54427],[-7.83325,54.55223],[-7.79659,54.57163],[-7.79341,54.58188],[-7.76212,54.58588],[-7.75151,54.59878],[-7.69725,54.61007],[-7.70877,54.63495],[-7.74165,54.61797],[-7.75797,54.62503],[-7.77236,54.62149],[-7.81366,54.64411],[-7.82828,54.63305],[-7.85213,54.63078],[-7.85669,54.65057],[-7.89164,54.65594],[-7.9099,54.66828],[-7.91381,54.67596],[-7.89766,54.68701],[-7.92089,54.69596],[-7.91804,54.70282],[-7.8796,54.70269],[-7.83665,54.73642],[-7.81761,54.73378],[-7.8047,54.7186],[-7.78875,54.71964],[-7.75006,54.70428],[-7.73551,54.71683],[-7.7116,54.72611],[-7.69723,54.72356],[-7.63657,54.75151],[-7.60944,54.74415],[-7.59117,54.74438],[-7.57919,54.75047],[-7.57865,54.74191],[-7.5698,54.74384],[-7.54826,54.74101],[-7.53859,54.751],[-7.54804,54.75711],[-7.54795,54.78835],[-7.52847,54.80757],[-7.47096,54.8348],[-7.44188,54.87561],[-7.45258,54.89849],[-7.44727,54.93524],[-7.39202,54.94545],[-7.4072,54.95521],[-7.4027,54.96689],[-7.40705,54.98294],[-7.39135,54.99774],[-7.40558,55.00332],[-7.37023,55.03476],[-7.34516,55.05083],[-7.31828,55.04507],[-7.29947,55.0561],[-7.28944,55.04771],[-7.27251,55.06357],[-7.24863,55.06999]]]}},canada_full:{type:"Feature",id:"canada_full",properties:{},geometry:{type:"Polygon",coordinates:[[[-140.99854,69.64945],[-120.9375,78.7335],[-91.05469,82.7432],[-75.58594,83.40004],[-63.45703,83.15311],[-59.32617,82.37915],[-63.76465,81.42049],[-67.19238,80.79583],[-73.21289,78.85307],[-74.9707,76.33114],[-61.34766,70.75797],[-50.1416,46.67959],[-65.98389,42.85181],[-66.95892,44.48769],[-66.9397,44.81692],[-67.13745,45.15493],[-67.26379,45.18591],[-67.31873,45.1278],[-67.43958,45.21881],[-67.44507,45.58329],[-67.79114,45.67164],[-67.78015,47.07012],[-68.19763,47.35743],[-68.39539,47.35743],[-68.37891,47.29413],[-68.90625,47.17478],[-69.06006,47.23449],[-69.08203,47.43552],[-69.22485,47.46524],[-70.00488,46.70974],[-70.05981,46.41514],[-70.18066,46.36209],[-70.3125,46.21025],[-70.24658,46.14178],[-70.3125,45.97406],[-70.26855,45.91294],[-70.42236,45.80583],[-70.42236,45.72152],[-70.71899,45.49865],[-70.62012,45.38302],[-70.80688,45.4293],[-70.85083,45.22848],[-71.00464,45.3367],[-71.1145,45.25169],[-71.26831,45.29035],[-71.41113,45.24395],[-71.5155,45.0153],[-74.81689,45.0153],[-75.31128,44.84808],[-75.7782,44.51218],[-75.82214,44.4377],[-76.43188,44.09942],[-76.79993,43.63011],[-78.68683,43.63806],[-79.19495,43.45292],[-79.07204,43.26521],[-79.05693,43.25671],[-79.04594,43.13807],[-79.06998,43.12103],[-79.06311,43.11652],[-79.05693,43.10951],[-79.07616,43.08393],[-79.07684,43.07691],[-79.01505,43.06839],[-78.99719,43.05785],[-79.02672,43.02071],[-79.01779,42.98456],[-78.98003,42.97099],[-78.96423,42.95843],[-78.93402,42.95542],[-78.91136,42.93883],[-78.90518,42.90011],[-78.93127,42.82361],[-80.07935,42.38289],[-81.27686,42.20818],[-82.39197,41.68112],[-82.68311,41.67701],[-83.07861,41.86547],[-83.15552,42.03909],[-83.12531,42.12064],[-83.13904,42.23462],[-83.07587,42.31185],[-82.98523,42.33418],[-82.81219,42.37478],[-82.63916,42.56117],[-82.59521,42.54903],[-82.52655,42.61375],[-82.41669,43.00063],[-82.13379,43.59631],[-82.51831,45.34442],[-83.59772,45.82114],[-83.43567,45.99696],[-83.57162,46.10847],[-83.65402,46.12275],[-83.76663,46.10466],[-83.82843,46.11989],[-83.89984,46.06084],[-83.95615,46.05989],[-83.974,46.1018],[-84.00833,46.11609],[-84.00696,46.14559],[-84.07974,46.18934],[-84.10995,46.24065],[-84.0976,46.25585],[-84.11545,46.26724],[-84.12094,46.31564],[-84.10309,46.32038],[-84.13467,46.36115],[-84.14841,46.42082],[-84.10995,46.50359],[-84.12781,46.531],[-84.14085,46.53241],[-84.17313,46.52722],[-84.19373,46.54092],[-84.226,46.53525],[-84.26582,46.49603],[-84.2926,46.49225],[-84.34135,46.50595],[-84.37225,46.50879],[-84.44023,46.49036],[-84.47662,46.45489],[-84.55353,46.45867],[-84.76776,46.62492],[-84.84741,46.88272],[-88.38501,48.31243],[-89.32983,47.96786],[-93.21899,48.64743],[-93.80127,48.5166],[-93.83423,48.63291],[-94.6637,48.75257],[-94.8175,49.32691],[-95.15259,49.38595],[-95.15533,49.00184],[-123.31879,49.00004],[-122.99469,48.7761],[-123.2666,48.69096],[-123.11279,48.37815],[-123.44238,48.22467],[-124.7168,48.49477],[-128.49609,48.74895],[-131.2207,53.61858],[-130.75928,54.73731],[-129.99023,55.27912],[-130.07813,56.10881],[-131.74805,56.63206],[-135.53833,59.80063],[-137.47192,58.90465],[-138.67493,59.78958],[-138.6969,59.90822],[-139.20227,60.09772],[-139.08142,60.35141],[-139.71863,60.33239],[-139.98779,60.18523],[-140.46021,60.30791],[-140.52063,60.22618],[-141.01501,60.30519],[-140.99854,69.64945]]]}},ottawa_gatineau:{type:"Feature",id:"ottawa_gatineau",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.23413,45.50827],[-76.12839,45.55829],[-75.26184,45.58041],[-75.13412,45.39652],[-75.42938,45.32512],[-75.35385,45.17816],[-75.82489,44.93564],[-76.34537,45.36855],[-76.23413,45.50827]]]}},vancouver_metro:{type:"Feature",id:"vancouver_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.32,49],[-123.45,49.38],[-123.26,49.47],[-122.24,49.27],[-122.2,49],[-123.32,49]]]}},cuba:{type:"Feature",id:"cuba",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.5,21.75],[-83.5,23.5],[-80,23.5],[-73.5,20.4],[-74.5,19.5],[-78,19.5],[-85.5,21.75]]]}},nicaragua:{type:"Feature",id:"nicaragua",properties:{},geometry:{type:"Polygon",coordinates:[[[-88,13],[-87.56104,13.13298],[-87.36877,12.99921],[-86.97876,13.02597],[-86.88538,13.28272],[-86.7041,13.29876],[-86.77002,13.76873],[-86.31409,13.77407],[-86.1438,14.046],[-86.01746,14.05133],[-85.75378,13.89141],[-85.16602,14.31761],[-84.96277,14.80144],[-84.4574,14.63674],[-83.39722,15.03499],[-82.5,14.9],[-82.8,12],[-83.676,10.95],[-83.66,10.8],[-83.92,10.7],[-84.688,11.076],[-84.91,10.945],[-85.615,11.215],[-85.7,11.06],[-86,11.06],[-88,13]]]}},boston_metro:{type:"Feature",id:"boston_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-70.5,41.91],[-71,41.91],[-71.42,42.05],[-71.57,42.18],[-71.64,42.4],[-71.57,42.52],[-71.35,42.64],[-71.1,42.7],[-70.5,42.7],[-70.5,41.91]]]}},central_pa:{type:"Feature",id:"central_pa",properties:{},geometry:{type:"Polygon",coordinates:[[[-78.7,41.5],[-77,41.5],[-76,40],[-76,39.72],[-79.3,39.72],[-78.7,41.5]]]}},chattanooga:{type:"Feature",id:"chattanooga",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.634,34.743],[-85.634,35.282],[-84.933,35.282],[-84.933,34.743],[-85.634,34.743]]]}},cleveland:{type:"Feature",id:"cleveland",properties:{},geometry:{type:"Polygon",coordinates:[[[-82.5,41.5],[-80.95,42],[-80.95,41],[-82.5,41],[-82.5,41.5]]]}},colorado:{type:"Feature",id:"colorado",properties:{},geometry:{type:"Polygon",coordinates:[[[-109.05,37],[-109.05,41],[-102.05,41],[-102.05,37],[-109.05,37]]]}},dc_metro:{type:"Feature",id:"dc_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-77.04437,38.70266],[-77.27783,38.69409],[-77.57172,38.91668],[-77.61017,39.1258],[-77.27509,39.21523],[-77.08694,39.21204],[-76.87546,39.05119],[-76.69968,38.97863],[-76.71066,38.77657],[-76.84662,38.7048],[-77.04437,38.70266]]]}},dfw_metro:{type:"Feature",id:"dfw_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-97.75,32.25],[-97.75,33.4],[-96,33.4],[-96,32.25],[-97.75,32.25]]]}},grand_junction_co:{type:"Feature",id:"grand_junction_co",properties:{},geometry:{type:"Polygon",coordinates:[[[-109,39.4],[-108.1,39.4],[-107.8,39.16],[-107.8,38.7],[-108.1,38.5],[-109,39],[-109,39.4]]]}},la_metro:{type:"Feature",id:"la_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-118.5,33.7],[-118.68,34.23],[-118.5,34.35],[-118,34.2],[-117.3,34.2],[-117.2,34.1],[-117.37,33.9],[-117.74,33.5],[-118.5,33.7]]]}},massachusetts:{type:"Feature",id:"massachusetts",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.53149,42.9725],[-69.40063,42.9725],[-69.40063,40.98819],[-71.55396,41.04622],[-71.53198,41.91863],[-73.70728,41.91045],[-73.53149,42.9725]]]}},minneapolis_st_paul_metro:{type:"Feature",id:"minneapolis_st_paul_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-93.801,44.578],[-93.801,45.348],[-92.666,45.348],[-92.666,44.578],[-93.801,44.578]]]}},mt_vernon_wa:{type:"Feature",id:"mt_vernon_wa",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.3,49],[-122,49],[-122,48],[-123.2,48.4],[-123.3,49]]]}},nyc_metro:{type:"Feature",id:"nyc_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.73,40.64],[-73.95,41.38],[-73.6,40.95],[-73.25,41],[-73.25,40.6],[-74.43,40.43],[-74.73,40.64]]]}},philly_metro:{type:"Feature",id:"philly_metro",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.7,40.3],[-75.3,40.4],[-74.7,40.3],[-74.45,40.1],[-74.9,39.55],[-75.5,39.55],[-75.8,39.7218],[-76.23,39.7211],[-75.7,40.3]]]}},phoenix:{type:"Feature",id:"phoenix",properties:{},geometry:{type:"Polygon",coordinates:[[[-113,32.7],[-113,34],[-111.1,34],[-111.1,32.7],[-113,32.7]]]}},portland_me:{type:"Feature",id:"portland_me",properties:{},geometry:{type:"Polygon",coordinates:[[[-70.5,42.9],[-71,43.3],[-71,44.2],[-69.6,44.5],[-69,44],[-70.5,42.9]]]}},portland_or:{type:"Feature",id:"portland_or",properties:{},geometry:{type:"Polygon",coordinates:[[[-124.4,44.8],[-124.4,46.3],[-121.5,46.3],[-121.5,44.8],[-124.4,44.8]]]}},salt_lake_city:{type:"Feature",id:"salt_lake_city",properties:{},geometry:{type:"Polygon",coordinates:[[[-112.6,40.75],[-112.3,41.4],[-111.5,41.4],[-111.1,40.3],[-112,39.75],[-112.6,40.75]]]}},seattle:{type:"Feature",id:"seattle",properties:{},geometry:{type:"Polygon",coordinates:[[[-122.15,47.26],[-122.33,47.26],[-122.54,47.33],[-122.52,47.46],[-122.45,47.55],[-122.45,47.8],[-121.2,47.8],[-121.43,47.38],[-121.43,47.14],[-121.94,47.14],[-122,47.17],[-122,47.17],[-122.1,47.19],[-122.15,47.26]]]}},sf_bay_area:{type:"Feature",id:"sf_bay_area",properties:{},geometry:{type:"Polygon",coordinates:[[[-123.5,38.5],[-122.8,38.8],[-121.7,38.2],[-121.5,36.9],[-123,36.9],[-123.5,38.5]]]}},south_sf_bay_area:{type:"Feature",id:"south_sf_bay_area",properties:{},geometry:{type:"Polygon",coordinates:[[[-121.4566,37.48249],[-121.21628,37.17673],[-121.20529,36.95757],[-121.49368,36.95757],[-121.5596,36.8928],[-121.98257,37.12419],[-122.27234,37.39635],[-122.13501,37.48903],[-121.4566,37.48249]]]}},st_louis:{type:"Feature",id:"st_louis",properties:{},geometry:{type:"Polygon",coordinates:[[[-90.28,39.1],[-89.57,39.05],[-89.57,38.18],[-90.58,38],[-91.37,38.2],[-91.37,38.75],[-90.28,39.1]]]}},tampa_bay:{type:"Feature",id:"tampa_bay",properties:{},geometry:{type:"Polygon",coordinates:[[[-83,28.2],[-82.2,28.2],[-82.2,27.55],[-83,27.55],[-83,28.2]]]}},usa_full:{type:"Feature",id:"usa_full",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-124.76179,48.41301],[-123.22752,48.18499],[-123.32289,49.00429],[-96.01312,49.00605],[-95.11054,49.412],[-93.99811,49.00671],[-89.43531,47.98378],[-88.34922,48.29633],[-87.50645,48.01427],[-83.2814,46.13885],[-82.17616,43.58854],[-82.66248,41.68895],[-79.00601,42.80053],[-79.15798,43.44626],[-78.76239,43.62496],[-76.90231,43.80246],[-75.07988,44.98029],[-72.02225,45.00598],[-71.41227,45.25488],[-70.46149,46.21766],[-69.25051,47.51223],[-67.75966,47.099],[-66.94528,44.71049],[-69.84893,43.26199],[-69.87974,40.99205],[-72.00202,40.99125],[-74.02112,39.57279],[-75.41474,35.05319],[-80.02453,32.01613],[-79.89011,26.85507],[-80.02,24.0071],[-84.01601,24.00527],[-84.01656,25.01258],[-81.99666,25.01349],[-81.9972,25.98268],[-84.01879,28.99618],[-86.02775,30.00475],[-88.01625,30.00389],[-88.01567,28.99443],[-90.90285,28.85645],[-93.74053,29.47421],[-95.55633,28.58761],[-96.80617,27.79782],[-96.95553,25.98216],[-97.43502,25.8266],[-98.01091,25.9928],[-99.23511,26.4476],[-100.00624,28.00822],[-101.25529,29.48105],[-102.1514,29.74757],[-102.71736,29.39206],[-103.25189,28.89087],[-104.58819,29.69979],[-105.02053,30.5361],[-106.20525,31.4467],[-106.28689,31.56133],[-106.42932,31.75206],[-106.48421,31.74645],[-106.53072,31.78209],[-108.18711,31.77551],[-108.19927,31.326],[-111.00893,31.33601],[-114.86123,32.47999],[-117.67593,32.46302],[-119.97759,33.00641],[-122.53697,36.85661],[-124.99343,40.05576],[-124.60595,45.90245],[-124.76179,48.41301]]],[[[-160.57876,22.50629],[-159.00937,22.50702],[-157.50474,21.9985],[-156.29276,21.22259],[-154.68902,19.88057],[-154.62178,18.7587],[-155.99619,18.77902],[-157.50832,20.9958],[-158.74706,21.24398],[-160.57822,21.49846],[-160.57876,22.50629]]],[[[-167.1572,68.722],[-164.9717,68.9947],[-163.0218,69.9707],[-160.4136,70.7398],[-156.1769,71.5633],[-140.9684,69.9535],[-140.9874,61.0119],[-139.1716,60.4127],[-138.0072,59.9918],[-135.123,59.7566],[-131.9759,56.9995],[-130.0071,57.0001],[-130.0044,54.0043],[-133.9948,54.0032],[-138.515,57.9986],[-138.516,58.9953],[-151.5013,58.992],[-151.5003,57.9988],[-151.9963,55.9992],[-158.0191,55.0028],[-159.0076,55.0025],[-162.4025,53.9567],[-171.4689,51.8215],[-177.9993,51.2554],[-178.0001,52.2446],[-173.8197,59.7401],[-172.5143,63.8767],[-169.0075,64.9988],[-169.0087,66.0015],[-168.0022,66.0018],[-164.8554,67.0255],[-167.1572,68.722]]],[[[-68.2,17.8],[-67.9,18.67],[-65.33,18.57],[-64.64,18.36],[-64.32,17.38],[-68.2,17.8]]],[[[146.2,15.4],[144.8,12.9],[144.2,13.2],[145.7,15.6],[146.2,15.4]]],[[[180,52.2],[180,51],[172,52.5],[172,53.5],[180,52.2]]]]}},wyoming:{type:"Feature",id:"wyoming",properties:{},geometry:{type:"Polygon",coordinates:[[[-111.05,41],[-111.05,45],[-104.05,45],[-104.05,41],[-111.05,41]]]}},australia_full:{type:"Feature",id:"australia_full",properties:{},geometry:{type:"Polygon",coordinates:[[[146.07422,-44.43378],[131.66016,-44.65302],[124.54102,-41.44273],[116.45508,-39.36828],[108.80859,-39.16414],[103.18359,-27.60567],[95.27344,-24.04646],[96.30615,-11.15685],[106.25977,-9.92557],[116.47705,-13.98738],[122.77222,-11.65224],[126.43066,-11.48002],[129.26514,-9.92557],[134.89014,-9.92557],[139.46045,-10.14193],[141.55334,-9.99861],[141.7868,-9.77132],[142.229,-9.67115],[142.72614,-9.552],[143.30017,-9.39216],[144.24774,-9.24851],[144.44824,-9.59533],[149.5459,-12.68321],[154.90723,-18.02053],[156.42334,-21.55528],[158.02734,-24.68695],[160.0708,-26.03704],[167.34375,-26.6671],[170.354,-29.11378],[168.2666,-30.63791],[160.15869,-34.03445],[152.18262,-38.41056],[149.94141,-43.51669],[146.07422,-44.43378]]]}},argentina:{type:"Feature",id:"argentina",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.14602,-49.18818],[-72.91615,-48.93261],[-72.53201,-48.80072],[-72.58755,-48.48542],[-72.22624,-48.32339],[-72.49784,-47.96155],[-72.33315,-47.44938],[-71.86801,-47.23376],[-71.94851,-46.80983],[-71.64665,-46.68783],[-71.79939,-46.19141],[-71.6147,-45.97522],[-71.79762,-45.62288],[-71.46813,-45.4921],[-71.32472,-45.306],[-71.56043,-44.97863],[-72.04094,-44.90019],[-72.07396,-44.78023],[-71.46969,-44.73753],[-71.23704,-44.79082],[-71.13226,-44.4711],[-71.36469,-44.38958],[-71.80731,-44.42036],[-71.84736,-44.11002],[-71.64902,-43.94552],[-71.75129,-43.78527],[-71.60784,-43.62836],[-71.93082,-43.45685],[-71.76157,-43.1645],[-72.14281,-42.8979],[-72.1812,-42.69735],[-72.023,-42.41766],[-72.17288,-42.14043],[-71.72931,-42.12447],[-71.91021,-41.34113],[-71.8196,-41.06038],[-71.96387,-40.71955],[-71.8414,-40.4521],[-71.65704,-40.36426],[-71.82818,-40.20778],[-71.59266,-39.90123],[-71.67811,-39.56486],[-71.39497,-39.34179],[-71.42542,-38.92164],[-70.92524,-38.76298],[-70.84044,-38.54138],[-70.97623,-38.44222],[-70.98292,-38.10477],[-71.21191,-37.68901],[-71.11983,-37.4585],[-71.21555,-37.27261],[-71.09237,-37.11444],[-71.11982,-36.69792],[-71.03513,-36.47333],[-70.71285,-36.42687],[-70.70501,-36.27229],[-70.42451,-36.15581],[-70.38755,-35.60868],[-70.43201,-35.31842],[-70.58358,-35.27831],[-70.36203,-35.13645],[-70.21683,-34.61145],[-70.01089,-34.41389],[-70.03094,-34.28805],[-69.79507,-34.24304],[-69.90417,-33.77143],[-69.7705,-33.3611],[-70.00282,-33.32294],[-70.08089,-33.02919],[-70.00121,-32.8846],[-70.17038,-32.62555],[-70.14899,-32.46585],[-70.31918,-32.27335],[-70.35277,-32.0257],[-70.2106,-31.95769],[-70.46072,-31.84116],[-70.56691,-31.60016],[-70.49734,-31.12216],[-70.40805,-31.16633],[-70.23998,-30.61575],[-70.11719,-30.43102],[-69.89853,-30.35557],[-69.87492,-29.7043],[-70.01808,-29.38321],[-69.78724,-29.13008],[-69.68114,-28.47172],[-69.45679,-28.18357],[-69.17254,-27.97088],[-68.94231,-27.52325],[-68.8412,-27.15464],[-68.29854,-27.0389],[-68.2638,-26.91623],[-68.58734,-26.49294],[-68.55754,-26.2871],[-68.38108,-26.17822],[-68.57599,-25.42894],[-68.4999,-25.16149],[-68.34279,-25.1124],[-68.56789,-24.79739],[-68.26201,-24.40457],[-67.32231,-24.0344],[-66.99052,-23.00044],[-67.18066,-22.8138],[-67.02827,-22.54089],[-66.78247,-22.43778],[-66.73899,-22.23893],[-66.28793,-22.08605],[-66.24277,-21.79408],[-66.07589,-21.83493],[-65.74764,-22.10912],[-64.99322,-22.08239],[-64.53579,-22.29137],[-64.29933,-22.86509],[-64.24332,-22.56039],[-63.93139,-22],[-62.80617,-22],[-62.7913,-22.16193],[-62.3009,-22.48659],[-62.20671,-22.70418],[-61.73612,-23.23432],[-61.08824,-23.61393],[-60.9899,-23.81808],[-60.37353,-24.024],[-60.03941,-24.01156],[-59.47554,-24.33261],[-59.35397,-24.47821],[-58.67243,-24.83192],[-58.24167,-24.92801],[-57.76089,-25.17193],[-57.555,-25.4484],[-57.74064,-25.65045],[-57.89112,-25.9662],[-58.08473,-26.11185],[-58.22103,-26.41403],[-58.18996,-26.64518],[-58.31991,-26.85821],[-58.64913,-27.12662],[-58.59905,-27.29984],[-57.87482,-27.27527],[-57.48754,-27.44418],[-56.96564,-27.50202],[-56.84926,-27.6063],[-56.60117,-27.42102],[-56.3749,-27.58903],[-56.29432,-27.42003],[-56.06276,-27.306],[-55.73692,-27.44516],[-55.6057,-27.16241],[-55.42284,-26.99528],[-54.78695,-26.63111],[-54.61874,-26.20893],[-54.67933,-25.99524],[-54.65698,-25.67619],[-54.5842,-25.58952],[-54.4812,-25.62543],[-54.108,-25.495],[-53.86217,-25.65902],[-53.83619,-25.97166],[-53.6411,-26.21559],[-53.73094,-26.5097],[-53.67249,-26.91252],[-53.84355,-27.16453],[-53.959,-27.15804],[-54.21736,-27.38603],[-54.673,-27.57],[-54.814,-27.533],[-54.936,-27.772],[-55.38728,-27.98524],[-55.76677,-28.23982],[-55.69902,-28.42637],[-55.88091,-28.4715],[-56.29651,-28.80272],[-56.42475,-29.07897],[-56.59315,-29.12516],[-56.70164,-29.35913],[-57.328,-29.972],[-57.64923,-30.20184],[-57.63687,-30.33197],[-57.85924,-30.47701],[-57.8096,-30.91332],[-58.08141,-31.45457],[-57.98082,-31.58691],[-58.20653,-31.86773],[-58.10645,-32.24002],[-58.20464,-32.46055],[-58.0841,-32.99782],[-58.36693,-33.12177],[-58.49375,-33.57857],[-58.29507,-34.17809],[-57.9345,-34.4519],[-55.9,-35.6],[-57,-39],[-61,-41],[-63.5,-55],[-66.67094,-55.11906],[-67.27285,-54.90511],[-67.95071,-54.87373],[-68.60967,-54.91369],[-68.60676,-52.65902],[-68.41869,-52.3325],[-69.19014,-52.15044],[-69.48632,-52.15165],[-69.9955,-52.00074],[-71.92259,-51.99991],[-72.29907,-51.69791],[-72.28621,-50.65987],[-72.72636,-50.61667],[-73.06995,-50.78909],[-73.32848,-50.5716],[-73.52199,-50.15397],[-73.44481,-49.79226],[-73.53933,-49.49825],[-73.47299,-49.20464],[-73.14602,-49.18818]]]}},bolivia:{type:"Feature",id:"bolivia",properties:{},geometry:{type:"Polygon",coordinates:[[[-60.17487,-16.26675],[-58.32092,-16.31948],[-58.47336,-16.74472],[-58.39371,-17.18081],[-57.79152,-17.55501],[-57.71187,-17.73103],[-57.55463,-18.22348],[-57.72079,-18.89914],[-57.70775,-19.0381],[-58.11768,-19.75313],[-57.85675,-19.96754],[-58.15338,-20.15201],[-58.17535,-19.83066],[-59.07074,-19.28846],[-59.97025,-19.29494],[-61.78848,-19.65358],[-62.57401,-21.99972],[-63.93082,-22.00736],[-64.24942,-22.60957],[-64.31808,-22.8806],[-64.56528,-22.36595],[-64.62021,-22.21856],[-64.99649,-22.08628],[-65.77446,-22.10027],[-65.92552,-21.93222],[-66.04774,-21.91884],[-66.04225,-21.86022],[-66.2273,-21.78437],[-66.3121,-22.1219],[-66.74057,-22.23635],[-66.7955,-22.44213],[-67.18002,-22.81353],[-67.56351,-22.90085],[-67.81174,-22.87934],[-68.17566,-21.3252],[-68.405,-20.9499],[-68.54095,-20.92681],[-68.55606,-20.7285],[-68.43796,-20.63857],[-68.74557,-20.46369],[-68.72772,-20.08173],[-68.56293,-20.05077],[-68.53134,-19.85779],[-68.69064,-19.74667],[-68.41873,-19.41544],[-68.9296,-18.97448],[-69.12186,-18.14128],[-69.46793,-17.50852],[-69.46793,-17.37489],[-69.63547,-17.27787],[-69.01199,-16.66053],[-69.03877,-16.58487],[-68.93509,-16.2061],[-69.16718,-16.22259],[-69.40201,-15.62634],[-69.13422,-15.23516],[-69.35806,-14.96933],[-68.97903,-14.21979],[-68.87466,-12.88745],[-68.65768,-12.49088],[-69.57264,-10.94456],[-68.74806,-11.00835],[-68.75167,-11.01762],[-68.75201,-11.03716],[-68.76592,-11.04963],[-68.70815,-11.14253],[-68.54576,-11.11036],[-68.24295,-10.95872],[-68.08502,-10.69165],[-67.86736,-10.64036],[-67.71629,-10.71459],[-67.6775,-10.60341],[-67.65947,-10.61792],[-67.58446,-10.50402],[-67.43614,-10.44966],[-67.40593,-10.38314],[-67.31461,-10.37774],[-67.32216,-10.32438],[-67.1953,-10.32277],[-67.18869,-10.33983],[-67.17093,-10.33814],[-66.57921,-9.90392],[-65.86441,-9.75981],[-65.56503,-9.82477],[-65.44968,-9.67318],[-65.29449,-9.85589],[-65.39474,-10.54722],[-65.35629,-10.78474],[-65.2684,-10.88658],[-65.29861,-11.32656],[-65.14481,-11.70939],[-64.36752,-12.4587],[-63.67538,-12.46675],[-61.64841,-13.53453],[-61.06339,-13.52919],[-60.4303,-13.88608],[-60.23804,-15.09864],[-60.57312,-15.09599],[-60.24353,-15.47221],[-60.17487,-16.26675]]]}},bahia:{id:"bahia",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-46.26343,-11.52309],[-46.40625,-11.53923],[-46.51062,-11.50425],[-46.604,-11.3481],[-46.61224,-11.25653],[-46.46668,-11.1811],[-46.42822,-11.02208],[-46.32935,-10.9331],[-46.19751,-10.65521],[-45.84045,-10.47701],[-45.82672,-10.35275],[-45.74707,-10.34194],[-45.70038,-10.26087],[-45.72784,-10.15815],[-45.59326,-10.09326],[-45.41199,-10.43379],[-45.45593,-10.55262],[-45.37903,-10.72538],[-45.15381,-10.8387],[-44.90112,-10.90883],[-44.60999,-10.66601],[-44.34631,-10.54182],[-44.13757,-10.63362],[-44.05518,-10.39057],[-43.96179,-10.42839],[-43.78601,-10.15275],[-43.69263,-10.03918],[-43.69812,-9.95262],[-43.64868,-9.82274],[-43.76404,-9.76861],[-43.8794,-9.54117],[-43.68713,-9.41655],[-43.4729,-9.24851],[-43.3081,-9.37861],[-43.04443,-9.36235],[-42.8302,-9.60617],[-42.33581,-9.31899],[-41.90735,-9.23767],[-41.7865,-9.09125],[-41.40198,-8.71136],[-41.14929,-8.70593],[-41.03943,-8.83351],[-41.01471,-8.82808],[-40.92407,-8.83894],[-40.8197,-9.07226],[-40.68237,-9.14277],[-40.66864,-9.26478],[-40.7428,-9.30002],[-40.75653,-9.42197],[-40.62744,-9.47615],[-40.53131,-9.41384],[-40.47363,-9.39758],[-40.42694,-9.34338],[-40.36102,-9.37319],[-40.29785,-9.09396],[-40.23468,-9.04243],[-40.14679,-9.10481],[-40.07813,-9.05057],[-39.98749,-9.05599],[-39.8996,-8.95833],[-39.90509,-8.82808],[-39.68262,-8.77923],[-39.70459,-8.67063],[-39.65241,-8.65977],[-39.41345,-8.50769],[-39.2926,-8.54843],[-39.23492,-8.6299],[-38.96576,-8.76837],[-38.86963,-8.76837],[-38.71307,-8.83622],[-38.68835,-8.90678],[-38.66913,-8.98275],[-38.61694,-8.96376],[-38.60596,-8.86065],[-38.5675,-8.81723],[-38.47687,-8.84708],[-38.50983,-8.94205],[-38.42194,-9.037],[-38.33679,-8.97461],[-38.28461,-9.00716],[-38.31757,-9.06684],[-38.21045,-9.36235],[-38.04565,-9.4599],[-38.02368,-9.8498],[-37.89185,-9.96885],[-37.74902,-10.31492],[-37.8479,-10.37977],[-37.78198,-10.64981],[-37.93579,-10.73617],[-38.13354,-10.6822],[-38.26538,-10.79014],[-38.02368,-11.31848],[-37.73804,-11.57691],[-37.3645,-11.48002],[-38.50159,-18.11975],[-39.65515,-18.35453],[-40.25391,-17.96828],[-40.23193,-17.79053],[-40.61646,-17.38209],[-40.51758,-16.89917],[-40.13306,-16.45716],[-39.90234,-16.04581],[-40.68237,-15.68651],[-41.08887,-15.73939],[-41.35254,-15.73939],[-41.37451,-15.49603],[-41.80298,-15.09334],[-42.04468,-15.18878],[-43.24219,-14.67925],[-43.50586,-14.78551],[-43.92334,-14.63674],[-43.7915,-14.31761],[-44.35181,-14.24309],[-44.65942,-14.38148],[-45.78003,-15.13576],[-46.10962,-15.29478],[-46.06567,-14.87047],[-45.92285,-14.38148],[-46.24146,-14.14723],[-46.32935,-13.11158],[-46.38428,-12.02858],[-46.26343,-11.52309]]]}},brazil:{type:"Feature",id:"brazil",properties:{},geometry:{type:"Polygon",coordinates:[[[-51.56433,4.29711],[-28.4491,1.04914],[-37.67761,-21.04862],[-52.94861,-34.05721],[-53.56384,-33.71063],[-53.58581,-33.23409],[-53.16833,-32.81036],[-54.11316,-32.08723],[-55.73914,-30.85036],[-56.11267,-31.18931],[-56.11267,-30.90694],[-57.0575,-30.14988],[-57.23328,-30.32073],[-57.73865,-30.26381],[-55.98083,-28.5411],[-54.94812,-27.68839],[-53.80554,-27.18136],[-53.7616,-26.73089],[-53.87146,-26.00249],[-54.20105,-25.88394],[-54.6405,-25.88394],[-54.28894,-24.13171],[-55.43701,-24.18685],[-55.87647,-22.3704],[-58.07373,-22.08564],[-58.24402,-20.06109],[-57.71668,-17.98396],[-58.43628,-17.18278],[-58.50769,-16.38866],[-60.1831,-16.29905],[-60.26001,-15.14637],[-60.49072,-14.09396],[-60.94116,-13.63531],[-61.85303,-13.5926],[-63.58887,-12.56529],[-64.22058,-12.55992],[-65.20386,-11.8996],[-65.4126,-9.74154],[-66.82983,-10.1203],[-68.17566,-10.92501],[-70.6366,-11.18379],[-70.6366,-9.62783],[-71.42761,-9.97426],[-72.74597,-9.88769],[-73.97644,-7.10634],[-72.70752,-4.67498],[-70.15869,-4.23686],[-69.67529,-1.03266],[-70.19714,1.75205],[-67.56042,1.83989],[-66.94519,0.69761],[-63.78113,1.83989],[-64.84131,4.36832],[-63.25378,3.59566],[-60.24353,5.20584],[-60.03479,4.98698],[-59.57886,3.81493],[-59.89746,3.26118],[-60.05676,2.76199],[-59.9469,2.2626],[-59.77661,2.23515],[-59.77661,1.75754],[-58.64502,1.55987],[-55.87647,2.61384],[-53.10791,2.35041],[-51.56433,4.29711]]]}},df_br:{id:"df_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-48.20114,-15.49868],[-47.42111,-15.5],[-47.38953,-15.56484],[-47.32361,-15.58865],[-47.33047,-15.63891],[-47.31125,-15.73278],[-47.36755,-15.83189],[-47.3703,-15.927],[-47.36893,-15.99698],[-47.30988,-16.04317],[-48.27805,-16.04713],[-48.24921,-15.94152],[-48.2753,-15.93096],[-48.29041,-15.83189],[-48.22998,-15.77772],[-48.21899,-15.71163],[-48.24097,-15.70898],[-48.23547,-15.66535],[-48.22449,-15.63097],[-48.20251,-15.62568],[-48.20114,-15.49868]]]}},rs_br:{id:"rs_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-50.56791,-28.32331],[-49.64837,-28.40599],[-49.62152,-28.67722],[-49.82288,-28.81257],[-49.86986,-29.14725],[-49.40674,-29.43409],[-50.66187,-31.5221],[-51.51429,-32.07544],[-52.0244,-32.51232],[-52.32644,-33.22264],[-53.199,-34.04411],[-53.65541,-33.63156],[-53.50103,-32.61414],[-55.57503,-31.01726],[-56.0113,-31.18392],[-56.20595,-30.78112],[-56.93084,-30.18535],[-57.2463,-30.36505],[-57.57519,-30.33029],[-57.71614,-30.18535],[-57.40068,-29.91811],[-57.23959,-29.67347],[-56.02473,-28.4178],[-55.70255,-28.08671],[-54.40043,-27.2008],[-53.38022,-26.97372],[-51.97071,-27.23661],[-51.03103,-27.74271],[-50.56791,-28.32331]]]}},chile:{type:"Feature",id:"chile",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[-110,-28],[-110,-26],[-109,-26],[-109,-28],[-110,-28]],[[-69.46999,-17.50394],[-69.67049,-17.66692],[-69.80164,-17.65253],[-69.83047,-17.71337],[-69.82704,-17.75196],[-69.80919,-17.8023],[-69.75494,-17.98135],[-69.82018,-18.1191],[-69.86618,-18.17325],[-69.96918,-18.26065],[-70.19165,-18.33106],[-72.5,-18.3],[-78,-53],[-68,-58],[-65.80412,-55.20392],[-67.30412,-54.90395],[-68.60412,-54.90395],[-68.60412,-52.65417],[-68.42212,-52.39063],[-68.42268,-52.33665],[-68.57786,-52.32931],[-68.58833,-52.31016],[-68.84205,-52.28181],[-69.19421,-52.15445],[-69.49016,-52.15561],[-70.00412,-52.00423],[-71.92097,-52.00391],[-71.95221,-51.97896],[-72.04212,-51.96756],[-71.93324,-51.91854],[-72.03255,-51.8118],[-72.32412,-51.60426],[-72.34531,-50.65403],[-73.32687,-50.52827],[-73.51742,-49.89065],[-72.98733,-48.99351],[-72.68005,-48.89271],[-72.53174,-48.77746],[-72.56195,-48.50569],[-72.24472,-48.34986],[-72.46788,-47.7451],[-72.0504,-47.34557],[-71.87325,-47.12505],[-71.9426,-46.81204],[-71.64974,-46.68289],[-71.82037,-46.1256],[-71.64459,-46.00936],[-71.75291,-45.55168],[-71.47104,-45.49829],[-71.54383,-45.40436],[-71.3895,-45.35287],[-71.33354,-45.28286],[-71.41148,-45.19486],[-71.56494,-44.98326],[-72.03323,-44.88409],[-72.03495,-44.76989],[-71.24908,-44.80425],[-71.07056,-44.47985],[-71.81213,-44.30714],[-71.58417,-43.64303],[-71.8856,-43.45765],[-71.72596,-43.19066],[-72.14344,-42.90363],[-72.04765,-42.54322],[-72.04182,-42.40546],[-72.17194,-42.14686],[-71.73051,-42.11516],[-71.92612,-40.72332],[-71.80252,-40.42081],[-71.70639,-40.425],[-71.66794,-40.30571],[-71.77643,-40.268],[-71.39465,-38.92843],[-70.90816,-38.67251],[-71.189,-37.74167],[-71.04858,-36.49087],[-70.95932,-36.50246],[-70.37876,-36.04743],[-70.43884,-35.32549],[-70.58441,-35.27646],[-70.53875,-35.20551],[-70.3791,-35.17241],[-69.87854,-34.15614],[-69.8703,-33.57458],[-69.78207,-33.33282],[-69.86721,-33.28663],[-69.99561,-33.3268],[-70.08453,-33.03716],[-70.3125,-32.12562],[-70.22736,-31.93934],[-70.46185,-31.84548],[-70.53102,-31.3724],[-70.07904,-30.38828],[-69.88678,-30.35747],[-69.81262,-30.14869],[-69.93347,-30.10118],[-69.94308,-29.24087],[-68.78609,-27.10803],[-68.56567,-27.17525],[-68.25256,-26.96492],[-68.57666,-26.49147],[-68.5437,-26.27987],[-68.37067,-26.17639],[-68.48328,-25.15399],[-68.32397,-25.09928],[-68.5437,-24.79047],[-68.46405,-24.62829],[-68.24432,-24.39338],[-67.32216,-24.03768],[-66.98639,-23.00012],[-67.17728,-22.81416],[-67.55768,-22.89642],[-67.81586,-22.86099],[-68.19489,-21.27018],[-68.405,-20.93964],[-68.53546,-20.8524],[-68.47504,-20.64949],[-68.72772,-20.46948],[-68.73322,-20.38454],[-68.67279,-20.34591],[-68.76549,-20.08237],[-68.56842,-20.05658],[-68.52997,-19.85262],[-68.68309,-19.72793],[-68.40225,-19.41091],[-68.92548,-18.97253],[-69.11087,-18.1328],[-69.06143,-18.06231],[-69.29352,-17.96698],[-69.30931,-17.9121],[-69.30794,-17.83956],[-69.34708,-17.7343],[-69.47205,-17.61065],[-69.46999,-17.50394]]]]}},bogota:{type:"Feature",id:"bogota",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.38,4.7],[-74.17,5],[-73.75,5],[-73.9,4.37],[-74.25,4.31],[-74.38,4.7]]]}},colombia:{type:"Feature",id:"colombia",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.8,11.8],[-71.3,12.7],[-70.9,11.9],[-71.98242,11.65762],[-72.2406,11.14607],[-72.45483,11.10295],[-72.8833,10.43379],[-72.94922,9.83898],[-73.31177,9.20514],[-72.99866,9.29189],[-72.94373,9.09125],[-72.76245,9.12379],[-72.65259,8.61633],[-72.39716,8.36098],[-72.34497,8.00484],[-72.4054,8.04563],[-72.49054,7.945],[-72.4411,7.89875],[-72.45209,7.53676],[-72.43835,7.40605],[-72.18567,7.38426],[-72.14996,7.32161],[-72.18018,7.24532],[-72.03461,7.0273],[-71.12,7.02457],[-71.09528,6.98641],[-70.9964,6.98641],[-70.77942,7.09817],[-70.5542,7.07636],[-70.30701,6.93461],[-70.11475,6.98095],[-69.43016,6.10778],[-69.34914,6.13987],[-69.31,6.0873],[-69.23378,6.08047],[-69.17404,6.15011],[-69.03877,6.22384],[-68.66455,6.14055],[-67.80762,6.288],[-67.45056,6.21155],[-67.47803,6.10232],[-67.40662,6.00946],[-67.60437,5.7909],[-67.63184,5.4629],[-67.82959,5.31524],[-67.79114,4.28068],[-67.62085,3.74915],[-67.5,3.78204],[-67.29126,3.36537],[-67.86255,2.82234],[-67.58789,2.79491],[-67.1759,2.33395],[-66.85181,1.23037],[-67.08801,1.16172],[-67.16766,1.83989],[-67.34894,1.97715],[-67.36816,2.22417],[-67.44781,2.21868],[-67.56866,2.054],[-67.80487,1.98813],[-67.91199,1.81793],[-68.18939,2.01009],[-68.2663,1.85087],[-68.16193,1.73008],[-69.83459,1.71361],[-69.8291,1.08209],[-69.19739,1.06561],[-69.15344,0.62621],[-69.48303,0.73057],[-69.79065,0.58776],[-70.02686,0.57128],[-70.04059,-0.19226],[-69.60937,-0.50262],[-69.55719,-0.65367],[-69.61212,-0.7498],[-69.41986,-1.03541],[-69.40338,-1.37041],[-69.9321,-4.21974],[-69.94995,-4.23275],[-70.06531,-4.08071],[-70.1841,-3.93893],[-70.28641,-3.82246],[-70.35027,-3.80054],[-70.50613,-3.87796],[-70.71075,-3.793],[-70.04883,-2.75102],[-70.8783,-2.23241],[-71.41113,-2.37786],[-71.75171,-2.19124],[-72.36694,-2.48762],[-72.63336,-2.36688],[-72.67456,-2.4595],[-72.93274,-2.4492],[-73.1813,-2.22692],[-73.10028,-2.0842],[-73.14697,-1.79597],[-73.55347,-1.69439],[-73.47382,-1.55437],[-73.64136,-1.26607],[-73.85834,-1.22763],[-74.27582,-0.97774],[-74.42139,-0.51086],[-74.79492,-0.23621],[-75.20142,-0.06592],[-75.27832,-0.12909],[-75.80566,0.04669],[-76.09955,0.32959],[-76.32751,0.42572],[-76.40991,0.37903],[-76.41266,0.23621],[-76.96198,0.27191],[-77.11029,0.36529],[-77.53601,0.40649],[-77.48383,0.65093],[-77.69257,0.73606],[-77.66441,0.81296],[-77.7166,0.85141],[-77.74544,0.83562],[-77.77565,0.83974],[-77.80861,0.82738],[-77.8196,0.80678],[-77.96173,0.82257],[-78.19794,0.94478],[-78.19931,0.99284],[-78.28308,1.05325],[-78.2515,1.08346],[-78.31741,1.19193],[-78.43002,1.1425],[-78.55499,1.2496],[-78.61816,1.24685],[-80,2.5],[-77.7,7.7],[-77.55524,7.51498],[-77.32178,7.87971],[-77.17896,7.93956],[-77.5,8.5],[-75.8,11.8]]]}},ecuador:{type:"Feature",id:"ecuador",properties:{},geometry:{type:"Polygon",coordinates:[[[-82,-3],[-80,2.2],[-77.86079,0.80404],[-77.72072,0.85484],[-77.66287,0.81794],[-77.66424,0.80884],[-77.67385,0.80215],[-77.67729,0.79099],[-77.66184,0.78979],[-77.68587,0.77365],[-77.6972,0.74241],[-77.67523,0.73778],[-77.5573,0.65058],[-77.47353,0.6626],[-77.52159,0.44837],[-76.47583,0.20874],[-76.32202,0.4422],[-76.0199,0.30487],[-75.81665,0.09064],[-75.26733,-0.1181],[-75.31265,-0.16617],[-75.50629,-0.21698],[-75.22888,-0.56441],[-75.20279,-0.97362],[-75.28931,-0.99147],[-75.36072,-0.95027],[-75.64087,-1.62576],[-76.63376,-2.59052],[-77.84637,-3],[-78.2872,-3.42158],[-79.01917,-5.01844],[-79.24301,-4.96581],[-79.62753,-4.42656],[-79.79233,-4.48954],[-80.12535,-4.29784],[-80.36018,-4.49775],[-80.44584,-4.45086],[-80.44739,-4.37692],[-80.33409,-4.21841],[-80.45013,-4.20968],[-80.44928,-4.13024],[-80.48035,-4.09445],[-80.47297,-4.05079],[-80.44739,-3.99719],[-80.39915,-3.98281],[-80.29701,-4.01843],[-80.12878,-3.89718],[-80.16106,-3.86704],[-80.19264,-3.60256],[-80.21633,-3.582],[-80.20706,-3.54705],[-80.21745,-3.5],[-80.22878,-3.50181],[-80.2335,-3.4899],[-80.2456,-3.48759],[-80.24545,-3.48481],[-80.24416,-3.48461],[-80.24386,-3.48247],[-80.24313,-3.48142],[-80.24393,-3.47881],[-80.24079,-3.47723],[-80.2438,-3.46463],[-80.22217,-3.44047],[-80.25238,-3.41],[-82,-3]]]}},paraguay:{type:"Feature",id:"paraguay",properties:{},geometry:{type:"Polygon",coordinates:[[[-54.25873,-24.35961],[-54.58403,-25.58921],[-54.65681,-25.67588],[-54.67916,-25.99493],[-54.61857,-26.20862],[-54.78678,-26.6308],[-55.42267,-26.99497],[-55.60553,-27.1621],[-55.73675,-27.44486],[-55.78857,-27.44309],[-55.89775,-27.34371],[-55.97809,-27.35591],[-56.06259,-27.30569],[-56.29415,-27.41973],[-56.37473,-27.58873],[-56.601,-27.42072],[-56.84909,-27.606],[-56.96547,-27.50172],[-57.48737,-27.44388],[-57.87465,-27.27496],[-58.59888,-27.29953],[-58.64896,-27.12631],[-58.31974,-26.8579],[-58.18979,-26.64487],[-58.22086,-26.41372],[-58.08456,-26.11154],[-57.89095,-25.96589],[-57.74047,-25.65014],[-57.55483,-25.44809],[-57.76072,-25.17162],[-58.2415,-24.9277],[-58.67226,-24.83161],[-59.3538,-24.4779],[-59.47537,-24.3323],[-60.03924,-24.01125],[-60.37336,-24.02369],[-60.98973,-23.81777],[-61.08807,-23.61362],[-61.73595,-23.234],[-62.20654,-22.70386],[-62.30073,-22.48627],[-62.64387,-22.24906],[-62.26072,-21.05983],[-62.26622,-20.56305],[-61.92152,-20.08915],[-61.73647,-19.63289],[-59.97488,-19.29332],[-59.06988,-19.28619],[-58.20814,-19.80515],[-57.83186,-20.9842],[-57.92507,-21.63334],[-57.88113,-21.68734],[-57.90602,-21.71294],[-57.97194,-22.07832],[-56.81013,-22.27099],[-56.56363,-22.20044],[-56.49462,-22.08659],[-56.39677,-22.07641],[-56.26631,-22.24811],[-56.01774,-22.29259],[-55.8526,-22.28227],[-55.78935,-22.38413],[-55.74034,-22.38913],[-55.75132,-22.47989],[-55.7472,-22.50653],[-55.72347,-22.5514],[-55.69845,-22.56298],[-55.69365,-22.57788],[-55.62361,-22.62986],[-55.38191,-24.00601],[-54.65973,-23.82806],[-54.31366,-24.01762],[-54.25873,-24.35961]]]}},peru:{type:"Feature",id:"peru",properties:{},geometry:{type:"Polygon",coordinates:[[[-83,-3],[-80.25238,-3.41],[-80.22217,-3.44047],[-80.2438,-3.46463],[-80.24079,-3.47723],[-80.24393,-3.47881],[-80.24313,-3.48142],[-80.24386,-3.48247],[-80.24416,-3.48461],[-80.24545,-3.48481],[-80.2456,-3.48759],[-80.2335,-3.4899],[-80.22878,-3.50181],[-80.21745,-3.5001],[-80.20706,-3.54705],[-80.21633,-3.582],[-80.19264,-3.60256],[-80.16106,-3.86704],[-80.12878,-3.89718],[-80.29701,-4.01843],[-80.39915,-3.98281],[-80.44739,-3.99719],[-80.47297,-4.05079],[-80.48035,-4.09445],[-80.44928,-4.13024],[-80.45013,-4.20968],[-80.33409,-4.21841],[-80.44739,-4.37692],[-80.44584,-4.45086],[-80.36018,-4.49775],[-80.12535,-4.29784],[-79.79233,-4.48954],[-79.62753,-4.42656],[-79.24301,-4.96581],[-79.01917,-5.01844],[-78.2872,-3.42158],[-77.84637,-3],[-76.63376,-2.59052],[-75.64087,-1.62576],[-75.36072,-0.95027],[-75.56534,-0.13806],[-75.15884,-0.06665],[-74.40628,-0.55553],[-72.92862,-2.39505],[-70.9552,-2.25162],[-70.02686,-2.70987],[-70.70595,-3.78478],[-70.49789,-3.88142],[-70.32349,-3.8088],[-69.95819,-4.23211],[-69.94446,-4.29784],[-69.99802,-4.37316],[-70.10376,-4.29164],[-70.19028,-4.35946],[-71.82999,-4.5662],[-72.86133,-5.25507],[-73.94348,-7.4932],[-72.19116,-9.95803],[-70.61188,-9.57638],[-70.62149,-10.96681],[-69.57161,-10.94557],[-68.65494,-12.49629],[-69.01886,-13.62196],[-68.83896,-14.22445],[-69.38141,-14.86251],[-69.14795,-15.24444],[-69.39926,-15.6151],[-69.19189,-16.17449],[-69.10177,-16.22555],[-68.96152,-16.19456],[-68.78952,-16.34254],[-68.98865,-16.42357],[-69.04015,-16.57368],[-69.01886,-16.65198],[-69.61075,-17.26542],[-69.46896,-17.37423],[-69.46827,-17.49919],[-69.66654,-17.66071],[-69.81262,-17.67281],[-69.75,-18],[-70,-18.27],[-75,-19],[-83,-3]]]}},latam:{type:"Feature",id:"latam",properties:{},geometry:{type:"Polygon",coordinates:[[[-123,14],[-117.45574,32.58935],[-117.23326,32.52453],[-116.43813,32.58992],[-115.96571,32.62752],[-115.48953,32.66395],[-114.71211,32.7179],[-114.7455,32.65614],[-114.79837,32.6067],[-114.81091,32.49615],[-111.06611,31.33282],[-109.5397,31.33311],[-108.86816,31.33165],[-108.2131,31.33135],[-108.21447,31.78655],[-106.52962,31.78363],[-106.51966,31.77225],[-106.50867,31.76116],[-106.4867,31.74715],[-106.4716,31.75123],[-106.46851,31.75912],[-106.45409,31.76554],[-106.43898,31.75678],[-106.41426,31.75007],[-106.37959,31.7305],[-106.37409,31.71269],[-106.35075,31.69575],[-106.33289,31.65835],[-106.30543,31.6224],[-106.28002,31.56186],[-106.24741,31.54314],[-106.21101,31.47347],[-106.17805,31.45766],[-106.14956,31.43335],[-106.00502,31.38881],[-105.76607,31.16816],[-105.38292,30.84683],[-104.9121,30.63644],[-104.67293,29.91804],[-104.39415,29.56151],[-103.20921,28.98742],[-102.4182,29.81056],[-101.4514,29.77242],[-100.96779,29.34866],[-100.9005,29.31454],[-100.69725,29.14257],[-100.62309,28.91322],[-100.51598,28.749],[-100.51186,28.70474],[-100.50293,28.66227],[-100.40337,28.58271],[-100.01472,28.06956],[-99.53957,27.59837],[-99.53339,27.57859],[-99.51279,27.5655],[-99.52103,27.55607],[-99.52824,27.49731],[-99.5018,27.50066],[-99.48601,27.49426],[-99.47777,27.48299],[-99.48498,27.4635],[-99.49596,27.44857],[-99.48669,27.39067],[-99.53476,27.31321],[-99.44344,27.25951],[-99.45717,27.03222],[-99.07127,26.42692],[-98.9978,26.39248],[-98.46771,26.21028],[-98.25966,26.09194],[-98.08388,26.05061],[-97.95067,26.06172],[-97.79205,26.05185],[-97.57919,25.95002],[-97.51328,25.89073],[-97.46315,25.87899],[-97.41783,25.83821],[-97.34367,25.92594],[-97,26],[-81,24],[-73.5,20.5],[-64,20],[-29,0],[-29,-20],[-63,-51],[-62,-57],[-72,-57],[-113,-30],[-123,14]]]}}};
23654 var resources = {"bw-facebook":{id:"bw-facebook",type:"facebook",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana",url:"https://www.facebook.com/MappingBotswana/",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"bw-twitter":{id:"bw-twitter",type:"twitter",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana",url:"https://twitter.com/mappingbotswana",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"cape-coast-youthmappers":{id:"cape-coast-youthmappers",featureId:"cape_coast_gh",type:"twitter",name:"University of Cape Coast YouthMappers",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable.",url:"https://twitter.com/YouthmappersUCC",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-facebook":{id:"osm-gh-facebook",featureId:"ghana",type:"facebook",name:"OpenStreetMap Ghana on Facebook",countryCodes:["gh"],languageCodes:["en"],description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us.",url:"https://www.facebook.com/OSMGhana/",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-twitter":{id:"osm-gh-twitter",featureId:"ghana",type:"twitter",name:"OpenStreetMap Ghana on Twitter",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmghana",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"talk-gh":{id:"talk-gh",featureId:"ghana",type:"mailinglist",name:"Talk-gh Mailing List",countryCodes:["gh"],languageCodes:["en"],description:"Talk-gh is the official mailing list for Ghana OSM community.",url:"https://lists.openstreetmap.org/listinfo/talk-gh",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-mg-facebook":{id:"osm-mg-facebook",featureId:"madagascar",type:"facebook",name:"OpenStreetMap Madagascar Facebook Group",countryCodes:["mg"],languageCodes:["mg","fr"],description:"Malagasy Facebook group for people interested in OpenStreetMap.",url:"https://www.facebook.com/groups/1601381123461284/",contacts:[{name:"Brice Ramamonjy",email:"rafaby21@gmail.com"},{name:"Dolly Andriatsiferana",email:"privatemajory@gmail.com"}]},"talk-mg":{id:"talk-mg",featureId:"madagascar",type:"mailinglist",countryCodes:["mg"],languageCodes:["mg","fr"],name:"Talk-mg Mailing List",description:"Place for OpenStreetMap contributors, communities and users in Madagascar to share and discuss.",url:"https://lists.openstreetmap.org/listinfo/talk-mg",contacts:[{name:"Brice Ramamonjy",email:"rafaby21@gmail.com"},{name:"Dolly Andriatsiferana",email:"privatemajory@gmail.com"}]},"OSM-BGD-facebook":{id:"OSM-BGD-facebook",featureId:"BGD",type:"facebook",name:"OpenStreetMap Bangladesh",description:"Improve OpenStreetMap in Bangladesh",extendedDescription:"Mapping in Bangladesh? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://www.facebook.com/groups/osmbd/",contacts:[{name:"Ahasanul Hoque",email:"hoque.ahasan@gmail.com"}]},"OSM-India-facebook":{id:"OSM-India-facebook",featureId:"india_full",type:"facebook",name:"OpenStreetMap India - Participatory neighborhood mapping",description:"Improve OpenStreetMap in India",extendedDescription:"Mapping in India? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://www.facebook.com/groups/mappingindia/",contacts:[{name:"Jinal Foflia",email:"fofliajinal@gmail.com"},{name:"Arun Ganesh",email:"arun.planemad@gmail.com"}],events:[{id:"sotmasia2018",i18n:true,name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India",when:"2018-11-17",url:"http://stateofthemap.asia/"}]},"OSM-india-mailinglist":{id:"OSM-india-mailinglist",featureId:"india_full",type:"mailinglist",name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community",url:"https://lists.openstreetmap.org/listinfo/talk-in",contacts:[{name:"Arun Ganesh",email:"arun.planemad@gmail.com"}]},"OSM-india-twitter":{id:"OSM-india-twitter",featureId:"india_full",type:"twitter",name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}",url:"https://twitter.com/osm_in",contacts:[{name:"Jinal Foflia",email:"fofliajinal@gmail.com"}]},"OSM-India-Puducherry-Facebook":{id:"OSM-India-Puducherry-Facebook",featureId:"india_puducherry",type:"facebook",name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events.",url:"https://www.facebook.com/FSHMP",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-India-Puducherry-Matrix":{id:"OSM-India-Puducherry-Matrix",featureId:"india_puducherry",type:"matrix",name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism.",url:"https://riot.im/app/#/room/#fshm:matrix.org",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-IDN-facebook":{id:"OSM-IDN-facebook",featureId:"IDN",type:"facebook",name:"OpenStreetMap Indonesia",description:"Improve OpenStreetMap in Indonesia",extendedDescription:"Mapping in Indonesia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/osm.id/",contacts:[{name:"Yantisa Akhadi",email:"yantisa.akhadi@hotosm.org"}]},"OSM-japan-facebook":{id:"OSM-japan-facebook",featureId:"japan",type:"facebook",name:"OpenStreetMap Japan Community",countryCodes:["jp"],languageCodes:["jp"],description:"Mappers and OpenStreetMap users in Japan",url:"https://www.facebook.com/groups/osmjapan/",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-japan-mailinglist":{id:"OSM-japan-mailinglist",featureId:"japan",type:"mailinglist",name:"OpenStreetMap Japan Mailinglist",countryCodes:["jp"],languageCodes:["jp"],description:"Talk-ja is an Official Mailinglist for Japanese Community",url:"https://lists.openstreetmap.org/listinfo/talk-ja",contacts:[{name:"OSMF Japan",email:"info@osmf.jp"}]},"OSM-japan-twitter":{id:"OSM-japan-twitter",featureId:"japan",type:"twitter",name:"OpenStreetMap Japan Twitter",countryCodes:["jp"],languageCodes:["jp"],description:"Hashtag on Twitter: {url}",url:"https://twitter.com/hashtag/osmjp",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-japan-website":{id:"OSM-japan-website",featureId:"japan",type:"group",name:"OpenStreetMap Japan",countryCodes:["jp"],languageCodes:["jp"],description:"Mappers and OpenStreetMap users in Japan",url:"https://openstreetmap.jp/",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-korea-telegram":{id:"OSM-korea-telegram",featureId:"korea",type:"telegram",countryCodes:["ko"],languageCodes:["ko","en"],name:"OSM Korea Telegram Channel",description:"Unofficial Channnel for OpenStreetMap contributors, communities and users in Korea to share and discuss.",url:"https://t.me/osmKorea",contacts:[{name:"Yongmin Hong",email:"revi@pobox.com"},{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-MY-facebook":{id:"OSM-MY-facebook",featureId:"malaysia",type:"facebook",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!",url:"https://www.facebook.com/groups/openstreetmapMY/",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-forum":{id:"OSM-MY-forum",featureId:"malaysia",type:"forum",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=60",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-matrix":{id:"OSM-MY-matrix",featureId:"malaysia",type:"matrix",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}",signupUrl:"https://riot.im/app/#/register",url:"https://riot.im/app/#/room/#OpenstreetmapMalaysia:matrix.org",contacts:[{name:"Ahmad Amsyar",email:"OfficiallyAhmad@protonmail.ch"}]},"OSM-MNG-facebook":{id:"OSM-MNG-facebook",featureId:"MNG",type:"facebook",name:"OpenStreetMap Mongolia",description:"Improve OpenStreetMap in Mongolia",extendedDescription:"Mapping in Mongolia? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/OSM.Mongolia/",contacts:[{name:" ",email:"talk-mn@openstreetmap.org"}]},"OSM-MMR-facebook":{id:"OSM-MMR-facebook",featureId:"MMR",type:"facebook",name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/osmmm/",contacts:[{name:"Yan Naung Oak",email:"yan@phandeeyar.org"},{name:"Patrick Oswald",email:"patrickoswald.omm@gmail.com"},{name:"Set Khaing Oo",email:"setkhaing@phandeeyar.org"}]},"OSM-Nepal-facebook":{id:"OSM-Nepal-facebook",featureId:"NPL",type:"facebook",name:"OpenStreetMap Nepal",description:"Improve OpenStreetMap in Nepal",extendedDescription:"Mapping in Nepal? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/mapkathmandu/",contacts:[{name:"Kshitiz Khanal",email:"khanal1990@gmail.com"}]},"OSM-PH-facebook":{id:"OSM-PH-facebook",featureId:"philippines",type:"facebook",countryCodes:["ph"],name:"OpenStreetMap PH Facebook",description:"Welcome to OpenStreetMap Philippines, where we encourage all fellow Filipinos to contribute to the OpenStreetMap project.",url:"https://www.facebook.com/OSMPH/",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-mailinglist":{id:"OSM-PH-mailinglist",featureId:"philippines",type:"mailinglist",countryCodes:["ph"],name:"Talk-ph Mailing List",description:"A mailing list to discuss OpenStreetMap in the Philippines",url:"https://lists.openstreetmap.org/pipermail/talk-ph/",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-slack":{id:"OSM-PH-slack",featureId:"philippines",type:"slack",countryCodes:["ph"],name:"OpenStreetMap PH Slack",description:"All are welcome! Sign up at {signupUrl}",signupUrl:"https://osmph-chat.herokuapp.com/",url:"https://osmph.slack.com",contacts:[{name:"Maning Sambale",email:"emmanuel.sambale@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-PH-telegram":{id:"OSM-PH-telegram",featureId:"philippines",type:"telegram",countryCodes:["ph"],languageCodes:["tl","en"],name:"OpenStreetMap PH Telegram",description:"Un-official, Telegram local community of OpenStreetMap contributors and friends in the Philippines",url:"https://t.me/osmph",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"},{name:"OSM PH Group",email:"osm.pilipinas@gmail.com"}]},"OSM-RU-forum":{id:"OSM-RU-forum",type:"forum",featureId:"russia",countryCodes:["ru"],languageCodes:["ru"],name:"OpenStreetMap RU forum",description:"OpenStreetMap Russia web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=21",contacts:[{name:"Ilya Zverev",email:"ilya@zverev.info"}]},"OSM-RU-telegram":{id:"OSM-RU-telegram",type:"telegram",featureId:"russia",countryCodes:["ru"],languageCodes:["ru"],name:"OpenStreetMap RU telegram",description:"OpenStreetMap Russia telegram chat",url:"https://t.me/ruosm",contacts:[{name:"Ilya Zverev",email:"ilya@zverev.info"}]},"OSM-LKA-facebook":{id:"OSM-LKA-facebook",featureId:"LKA",type:"facebook",name:"OpenStreetMap Sri Lanka",description:"Improve OpenStreetMap in Sri Lanka",extendedDescription:"Mapping in Sri Lanka? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/142058222659672/",contacts:[{name:"Karan Suthakaran",email:"karansuthakaran@yahoo.com"}]},"OSM-TW-facebook":{id:"OSM-TW-facebook",featureId:"taiwan",type:"facebook",name:"OpenStreetMap Taiwan Community",countryCodes:["tw"],languageCodes:["zh-tw"],description:"Facebook Group for Mappers and OpenStreetMap users to discuss matters about Taiwan.",url:"https://www.facebook.com/groups/OpenStreetMap.TW/",contacts:[{name:"Nobody 沒有人 (Public mail)",email:"hiboard@openstreetmap.tw"}]},"OSM-TW-mailinglist":{id:"OSM-TW-mailinglist",featureId:"taiwan",type:"mailinglist",name:"OpenStreetMap Taiwan Mailinglist",countryCodes:["tw"],languageCodes:["zh-tw","en"],description:"Talk-tw is an Official Mailinglist for the Communities to dicuss matters about Taiwan",url:"https://lists.openstreetmap.org/listinfo/talk-tw",contacts:[{name:"Nobody 沒有人 (Public email)",email:"hiboard@openstreetmap.tw"}]},"OSM-TH-CNX-meetup":{id:"OSM-TH-CNX-meetup",featureId:"thailand_cnx",type:"meetup",countryCodes:["th"],languageCodes:["en"],name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Team Chiang Mai",email:"meetup-cnx@openstreetmap.in.th"}]},"OSM-TH-facebook":{id:"OSM-TH-facebook",featureId:"thailand_full",type:"facebook",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand",url:"https://www.facebook.com/groups/thaiosm/",contacts:[{name:"Theppitak Karoonboonyanan",email:"theppitak@gmail.com"}]},"OSM-TH-forum":{id:"OSM-TH-forum",featureId:"thailand_full",type:"forum",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Stephan Knauss",email:"osm@stephans-server.de"}]},"al-forum":{id:"al-forum",featureId:"albania",type:"forum",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=91",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-maptime-tirana":{id:"al-maptime-tirana",featureId:"al-tirana",type:"group",countryCodes:["al"],languageCodes:["sq","en"],name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time.",url:"http://maptime.io/tirana/",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-telegram":{id:"al-telegram",featureId:"albania",type:"telegram",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel",url:"https://telegram.me/OpenStreetMapAL",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"at-forum":{id:"at-forum",featureId:"austria",type:"forum",name:"OpenStreetMap Austria Forum",countryCodes:["at"],languageCodes:["en","de"],description:"The official forum for OpenStreetMap questions in and around Austria",url:"https://forum.openstreetmap.org/viewforum.php?id=89",contacts:[{name:"emga",email:"emgaosm@gmail.com"}]},"at-mailinglist":{id:"at-mailinglist",featureId:"austria",type:"mailinglist",name:"Talk-at Mailing List",countryCodes:["at"],languageCodes:["de"],description:"Talk-at is the official mailing list for the Austrian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-at",contacts:[{name:"AT community",email:"info@openstreetmap.at"}]},"at-twitter":{id:"at-twitter",featureId:"austria",type:"twitter",name:"OpenStreetMap Austria Twitter",countryCodes:["at"],languageCodes:["de"],description:"OpenStreetMap Austria On Twitter: {url}",url:"https://twitter.com/osm_at",contacts:[{name:"AT Community",email:"info@openstreetmap.at"}]},"osmgraz-meetup":{id:"osmgraz-meetup",featureId:"graz",type:"meetup",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz",url:"https://wiki.openstreetmap.org/wiki/Graz/Stammtisch",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"osmgraz-twitter":{id:"osmgraz-twitter",featureId:"graz",type:"twitter",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter",url:"https://twitter.com/osmgraz",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"osm-at":{id:"osm-at",featureId:"austria",type:"group",countryCodes:["at"],languageCodes:["de"],name:"OpenStreetMap Austria",description:"The platform for information on OpenStreetMap in Austria",url:"https://www.openstreetmap.at/",contacts:[{name:"AT community",email:"info@openstreetmap.at"}]},byosm:{id:"byosm",type:"telegram",featureId:"belarus",languageCodes:["ru","be","en"],name:"OpenStreetMap Belarus",description:"OpenStreetMap Belarus telegram chat",url:"https://t.me/byosm",contacts:[{name:"Darafei Praliaskouski",email:"me@komzpa.net"}]},"be-facebook":{id:"be-facebook",featureId:"belgium",type:"facebook",name:"OpenStreetMap BE Community",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Mappers and OpenStreetMap on Facebook in Belgium",url:"https://www.facebook.com/groups/1419016881706058/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-forum":{id:"be-forum",type:"forum",featureId:"belgium",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap BE forum",description:"OpenStreetMap Belgium web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=29",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-irc":{id:"be-irc",featureId:"belgium",type:"irc",name:"OpenStreetMap Belgium IRC",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Join #osmbe on irc.oftc.net (port 6667)",extendedDescription:"Join #osmbe on irc.oftc.net (port 6667), it is bridged with the Matrix chat channel",url:"https://webchat.oftc.net/?channels=osmbe",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-mailinglist":{id:"be-mailinglist",featureId:"belgium",type:"mailinglist",name:"Talk-be Mailing List",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Talk-be is the official mailing list for the Belgian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-be",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-maptime":{id:"be-maptime",featureId:"belgium",type:"group",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"Maptime Belgium",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time.",url:"http://maptime.io/belgium/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-matrix":{id:"be-matrix",featureId:"belgium",type:"matrix",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects.",url:"https://riot.im/app/#/group/+osmbe:matrix.org",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-meetup":{id:"be-meetup",featureId:"belgium",type:"meetup",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!",url:"https://meetup.com/OpenStreetMap-Belgium/",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-twitter":{id:"be-twitter",featureId:"belgium",type:"twitter",name:"OpenStreetMap Belgium Twitter",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"OSM Belgium on Twitter: @osm_be",url:"https://twitter.com/osm_be",contacts:[{name:"BE community",email:"community@osm.be"}]},"hr-facebook":{id:"hr-facebook",featureId:"croatia",type:"facebook",name:"OpenStreetMap Croatia Facebook group",countryCodes:["hr"],languageCodes:["hr"],description:"OpenStreetMap Croatia Facebook group",url:"https://www.facebook.com/groups/541098862671461",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-irc":{id:"hr-irc",featureId:"croatia",type:"irc",name:"OpenStreetMap Croatia on IRC",countryCodes:["hr"],languageCodes:["hr"],description:"Join #osm-hr on irc.freenode.org (port 6667)",url:"https://webchat.freenode.net/?url=irc://irc.freenode.net/osm-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-mailinglist":{id:"hr-mailinglist",featureId:"croatia",type:"mailinglist",name:"Talk-hr Mailing List",countryCodes:["hr"],languageCodes:["hr"],description:"Talk-hr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"czech-community":{id:"czech-community",featureId:"czechia",type:"group",name:"Czech OSM community",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Map portal, website and contacts on OSM members in Czechia",url:"https://openstreetmap.cz/komunita",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-facebook":{id:"osmcz-facebook",featureId:"czechia",type:"facebook",name:"OpenStreetMap CZ on Facebook",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Facebook - including translated WeeklyOSM!",url:"https://www.facebook.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-twitter":{id:"osmcz-twitter",featureId:"czechia",type:"twitter",name:"Czech twitter @osmcz",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Twitter - including translated WeeklyOSM!",url:"https://twitter.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"talk-cz-mailinglist":{id:"talk-cz-mailinglist",featureId:"czechia",type:"mailinglist",name:"Czech mailing list (talk-cz)",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Talk-cz is the official mailing list for Czech community",url:"https://openstreetmap.cz/talkcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"dk-forum":{id:"dk-forum",type:"forum",featureId:"denmark",countryCodes:["dk"],languageCodes:["da"],name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=48",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-irc":{id:"dk-irc",featureId:"denmark",type:"irc",name:"OpenStreetMap Denmark IRC",countryCodes:["dk"],languageCodes:["da"],description:"Join #osm-dk on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-mailinglist":{id:"dk-mailinglist",featureId:"denmark",type:"mailinglist",name:"Talk-dk Mailing List",countryCodes:["dk"],languageCodes:["da"],description:"A mailing list to discuss OpenStreetMap in Denmark",url:"https://lists.openstreetmap.org/listinfo/talk-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"fi-forum":{id:"fi-forum",featureId:"finland",type:"forum",countryCodes:["fi"],languageCodes:["fi"],name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=15",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-irc":{id:"fi-irc",featureId:"finland",type:"irc",name:"OpenStreetMap Finland IRC",countryCodes:["fi"],languageCodes:["fi"],description:"Join #osm-fi on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-mailinglist":{id:"fi-mailinglist",featureId:"finland",type:"mailinglist",name:"Talk-fi Mailing List",countryCodes:["fi"],languageCodes:["fi"],description:"Talk-fi is the official mailing list for the Finnish OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fr-facebook":{id:"fr-facebook",featureId:"france",type:"facebook",name:"OpenStreetMap France Facebook page",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France Facebook page",url:"https://www.facebook.com/osmfr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-forum":{id:"fr-forum",type:"forum",featureId:"france",countryCodes:["fr"],languageCodes:["fr"],name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum",url:"https://forum.openstreetmap.fr/",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-irc":{id:"fr-irc",featureId:"france",type:"irc",name:"OpenStreetMap France on IRC",countryCodes:["fr"],languageCodes:["fr"],description:"Join #osm-fr on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-mailinglist":{id:"fr-mailinglist",featureId:"france",type:"mailinglist",name:"Talk-fr Mailing List",countryCodes:["fr"],languageCodes:["fr"],description:"Talk-fr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-twitter":{id:"fr-twitter",featureId:"france",type:"twitter",name:"OpenStreetMap France on Twitter",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France on Twitter: {url}",url:"https://twitter.com/osm_fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"de-berlin-mailinglist":{id:"de-berlin-mailinglist",featureId:"de-berlin-brandenburg",type:"mailinglist",name:"Berlin Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Berlin OSM community",url:"https://lists.openstreetmap.de/listinfo/berlin",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-berlin-meetup":{id:"de-berlin-meetup",featureId:"de-berlin-brandenburg",type:"meetup",name:"OpenStreetMap Berlin-Brandenburg Meetup",countryCodes:["de"],languageCodes:["de"],description:"Mappers and OpenStreetMap users in the Berlin area",url:"https://www.meetup.com/OSM-Berlin-Brandenburg/",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-telegram":{id:"de-berlin-telegram",featureId:"de-berlin-brandenburg",type:"telegram",name:"@osmberlin on Telegram",countryCodes:["de"],languageCodes:["de"],description:"OpenStreetMap Berlin Telegram chat",url:"https://t.me/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-twitter":{id:"de-berlin-twitter",featureId:"de-berlin-brandenburg",type:"twitter",name:"OpenStreetMap Berlin Twitter",countryCodes:["de"],languageCodes:["de"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-forum":{id:"de-forum",featureId:"germany",type:"forum",countryCodes:["de"],languageCodes:["de"],name:"OpenStreetMap DE forum",description:"OpenStreetMap Germany web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=14",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-irc":{id:"de-irc",featureId:"germany",type:"irc",name:"OpenStreetMap Germany IRC",countryCodes:["de"],languageCodes:["de"],description:"Join #osm-de on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-de",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-mailinglist":{id:"de-mailinglist",featureId:"germany",type:"mailinglist",name:"Talk-de Mailing List",countryCodes:["de"],languageCodes:["de"],description:"Talk-de is the official mailing list for the German OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-de",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-ostwestfalen-lippe-mailinglist":{id:"de-ostwestfalen-lippe-mailinglist",featureId:"de-ostwestfalen-lippe",type:"mailinglist",name:"OWL Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Ostwestfalen-Lippe OSM community",url:"https://gt.owl.de/mailman/listinfo/osm",contacts:[{name:"Florian Lohoff",email:"osm-owner@gt.owl.de"}]},"de-telegram":{id:"de-telegram",featureId:"germany",type:"telegram",name:"OpenStreetMap Germany Telegram",countryCodes:["de"],languageCodes:["de"],description:"Join the OpenStreetMap Germany Telegram supergroup at {url}",url:"https://t.me/OSM_de",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"osm-de":{id:"osm-de",featureId:"germany",type:"group",countryCodes:["de"],languageCodes:["de"],name:"OpenStreetMap Germany",description:"The platform for information on OpenStreetMap in Germany",url:"https://www.openstreetmap.de/",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"hu-facebook":{id:"hu-facebook",featureId:"hungary",type:"facebook",name:"OpenStreetMap HU on Facebook",countryCodes:["hu"],languageCodes:["hu"],description:"Mappers and OpenStreetMap Facebook in Hungary",url:"https://www.facebook.com/groups/osm.hu/",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-forum":{id:"hu-forum",featureId:"hungary",type:"forum",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum",url:"https://groups.google.com/forum/#!forum/openstreetmap-hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-meetup":{id:"hu-meetup",featureId:"hungary",type:"meetup",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary",url:"https://www.meetup.com/OpenStreetMap-Hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"is-facebook":{id:"is-facebook",type:"facebook",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland",url:"https://www.facebook.com/osmiceland/",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-mailinglist":{id:"is-mailinglist",type:"mailinglist",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-is",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-twitter":{id:"is-twitter",type:"twitter",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Twittter",description:"Twitter of OpenStreetMap in Iceland",url:"https://twitter.com/openstreetmapis",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"it-facebook":{id:"it-facebook",featureId:"italy",type:"facebook",name:"OpenStreetMap Italy Facebook",countryCodes:["it"],languageCodes:["it"],description:"Join the OpenStreetMap Italy community on Facebook",url:"https://www.facebook.com/OpenStreetMap.Italia/",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-irc":{id:"it-irc",featureId:"italy",type:"irc",name:"OpenStreetMap Italy IRC",countryCodes:["it"],languageCodes:["it"],description:"Join #osm-it on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-mailinglist":{id:"it-mailinglist",featureId:"italy",type:"mailinglist",name:"Talk-it Mailing List",countryCodes:["it"],languageCodes:["it"],description:"Talk-it is the official mailing list for the Italian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-telegram":{id:"it-telegram",type:"telegram",featureId:"italy",countryCodes:["it"],languageCodes:["it"],name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat",url:"https://t.me/OpenStreetMapItalia",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-twitter":{id:"it-twitter",featureId:"italy",type:"twitter",name:"OpenStreetMap Italy Twitter",countryCodes:["it"],languageCodes:["it"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapIt",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"OSM-Rome-meetup":{id:"OSM-Rome-meetup",featureId:"IT_Roma_Capitale",type:"group",name:"Incontro Mappatori Romani",countryCodes:["it"],languageCodes:["it"],description:"Improve OpenStreetMap in the Rome area",extendedDescription:"We aim to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Lazio.",url:"https://wiki.openstreetmap.org/wiki/Rome/Incontro",contacts:[{name:"Martin Koppenhoefer",email:"dieterdreist@gmail.com"}]},"South-Tyrol-Mailing-List":{id:"South-Tyrol-Mailing-List",featureId:"south_tyrol",type:"mailinglist",countryCodes:["it"],languageCodes:["de","it","lld","en"],name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol",url:"https://lists.openstreetmap.org/listinfo/talk-it-southtyrol",contacts:[{name:"Martin Raifer",email:"tyr.asd@gmail.com"}]},"talk-it-lazio":{id:"talk-it-lazio",featureId:"IT_Lazio",type:"mailinglist",countryCodes:["it"],languageCodes:["it"],name:"OpenStreetMap IT Lazio",description:"All are welcome! Sign up at {signupUrl}",extendedDescription:"Mailinglist for Rome and Lazio area.",signupUrl:"https://lists.openstreetmap.org/listinfo/talk-it-lazio",url:"https://lists.openstreetmap.org/listinfo/talk-it-lazio",contacts:[{name:"Martin Koppenhoefer",email:"dieterdreist@gmail.com"}]},"Trentino-Mailing-List":{id:"Trentino-Mailing-List",featureId:"trentino",type:"mailinglist",countryCodes:["it"],languageCodes:["it"],name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino",url:"https://lists.openstreetmap.org/listinfo/talk-it-trentino",contacts:[{name:"Luca Delucchi",email:"lucadeluge@gmail.com"}]},"no-forum":{id:"no-forum",type:"forum",featureId:"norway",countryCodes:["no"],languageCodes:["no"],name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=68",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}]},"no-irc":{id:"no-irc",featureId:"norway",type:"irc",name:"OpenStreetMap Norway on IRC",countryCodes:["no"],languageCodes:["no"],description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://webchat.oftc.net/?channels=osm-no"},"no-mailinglist":{id:"no-mailinglist",featureId:"norway",type:"mailinglist",name:"OpenStreetMap Norway mailing list",countryCodes:["no"],languageCodes:["no"],description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://lists.nuug.no/mailman/listinfo/kart"},"OSM-PL-facebook-group":{id:"OSM-PL-facebook-group",type:"facebook",featureId:"poland",countryCodes:["pl"],languageCodes:["pl"],name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland",url:"https://www.facebook.com/groups/500589303317858/",contacts:[{name:"Michał Brzozowski",email:"www.haxor@gmail.com"}]},"OSM-PL-forum":{id:"OSM-PL-forum",type:"forum",featureId:"poland",countryCodes:["pl"],languageCodes:["pl","en"],name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community",url:"https://forum.openstreetmap.org/viewforum.php?id=23",contacts:[{name:"Daniel Koć",email:"daniel@xn--ko-wla.pl"},{name:"Ryszard Mikke",email:"ryszard.mikke@gmail.com"}]},"si-forum":{id:"si-forum",type:"forum",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia",url:"https://forum.openstreetmap.org/viewforum.php?id=58",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"si-mailinglist":{id:"si-mailinglist",type:"mailinglist",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia",url:"https://lists.openstreetmap.org/listinfo/talk-si",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"OSM-ES-mailinglist":{id:"OSM-ES-mailinglist",type:"mailinglist",featureId:"spain",languageCodes:["es"],name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain",url:"https://lists.openstreetmap.org/listinfo/talk-es",contacts:[{name:"Iván Sánchez",email:"ivansanchez@escomposlinux.org"}]},"OSM-ES-telegram":{id:"OSM-ES-telegram",type:"telegram",featureId:"spain",languageCodes:["es"],name:"@OSMes on Telegram",description:"OpenStreetMap Spain Telegram chat",url:"https://t.me/OSMes",contacts:[{name:"Jorge Sanz",email:"sanchi2@gmail.com"}]},"osm-se":{id:"osm-se",featureId:"sweden",type:"group",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden",url:"http://openstreetmap.se/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-facebook":{id:"se-facebook",featureId:"sweden",type:"facebook",name:"OpenStreetMap Sweden Facebook",countryCodes:["se"],languageCodes:["sv"],description:"OpenStreetMap Sweden on Facebook",url:"https://www.facebook.com/groups/osmsweden/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-forum":{id:"se-forum",type:"forum",featureId:"sweden",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=4",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-irc":{id:"se-irc",featureId:"sweden",type:"irc",name:"OpenStreetMap Sweden IRC",countryCodes:["se"],languageCodes:["sv"],description:"Join #osm.se on irc.oftc.net (port 6667)",url:"https://irc.openstreetmap.org/?chan=osm.se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-mailinglist":{id:"se-mailinglist",featureId:"sweden",type:"mailinglist",name:"Talk-se Mailing List",countryCodes:["se"],languageCodes:["sv"],description:"A mailing list to discuss OpenStreetMap in Sweden",url:"https://lists.openstreetmap.org/listinfo/talk-se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-twitter":{id:"se-twitter",featureId:"sweden",type:"twitter",name:"OpenStreetMap Sweden on Twitter",countryCodes:["se"],languageCodes:["sv"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/openstreetmapse",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"Nottingham-OSM-pub-meetup":{id:"Nottingham-OSM-pub-meetup",featureId:"east_midlands_uk",type:"group",name:"East Midlands (Nottingham) Monthly pub meet-up",countryCodes:["gb"],languageCodes:["en"],description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose.",url:"https://wiki.openstreetmap.org/wiki/Nottingham/Pub-meetup",contacts:[{name:"Jerry Clough",email:"SK53.osm@gmail.com"}]},"gb-mailinglist":{id:"gb-mailinglist",featureId:"united_kingdom",type:"mailinglist",name:"Talk-gb Mailing List",countryCodes:["gb"],languageCodes:["en","cy"],description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"mappa-mercia-group":{id:"mappa-mercia-group",featureId:"england-west-midlands",type:"group",countryCodes:["gb"],languageCodes:["en"],name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data.",url:"http://www.mappa-mercia.org/",contacts:[{name:"Brian Prangle",email:"community@mappa-mercia.org"}]},"gb-irc":{id:"gb-irc",featureId:"united_kingdom",type:"irc",name:"OpenStreetMap United Kingdom IRC",countryCodes:["gb"],languageCodes:["en","cy"],description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question",url:"https://irc.openstreetmap.org/?chan=osm-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"OSM-CA-Slack":{id:"OSM-CA-Slack",featureId:"canada_full",type:"slack",countryCodes:["ca"],languageCodes:["en","fr"],name:"OSM-CA Slack",description:"All are welcome! Sign up at {signupUrl}.",signupUrl:"https://slackinviteosmcanada.herokuapp.com/",url:"https://osm-ca.slack.com/",contacts:[{name:"Denis Carriere",email:"carriere.denis@gmail.com"}]},"OSM-Vancouver-meetup":{id:"OSM-Vancouver-meetup",featureId:"vancouver_metro",type:"meetup",name:"OpenStreetMap Vancouver",countryCodes:["ca"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Vancouver, BC area",url:"https://www.meetup.com/OpenStreetMap-Vancouver/",contacts:[{name:"Paul Norman",email:"penorman@mac.com"},{name:"Peter Chin",email:"bpchin@gmail.com"}],events:[{name:"April Metrotown Mappy Hour",description:"Mappy Hour is the time and place for discussion of OpenStreetMap, from surveying data to consuming data. Beginners welcome. Bring your questions.",when:"2018-04-27 18:30",where:"Firefighters' Public House, 6515 Bonsor Avenue, Burnaby, BC",url:"https://www.meetup.com/OpenStreetMap-Vancouver/events/qzsbsmyxgbkc/"}]},"OSM-CU-telegram":{id:"OSM-CU-telegram",type:"telegram",featureId:"cuba",countryCodes:["cu"],languageCodes:["es"],name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat",url:"https://telegram.me/OSM_Cuba",contacts:[{name:"Talk-cu Owner",email:"talk-cu-owner@openstreetmap.org"}]},"OSM-NI-telegram":{id:"OSM-NI-telegram",type:"telegram",featureId:"nicaragua",countryCodes:["ni"],languageCodes:["es"],name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat",url:"https://telegram.me/MapaNica",contacts:[{name:"Talk-ni Owner",email:"talk-ni-owner@openstreetmap.org"}]},"Bay-Area-OpenStreetMappers":{id:"Bay-Area-OpenStreetMappers",featureId:"sf_bay_area",type:"meetup",name:"Bay Area OpenStreetMappers",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the Bay Area",extendedDescription:"This group is about growing the OpenStreetMap community here in the Bay Area. Our events are open to everyone, from open source enthusiasts, cyclists, GIS professionals, geocachers, and beyond. Anyone and everyone who is interested in maps, map making and free map data is welcome to join our group as well as attend our events.",url:"https://www.meetup.com/Bay-Area-OpenStreetMappers/",contacts:[{name:"Ben Discoe",email:"bdiscoe@gmail.com"}]},"Central-Pennsylvania-OSM":{id:"Central-Pennsylvania-OSM",featureId:"central_pa",type:"facebook",name:"Central Pennsylvania OSM",countryCodes:["us"],languageCodes:["en"],description:"Online mapping community based out of State College, PA",url:"https://www.facebook.com/CentralPennsylvaniaOSM",contacts:[{name:"Sterling Quinn",email:"sdq107@psu.edu"}]},"Code-for-San-Jose-Slack":{id:"Code-for-San-Jose-Slack",featureId:"south_sf_bay_area",type:"slack",countryCodes:["us"],languageCodes:["en"],name:"Code for San Jose Slack",description:"All are welcome! Sign up at {signupUrl}, then join the #osm channel.",signupUrl:"https://slackin-c4sj.herokuapp.com/",url:"https://codeforsanjose.slack.com/",contacts:[{name:"OSM Bay Area mailing list",email:"talk-us-sfbay@openstreetmap.org"}]},"Dallas-Fort-Worth-OSM":{id:"Dallas-Fort-Worth-OSM",featureId:"dfw_metro",type:"group",name:"Dallas-Fort Worth OSM",countryCodes:["us"],languageCodes:["en"],description:"The OpenStreetMap user group for Dallas-Fort Worth",extendedDescription:"Dallas, Fort Worth, and all the cities in between are abounding with creative and tech-savvy people. The vision for this usergroup is to find new ways to use the amazing resource of OSM.",url:"http://dfwosm.org/",contacts:[{name:"Andrew Matheny",email:"andrewdmatheny@gmail.com"}]},GeoPhilly:{id:"GeoPhilly",featureId:"philly_metro",type:"meetup",name:"GeoPhilly",countryCodes:["us"],languageCodes:["en"],description:"Meetup for map enthusiasts in the Philadelphia area",extendedDescription:"GeoPhilly unites developers, geographers, data geeks, open source enthusiasts, civic hackers and map addicts in our shared love of maps and the stories they tell. If you use maps as part of your work or just want to learn more, this is the meetup for you! Our events aim to be open, friendly, educational and social and range from happy hours to lightning talks or even workshops. Come create a diverse, inspiring geospatial community in the Philadelphia with us!",url:"https://www.meetup.com/GeoPhilly/",contacts:[{name:"Dan Ford",email:"dford@azavea.com"}]},MapMinnesota:{id:"MapMinnesota",featureId:"minneapolis_st_paul_metro",type:"meetup",name:"MapMinnesota",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap enthusiasts in the Twin Cities area",extendedDescription:"Connecting OpenStreetMap enthusiasts in Minnesota and the Twin Cities!",url:"https://www.meetup.com/Map-Minnesota/",contacts:[{name:"Ian Dees",email:"ian.dees@gmail.com"}]},"Mapping-DC-meetup":{id:"Mapping-DC-meetup",featureId:"dc_metro",type:"meetup",name:"Mapping DC",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the DC area",extendedDescription:"We are a group of volunteer mappers who aim to improve the OpenStreetMap in the DC area. We also aim to teach others about the OSM ecosystem, data analytics, cartography, and GIS. We gather every other month at meetups to focus on one area of our city.",url:"https://mappingdc.org/",contacts:[{name:"Brian DeRocher",email:"brian@derocher.org"}],events:[{name:"April Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-04-10 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxgbnb/"},{name:"June Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-06-12 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxjbqb/"},{name:"August Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-08-14 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxlbsb/"},{name:"October Meetup",description:"Meets every other month on the 2nd Tuesday",when:"2018-10-09 18:00",where:"Capitol City Brewing Company, 1100 New York Ave NW, Washington, DC",url:"https://www.meetup.com/MappingDC/events/qqvnvhyxnbmb/"}]},"Maptime-ME-meetup":{id:"Maptime-ME-meetup",featureId:"portland_me",type:"meetup",name:"MaptimeME",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users, around Portland, ME",extendedDescription:"Maptime is, rather literally, time for mapmaking. Our mission is to open the doors of cartographic possibility to anyone interested by creating a time and space for collaborative learning, exploration, and map creation using mapping tools and technologies.",url:"https://www.meetup.com/MaptimeME/",contacts:[{name:"Malcolm Toon",email:"malcolm@foreflight.com"}]},"us-ma-mailinglist":{id:"us-ma-mailinglist",featureId:"massachusetts",type:"mailinglist",name:"Talk-us-massachusetts Mailing List",countryCodes:["us"],languageCodes:["en"],description:"Email mailing list for the Massachusetts OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-us-massachusetts",contacts:[{name:"Alan Bragg",email:"alan.ruth.bragg@gmail.com"}]},"OpenCleveland-meetup":{id:"OpenCleveland-meetup",featureId:"cleveland",type:"meetup",name:"Open Cleveland",countryCodes:["us"],languageCodes:["en"],description:"Improve OpenStreetMap in the Cleveland area",extendedDescription:"Open Geo Cleveland aims to be a resource for people to discuss and share knowledge on utilizing free geographic data sets especially OpenStreetMap, and Open geo-spatial software that manages, edits, and displays geographic data, and advocate for its use in Northeast Ohio. We're also a maptime chapter =)",url:"https://www.meetup.com/open-cleveland/",contacts:[{name:"Will Skora",email:"skorasaurus@gmail.com"},{name:"Anastasia Diamond-Ortiz",email:"anastasia.diamond@gmail.com"}],events:[{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-04-18 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbxb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-04-25 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxgbhc/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-02 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbdb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-09 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbmb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-16 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbvb/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-23 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbfc/"},{name:"Wednesday Meetup / Hack Night",description:"Meets weekly - programming experience is not necessary!",when:"2018-05-30 18:00",where:"The Tech Hive, 6815 Euclid Ave, Cleveland, OH",url:"https://www.meetup.com/open-cleveland/events/lcjdnpyxhbnc/"}]},"OSM-Boston":{id:"OSM-Boston",featureId:"boston_metro",type:"meetup",name:"OpenStreetMap Boston",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Boston area",extendedDescription:"OpenStreetMap is the free and open, wiki-style map of the world, with hundreds of thousands of contributions every day from people like you. Editing the map is simple, and fun! Join us both indoors and outdoors in our effort to create the best map of the Boston area and the rest of the world!",url:"https://www.meetup.com/OpenStreetMap-Boston/",contacts:[{name:"Lars Ahlzen",email:"lars@ahlzen.com"}]},"OSM-Central-Salish-Sea":{id:"OSM-Central-Salish-Sea",featureId:"mt_vernon_wa",type:"meetup",name:"OpenStreetMap Central Salish Sea",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Mount Vernon, WA",extendedDescription:"OpenStreetMap is an map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more. We meet all the time to talk maps, make maps and have fun!",url:"https://www.meetup.com/OpenStreetMap-Central-Salish-Sea/",contacts:[{name:"Clifford Snow",email:"clifford@snowandsnow.us"}]},"OSM-Chattanooga":{id:"OSM-Chattanooga",featureId:"chattanooga",type:"facebook",name:"OSM Chattanooga",countryCodes:["us"],languageCodes:["en"],description:"The OpenStreetMap user group for Chattanooga",url:"https://www.facebook.com/groups/123483951073256",contacts:[{name:"Jenny Park",email:"tennessee@tpl.org"},{name:"Randal Hale",email:"rjhale@northrivergeographic.com"}]},"OSM-Colorado":{id:"OSM-Colorado",featureId:"colorado",type:"meetup",name:"OpenStreetMap Colorado",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the state of Colorado, USA",extendedDescription:"OpenStreetMap (OSM) Colorado is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.",url:"https://www.meetup.com/OSM-Colorado/",contacts:[{name:"Russell Deffner",email:"russdeffner@gmail.com"}]},"OSM-NYC":{id:"OSM-NYC",featureId:"nyc_metro",type:"meetup",name:"OpenStreetMap NYC",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users, developers and enthusiasts in the New York Metropolitan area",url:"https://www.meetup.com/osm-nyc/",contacts:[{name:"Jeff Ferzoco",email:"jferzoco@carto.com"}]},"OSM-Portland-forum":{id:"OSM-Portland-forum",featureId:"portland_or",type:"forum",name:"OpenStreetMap PDX Google Group",countryCodes:["us"],languageCodes:["en"],description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner.",url:"https://groups.google.com/group/osm-pdx",contacts:[{name:"Madeline Steele",email:"madeline.steele@gmail.com"}]},"OSM-Portland":{id:"OSM-Portland",featureId:"portland_or",type:"meetup",name:"OpenStreetMap Portland",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Portland area",extendedDescription:"OpenStreetMap (OSM) is a map of the world made by people like you. It's a map that you build, that's given away for free like wikipedia. Check out osm.org for more, and come join us at a meetup to talk maps, contribute to OSM, and have fun!",url:"https://www.meetup.com/OpenStreetMap-Portland/",contacts:[{name:"Madeline Steele",email:"madeline.steele@gmail.com"}]},"OSM-Seattle":{id:"OSM-Seattle",featureId:"seattle",type:"meetup",name:"OpenStreetMap Seattle",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Seattle area",url:"https://www.meetup.com/OpenStreetMap-Seattle/",contacts:[{name:"Clifford Snow",email:"clifford@snowandsnow.us"},{name:"Chase Stephens",email:"seattlefyi@gmail.com"},{name:"Paul McCombs",email:"pablo@imperium.org"}]},"OSM-SoCal":{id:"OSM-SoCal",featureId:"la_metro",type:"meetup",name:"OpenStreetMap Southern California",countryCodes:["us"],languageCodes:["en"],description:"Let's have some fun, contribute something to Los Angeles, and learn about mapping!",extendedDescription:"OpenStreetMap (OSM) Southern California is for anyone interested in mapping to get together to work with OpenStreetMap. OpenStreetMap, the Wikipedia of maps, is a free open-source map of the world being created by more than 1,000,000 volunteers around the globe. Everyone is welcome. If you don't know OpenStreetMap, we'll teach you. If you have an idea for a mapping project or even a field trip that the group can do, great!",url:"https://www.meetup.com/OSM-Southern-California/",contacts:[{name:"Charlotte Wolter",email:"techlady@techlady.com"}]},"OSM-South-Bay":{id:"OSM-South-Bay",featureId:"south_sf_bay_area",type:"meetup",name:"OSM South Bay",countryCodes:["us"],languageCodes:["en"],description:"Map Nights hosted by Code for San Jose",extendedDescription:"Code for San Jose, the local Code for America brigade, hosts monthly Map Nights on Thursday nights in downtown San José. Meet fellow South Bay mappers, help out with local mapping projects, and hear about other civic tech projects. Programming and GIS skills are not required.",url:"https://www.meetup.com/Code-for-San-Jose/",contacts:[{name:"OSM Bay Area mailing list",email:"talk-us-sfbay@openstreetmap.org"}]},"OSM-Tampa-Bay":{id:"OSM-Tampa-Bay",featureId:"tampa_bay",type:"meetup",name:"OpenStreetMap Tampa Bay",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Tampa Bay area",extendedDescription:"OSM Tampa Bay group for local residents to get together and build out the definitive map of Tampa Bay with OpenStreetMap, the free and editable map of the world. If you're into maps, data, open source, GPS, hiking, cycling, et cetera, you'll love working with OpenStreetMap -- so join in! We'll get together and map and talk about new topics once-a-month or so.",url:"https://www.meetup.com/osmtampabay/",contacts:[{name:"Coleman McCormick",email:"cmccormick@gmail.com"}]},"OSM-US-Slack":{id:"OSM-US-Slack",featureId:"usa_full",type:"slack",countryCodes:["us"],languageCodes:["en"],name:"OpenStreetMap US Slack",description:"All are welcome! Sign up at {signupUrl}",signupUrl:"https://slack.openstreetmap.us/",url:"https://osmus.slack.com",contacts:[{name:"Ian Dees",email:"ian@openstreetmap.us"},{name:"Clifford Snow",email:"clifford@snowandsnow.us"}]},"OSM-US":{id:"OSM-US",featureId:"usa_full",type:"group",countryCodes:["us"],languageCodes:["en"],name:"OpenStreetMap US",description:"We help grow and improve OpenStreetMap in the United States.",extendedDescription:"We support OpenStreetMap by holding annual conferences, providing community resources, building partnerships, and by spreading the word. Join OpenStreetMap US here: {signupUrl}",signupUrl:"https://www.openstreetmap.us/join",url:"https://www.openstreetmap.us/",contacts:[{name:"Ian Dees",email:"ian@openstreetmap.us"},{name:"Bryan Housel",email:"bryan@openstreetmap.us"}],events:[{id:"sotmus2018",i18n:true,name:"State of the Map US 2018",description:"Join the OpenStreetMap community at State of the Map US in Detroit, Michigan. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Detroit, Michigan",when:"2018-oct-05",url:"https://2018.stateofthemap.us/"}]},"OSM-Utah":{id:"OSM-Utah",featureId:"salt_lake_city",type:"meetup",name:"OpenStreetMap Utah",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Salt Lake City area",extendedDescription:"Activities may include things like Learn To Map workshops, mapping parties and outdoor data collection. The events will take place in the SLC area, at least initially. We are looking for seasoned mappers as well as people new to OSM. Join and let's do some mapping!",url:"https://www.meetup.com/OpenStreetMap-Utah/",contacts:[{name:"Martijn van Exel",email:"m@rtijn.org"}]},"OSM-Wyoming":{id:"OSM-Wyoming",featureId:"wyoming",type:"meetup",name:"OpenStreetMap Wyoming",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the state of Wyoming",extendedDescription:"OpenStreetMap (OSM) Wyoming is a local collaboration of people interested in contributing their efforts to create free maps. We encourage all of our mappers to organize or suggest mapping events throughout the state. Meetup activities can be simple social mixers, OSM basic to advanced training, or community mapping parties.",url:"https://www.meetup.com/OSM-Wyoming/",contacts:[{name:"Russell Deffner",email:"russdeffner@gmail.com"}]},"PHXGeo-meetup":{id:"PHXGeo-meetup",featureId:"phoenix",type:"meetup",name:"PHXGeo Meetup",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users in the Phoenix, AZ area",extendedDescription:"This is a meetup group for those in the Phoenix area who like maps, GIS, OpenStreetMap, cartography and anything in between.",url:"https://www.meetup.com/PHXGeo/",contacts:[{name:"Ryan Arp",email:"ryan@arpconsultinggroup.com"}]},"PHXGeo-twitter":{id:"PHXGeo-twitter",featureId:"phoenix",type:"twitter",name:"PHXGeo Twitter",countryCodes:["us"],languageCodes:["en"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/phxgeo",contacts:[{name:"Ryan Arp",email:"ryan@arpconsultinggroup.com"}]},"Western-Slope-facebook":{id:"Western-Slope-facebook",featureId:"grand_junction_co",type:"facebook",name:"Western Slope OSM Facebook",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Grand Junction, CO",url:"https://www.facebook.com/wsosm/",contacts:[{name:"Aaron Young",email:"aaron@kaartgroup.com"}]},"Western-Slope-meetup":{id:"Western-Slope-meetup",featureId:"grand_junction_co",type:"meetup",name:"Western Slope OSM Meetup",countryCodes:["us"],languageCodes:["en"],description:"Mappers and OpenStreetMap users around Grand Junction, CO",extendedDescription:"The goal of this group is to introduce OpenStreetMap to the community, develop a community of mappers, create the most amazing geodata possible using whatever method we can and finally strategize in order to get this data out into our community. Imagine accurate trail signage! Imagine further development of bike paths! Imagine anything you want, that's the joy of OpenStreetMap!",url:"https://www.meetup.com/Western-Slope-OpenStreetMap/",contacts:[{name:"Aaron Young",email:"aaron@kaartgroup.com"}]},"Maptime-Australia-Slack":{id:"Maptime-Australia-Slack",featureId:"australia_full",type:"slack",countryCodes:["au"],languageCodes:["en"],name:"Maptime Australia Slack",description:"Sign up at {signupUrl}",signupUrl:"https://bit.ly/maptimeau",url:"https://maptimeaustralia.slack.com",contacts:[{name:"David Dean",email:"ddean@ieee.org"},{name:"Philip Mallis",email:"philip.mallis@unimelb.edu.au"},{name:"Edoardo Neerhut",email:"ed@mapillary.com"}]},"talk-au":{id:"talk-au",featureId:"australia_full",type:"mailinglist",countryCodes:["au"],languageCodes:["en"],name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat",url:"https://lists.openstreetmap.org/listinfo/talk-au",contacts:[{name:"Ben Kelley",email:"ben.kelley@gmail.com"},{name:"Steve Bennett",email:"stevagewp@gmail.com"},{name:"Ian Sergeant",email:"inas66+osm@gmail.com"}]},"OSM-AR-facebook":{id:"OSM-AR-facebook",featureId:"argentina",type:"facebook",name:"OpenStreetMap Argentina Facebook",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina community on Facebook",extendedDescription:"News from the local community",url:"https://www.facebook.com/OpenStreetMapArgentina/",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-forum":{id:"OSM-AR-forum",featureId:"argentina",type:"forum",name:"OpenStreetMap Argentina web forum",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina web forum",extendedDescription:"Ideal for long or important discussions. Slow response time.",url:"https://forum.openstreetmap.org/viewforum.php?id=49",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-irc":{id:"OSM-AR-irc",featureId:"argentina",type:"irc",name:"OpenStreetMap Argentina IRC",countryCodes:["ar"],languageCodes:["es"],description:"Join #osm-ar on irc.oftc.net (port 6667)",extendedDescription:"You may find the most geeky user in the community.",url:"https://irc.openstreetmap.org/?chan=osm-ar",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-mailinglist":{id:"OSM-AR-mailinglist",featureId:"argentina",type:"mailinglist",name:"Talk-ar Mailing List",countryCodes:["ar"],languageCodes:["es"],description:"Historic mailing list. Almost unused today.",url:"https://lists.openstreetmap.org/pipermail/talk-ar/",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-telegram":{id:"OSM-AR-telegram",featureId:"argentina",type:"telegram",name:"OpenStreetMap Argentina Telegram",countryCodes:["ar"],languageCodes:["es"],description:"Join the OpenStreetMap Argentina community on Telegram",extendedDescription:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. Everyone is welcome!",url:"https://telegram.me/osm_ar",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-AR-twitter":{id:"OSM-AR-twitter",featureId:"argentina",type:"twitter",name:"OpenStreetMap Argentina Twitter",countryCodes:["ar"],languageCodes:["es"],description:"Follow us on Twitter at {url}",extendedDescription:"News from the local community and OpenStreetMap in general.",url:"https://twitter.com/OpenStreetMapAr",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-BO-mailinglist":{id:"OSM-BO-mailinglist",featureId:"bolivia",type:"mailinglist",name:"Talk-bo Mailing List",countryCodes:["bo"],languageCodes:["es"],description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://lists.openstreetmap.org/pipermail/talk-bo/",contacts:[{name:"Marco Antonio",email:"marcoantoniofrias@gmail.com"}]},"Bahia-telegram":{id:"Bahia-telegram",featureId:"bahia",type:"telegram",name:"OpenStreetMap Bahia Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Bahia community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMBA",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"DF-telegram":{id:"DF-telegram",featureId:"df_br",type:"telegram",name:"OpenStreetMap Brasília Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasília community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/osmbsb",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"OSM-br-mailinglist":{id:"OSM-br-mailinglist",featureId:"brazil",type:"mailinglist",name:"Talk-br Mailing List",countryCodes:["br"],languageCodes:["pt"],description:"A mailing list to discuss OpenStreetMap in Brazil",url:"https://lists.openstreetmap.org/pipermail/talk-br/",contacts:[{name:"Arlindo Pereira",email:"nighto@gmail.com"}]},"OSM-br-telegram":{id:"OSM-br-telegram",featureId:"brazil",type:"telegram",name:"OpenStreetMap Brasil Telegram",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasil community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMBrasil_Comunidade",contacts:[{name:"Vitor George",email:"vitor.george@gmail.com"}],events:[{id:"webinar_mundogeo",name:"Webinar: OpenStreetMap em Prefeituras e Empresas",description:"Participe do webinar sobre como utilizar o OpenStreeMap em prefeituras e empresas.",where:"Online",when:"2018-05-02 14:30",url:"http://mundogeo.com/webinar/webinar.html"},{id:"mundogeo",name:"Painel OpenStreetMap no MundoGeo #connect",description:"Participe do painel sobre o OpenStreetMap no MundoGeo #connect.",where:"São Paulo, SP, Brasil",when:"2018-05-16 11:00",url:"http://mundogeoconnect.com/2018/atividades-especiais/"}]},"OSM-br-twitter":{id:"OSM-br-twitter",featureId:"brazil",type:"twitter",name:"OpenStreetMap Brasil Twitter",countryCodes:["br"],languageCodes:["pt"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapBR",contacts:[{name:"Wille Marcel",email:"wille@wille.blog.br"}]},"RS-telegram":{id:"RS-telegram",featureId:"rs_br",type:"telegram",name:"OpenStreetMap Rio Grande do Sul Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Rio Grande do Sul community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/osmrs",contacts:[{name:"No one",email:"nobody@nowhere.org"}]},"OSM-CL-facebook":{id:"OSM-CL-facebook",featureId:"chile",type:"facebook",name:"OpenStreetMap Chile Facebook",countryCodes:["cl"],languageCodes:["es"],description:"Join the OpenStreetMap Chile community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://www.facebook.com/OpenStreetMap-Chile-145127198882915/",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-mailinglist":{id:"OSM-CL-mailinglist",featureId:"chile",type:"mailinglist",name:"Talk-cl Mailing List",countryCodes:["cl"],languageCodes:["es"],description:"A mailing list to discuss OpenStreetMap in Chile",url:"https://lists.openstreetmap.org/pipermail/talk-cl/",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-telegram":{id:"OSM-CL-telegram",featureId:"chile",type:"telegram",name:"OpenStreetMap Chile Telegram",countryCodes:["cl"],languageCodes:["es"],description:"Join the OpenStreetMap Chile community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!",url:"https://t.me/OSMcl",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"OSM-CL-twitter":{id:"OSM-CL-twitter",featureId:"chile",type:"twitter",name:"OpenStreetMap Chile Twitter",countryCodes:["cl"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmCL",contacts:[{name:"Julio Costa",email:"julio.costa@openstreetmap.cl"}]},"Maptime-Bogota":{id:"Maptime-Bogota",featureId:"bogota",type:"meetup",name:"Maptime Bogotá",countryCodes:["co"],languageCodes:["es"],description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap. It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun.",url:"https://www.meetup.com/Maptime-Colombia-OSM/",contacts:[{name:"Andrés Gómez Casanova",email:"angoca@gmail.com"}]},"OSM-CO-facebook":{id:"OSM-CO-facebook",featureId:"colombia",type:"facebook",name:"OpenStreetMap Colombia Facebook",countryCodes:["co"],languageCodes:["es"],description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!",url:"https://www.facebook.com/groups/OsmCol/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-mailinglist":{id:"OSM-CO-mailinglist",featureId:"colombia",type:"mailinglist",name:"Talk-co Mailing List",countryCodes:["co"],languageCodes:["es"],description:"A mailing list to discuss OpenStreetMap in Colombia",url:"https://lists.openstreetmap.org/pipermail/talk-co/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-telegram":{id:"OSM-CO-telegram",type:"telegram",featureId:"colombia",countryCodes:["co"],languageCodes:["es"],name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat",url:"https://telegram.me/osmco",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-twitter":{id:"OSM-CO-twitter",featureId:"colombia",type:"twitter",name:"OpenStreetMap Colombia Twitter",countryCodes:["co"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapCo",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO":{id:"OSM-CO",featureId:"colombia",type:"group",countryCodes:["co"],languageCodes:["es"],name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation",url:"https://blog.openstreetmap.co/s657",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-EC-telegram":{id:"OSM-EC-telegram",type:"telegram",featureId:"ecuador",languageCodes:["es"],countryCodes:["ec"],name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat",url:"https://telegram.me/MappingEcuador",contacts:[{name:"Talk-ec Owner",email:"talk-ec-owner@openstreetmap.org"}]},"OSM-PY-telegram":{id:"OSM-PY-telegram",type:"telegram",featureId:"paraguay",languageCodes:["es"],countryCodes:["py"],name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat",url:"https://telegram.me/osm_py",contacts:[{name:"Talk-py Owner",email:"talk-py-owner@openstreetmap.org"}]},"OSM-PE-facebook":{id:"OSM-PE-facebook",featureId:"peru",type:"facebook",name:"OpenStreetMap Peru Facebook",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Facebook",url:"https://www.facebook.com/Osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-mailinglist":{id:"OSM-PE-mailinglist",featureId:"peru",type:"mailinglist",name:"Talk-pe Mailing List",countryCodes:["pe"],languageCodes:["es"],description:"The official mailing list for the OpenStreetMap Peru community",url:"https://lists.openstreetmap.org/pipermail/talk-pe/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-matrix":{id:"OSM-PE-matrix",featureId:"peru",type:"matrix",name:"OpenStreetMap Peru Matrix Chat",countryCodes:["pe"],languageCodes:["es"],description:"Chat with other members of the OpenStreetMap Peru community in Matrix.",url:"https://matrix.to/#/#osmpe:matrix.org",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-telegram":{id:"OSM-PE-telegram",featureId:"peru",type:"telegram",name:"OpenStreetMap Peru Telegram",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Telegram",url:"https://telegram.me/osmPe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-twitter":{id:"OSM-PE-twitter",featureId:"peru",type:"twitter",name:"OpenStreetMap Peru Twitter",countryCodes:["pe"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE":{id:"OSM-PE",featureId:"peru",type:"group",name:"OpenStreetMap Peru",countryCodes:["ar"],languageCodes:["es"],description:"News and resources for the OpenStreetMap Peru community",url:"http://osmpe.ourproject.org/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"LATAM-Facebook":{id:"LATAM-Facebook",featureId:"latam",type:"facebook",languageCodes:["es","pt"],name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook",url:"https://www.facebook.com/osmlatam/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Telegram":{id:"LATAM-Telegram",featureId:"latam",type:"telegram",languageCodes:["es","pt"],name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America",url:"https://t.me/OSMLatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Twitter":{id:"LATAM-Twitter",featureId:"latam",type:"twitter",languageCodes:["es","pt"],name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmlatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"osm-latam":{id:"osm-latam",type:"group",languageCodes:["es","pt"],name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",url:"https://osmlatam.org/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}],events:[{id:"sotm-latam-2018",i18n:true,name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina",when:"2018-sep-24",url:"https://state.osmlatam.org/"}]},"OSM-Facebook":{id:"OSM-Facebook",type:"facebook",languageCodes:["en"],name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap.",url:"https://www.facebook.com/OpenStreetMap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"OSM-help":{id:"OSM-help",type:"forum",languageCodes:["en"],name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap. Whether you are a beginner mapper or have a technical question, we're here to help!",url:"https://help.openstreetmap.org/",contacts:[{name:"OSMF Operations",email:"operations@osmfoundation.org"}]},"OSM-Reddit":{id:"OSM-Reddit",type:"reddit",languageCodes:["en"],name:"OpenStreetMap on Reddit",description:"/r/openstreetmap/ is a great place to learn more about OpenStreetMap. Ask us anything!",url:"https://www.reddit.com/r/openstreetmap/",contacts:[{name:"Serge Wroclawski",email:"emacsen@gmail.com"}]},"OSM-Telegram":{id:"OSM-Telegram",type:"telegram",languageCodes:["en"],name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}",url:"https://t.me/OpenStreetMapOrg",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-Twitter":{id:"OSM-Twitter",type:"twitter",languageCodes:["en"],name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/openstreetmap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},OSMF:{id:"OSMF",type:"group",languageCodes:["en","nl","fr","it","jp","ru"],name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",url:"https://wiki.osmfoundation.org/wiki/Main_Page",signupUrl:"https://join.osmfoundation.org/",contacts:[{name:"OSMF Board",email:"board@osmfoundation.org"}],events:[{id:"sotm2018",i18n:true,name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy",when:"2018-jul-28",url:"https://2018.stateofthemap.org/"}]}};
23656 var dataImagery = [{id:"sjcgis.org-Aerials_2013_WM",name:"2013 aerial imagery for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2013_WM/MapServer/tile/{zoom}/{y}/{x}",endDate:"2013-06-01T00:00:00.000Z",startDate:"2013-05-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-123.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],terms_url:"https://www.arcgis.com/home/item.html?id=7bf69831861d438d8365cf9f46662523",terms_text:"Pictometry Inc, San Juan County GIS",description:"Public domain aerial imagery taken in May/June 2013 from San Juan County, WA. Resolution is 9 inch."},{id:"sjcgis.org-Aerials_2016_WM",name:"2016 aerial imagery for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/Aerials_2016_WM/MapServer/tile/{zoom}/{y}/{x}",endDate:"2016-07-01T00:00:00.000Z",startDate:"2016-05-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-123.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],best:true,description:"Public domain aerial imagery taken in May, June, and July from San Juan County, WA. Resolution is 6 inch countywide."},{id:"OS7",name:"7th Series (OS7)",type:"tms",template:"https://ooc.openstreetmap.org/os7/{zoom}/{x}/{y}.jpg",zoomExtent:[6,14],polygon:[[[-3.04697,54.83947],[-3.05864,55.24157],[-4.04466,55.23296],[-4.07076,55.63654],[-4.61904,55.6253],[-4.64926,56.02834],[-4.48961,56.03217],[-4.52394,56.4367],[-3.86751,56.44581],[-3.84176,56.04944],[-3.44591,56.04982],[-3.43492,55.64429],[-2.79497,55.65049],[-2.80802,56.05749],[-3.20661,56.05327],[-3.21417,56.45682],[-3.73808,56.45075],[-3.74185,56.86175],[-5.07669,56.83171],[-5.03652,56.42949],[-5.16012,56.42493],[-5.12991,56.01798],[-5.92607,55.99456],[-5.85518,55.23335],[-5.2281,55.25136],[-5.21024,55.02765],[-4.65956,55.04181],[-4.64548,54.81633],[-3.04697,54.83947]],[[-1.74835,57.76428],[-1.74065,57.36],[-2.58022,57.35537],[-2.57437,57.04526],[-2.08408,57.04799],[-2.07651,56.64276],[-2.7345,56.63906],[-2.73781,56.81718],[-3.23885,56.81437],[-3.24896,57.35168],[-3.75629,57.34889],[-3.76219,57.65868],[-4.76587,57.64473],[-4.81008,58.26984],[-5.2511,58.26547],[-5.27376,58.66767],[-3.55818,58.69887],[-3.56607,58.9316],[-3.37656,58.93444],[-3.38584,59.20171],[-3.18713,59.20215],[-3.18747,59.24176],[-3.06757,59.24203],[-3.07855,59.42135],[-2.37131,59.42763],[-2.36856,59.0222],[-2.67893,59.02078],[-2.67343,58.83935],[-2.86569,58.83651],[-2.8602,58.53531],[-3.03461,58.53316],[-3.0195,58.13159],[-3.6156,58.11982],[-3.61276,57.97754],[-3.71092,57.97562],[-3.69932,57.75364],[-1.74835,57.76428]],[[-7.07492,56.76319],[-7.73471,56.73566],[-7.7911,57.13994],[-7.70662,57.14343],[-7.76299,57.54311],[-7.60218,57.54968],[-7.62134,57.68452],[-7.72499,57.6803],[-7.73017,57.71673],[-7.60264,57.72191],[-7.59964,57.70083],[-7.48634,57.70544],[-7.49528,57.76813],[-7.37493,57.77301],[-7.39337,57.90201],[-7.23591,57.90838],[-7.24323,57.95948],[-7.13916,57.96369],[-7.14508,58.00495],[-7.23742,58.00122],[-7.23297,57.97018],[-7.31133,57.96702],[-7.31538,57.99525],[-7.24904,57.99792],[-7.28082,58.21856],[-7.07355,58.22687],[-7.0827,58.29018],[-6.80743,58.30119],[-6.82768,58.44074],[-6.50305,58.45366],[-6.51532,58.53792],[-6.16474,58.55184],[-6.10631,58.14894],[-6.33469,58.13976],[-6.27759,57.74145],[-6.96138,57.71366],[-6.93332,57.51615],[-7.10017,57.50933],[-7.05218,57.169],[-7.13111,57.16575],[-7.07492,56.76319]],[[0.41076,50.82087],[0.98102,50.80612],[0.99437,51.01173],[1.45062,50.99998],[1.47712,51.40552],[0.89619,51.42035],[0.88243,51.21039],[0.505,51.22007],[0.52273,51.49042],[-0.63397,51.51063],[-0.63671,51.44563],[-1.09951,51.45248],[-1.11485,51.04814],[-0.52987,51.0394],[-0.52751,51.10203],[0.42806,51.08778],[0.41076,50.82087]],[[-5.39457,51.9619],[-4.79581,51.98051],[-4.78873,51.89403],[-4.20265,51.91228],[-4.22941,52.23828],[-3.6552,52.25602],[-3.62228,51.85483],[-4.21342,51.8364],[-4.18551,51.49342],[-4.77661,51.47485],[-4.78476,51.57525],[-5.08799,51.56574],[-5.09422,51.64242],[-5.3678,51.63385],[-5.39457,51.9619]],[[-1.2389,54.03537],[-0.62779,54.02811],[-0.62004,54.25257],[-0.57268,54.25201],[-0.55865,54.65542],[-1.17998,54.66269],[-1.18782,54.43788],[-1.23221,54.4384],[-1.2389,54.03537]],[[-2.67227,50.97677],[-2.09961,50.98023],[-2.10572,51.37949],[-1.58877,51.38259],[-1.59499,51.78589],[-2.17563,51.78891],[-2.17154,51.38392],[-2.67846,51.38088],[-2.67227,50.97677]],[[-2.60155,53.27155],[-3.22973,53.2685],[-3.23522,53.67231],[-2.60704,53.67533],[-2.60155,53.27155]],[[-0.03942,51.7728],[-0.61563,51.77577],[-0.60465,52.58414],[-0.02843,52.58122],[-0.03942,51.7728]],[[-2.91529,54.03523],[-3.53229,54.02866],[-3.54484,54.43397],[-2.92785,54.44047],[-2.91529,54.03523]],[[-6.30583,57.19689],[-6.3539,57.60015],[-5.69111,57.62295],[-5.64305,57.21995],[-6.30583,57.19689]],[[1.17115,52.57236],[1.19865,52.97594],[1.79788,52.96106],[1.77037,52.55734],[1.17115,52.57236]],[[-2.40225,55.56317],[-2.40088,55.9657],[-1.76084,55.96501],[-1.76222,55.56248],[-2.40225,55.56317]],[[-6.32574,56.38537],[-7.0196,56.35747],[-7.07316,56.76384],[-6.3793,56.79145],[-6.32574,56.38537]],[[-2.42258,54.4431],[-2.42574,54.84188],[-1.79931,54.84354],[-1.79614,54.44477],[-2.42258,54.4431]],[[-3.02701,51.37935],[-3.60589,51.37017],[-3.62237,51.77304],[-3.04349,51.78215],[-3.02701,51.37935]],[[-3.05379,52.18979],[-3.06615,52.59374],[-2.48364,52.60034],[-2.47128,52.19646],[-3.05379,52.18979]],[[-5.67673,51.70425],[-5.67886,51.73101],[-5.4636,51.7376],[-5.46146,51.71084],[-5.67673,51.70425]],[[-5.84427,59.10882],[-5.8469,59.13578],[-5.79558,59.1371],[-5.79294,59.11014],[-5.84427,59.10882]],[[-8.64844,57.77861],[-8.66597,57.87717],[-8.46649,57.88721],[-8.44897,57.78867],[-8.64844,57.77861]],[[-4.52711,59.01532],[-4.52859,59.03319],[-4.47623,59.03434],[-4.47475,59.01646],[-4.52711,59.01532]],[[-7.68062,58.25838],[-7.68655,58.2938],[-7.53445,58.30084],[-7.52852,58.26542],[-7.68062,58.25838]],[[-6.19102,59.08009],[-6.19546,59.11586],[-6.12542,59.11815],[-6.12099,59.08238],[-6.19102,59.08009]],[[-4.42669,59.07112],[-4.42805,59.0887],[-4.37621,59.08976],[-4.37485,59.07218],[-4.42669,59.07112]]]},{id:"ACT2017",name:"ACTmapi Imagery 2017",type:"wms",template:"https://data.actmapi.act.gov.au/arcgis/services/actmapi/imagery2017mga/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-05-01T00:00:00.000Z",startDate:"2017-05-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[149.085,-35.1171],[149.1509,-35.1157],[149.1509,-35.1335],[149.1736,-35.1335],[149.1739,-35.1512],[149.1957,-35.1512],[149.1962,-35.1689],[149.2177,-35.1683],[149.2192,-35.2048],[149.241,-35.2043],[149.2419,-35.2223],[149.2632,-35.2222],[149.2644,-35.2575],[149.3085,-35.2571],[149.309,-35.2751],[149.3531,-35.2742],[149.3536,-35.2921],[149.3974,-35.2917],[149.3988,-35.3452],[149.3777,-35.3457],[149.3772,-35.3641],[149.3341,-35.3648],[149.3385,-35.5451],[149.1624,-35.5487],[149.1727,-35.9271],[149.0175,-35.9294],[149.0172,-35.9113],[148.9506,-35.9125],[148.9499,-35.8946],[148.9277,-35.8949],[148.9272,-35.8768],[148.9053,-35.8768],[148.9042,-35.8586],[148.8826,-35.859],[148.8805,-35.7695],[148.8361,-35.7698],[148.8359,-35.7521],[148.8138,-35.7524],[148.8131,-35.7343],[148.7909,-35.7347],[148.7911,-35.7167],[148.7688,-35.7167],[148.7617,-35.3924],[148.7839,-35.3921],[148.7822,-35.3022],[148.8041,-35.302],[148.8033,-35.2836],[148.8474,-35.2832],[148.8469,-35.2652],[148.8689,-35.2643],[148.8687,-35.2466],[148.9128,-35.246],[148.9123,-35.2282],[148.9341,-35.228],[148.9329,-35.1919],[148.999,-35.1904],[148.9986,-35.1724],[149.0206,-35.172],[149.0204,-35.154],[149.0637,-35.1532],[149.0635,-35.1355],[149.0857,-35.1348],[149.085,-35.1171]]],terms_url:"https://actmapi-actgov.opendata.arcgis.com/datasets/884456bde6fd46d68e0c05479f55d548",terms_text:"© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory"},{id:"ACT2018",name:"ACTmapi Imagery 2018",type:"wms",template:"https://data.actmapi.act.gov.au/arcgis/services/actmapi/imagery2018mga/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-03-19T00:00:00.000Z",startDate:"2018-03-19T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[149.2695,-35.4381],[149.2669,-35.348],[149.3329,-35.3468],[149.3334,-35.3648],[149.3774,-35.364],[149.3769,-35.3459],[149.3989,-35.3455],[149.3984,-35.3275],[149.4094,-35.3273],[149.4088,-35.3092],[149.3978,-35.3095],[149.3973,-35.2914],[149.3533,-35.2923],[149.3528,-35.2743],[149.3089,-35.2751],[149.3084,-35.2571],[149.2644,-35.2579],[149.2634,-35.2219],[149.2415,-35.2223],[149.241,-35.2043],[149.219,-35.2047],[149.218,-35.1687],[149.1961,-35.1691],[149.1956,-35.151],[149.1737,-35.1514],[149.1732,-35.1334],[149.1512,-35.1338],[149.1508,-35.1158],[149.085,-35.1169],[149.0854,-35.135],[149.0635,-35.1353],[149.0639,-35.1534],[149.0201,-35.1541],[149.0205,-35.1721],[148.9985,-35.1725],[148.999,-35.1905],[148.9331,-35.1916],[148.934,-35.2276],[148.912,-35.228],[148.9124,-35.246],[148.8685,-35.2467],[148.8689,-35.2647],[148.8469,-35.265],[148.8473,-35.2831],[148.8034,-35.2837],[148.8038,-35.3018],[148.7818,-35.3021],[148.7838,-35.3922],[148.8058,-35.3919],[148.8086,-35.5181],[148.7976,-35.5182],[148.7994,-35.5993],[148.8766,-35.5982],[148.8747,-35.517],[148.8527,-35.5174],[148.8508,-35.4363],[148.8398,-35.4364],[148.8388,-35.3914],[149.0039,-35.3888],[149.0048,-35.4248],[149.0268,-35.4244],[149.0277,-35.4605],[149.0497,-35.4601],[149.0511,-35.5142],[149.1613,-35.5122],[149.1594,-35.4402],[149.2695,-35.4381]]],terms_text:"© Jacobs Group (Australia) Pty Ltd and Australian Capital Territory",best:true},{id:"AGIV10cm",name:"AGIV Flanders 2013-2015 aerial imagery 10cm",type:"wms",template:"https://geoservices.informatievlaanderen.be/raadpleegdiensten/OGW/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OGWRGB13_15VL&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.98494,50.70723],[5.98494,50.7672],[5.91079,50.82275],[5.75561,50.83533],[5.75423,50.86264],[5.8332,50.93323],[5.85517,51.02661],[5.90941,51.07754],[5.91216,51.18225],[5.87851,51.20807],[5.77414,51.23689],[5.68419,51.24075],[5.62308,51.26998],[5.62308,51.29789],[5.54,51.34724],[5.4473,51.34853],[5.39855,51.32107],[5.31203,51.32322],[5.26671,51.36182],[5.19942,51.37254],[5.18294,51.39611],[5.15891,51.4924],[5.08338,51.53086],[5.03257,51.53983],[4.95566,51.50522],[4.90142,51.50565],[4.83825,51.54367],[4.77096,51.55862],[4.7119,51.54709],[4.64049,51.49667],[4.6144,51.4971],[4.56565,51.53171],[4.48256,51.53043],[4.42626,51.52189],[4.3006,51.46974],[4.29511,51.42566],[4.18113,51.42437],[4.13718,51.39525],[4.13856,51.35067],[4.05204,51.30047],[3.93325,51.27298],[3.86527,51.27084],[3.86321,51.29016],[3.76296,51.32407],[3.59336,51.35925],[3.47732,51.33137],[3.42582,51.39739],[3.23562,51.35153],[3.226,51.36568],[3.17794,51.36182],[3.16009,51.33223],[3.06258,51.30219],[2.75084,51.1702],[2.47001,51.07452],[2.49267,50.99378],[2.53112,50.95573],[2.50915,50.91159],[2.53043,50.82145],[2.5991,50.76416],[2.66501,50.76459],[2.77007,50.66677],[2.8971,50.65894],[2.99186,50.72549],[3.11339,50.72636],[3.23699,50.70592],[3.36265,50.6585],[3.47114,50.70201],[3.63936,50.66721],[3.69842,50.68156],[3.72794,50.71245],[3.81858,50.68418],[3.87488,50.64152],[4.09255,50.64283],[4.15023,50.66329],[4.20653,50.64413],[4.31365,50.64283],[4.45235,50.68766],[4.53475,50.67808],[4.61303,50.69549],[4.67689,50.69592],[4.72701,50.73201],[4.78057,50.73201],[4.79979,50.71288],[4.86228,50.71288],[4.88563,50.69549],[4.96116,50.69549],[5.03119,50.65763],[5.10741,50.65023],[5.2008,50.64892],[5.23581,50.66546],[5.32508,50.6659],[5.36696,50.682],[5.42121,50.66416],[5.52215,50.6746],[5.6224,50.72418],[5.67527,50.69853],[5.73981,50.69723],[5.77277,50.67199],[5.8126,50.66024],[5.90804,50.65981],[5.98494,50.70723]]],terms_text:"Orthophoto Flanders © AGIV",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIVFlandersGRB",name:"AGIV Flanders GRB",type:"tms",template:"https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=grb_bsk&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,21],polygon:[[[4.40434,50.78177],[4.45538,50.79328],[4.40268,50.8961],[4.331,50.90094],[4.27142,50.82002],[4.30648,50.81244],[4.36348,50.77251],[4.40434,50.78177],[4.43104,50.73831],[4.31859,50.72022],[4.29031,50.69402],[4.14853,50.72834],[3.95877,50.68947],[3.9097,50.69245],[3.89113,50.74333],[3.77568,50.74789],[3.75857,50.78045],[3.67752,50.77062],[3.64047,50.72242],[3.54139,50.73377],[3.54062,50.76307],[3.46005,50.76556],[3.3522,50.70614],[3.30562,50.75466],[3.17839,50.75609],[3.15329,50.78564],[3.02008,50.77312],[2.99943,50.81035],[2.91648,50.75356],[2.85476,50.75745],[2.86521,50.70565],[2.78473,50.7369],[2.713,50.81534],[2.63518,50.8129],[2.59909,50.85306],[2.59031,50.91893],[2.63262,50.94575],[2.57372,51.00842],[2.54165,51.09345],[3.15582,51.32714],[3.18307,51.37128],[3.23443,51.34669],[3.36356,51.37228],[3.38101,51.27446],[3.44201,51.24313],[3.52759,51.24604],[3.51511,51.28753],[3.58984,51.30577],[3.7783,51.26235],[3.79088,51.21429],[3.92412,51.21938],[4.16613,51.2929],[4.26163,51.37647],[4.42065,51.36473],[4.39108,51.45149],[4.54747,51.48571],[4.53541,51.42303],[4.64953,51.42758],[4.76359,51.5088],[4.84188,51.48074],[4.8383,51.42174],[4.89366,51.41698],[4.92785,51.39544],[5.02894,51.48789],[5.08018,51.46948],[5.10202,51.42892],[5.07117,51.3935],[5.13109,51.35137],[5.13448,51.31547],[5.20031,51.32172],[5.24189,51.30534],[5.23036,51.26436],[5.34828,51.27492],[5.41741,51.26229],[5.4863,51.30197],[5.5556,51.26986],[5.56045,51.22233],[5.76027,51.18505],[5.85578,51.14463],[5.75909,51.03588],[5.72665,50.91307],[5.64522,50.8372],[5.68732,50.804],[5.47863,50.72352],[5.41196,50.72368],[5.38908,50.74775],[5.30912,50.71802],[5.16984,50.72257],[5.16508,50.6957],[5.05642,50.71567],[5.00339,50.76594],[4.92545,50.74275],[4.90869,50.76968],[4.83106,50.77028],[4.76014,50.80544],[4.64309,50.79755],[4.65486,50.7552],[4.62021,50.74348],[4.59727,50.76359],[4.52399,50.72724],[4.49455,50.75679],[4.43104,50.73831],[4.40434,50.78177]],[[5.67393,50.75373],[5.88438,50.70114],[5.94172,50.76524],[5.76662,50.78761],[5.67393,50.75373]],[[4.91171,51.43492],[4.93711,51.42614],[4.95891,51.45471],[4.92801,51.46049],[4.91171,51.43492]]],terms_text:"GRB Flanders © AGIV",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIV",name:"AGIV Flanders most recent aerial imagery",type:"tms",template:"https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=omwrgbmrvl&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,21],polygon:[[[4.7737,50.79368],[4.8379,50.75916],[4.92511,50.73483],[4.98862,50.76264],[5.036,50.73527],[5.0645,50.69875],[5.1644,50.69005],[5.19393,50.71179],[5.3086,50.71245],[5.36422,50.74396],[5.43391,50.70766],[5.54378,50.74396],[5.61141,50.73527],[5.71166,50.73505],[5.77105,50.74092],[5.81946,50.70484],[5.89568,50.70614],[5.9204,50.72831],[5.91971,50.74504],[5.89843,50.77675],[5.81569,50.76351],[5.77517,50.79216],[5.69552,50.79737],[5.69072,50.82319],[5.66325,50.82904],[5.65467,50.86481],[5.72368,50.9012],[5.77174,50.95443],[5.75114,50.97368],[5.78273,51.00048],[5.78032,51.0523],[5.80848,51.05338],[5.80951,51.07668],[5.84315,51.09372],[5.84418,51.1101],[5.82599,51.11851],[5.86959,51.14953],[5.8277,51.17365],[5.792,51.16891],[5.7738,51.19344],[5.666,51.1928],[5.64059,51.21065],[5.5709,51.22829],[5.56231,51.27535],[5.49811,51.30605],[5.47099,51.30219],[5.45794,51.2893],[5.43048,51.28823],[5.41434,51.27363],[5.36593,51.282],[5.33641,51.28265],[5.32577,51.26718],[5.24337,51.27406],[5.24989,51.31335],[5.20972,51.32794],[5.14174,51.31914],[5.14209,51.35367],[5.08647,51.39482],[5.11565,51.43615],[5.08853,51.47508],[5.05214,51.47636],[5.04561,51.4939],[5.02364,51.4939],[5.01609,51.48663],[4.82966,51.48663],[4.83001,51.50009],[4.76855,51.51099],[4.74727,51.50394],[4.658,51.4492],[4.65663,51.43144],[4.53956,51.43379],[4.55466,51.48171],[4.5296,51.48748],[4.46368,51.48235],[4.37167,51.45562],[4.37751,51.40553],[4.4139,51.37511],[4.39776,51.36118],[4.34798,51.36675],[4.34627,51.38497],[4.20344,51.38111],[4.2213,51.3511],[4.15641,51.29832],[4.05101,51.25193],[4.00638,51.25279],[3.95144,51.22205],[3.88484,51.22936],[3.81926,51.21797],[3.80038,51.22872],[3.80107,51.26074],[3.74442,51.28007],[3.63593,51.29746],[3.58615,51.31378],[3.5065,51.28308],[3.51371,51.25021],[3.43921,51.25064],[3.39766,51.27513],[3.37329,51.31678],[3.39114,51.34274],[3.3623,51.37961],[3.24283,51.35474],[3.20266,51.37039],[3.15631,51.35196],[3.14223,51.33051],[2.53318,51.09092],[2.56476,50.9968],[2.61832,50.9527],[2.57781,50.91852],[2.5936,50.88431],[2.58948,50.85051],[2.6245,50.80757],[2.71033,50.8054],[2.78449,50.71853],[2.87375,50.69983],[2.86483,50.74765],[2.92525,50.75156],[2.97263,50.77024],[2.97332,50.79889],[3.00078,50.79759],[3.01383,50.76676],[3.09863,50.76611],[3.13537,50.78196],[3.16832,50.75004],[3.30428,50.74613],[3.31561,50.71484],[3.3678,50.70179],[3.44848,50.75091],[3.53293,50.75156],[3.53328,50.72549],[3.63902,50.7131],[3.69086,50.7672],[3.75163,50.76177],[3.7712,50.73874],[3.87729,50.73983],[3.87969,50.70418],[3.9202,50.68352],[3.99951,50.682],[4.06749,50.68961],[4.16018,50.72049],[4.17632,50.70331],[4.24739,50.68222],[4.31708,50.69418],[4.31846,50.70962],[4.38403,50.71027],[4.38437,50.72353],[4.47226,50.74743],[4.52617,50.71853],[4.55226,50.73766],[4.64908,50.73722],[4.6532,50.78717],[4.72426,50.78218],[4.73731,50.79585],[4.7737,50.79368]]],terms_text:"Orthophoto Flanders most recent © AGIV",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGRI-black_and_white-2.5m",name:"AGRI black-and-white 2.5m",type:"tms",template:"https://{switch:a,b,c}.agri.openstreetmap.org/layer/au_ga_agri/{zoom}/{x}/{y}.png",endDate:"2011-01-01T00:00:00.000Z",startDate:"2006-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[112.28778,-28.78459],[112.71488,-31.13894],[114.11263,-34.17829],[113.60788,-37.39012],[117.17992,-37.45179],[119.31538,-37.42096],[121.72262,-36.70839],[123.81925,-35.76893],[125.9547,-34.3066],[127.97368,-33.7274],[130.07031,-33.24166],[130.10913,-33.8887],[131.00214,-34.04971],[131.0798,-34.72257],[132.28342,-35.39],[134.18591,-35.61126],[133.8753,-37.1119],[134.8459,-37.6365],[139.7769,-37.82075],[139.93223,-39.4283],[141.6017,-39.8767],[142.3783,-39.36829],[142.3783,-40.64702],[142.49478,-42.07487],[144.009,-44.06013],[147.23161,-44.03222],[149.05645,-42.53431],[149.52237,-40.99959],[149.9494,-40.85292],[150.8036,-38.09627],[151.81313,-38.12682],[156.20052,-22.66771],[156.20052,-20.10109],[156.62761,-17.41763],[155.26869,-17.19521],[154.14272,-19.51662],[153.5215,-18.34139],[153.05558,-16.5636],[152.78379,-15.25677],[152.27905,-13.4135],[151.3472,-12.39177],[149.48354,-12.05024],[146.9598,-9.99241],[135.9719,-9.99241],[130.3032,-10.33636],[128.09016,-12.16414],[125.91588,-12.31591],[124.3239,-11.86033],[122.03323,-11.97429],[118.26706,-16.9353],[115.93747,-19.11357],[114.0738,-21.11863],[113.49141,-22.59603],[112.28778,-28.78459]]],terms_url:"https://data.gov.au/dataset/agri-the-australian-geographic-reference-image",terms_text:"AGRI, Geoscience Australia"},{id:"alagoas_litoral",name:"Alagoas Litoral 2006",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Ortofotos%202006&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.52384,-9.48089],[-35.5236,-9.44515],[-35.51572,-9.44518],[-35.51584,-9.44229],[-35.50542,-9.44238],[-35.50518,-9.43064],[-35.49334,-9.43073],[-35.49304,-9.3982],[-35.4893,-9.39817],[-35.48921,-9.38628],[-35.4854,-9.38634],[-35.48525,-9.37809],[-35.48127,-9.37812],[-35.48114,-9.36987],[-35.47698,-9.36996],[-35.47686,-9.36385],[-35.47459,-9.36388],[-35.47447,-9.36153],[-35.47212,-9.36141],[-35.47206,-9.35917],[-35.46976,-9.3592],[-35.46967,-9.35682],[-35.46653,-9.35676],[-35.46641,-9.35289],[-35.46387,-9.35277],[-35.46387,-9.35119],[-35.44135,-9.35131],[-35.44125,-9.34541],[-35.43177,-9.34538],[-35.43171,-9.33602],[-35.39463,-9.33632],[-35.39442,-9.30125],[-35.38165,-9.30143],[-35.38147,-9.28638],[-35.37799,-9.28626],[-35.37796,-9.2811],[-35.36942,-9.28122],[-35.36921,-9.27261],[-35.35966,-9.27276],[-35.35969,-9.26465],[-35.35051,-9.26474],[-35.35036,-9.25562],[-35.34115,-9.25565],[-35.34118,-9.24501],[-35.31775,-9.24519],[-35.3176,-9.22567],[-35.30292,-9.22579],[-35.30283,-9.2113],[-35.30794,-9.21136],[-35.30785,-9.19979],[-35.29103,-9.19988],[-35.29091,-9.1966],[-35.29018,-9.19669],[-35.28997,-9.16516],[-35.27759,-9.16522],[-35.2775,-9.16417],[-35.27541,-9.1642],[-35.27535,-9.16152],[-35.27375,-9.16149],[-35.27366,-9.15839],[-35.27182,-9.15842],[-35.27185,-9.15729],[-35.27149,-9.15729],[-35.27143,-9.15469],[-35.26965,-9.15463],[-35.26959,-9.15362],[-35.26919,-9.15362],[-35.26907,-9.13159],[-35.26403,-9.13165],[-35.264,-9.12318],[-35.26056,-9.12321],[-35.26053,-9.11781],[-35.256,-9.11784],[-35.25573,-9.08946],[-35.25114,-9.08955],[-35.25108,-9.08651],[-35.25026,-9.08648],[-35.25029,-9.08475],[-35.24449,-9.08478],[-35.24449,-9.07989],[-35.24093,-9.07997],[-35.24081,-9.07312],[-35.23734,-9.07312],[-35.23719,-9.06322],[-35.23655,-9.06322],[-35.23652,-9.04655],[-35.23323,-9.04652],[-35.23332,-9.04345],[-35.2306,-9.04348],[-35.2306,-9.04014],[-35.22897,-9.04008],[-35.229,-9.03835],[-35.22505,-9.03826],[-35.22502,-9.03167],[-35.2223,-9.03161],[-35.22233,-9.02012],[-35.21834,-9.02009],[-35.21831,-9.01341],[-35.21671,-9.01341],[-35.21668,-9.00998],[-35.21176,-9.00998],[-35.21173,-9.00647],[-35.20971,-9.00653],[-35.20974,-9.00438],[-35.20765,-9.00432],[-35.20768,-9.00226],[-35.20566,-9.00226],[-35.20563,-8.99987],[-35.20391,-8.99987],[-35.20394,-8.99785],[-35.20213,-8.99791],[-35.20213,-8.99579],[-35.19844,-8.99582],[-35.19844,-8.99361],[-35.19434,-8.99361],[-35.19428,-8.99122],[-35.19065,-8.99131],[-35.19062,-8.98833],[-35.18766,-8.98842],[-35.18763,-8.98544],[-35.18473,-8.98541],[-35.18467,-8.98255],[-35.18238,-8.98252],[-35.18235,-8.98052],[-35.17951,-8.98061],[-35.17948,-8.97742],[-35.17809,-8.97745],[-35.17803,-8.97306],[-35.17558,-8.97303],[-35.17549,-8.96912],[-35.17293,-8.96909],[-35.17284,-8.96292],[-35.17063,-8.96289],[-35.17048,-8.95579],[-35.16852,-8.95564],[-35.16852,-8.94806],[-35.16794,-8.948],[-35.16791,-8.93995],[-35.16245,-8.93995],[-35.16242,-8.92978],[-35.1587,-8.92981],[-35.15873,-8.92662],[-35.15547,-8.92668],[-35.1555,-8.92378],[-35.15348,-8.92381],[-35.15339,-8.92065],[-35.15131,-8.92062],[-35.15122,-8.91194],[-35.15263,-8.91194],[-35.15263,-8.90821],[-35.15439,-8.90824],[-35.1543,-8.90215],[-35.15593,-8.90212],[-35.15593,-8.90051],[-35.15768,-8.90048],[-35.15774,-8.89905],[-35.15958,-8.89908],[-35.15955,-8.89747],[-35.16139,-8.8975],[-35.16133,-8.89625],[-35.16363,-8.89625],[-35.1636,-8.89526],[-35.16553,-8.89526],[-35.1655,-8.89315],[-35.16794,-8.89315],[-35.16791,-8.89147],[-35.17024,-8.89153],[-35.17027,-8.8904],[-35.17302,-8.89043],[-35.17302,-8.88876],[-35.17791,-8.88876],[-35.17794,-8.88795],[-35.17894,-8.88792],[-35.17894,-8.88891],[-35.17966,-8.88894],[-35.17978,-8.88858],[-35.18099,-8.88861],[-35.18099,-8.88816],[-35.18519,-8.88816],[-35.18519,-8.88897],[-35.18591,-8.889],[-35.18591,-8.88971],[-35.18932,-8.88971],[-35.18947,-8.8893],[-35.19014,-8.88927],[-35.19017,-8.88831],[-35.19071,-8.88831],[-35.19077,-8.88789],[-35.19153,-8.88792],[-35.19156,-8.88619],[-35.19754,-8.88607],[-35.19757,-8.8873],[-35.19968,-8.8873],[-35.19974,-8.88777],[-35.2008,-8.88777],[-35.2008,-8.88822],[-35.2033,-8.88822],[-35.20337,-8.8887],[-35.20563,-8.88861],[-35.20557,-8.88983],[-35.20741,-8.8898],[-35.20744,-8.89022],[-35.21125,-8.89025],[-35.21128,-8.88769],[-35.21245,-8.88777],[-35.21248,-8.88861],[-35.21623,-8.88858],[-35.21623,-8.88748],[-35.21871,-8.88745],[-35.21871,-8.88897],[-35.22136,-8.88897],[-35.22263,-8.88792],[-35.22402,-8.88748],[-35.22453,-8.88763],[-35.22644,-8.88718],[-35.22707,-8.88598],[-35.23311,-8.88446],[-35.23933,-8.88339],[-35.24129,-8.88416],[-35.25011,-8.88515],[-35.25624,-8.88506],[-35.26168,-8.88294],[-35.26161,-8.88094],[-35.26406,-8.88109],[-35.26877,-8.8793],[-35.27421,-8.87748],[-35.2781,-8.87518],[-35.28499,-8.87507],[-35.28502,-8.87581],[-35.2881,-8.87578],[-35.29405,-8.87545],[-35.30782,-8.87208],[-35.31757,-8.86961],[-35.32784,-8.86716],[-35.33206,-8.86614],[-35.34103,-8.86376],[-35.3471,-8.86244],[-35.3522,-8.86113],[-35.35257,-8.86391],[-35.34903,-8.86611],[-35.34496,-8.87205],[-35.34327,-8.87489],[-35.34318,-8.87569],[-35.34381,-8.87668],[-35.34481,-8.8768],[-35.34888,-8.87721],[-35.35042,-8.87781],[-35.35254,-8.87891],[-35.35399,-8.88011],[-35.35577,-8.88252],[-35.35755,-8.88396],[-35.36036,-8.88512],[-35.36114,-8.88509],[-35.3612,-8.88587],[-35.36175,-8.8859],[-35.36178,-8.88777],[-35.36253,-8.88783],[-35.36247,-8.891],[-35.36311,-8.89112],[-35.36311,-8.89482],[-35.3644,-8.89488],[-35.36507,-8.8967],[-35.36637,-8.90022],[-35.36754,-8.90427],[-35.36794,-8.90782],[-35.36863,-8.90917],[-35.37207,-8.91155],[-35.3741,-8.91349],[-35.37277,-8.916],[-35.37262,-8.91817],[-35.37084,-8.92229],[-35.37062,-8.92486],[-35.37235,-8.93038],[-35.37153,-8.93193],[-35.37153,-8.93363],[-35.37171,-8.93387],[-35.37171,-8.94362],[-35.36818,-8.94377],[-35.36815,-8.94505],[-35.36927,-8.94511],[-35.36921,-8.94863],[-35.37078,-8.94872],[-35.37081,-8.95182],[-35.37219,-8.95176],[-35.37222,-8.95528],[-35.37319,-8.95531],[-35.37313,-8.95737],[-35.3744,-8.95737],[-35.37446,-8.96012],[-35.37567,-8.96018],[-35.3757,-8.96205],[-35.37688,-8.96208],[-35.37694,-8.96444],[-35.37781,-8.96444],[-35.37775,-8.96617],[-35.38074,-8.96617],[-35.38074,-8.96331],[-35.38288,-8.96328],[-35.38291,-8.95982],[-35.38542,-8.95985],[-35.38542,-8.95722],[-35.38723,-8.95722],[-35.3872,-8.95406],[-35.38947,-8.95409],[-35.38947,-8.95084],[-35.39158,-8.95087],[-35.39158,-8.94792],[-35.39587,-8.94792],[-35.39581,-8.94651],[-35.3972,-8.94654],[-35.39711,-8.94472],[-35.39838,-8.94469],[-35.39838,-8.93915],[-35.40107,-8.93915],[-35.40106,-8.93895],[-35.40167,-8.93894],[-35.40173,-8.93688],[-35.40236,-8.93688],[-35.40236,-8.93628],[-35.40324,-8.9364],[-35.4033,-8.93583],[-35.40426,-8.9358],[-35.4042,-8.93363],[-35.40574,-8.9336],[-35.40577,-8.93124],[-35.4081,-8.93133],[-35.40804,-8.92927],[-35.40937,-8.9293],[-35.40928,-8.92739],[-35.41085,-8.92742],[-35.41085,-8.92542],[-35.41239,-8.92545],[-35.41236,-8.9239],[-35.41335,-8.92387],[-35.41329,-8.92193],[-35.41523,-8.92196],[-35.41523,-8.91999],[-35.41655,-8.92002],[-35.41655,-8.91755],[-35.4196,-8.91755],[-35.41966,-8.91964],[-35.42184,-8.91964],[-35.42187,-8.92265],[-35.42389,-8.92268],[-35.42392,-8.92513],[-35.42537,-8.92513],[-35.42537,-8.92766],[-35.42724,-8.92766],[-35.42727,-8.92987],[-35.42815,-8.92984],[-35.42818,-8.9316],[-35.42987,-8.93154],[-35.4299,-8.93407],[-35.43141,-8.93407],[-35.43141,-8.9356],[-35.43226,-8.93557],[-35.43229,-8.93586],[-35.4334,-8.93583],[-35.4334,-8.94001],[-35.43434,-8.94004],[-35.43434,-8.94097],[-35.43531,-8.94097],[-35.43534,-8.94261],[-35.43567,-8.94264],[-35.4357,-8.94329],[-35.43627,-8.94332],[-35.43624,-8.94422],[-35.4373,-8.94422],[-35.43727,-8.9452],[-35.43823,-8.9452],[-35.43827,-8.94684],[-35.43902,-8.94687],[-35.43902,-8.94798],[-35.44026,-8.94798],[-35.44032,-8.94953],[-35.44159,-8.94956],[-35.44165,-8.95152],[-35.44273,-8.95152],[-35.44273,-8.95334],[-35.44436,-8.95334],[-35.44436,-8.95498],[-35.44569,-8.95501],[-35.44563,-8.95674],[-35.4472,-8.9568],[-35.44717,-8.95865],[-35.44895,-8.95871],[-35.44892,-8.96],[-35.45101,-8.95994],[-35.45098,-8.96101],[-35.45469,-8.96095],[-35.45466,-8.96235],[-35.46049,-8.96235],[-35.46055,-8.96557],[-35.46653,-8.96548],[-35.46659,-8.96885],[-35.46771,-8.96883],[-35.46774,-8.97053],[-35.4739,-8.97053],[-35.47399,-8.9753],[-35.47791,-8.97521],[-35.47797,-8.97816],[-35.4841,-8.97813],[-35.48416,-8.98201],[-35.49084,-8.98195],[-35.49084,-8.98562],[-35.49721,-8.98562],[-35.49721,-8.99069],[-35.50225,-8.99057],[-35.50234,-8.99567],[-35.50648,-8.99567],[-35.50651,-8.99856],[-35.51204,-8.9985],[-35.51207,-9.00163],[-35.51663,-9.00166],[-35.51666,-9.00617],[-35.52119,-9.00614],[-35.52122,-9.00739],[-35.53127,-9.00733],[-35.53127,-9.01064],[-35.54818,-9.01049],[-35.54818,-9.01359],[-35.56968,-9.01344],[-35.56974,-9.01738],[-35.58575,-9.01732],[-35.58578,-9.01995],[-35.60957,-9.01983],[-35.60954,-9.02302],[-35.62911,-9.02287],[-35.62905,-9.02508],[-35.65221,-9.0249],[-35.65224,-9.02758],[-35.67552,-9.0274],[-35.67555,-9.03056],[-35.68295,-9.03056],[-35.68298,-9.03435],[-35.69128,-9.03432],[-35.69128,-9.03766],[-35.6995,-9.0376],[-35.6995,-9.04034],[-35.70668,-9.04031],[-35.70671,-9.04518],[-35.71115,-9.04518],[-35.71133,-9.06691],[-35.70871,-9.06691],[-35.70877,-9.07869],[-35.70656,-9.07872],[-35.70656,-9.08653],[-35.7043,-9.08653],[-35.70433,-9.09104],[-35.69992,-9.09107],[-35.69989,-9.0956],[-35.69536,-9.09557],[-35.69542,-9.10001],[-35.69092,-9.10013],[-35.69101,-9.10207],[-35.63367,-9.10246],[-35.6337,-9.10541],[-35.62585,-9.10553],[-35.62591,-9.10964],[-35.62231,-9.10964],[-35.62234,-9.11203],[-35.6199,-9.112],[-35.6199,-9.11501],[-35.61473,-9.11507],[-35.61473,-9.11707],[-35.61177,-9.11701],[-35.61181,-9.1182],[-35.6096,-9.11826],[-35.60963,-9.12571],[-35.59976,-9.12583],[-35.59979,-9.12923],[-35.59634,-9.12926],[-35.5964,-9.13502],[-35.59197,-9.13507],[-35.59209,-9.149],[-35.59018,-9.14897],[-35.59015,-9.15108],[-35.6016,-9.15105],[-35.60154,-9.14912],[-35.60552,-9.14912],[-35.60549,-9.14557],[-35.61184,-9.14554],[-35.61184,-9.14235],[-35.6176,-9.14238],[-35.61757,-9.13853],[-35.624,-9.13853],[-35.62397,-9.13466],[-35.63177,-9.13466],[-35.63164,-9.13063],[-35.63922,-9.1306],[-35.63919,-9.12878],[-35.66386,-9.12869],[-35.6638,-9.1261],[-35.71278,-9.12577],[-35.71275,-9.12407],[-35.72426,-9.12401],[-35.71964,-9.15323],[-35.72112,-9.1532],[-35.72124,-9.17258],[-35.72066,-9.17255],[-35.72082,-9.18558],[-35.71212,-9.18566],[-35.7133,-9.34416],[-35.69041,-9.34433],[-35.69065,-9.37189],[-35.68899,-9.37189],[-35.68902,-9.37598],[-35.68757,-9.37598],[-35.68766,-9.38232],[-35.68497,-9.38235],[-35.68503,-9.39093],[-35.68168,-9.39099],[-35.68177,-9.39936],[-35.67715,-9.39933],[-35.67724,-9.4089],[-35.67292,-9.40893],[-35.67301,-9.41754],[-35.66972,-9.4176],[-35.66978,-9.42498],[-35.66722,-9.42498],[-35.66728,-9.4327],[-35.66075,-9.43288],[-35.66075,-9.43705],[-35.6513,-9.43708],[-35.65142,-9.44211],[-35.64514,-9.44217],[-35.64523,-9.44652],[-35.63645,-9.44661],[-35.63645,-9.44992],[-35.62711,-9.45],[-35.62727,-9.46505],[-35.62086,-9.46511],[-35.62092,-9.4722],[-35.60939,-9.47222],[-35.60939,-9.47529],[-35.59674,-9.47535],[-35.59674,-9.47351],[-35.57844,-9.47371],[-35.57847,-9.47595],[-35.57267,-9.47604],[-35.5727,-9.48042],[-35.56823,-9.48048],[-35.56826,-9.48881],[-35.54169,-9.48893],[-35.54163,-9.48071],[-35.52384,-9.48089]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"arapiraca_al",name:"Arapiraca AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Arapiraca&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.60875,-9.83072],[-36.60784,-9.74047],[-36.61718,-9.74051],[-36.61631,-9.65075],[-36.70737,-9.64977],[-36.70832,-9.74043],[-36.69898,-9.74047],[-36.69997,-9.82968],[-36.60875,-9.83072]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"CRAIG-Auvergne-2013",name:"Auvergne 2013 25cm CRAIG",type:"tms",template:"https://tiles.craig.fr/osm/wmts/1.0.0/ortho_2013/webmercator/{zoom}/{x}/{y}.jpeg",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.94012,44.63388],[2.99719,44.63393],[2.99717,44.64734],[3.01597,44.64735],[3.01593,44.67412],[3.03495,44.67413],[3.0349,44.70152],[3.05363,44.70154],[3.05357,44.7419],[3.07233,44.74191],[3.07222,44.80917],[3.09216,44.80919],[3.09214,44.82213],[3.13014,44.82216],[3.13005,44.87707],[3.14856,44.87709],[3.14858,44.8637],[3.16823,44.86371],[3.16825,44.85003],[3.2064,44.85006],[3.20638,44.86284],[3.24395,44.86287],[3.24393,44.87679],[3.26315,44.87681],[3.26308,44.91752],[3.32004,44.91757],[3.32002,44.93033],[3.33908,44.93035],[3.33906,44.9442],[3.377,44.94423],[3.37702,44.93029],[3.39603,44.9303],[3.39612,44.87627],[3.41483,44.87629],[3.41489,44.83553],[3.43334,44.83554],[3.43338,44.80828],[3.45255,44.80829],[3.45258,44.79463],[3.50893,44.79468],[3.5089,44.80815],[3.60426,44.80823],[3.60422,44.83482],[3.62361,44.83484],[3.62357,44.86166],[3.64248,44.86167],[3.64255,44.8211],[3.66101,44.82112],[3.66103,44.80777],[3.6993,44.8078],[3.69928,44.82099],[3.73611,44.82102],[3.73618,44.77971],[3.77511,44.77974],[3.77515,44.75223],[3.81184,44.75226],[3.81186,44.7392],[3.83118,44.73922],[3.83121,44.72468],[3.88782,44.72472],[3.8878,44.73818],[3.92563,44.73821],[3.9256,44.75167],[3.94541,44.75168],[3.94537,44.77847],[3.96437,44.77848],[3.96435,44.79193],[4.00332,44.79196],[4.0033,44.80526],[4.02169,44.80527],[4.02167,44.81857],[4.05965,44.8186],[4.05961,44.84492],[4.07981,44.84494],[4.07979,44.85735],[4.17388,44.85743],[4.17386,44.87055],[4.19326,44.87056],[4.19323,44.88427],[4.21404,44.88429],[4.214,44.91002],[4.23241,44.91004],[4.23237,44.93731],[4.27155,44.93734],[4.27153,44.9503],[4.32887,44.95034],[4.32878,45.00367],[4.34893,45.00368],[4.3489,45.01707],[4.40608,45.01711],[4.40599,45.071],[4.38847,45.07099],[4.38845,45.0846],[4.40794,45.08461],[4.40792,45.09663],[4.48436,45.09669],[4.48429,45.13705],[4.46636,45.13703],[4.46634,45.1502],[4.48645,45.15022],[4.4864,45.17724],[4.50655,45.17726],[4.50644,45.24501],[4.48813,45.24499],[4.48811,45.25921],[4.46986,45.25919],[4.46984,45.27298],[4.45088,45.27297],[4.45086,45.28642],[4.39368,45.28637],[4.39363,45.31352],[4.37509,45.3135],[4.37507,45.32741],[4.39507,45.32742],[4.39503,45.35458],[4.37679,45.35457],[4.37676,45.36855],[4.35766,45.36853],[4.35763,45.38234],[4.28146,45.38227],[4.28143,45.39688],[4.24446,45.39685],[4.24443,45.41079],[4.14812,45.41071],[4.14814,45.39807],[4.12919,45.39805],[4.12921,45.38409],[4.09021,45.38406],[4.09024,45.37121],[4.01355,45.37115],[4.01353,45.3861],[3.91709,45.38602],[3.91707,45.39974],[3.93757,45.39975],[3.93755,45.41311],[3.97528,45.41315],[3.97526,45.42621],[3.99537,45.42622],[3.9957,45.52096],[3.97778,45.52094],[3.97769,45.57439],[3.95818,45.57437],[3.95815,45.58837],[3.9396,45.58835],[3.93958,45.60262],[3.92023,45.60261],[3.9202,45.61646],[3.88189,45.61643],[3.88185,45.64328],[3.84413,45.64325],[3.84411,45.65709],[3.82617,45.65707],[3.82612,45.68389],[3.80722,45.68387],[3.80713,45.73758],[3.78821,45.73756],[3.78819,45.7518],[3.76885,45.75178],[3.7688,45.77897],[3.75072,45.77895],[3.75058,45.86066],[3.76967,45.86067],[3.76958,45.91433],[3.75166,45.91432],[3.75164,45.92809],[3.7329,45.92807],[3.73285,45.95472],[3.81018,45.95478],[3.81016,45.96823],[3.8496,45.96826],[3.84951,46.02162],[3.83188,46.0216],[3.83179,46.07591],[3.8505,46.07592],[3.85046,46.10295],[3.83247,46.10294],[3.83234,46.18456],[3.81422,46.18455],[3.81415,46.22442],[3.83369,46.22444],[3.83366,46.2381],[3.85289,46.23812],[3.85287,46.25147],[3.89314,46.25151],[3.89312,46.26447],[3.91306,46.26448],[3.91303,46.27793],[3.95189,46.27796],[3.95187,46.29082],[3.97152,46.29084],[3.9715,46.30369],[4.0105,46.30373],[4.01048,46.31776],[4.02983,46.31778],[4.02978,46.34428],[4.0116,46.34427],[4.01146,46.42534],[4.03153,46.42536],[4.03146,46.4658],[4.01324,46.46578],[4.01322,46.47938],[3.99437,46.47936],[3.99435,46.49361],[3.9746,46.4936],[3.97457,46.50753],[3.87754,46.50745],[3.8775,46.53478],[3.85836,46.53476],[3.85833,46.54832],[3.81869,46.54828],[3.81871,46.53553],[3.79924,46.53552],[3.79922,46.54907],[3.76104,46.54904],[3.76092,46.61681],[3.74233,46.61679],[3.74228,46.64396],[3.72286,46.64395],[3.72281,46.67104],[3.70387,46.67102],[3.70385,46.68467],[3.68411,46.68466],[3.68406,46.712],[3.66484,46.71198],[3.66479,46.73904],[3.64576,46.73902],[3.64572,46.76634],[3.62575,46.76632],[3.62573,46.77971],[3.56723,46.77966],[3.56725,46.76631],[3.54715,46.76629],[3.54719,46.73928],[3.52716,46.73927],[3.52723,46.6989],[3.48774,46.69887],[3.48776,46.68594],[3.46796,46.68593],[3.46794,46.69941],[3.46792,46.71279],[3.44865,46.71278],[3.44863,46.72679],[3.35043,46.72671],[3.35048,46.6999],[3.33039,46.69988],[3.33034,46.7272],[3.23272,46.72712],[3.23274,46.71351],[3.2129,46.7135],[3.21293,46.70013],[3.17354,46.7001],[3.1735,46.72751],[3.15412,46.72749],[3.1541,46.74073],[3.11478,46.7407],[3.11475,46.75428],[3.07534,46.75424],[3.0753,46.78135],[3.05597,46.78134],[3.05592,46.80831],[2.99704,46.80826],[2.99702,46.82196],[2.93794,46.82191],[2.93797,46.80826],[2.89866,46.80823],[2.89869,46.79424],[2.87899,46.79422],[2.87901,46.78104],[2.85942,46.78103],[2.85944,46.76771],[2.84004,46.76769],[2.84007,46.75447],[2.7414,46.75439],[2.74138,46.76682],[2.70234,46.76679],[2.70236,46.75389],[2.68266,46.75387],[2.68268,46.74048],[2.66349,46.74046],[2.66351,46.7259],[2.64342,46.72588],[2.64344,46.71309],[2.62414,46.71308],[2.62417,46.69981],[2.60397,46.69979],[2.60399,46.68584],[2.56512,46.68581],[2.56515,46.67261],[2.54593,46.6726],[2.546,46.63215],[2.56592,46.63217],[2.56595,46.61811],[2.54564,46.61809],[2.54569,46.59072],[2.56642,46.59074],[2.56644,46.57754],[2.5855,46.57756],[2.58552,46.56472],[2.56613,46.5647],[2.56616,46.55062],[2.46828,46.55055],[2.4683,46.53582],[2.33212,46.53571],[2.33217,46.50886],[2.31265,46.50884],[2.31267,46.49534],[2.29288,46.49533],[2.2929,46.48182],[2.27487,46.4818],[2.27492,46.45442],[2.25539,46.4544],[2.25553,46.37349],[2.27595,46.37351],[2.27604,46.32087],[2.31456,46.32091],[2.31458,46.30704],[2.35371,46.30707],[2.35373,46.29297],[2.39384,46.293],[2.39389,46.26729],[2.45157,46.26733],[2.4516,46.25349],[2.47094,46.25351],[2.47098,46.22656],[2.49151,46.22657],[2.49155,46.19933],[2.51088,46.19934],[2.51093,46.17278],[2.53117,46.1728],[2.53138,46.05135],[2.55163,46.05137],[2.55166,46.03777],[2.57056,46.03778],[2.57068,45.96994],[2.55144,45.96993],[2.55146,45.95662],[2.53226,45.9566],[2.53228,45.94301],[2.51307,45.94299],[2.51313,45.90203],[2.47494,45.902],[2.47496,45.88882],[2.43619,45.88879],[2.43622,45.87533],[2.41721,45.87531],[2.41725,45.84794],[2.37847,45.84791],[2.3785,45.83397],[2.35952,45.83396],[2.35956,45.80708],[2.37873,45.8071],[2.37875,45.79358],[2.3987,45.79359],[2.39872,45.78035],[2.41825,45.78036],[2.41832,45.74],[2.45722,45.74003],[2.45724,45.7267],[2.47589,45.72671],[2.47591,45.71324],[2.49533,45.71325],[2.49542,45.65913],[2.45769,45.6591],[2.45776,45.61834],[2.43912,45.61833],[2.43919,45.57766],[2.4585,45.57768],[2.45855,45.55053],[2.47809,45.55055],[2.47811,45.53725],[2.49755,45.53726],[2.49759,45.51068],[2.47855,45.51066],[2.47864,45.45613],[2.45978,45.45612],[2.45987,45.40176],[2.42249,45.40173],[2.42247,45.41528],[2.40232,45.41527],[2.40229,45.42882],[2.3256,45.42876],[2.32567,45.38796],[2.34562,45.38798],[2.34566,45.36111],[2.32626,45.36109],[2.32628,45.34721],[2.30738,45.3472],[2.3074,45.3336],[2.28811,45.33358],[2.28813,45.32082],[2.26963,45.3208],[2.26966,45.30621],[2.25066,45.3062],[2.25068,45.29251],[2.23169,45.2925],[2.23171,45.27924],[2.213,45.27922],[2.21305,45.25204],[2.19374,45.25202],[2.19376,45.23811],[2.17561,45.2381],[2.17574,45.15768],[2.15735,45.15767],[2.15744,45.10295],[2.12024,45.10292],[2.12026,45.08955],[2.10067,45.08953],[2.10069,45.07544],[2.08246,45.07543],[2.08255,45.0216],[2.10255,45.02161],[2.1026,44.99445],[2.04574,44.99441],[2.04585,44.92753],[2.06578,44.92755],[2.06589,44.85969],[2.0857,44.8597],[2.08572,44.84581],[2.10556,44.84583],[2.1056,44.81933],[2.12474,44.81934],[2.12477,44.80551],[2.14351,44.80553],[2.14355,44.7786],[2.12561,44.77858],[2.1257,44.72427],[2.10665,44.72426],[2.10671,44.68423],[2.12634,44.68424],[2.12636,44.67074],[2.14598,44.67075],[2.14607,44.61644],[2.18396,44.61648],[2.18398,44.60378],[2.24042,44.60383],[2.24037,44.63095],[2.25948,44.63097],[2.25946,44.64493],[2.31668,44.64498],[2.3167,44.63088],[2.33615,44.6309],[2.33617,44.61758],[2.37242,44.61761],[2.3724,44.63158],[2.41105,44.63161],[2.41107,44.61907],[2.44922,44.61911],[2.4492,44.63232],[2.50486,44.63237],[2.50481,44.65976],[2.52461,44.65977],[2.52457,44.68717],[2.54225,44.68719],[2.54223,44.70122],[2.58071,44.70125],[2.5806,44.76834],[2.61769,44.76837],[2.61762,44.80884],[2.63676,44.80885],[2.63669,44.84929],[2.67331,44.84933],[2.67329,44.86252],[2.69338,44.86253],[2.69333,44.88943],[2.73052,44.88946],[2.73048,44.91645],[2.74992,44.91646],[2.75005,44.83647],[2.80733,44.83652],[2.80731,44.8491],[2.82638,44.84912],[2.8264,44.83628],[2.8457,44.8363],[2.84577,44.79571],[2.86422,44.79573],[2.86426,44.76865],[2.88399,44.76866],[2.88403,44.74197],[2.90203,44.74198],[2.90214,44.67432],[2.92198,44.67434],[2.92202,44.6473],[2.9401,44.64731],[2.94012,44.63388]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/8cabc987-829c-4c9f-943b-6a0e255cd73",terms_text:"Orthophotographie CRAIG/Sintegra/IGN 2013"},{id:"CRAIG-Auvergne-2016",name:"Auvergne 2016 25cm CRAIG",type:"tms",template:"https://tiles.craig.fr/ortho/wmts/1.0.0/ortho_2016/webmercator/{zoom}/{x}/{y}.jpeg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.49389,46.66829],[2.71362,46.84141],[3.64746,46.80758],[4.04846,46.48327],[4.03747,46.24825],[4.46044,46.25965],[4.4934,46.14559],[4.38354,46.09229],[4.45495,45.69084],[4.76257,45.57176],[4.81201,45.34443],[4.22424,44.84419],[3.86169,44.696],[3.37829,44.80523],[3.33435,44.89091],[3.18054,44.82471],[3.03222,44.60612],[2.92785,44.60221],[2.71911,44.85198],[2.51037,44.60221],[2.12585,44.58265],[2.005,44.97257],[2.30712,45.46784],[2.43347,45.44087],[2.41149,45.72919],[2.34558,45.82402],[2.54882,45.97979],[2.46093,46.22166],[2.21374,46.33935],[2.27828,46.53903],[2.54882,46.56642],[2.49389,46.66829]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/e37c057b-5884-429b-8bec-5db0baef0ee",terms_text:"CRAIG - IGN -TopoGEODIS - Feder Auvergne-Rhône-Alpes 2016"},{id:"BANO",name:"BANO",type:"tms",template:"https://{switch:a,b,c}.layers.openstreetmap.fr/bano/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/FR:WikiProject_France/WikiProject_Base_Adresses_Nationale_Ouverte_(BANO)#Licence_du_r.C3.A9sultat",terms_text:"Tiles © cquest@Openstreetmap France, data © OpenStreetMap contributors, ODBL",description:"French address registry or Base Adresses Nationale Ouverte",overlay:true},{id:"lu.geoportail.opendata.basemap",name:"Basemap geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/basemap/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",endDate:"2010-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/carte-de-base-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"basemap.at",name:"basemap.at",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/geolandbasemap/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",description:"Basemap of Austria, based on government data.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"basemap.at-overlay",name:"basemap.at Beschriftungen (annotations)",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmapoverlay/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at/",terms_text:"basemap.at",description:"Annotation overlay provided by basemap.at.",icon:"https://www.basemap.at/images/logo_basemap.jpg",overlay:true},{id:"basemap.at-orthofoto",name:"basemap.at Orthofoto",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmaporthofoto30cm/normal/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[0,19],polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"https://basemap.at",terms_text:"basemap.at",best:true,description:"Orthofoto layer provided by basemap.at. \"Successor\" of geoimage.at imagery.",icon:"https://www.basemap.at/images/logo_basemap.jpg"},{id:"bavaria-80cm",name:"Bavaria (80 cm)",type:"wms",template:"https://geoservices.bayern.de/wms/v1/ogc_dop80_oa.cgi?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=by_dop80c&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[7,18],polygon:[[[10.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung",best:true},{id:"bavaria-DOP80",name:"Bavaria DOP 80cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[7,18],polygon:[[[10.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung",best:true},{id:"route500hydro",name:"BD Carthage",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.fr/route500hydro/{zoom}/{x}/{y}.png",zoomExtent:[6,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"http://www.sandre.eaufrance.fr/actualite/la-bd-carthage-en-licence-ouverte-open-licence",terms_text:"Tiles © cquest@Openstreetmap France, data © Onema - IGN, LO/OL",description:"Réseau hydrographique: cours et plans d'eau et POI",overlay:true},{id:"fr.ign.bdortho",name:"BDOrtho IGN",type:"tms",template:"https://proxy-ign.openstreetmap.fr/94GjiyqD/bdortho/{zoom}/{x}/{y}.jpg",zoomExtent:[2,21],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]],[[-61.27501,14.90218],[-60.72368,14.90101],[-60.72489,14.36686],[-61.27622,14.36803],[-61.27501,14.90218]],[[-61.92802,16.58618],[-61.92686,15.7394],[-60.88128,15.74072],[-60.88243,16.5875],[-61.92802,16.58618]],[[-53.89344,6.004],[-52.46522,5.4465],[-51.52039,4.51072],[-51.53687,4.11633],[-52.2345,3.10213],[-52.641,2.25162],[-52.92664,2.07597],[-53.72864,2.21869],[-54.20106,2.03205],[-54.8053,2.27358],[-54.31092,2.80589],[-54.31641,3.20085],[-54.12415,3.46408],[-54.12964,3.59567],[-54.42078,4.00127],[-54.58008,4.95962],[-53.89344,6.004]],[[55.08816,-20.77935],[55.95959,-20.77281],[55.96576,-21.49],[55.09434,-21.49651],[55.08816,-20.77935]],[[44.92054,-12.57363],[45.34826,-12.57029],[45.35274,-13.1163],[44.92502,-13.11963],[44.92054,-12.57363]],[[-178.57728,-14.70582],[-178.42568,-14.00334],[-176.34156,-12.83858],[-175.71534,-12.9189],[-175.91858,-13.58726],[-177.84638,-14.64983],[-178.57728,-14.70582]]],terms_url:"https://openstreetmap.fr/bdortho",terms_text:"BDOrtho IGN",best:true,icon:"http://www.ign.fr/institut/sites/all/themes/ign_institut/logo.png"},{id:"Benin_cotonou_pleiade_2016",name:"Benin: Cotonou Pleiade 2016",type:"tms",template:"https://geoxxx.agrocampus-ouest.fr/owsifl/gwc/service/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Benin:cotonou_pleiade_2016&STYLE=&FORMAT=image/jpeg&tileMatrixSet=EPSG:3857&tileMatrix=EPSG:3857:{zoom}&tileRow={y}&tileCol={x}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[2.31954,6.55745],[2.33645,6.56024],[2.36377,6.56211],[2.36738,6.56068],[2.37777,6.5494],[2.37779,6.53485],[2.36994,6.49332],[2.37038,6.45527],[2.36958,6.45269],[2.36188,6.44177],[2.35392,6.40545],[2.36749,6.4015],[2.39526,6.40072],[2.40128,6.40374],[2.40588,6.40341],[2.42046,6.39383],[2.42485,6.39794],[2.42949,6.39887],[2.43625,6.39628],[2.43958,6.40042],[2.44439,6.40189],[2.45376,6.39899],[2.47145,6.39632],[2.48162,6.39106],[2.49453,6.3874],[2.50893,6.38888],[2.50719,6.39229],[2.5012,6.39162],[2.4963,6.39521],[2.4951,6.40123],[2.49543,6.40401],[2.4983,6.41022],[2.50191,6.41282],[2.51087,6.41321],[2.52219,6.40849],[2.53352,6.40517],[2.5381,6.40961],[2.54111,6.4109],[2.54651,6.41099],[2.54654,6.40651],[2.57639,6.40724],[2.57642,6.41177],[2.58576,6.41196],[2.58868,6.41095],[2.60877,6.39414],[2.6257,6.39488],[2.64555,6.39729],[2.65039,6.39339],[2.65367,6.36823],[2.64312,6.36659],[2.61251,6.36289],[2.56868,6.3607],[2.54683,6.36055],[2.54687,6.35546],[2.50207,6.35461],[2.47064,6.35596],[2.46777,6.35203],[2.46423,6.3502],[2.45254,6.35006],[2.45113,6.34813],[2.44737,6.34629],[2.43757,6.34654],[2.43298,6.33841],[2.43016,6.33707],[2.42245,6.33707],[2.39236,6.34115],[2.39315,6.34115],[2.36528,6.34445],[2.35386,6.3453],[2.34377,6.34458],[2.34094,6.34534],[2.31086,6.36567],[2.28435,6.37465],[2.28147,6.37762],[2.27599,6.39517],[2.27612,6.3982],[2.31529,6.49261],[2.3158,6.55307],[2.31954,6.55745]],[[1.69563,6.25076],[1.7001,6.24712],[1.70418,6.24697],[1.75875,6.25836],[1.77079,6.25995],[1.81712,6.27161],[1.84457,6.27657],[1.85768,6.27945],[1.88843,6.28326],[1.90482,6.28595],[1.90618,6.29435],[1.90083,6.29721],[1.89881,6.29954],[1.89404,6.30085],[1.89048,6.2997],[1.88748,6.29636],[1.88344,6.29622],[1.8697,6.29227],[1.8564,6.29198],[1.85207,6.28675],[1.84991,6.28906],[1.84691,6.29203],[1.84353,6.29333],[1.84041,6.29315],[1.83627,6.29129],[1.8341,6.28733],[1.83417,6.2852],[1.8323,6.28456],[1.82786,6.28644],[1.82182,6.29084],[1.81563,6.28998],[1.81211,6.29143],[1.80758,6.29571],[1.80472,6.29693],[1.80074,6.2971],[1.79776,6.29612],[1.79625,6.29492],[1.7949,6.28965],[1.79641,6.28608],[1.80098,6.28338],[1.79567,6.28013],[1.79156,6.28174],[1.78499,6.28122],[1.78092,6.27753],[1.77588,6.2755],[1.76745,6.27696],[1.75653,6.27496],[1.74833,6.27239],[1.74762,6.27726],[1.74572,6.27938],[1.73948,6.27985],[1.7368,6.27761],[1.73572,6.27892],[1.72902,6.27911],[1.72435,6.27422],[1.72449,6.26786],[1.72556,6.26683],[1.69934,6.26159],[1.69573,6.25726],[1.69563,6.25076]]],best:true},{id:"Berlin-2011",name:"Berlin aerial photography 2011",type:"wms",template:"https://fbinter.stadt-berlin.de/fb/wms/senstadt/k_luftbild2011_20?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[13.48699,52.68076],[13.52584,52.65196],[13.5299,52.64437],[13.54209,52.60921],[13.58109,52.58134],[13.59674,52.55936],[13.63477,52.55121],[13.66547,52.52854],[13.67199,52.50379],[13.65806,52.50372],[13.65796,52.49324],[13.7547,52.4565],[13.76644,52.43884],[13.76627,52.42973],[13.74494,52.39909],[13.65235,52.33133],[13.6417,52.33103],[13.62609,52.35491],[13.59432,52.37455],[13.53198,52.38376],[13.51948,52.39236],[13.48536,52.39227],[13.43552,52.38016],[13.42885,52.37401],[13.38689,52.37388],[13.38642,52.38667],[13.36857,52.38728],[13.37045,52.39349],[13.33968,52.40887],[13.31243,52.39775],[13.30557,52.40452],[13.23622,52.40342],[13.18886,52.40417],[13.17719,52.39067],[13.14859,52.38971],[13.14868,52.38421],[13.11889,52.38385],[13.11935,52.40025],[13.10487,52.40723],[13.07371,52.40668],[13.07367,52.41403],[13.10516,52.47897],[13.11685,52.47881],[13.112,52.55915],[13.11865,52.59156],[13.15251,52.60489],[13.16282,52.60462],[13.21264,52.6321],[13.22139,52.63215],[13.27292,52.66444],[13.31376,52.66442],[13.32714,52.64692],[13.36783,52.6468],[13.39158,52.65382],[13.42728,52.6549],[13.47594,52.68122],[13.48699,52.68076]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2011"},{id:"Berlin-2014",name:"Berlin aerial photography 2014",type:"tms",template:"https://tiles.codefor.de/berlin-2014/{zoom}/{x}/{y}.png",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[13.19746,52.64206],[13.25639,52.64285],[13.2558,52.66101],[13.31391,52.66185],[13.31476,52.64353],[13.37431,52.64462],[13.37386,52.66269],[13.4026,52.663],[13.40332,52.64501],[13.4334,52.64555],[13.43227,52.68001],[13.49082,52.68111],[13.49147,52.66428],[13.52092,52.66457],[13.5216,52.6465],[13.55096,52.6469],[13.55147,52.62938],[13.52219,52.62898],[13.52335,52.59248],[13.58263,52.59329],[13.58307,52.57535],[13.61246,52.57582],[13.61324,52.55784],[13.64268,52.55813],[13.64296,52.5401],[13.67253,52.54048],[13.67375,52.50475],[13.64413,52.5045],[13.64476,52.48608],[13.7037,52.48683],[13.70415,52.46901],[13.73362,52.4692],[13.73399,52.45121],[13.76358,52.45156],[13.76447,52.40209],[13.73546,52.39753],[13.73611,52.37963],[13.70678,52.37935],[13.70731,52.36136],[13.67785,52.36104],[13.67898,52.33017],[13.62102,52.32946],[13.61999,52.36033],[13.59046,52.36007],[13.5901,52.37806],[13.53116,52.37735],[13.53064,52.39525],[13.47168,52.39459],[13.47149,52.4125],[13.44101,52.41219],[13.44257,52.37604],[13.35487,52.37498],[13.35427,52.39306],[13.23667,52.39114],[13.23609,52.40922],[13.17635,52.40836],[13.17752,52.39029],[13.14791,52.38987],[13.14876,52.37459],[13.11971,52.37422],[13.11941,52.38955],[13.08981,52.38899],[13.08938,52.40707],[13.0618,52.40662],[13.06075,52.42408],[13.08842,52.42449],[13.086,52.47853],[13.11546,52.47896],[13.11462,52.49695],[13.1441,52.49729],[13.14332,52.5157],[13.1137,52.51528],[13.11077,52.6047],[13.19862,52.6062],[13.19746,52.64206]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2014"},{id:"Berlin-2015",name:"Berlin aerial photography 2015",type:"tms",template:"https://tiles.codefor.de/berlin-2015/{zoom}/{x}/{y}.png",endDate:"2015-08-03T00:00:00.000Z",startDate:"2015-08-02T00:00:00.000Z",polygon:[[[13.11068,52.59538],[13.13975,52.60527],[13.18355,52.61488],[13.21262,52.63315],[13.24167,52.64282],[13.256,52.65201],[13.27004,52.67021],[13.31368,52.67072],[13.32914,52.66204],[13.32948,52.6529],[13.43284,52.65414],[13.44733,52.6816],[13.50561,52.68244],[13.50654,52.65531],[13.53605,52.65572],[13.5376,52.61991],[13.52229,52.61977],[13.52304,52.60165],[13.59776,52.58469],[13.59865,52.55769],[13.62817,52.55805],[13.64303,52.5492],[13.65813,52.54042],[13.67312,52.53144],[13.67356,52.51358],[13.65913,52.51344],[13.65998,52.48643],[13.68931,52.48687],[13.73386,52.46933],[13.73405,52.46034],[13.76362,52.46068],[13.76431,52.42464],[13.74941,52.42474],[13.75045,52.39778],[13.73585,52.39762],[13.70661,52.37944],[13.707,52.3614],[13.67782,52.36125],[13.66405,52.33395],[13.62073,52.33337],[13.62031,52.36042],[13.58986,52.3781],[13.53149,52.37748],[13.53133,52.38641],[13.44223,52.38484],[13.42813,52.3667],[13.38464,52.3662],[13.35432,52.39301],[13.29537,52.39209],[13.29531,52.40103],[13.19171,52.39957],[13.19222,52.39056],[13.14774,52.38996],[13.14839,52.38095],[13.11964,52.38041],[13.0744,52.40683],[13.07392,52.42426],[13.10275,52.43374],[13.10123,52.47874],[13.11558,52.47897],[13.11068,52.59538]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2015"},{id:"Berlin-2016",name:"Berlin aerial photography 2016",type:"tms",template:"https://tiles.codefor.de/berlin-2016/{zoom}/{x}/{y}.png",endDate:"2016-04-03T00:00:00.000Z",startDate:"2016-04-02T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2016"},{id:"Berlin-2016-infrared",name:"Berlin aerial photography 2016 (infrared)",type:"tms",template:"https://tiles.codefor.de/berlin-2016i/{zoom}/{x}/{y}.png",endDate:"2016-04-03T00:00:00.000Z",startDate:"2016-04-02T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale Color-Infrarot-Orthophotos 2016"},{id:"Berlin-2017",name:"Berlin aerial photography 2017",type:"tms",template:"https://tiles.codefor.de/berlin-2017/{zoom}/{x}/{y}.png",endDate:"2017-03-28T00:00:00.000Z",startDate:"2017-03-27T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2017"},{id:"Berlin-2018",name:"Berlin aerial photography 2018",type:"tms",template:"https://tiles.codefor.de/berlin-2018/{zoom}/{x}/{y}.png",endDate:"2018-04-07T00:00:00.000Z",startDate:"2018-03-19T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2018",best:true},{id:"Bing",name:"Bing aerial imagery",type:"bing",template:"https://www.bing.com/maps",zoomExtent:[0,22],"default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/Bing.png"},{id:"Bologna-Orthophoto-2017",name:"Bologna ortofoto 2017",type:"tms",template:"https://sitmappe.comune.bologna.it/tms/tileserver/Ortofoto2017/{zoom}/{x}/{y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[11.22962,44.53077],[11.23184,44.52461],[11.24123,44.52167],[11.23251,44.50893],[11.23572,44.50323],[11.25009,44.50116],[11.24765,44.49644],[11.25708,44.49765],[11.25653,44.49294],[11.29461,44.48981],[11.29676,44.4857],[11.28807,44.47586],[11.29226,44.4609],[11.28447,44.45459],[11.28228,44.42572],[11.29347,44.4276],[11.29254,44.43377],[11.31339,44.42103],[11.32504,44.42274],[11.33695,44.42772],[11.33765,44.43167],[11.3315,44.43273],[11.33453,44.43867],[11.34466,44.43594],[11.34498,44.44093],[11.36235,44.45099],[11.37312,44.44935],[11.37498,44.45897],[11.39499,44.46368],[11.4011,44.46122],[11.39464,44.46803],[11.41577,44.48376],[11.42559,44.4845],[11.42717,44.48921],[11.41727,44.4906],[11.43363,44.51312],[11.42692,44.51532],[11.43034,44.5196],[11.42466,44.51959],[11.41987,44.52934],[11.4143,44.52564],[11.40739,44.52851],[11.41487,44.53999],[11.38871,44.54145],[11.39082,44.54553],[11.36474,44.55253],[11.36414,44.55609],[11.3573,44.5519],[11.34375,44.55333],[11.33589,44.54299],[11.33145,44.54734],[11.31349,44.54722],[11.30929,44.5295],[11.29104,44.53581],[11.28179,44.54851],[11.26911,44.53248],[11.25118,44.55578],[11.24499,44.55569],[11.22962,44.53077]]],terms_url:"http://dati.comune.bologna.it/node/3449",terms_text:"© Comune di Bologna cc-by 4.0 ODbL compliant",best:true},{id:"Bonvillars-2013",name:"Bonvillars Orthophoto 2013",type:"tms",template:"http://osmdata.asitvd.ch/tiles/bonvillars2013/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.66713,46.83358],[6.66313,46.83833],[6.67213,46.84191],[6.6749,46.84226],[6.67843,46.83807],[6.66713,46.83358]]],terms_url:"http://osmdata.asitvd.ch/",terms_text:"Bonvillars - Orthophoto technique 2013"},{id:"Bordeaux_2012",name:"Bordeaux - 2012",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/bordeaux_2012/{zoom}/{x}/{y}",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-0.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],terms_text:"Communauté urbaine de Bordeaux - 2012"},{id:"Bordeaux_2016",name:"Bordeaux 2016",type:"tms",template:"http://tms.bordeaux.inria.fr/bdx2016/{zoom}/{x}/{y}.jpg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[-0.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],terms_text:"Bordeaux Métropole - 2016"},{id:"branquinha_al",name:"Branquinha AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?service=WMS&version=1.1.0&request=GetMap&layers=Branquinha&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.96968,-9.2928],[-35.97063,-9.20261],[-35.97727,-9.20264],[-35.98365,-9.2027],[-35.98765,-9.20266],[-35.99159,-9.20274],[-36.00498,-9.20284],[-36.01473,-9.20293],[-36.01651,-9.20296],[-36.01871,-9.20293],[-36.02487,-9.20286],[-36.02892,-9.20297],[-36.03308,-9.20289],[-36.03769,-9.20294],[-36.04581,-9.203],[-36.05161,-9.20305],[-36.05457,-9.20301],[-36.06022,-9.20304],[-36.06191,-9.20304],[-36.0618,-9.21319],[-36.06167,-9.21806],[-36.06156,-9.21915],[-36.06163,-9.22156],[-36.06144,-9.22277],[-36.06139,-9.22716],[-36.06134,-9.23227],[-36.0614,-9.23391],[-36.06145,-9.23494],[-36.06131,-9.23646],[-36.06133,-9.23773],[-36.06142,-9.23905],[-36.06145,-9.24133],[-36.06136,-9.2423],[-36.06141,-9.24358],[-36.06139,-9.2453],[-36.06126,-9.24726],[-36.06123,-9.24949],[-36.06127,-9.25107],[-36.06121,-9.25517],[-36.06119,-9.25795],[-36.06107,-9.25945],[-36.06109,-9.26183],[-36.06106,-9.26493],[-36.06086,-9.27146],[-36.06083,-9.2751],[-36.06074,-9.28274],[-36.0608,-9.29234],[-36.06074,-9.29363],[-36.05477,-9.29357],[-36.04621,-9.29349],[-36.03941,-9.29348],[-36.03501,-9.29339],[-36.02979,-9.29341],[-36.02167,-9.29332],[-36.01278,-9.29328],[-36.00468,-9.29321],[-35.99678,-9.29314],[-35.98969,-9.29312],[-35.98483,-9.29305],[-35.98305,-9.29289],[-35.98173,-9.29294],[-35.97884,-9.29282],[-35.96968,-9.2928]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"British_Columbia_Mosaic",name:"British Columbia Mosaic",type:"tms",template:"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/bc_mosaic/{zoom}/{x}/{y}.png",endDate:"2013-06-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",zoomExtent:[9,20],polygon:[[[-123.3176,49.32726],[-123.44053,49.32682],[-123.44072,49.33844],[-123.43984,49.34304],[-123.44013,49.34354],[-123.44011,49.34399],[-123.44063,49.34445],[-123.44047,49.34558],[-123.43978,49.34606],[-123.43897,49.34613],[-123.43729,49.35672],[-123.43748,49.37108],[-123.43353,49.37094],[-123.43304,49.37373],[-123.43327,49.37512],[-123.43228,49.3761],[-123.43175,49.37917],[-123.43143,49.37959],[-123.43078,49.38239],[-123.43134,49.38274],[-123.43121,49.38385],[-123.43004,49.38459],[-123.41899,49.38471],[-123.41922,49.41352],[-123.39725,49.41357],[-123.39728,49.42435],[-123.40069,49.42433],[-123.40077,49.57035],[-123.40008,49.57035],[-123.40108,49.59338],[-123.37604,49.59328],[-123.37698,49.67561],[-123.35073,49.67564],[-123.3508,49.70868],[-123.33289,49.70872],[-123.33279,49.72563],[-123.30071,49.72556],[-123.30092,49.73754],[-123.2886,49.73764],[-123.28878,49.82492],[-123.2998,49.82492],[-123.30117,49.84978],[-123.32182,49.85067],[-123.32733,49.85777],[-123.32767,49.97589],[-123.30083,49.97522],[-123.30072,50.0997],[-123.25017,50.10074],[-123.25091,50.27549],[-123.02243,50.27556],[-123.02249,50.32549],[-123.00093,50.32547],[-123.00078,50.34239],[-122.9775,50.34234],[-122.97748,50.35043],[-122.95081,50.3505],[-122.95079,50.3712],[-122.93252,50.37115],[-122.9321,50.39979],[-122.88742,50.39997],[-122.88734,50.42561],[-122.66202,50.4257],[-122.66231,50.39945],[-122.59903,50.39924],[-122.59883,50.37552],[-122.57248,50.37537],[-122.57356,50.24939],[-122.59904,50.24946],[-122.59915,50.22657],[-122.6185,50.22664],[-122.61857,50.22441],[-122.64906,50.22451],[-122.64922,50.19935],[-122.73086,50.19938],[-122.73116,50.12443],[-122.74904,50.12451],[-122.74905,50.0903],[-122.76878,50.09034],[-122.76898,49.94945],[-122.99905,49.94947],[-122.99912,49.87546],[-122.97759,49.87546],[-122.97781,49.69951],[-122.99924,49.69948],[-122.99925,49.65165],[-123.02215,49.65165],[-123.02212,49.59951],[-123.04919,49.59946],[-123.04919,49.59405],[-123.06646,49.59404],[-123.06636,49.54519],[-123.06999,49.54512],[-123.0699,49.54132],[-123.07068,49.53928],[-123.07089,49.53799],[-123.07115,49.53688],[-123.07111,49.53581],[-123.07138,49.53282],[-123.07165,49.53211],[-123.07171,49.53139],[-123.07203,49.53042],[-123.07396,49.53035],[-123.0748,49.5295],[-123.07482,49.52881],[-123.07434,49.52806],[-123.07353,49.52746],[-123.07337,49.52704],[-123.07329,49.52559],[-123.07371,49.52496],[-123.07362,49.52449],[-123.09926,49.52449],[-123.09916,49.47545],[-123.07105,49.47553],[-123.07109,49.4663],[-123.07392,49.46631],[-123.07422,49.4505],[-123.07463,49.45009],[-123.07465,49.44933],[-123.0746,49.44902],[-123.07446,49.44869],[-123.07433,49.44799],[-123.07424,49.44777],[-123.07431,49.44475],[-123.07471,49.44476],[-123.07464,49.43773],[-122.99965,49.43774],[-122.99965,49.43692],[-122.86062,49.44153],[-122.81026,49.4424],[-122.8099,49.37667],[-122.40361,49.37666],[-122.40363,49.37719],[-122.26474,49.3773],[-122.26354,49.23601],[-122.21557,49.23614],[-122.0581,49.23588],[-121.95383,49.29665],[-121.94009,49.30454],[-121.92358,49.31423],[-121.89909,49.32254],[-121.88834,49.32598],[-121.8553,49.33636],[-121.8327,49.34415],[-121.76713,49.36544],[-121.67367,49.36546],[-121.64042,49.37438],[-121.5962,49.38605],[-121.58612,49.38792],[-121.52137,49.39946],[-121.51174,49.40384],[-121.46793,49.4229],[-121.44168,49.43456],[-121.42243,49.43458],[-121.34629,49.39323],[-121.34801,49.34124],[-121.5135,49.32058],[-121.60317,49.27717],[-121.65841,49.18561],[-121.67995,49.16541],[-121.78158,49.07026],[-121.80762,49.06225],[-121.9394,49.06362],[-121.97255,49.04242],[-121.99214,49.03329],[-122.00353,49.02734],[-122.01786,49.02411],[-122.11086,48.99928],[-122.14931,48.99953],[-122.14927,48.99915],[-122.19914,48.9996],[-122.19918,48.9992],[-122.23436,48.99948],[-122.23436,49.00017],[-122.39947,49.00124],[-122.45213,49.00163],[-122.45213,49.00088],[-122.45841,49.00093],[-122.45848,48.99931],[-122.49925,48.9995],[-122.49925,48.99929],[-122.54926,48.99951],[-122.54926,48.99932],[-122.65808,48.99942],[-122.65811,48.9954],[-122.70676,48.99553],[-122.75198,48.99564],[-122.79221,48.99572],[-122.79219,48.99943],[-123.03504,48.99957],[-123.03504,49.0001],[-123.03971,49.00005],[-123.03974,49.00018],[-123.04855,49.00013],[-123.04853,49.00047],[-123.05571,49.00045],[-123.05563,49.00023],[-123.06414,49.00013],[-123.06416,48.99994],[-123.0749,48.99969],[-123.07507,49.00062],[-123.08996,49.00037],[-123.10923,48.99994],[-123.12712,49.0003],[-123.136,48.99987],[-123.13627,49.00058],[-123.15385,48.99981],[-123.15405,49.00068],[-123.171,49.00013],[-123.20009,48.99968],[-123.20034,49.04978],[-123.21088,49.04972],[-123.21122,49.05199],[-123.20705,49.05209],[-123.20789,49.06079],[-123.21917,49.0601],[-123.21896,49.06127],[-123.22518,49.06127],[-123.22539,49.06224],[-123.22971,49.06203],[-123.22981,49.06859],[-123.23319,49.06873],[-123.2335,49.07059],[-123.24931,49.07025],[-123.24973,49.08026],[-123.27514,49.0804],[-123.27514,49.08709],[-123.29948,49.0873],[-123.29944,49.08025],[-123.32545,49.08039],[-123.32544,49.11547],[-123.2751,49.15033],[-123.27518,49.18733],[-123.27881,49.18711],[-123.27889,49.19107],[-123.30048,49.19107],[-123.30042,49.26229],[-123.31262,49.26224],[-123.3126,49.27149],[-123.31543,49.27147],[-123.31566,49.28189],[-123.31747,49.28188],[-123.3175,49.29185],[-123.31904,49.29185],[-123.31907,49.2986],[-123.32023,49.29857],[-123.32028,49.30197],[-123.32227,49.30196],[-123.32239,49.31183],[-123.3254,49.31181],[-123.32539,49.32017],[-123.31927,49.3202],[-123.31922,49.32467],[-123.31794,49.32466],[-123.31799,49.32541],[-123.3176,49.32726]]],terms_url:"http://imagery.paulnorman.ca/tiles/about.html",terms_text:"Copyright Province of British Columbia, City of Surrey"},{id:"Budapest_XI_2015",name:"Budapest district XI orthophoto 2015",type:"wms",template:"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto2015_20160304&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[19.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],terms_url:"http://terinfo.ujbuda.hu",terms_text:"Budapest XI. kerület önkormányzata",description:"5 cm resolution bald image"},{id:"Budapest_XI_2017",name:"Budapest district XI orthophoto 2017",type:"wms",template:"http://terinfo.ujbuda.hu/mapproxy/service?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orto_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-03-01T00:00:00.000Z",startDate:"2017-03-01T00:00:00.000Z",polygon:[[[19.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],terms_url:"http://terinfo.ujbuda.hu",terms_text:"Budapest XI. kerület önkormányzata",best:true,description:"5 cm resolution bald image"},{id:"Cadastre",name:"Cadastre",type:"tms",template:"http://tms.cadastre.openstreetmap.fr/*/tout/{zoom}/{x}/{y}.png",zoomExtent:[12,22],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_Cadastre_Fran%C3%A7ais/Conditions_d%27utilisation",terms_text:"cadastre-dgi-fr source : Direction Générale des Impôts - Cadastre. Mise à jour : 2018",description:"French land registry",icon:"https://svn.openstreetmap.org/applications/editors/josm/plugins/cadastre-fr/images/cadastre_small.png"},{id:"lu.geoportail.opendata.cadastre",name:"Cadastre geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/cadastre/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/plan-cadastral-numerise-pcn-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"cajueiro_al",name:"Cajueiro AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Cajueiro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.10753,-9.43884],[-36.10752,-9.43421],[-36.10767,-9.42959],[-36.10779,-9.42361],[-36.10769,-9.41927],[-36.10781,-9.41391],[-36.10803,-9.41094],[-36.1081,-9.40965],[-36.10811,-9.40747],[-36.10816,-9.40693],[-36.10819,-9.40418],[-36.10811,-9.40176],[-36.10817,-9.40002],[-36.10827,-9.39952],[-36.10827,-9.39646],[-36.10833,-9.39475],[-36.10832,-9.39273],[-36.10836,-9.3904],[-36.10841,-9.38447],[-36.10847,-9.38165],[-36.10846,-9.37767],[-36.10835,-9.37573],[-36.10845,-9.37432],[-36.10849,-9.37234],[-36.10845,-9.3697],[-36.10867,-9.36278],[-36.10863,-9.36102],[-36.10873,-9.35928],[-36.10874,-9.35736],[-36.10855,-9.35479],[-36.1087,-9.3523],[-36.10871,-9.34996],[-36.10873,-9.34893],[-36.11269,-9.34908],[-36.11726,-9.34912],[-36.12138,-9.34905],[-36.12806,-9.3491],[-36.13217,-9.34906],[-36.13694,-9.34915],[-36.14025,-9.34914],[-36.14134,-9.34932],[-36.14458,-9.34916],[-36.14684,-9.34914],[-36.14842,-9.34905],[-36.15276,-9.34907],[-36.154,-9.34922],[-36.15627,-9.34923],[-36.16026,-9.34921],[-36.16086,-9.34929],[-36.166,-9.34933],[-36.16938,-9.34942],[-36.17176,-9.34936],[-36.17628,-9.34945],[-36.18028,-9.34937],[-36.18227,-9.34946],[-36.18826,-9.34938],[-36.19039,-9.34945],[-36.19354,-9.34946],[-36.19552,-9.34941],[-36.19918,-9.34951],[-36.19926,-9.35146],[-36.19913,-9.35234],[-36.19912,-9.35353],[-36.19919,-9.35646],[-36.19922,-9.35771],[-36.1993,-9.35832],[-36.19933,-9.36112],[-36.19922,-9.36177],[-36.19918,-9.36258],[-36.19931,-9.364],[-36.19926,-9.36499],[-36.19922,-9.36563],[-36.19928,-9.3666],[-36.19917,-9.36796],[-36.19917,-9.36868],[-36.19922,-9.36911],[-36.19912,-9.37017],[-36.19887,-9.37149],[-36.19886,-9.37264],[-36.19902,-9.37322],[-36.19915,-9.37504],[-36.19911,-9.37688],[-36.19896,-9.37747],[-36.19899,-9.37915],[-36.19917,-9.38053],[-36.19919,-9.38124],[-36.19926,-9.38175],[-36.19928,-9.38302],[-36.19913,-9.38374],[-36.19908,-9.38592],[-36.19879,-9.38787],[-36.19881,-9.38935],[-36.19902,-9.39092],[-36.19904,-9.392],[-36.19899,-9.39348],[-36.1988,-9.39451],[-36.19867,-9.39705],[-36.19845,-9.39949],[-36.19864,-9.40313],[-36.19866,-9.40476],[-36.19865,-9.40836],[-36.19875,-9.40902],[-36.19857,-9.41058],[-36.19859,-9.41273],[-36.19874,-9.41446],[-36.19868,-9.41711],[-36.1986,-9.41902],[-36.19846,-9.41965],[-36.1985,-9.42235],[-36.19871,-9.42429],[-36.19858,-9.42697],[-36.1984,-9.42895],[-36.19857,-9.43412],[-36.19871,-9.4347],[-36.19865,-9.43595],[-36.19857,-9.43626],[-36.19859,-9.43667],[-36.19876,-9.43749],[-36.19889,-9.43905],[-36.19882,-9.43995],[-36.1785,-9.43977],[-36.17718,-9.43968],[-36.17265,-9.43967],[-36.17099,-9.43971],[-36.16396,-9.43963],[-36.15386,-9.4395],[-36.13983,-9.4393],[-36.12875,-9.43913],[-36.11497,-9.43892],[-36.10753,-9.43884]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"osm-cambodia_laos_thailand_vietnam-bilingual",name:"Cambodia, Laos, Thailand, Vietnam, Malaysia, Myanmar bilingual",type:"tms",template:"https://{switch:a,b,c,d}.tile.osm-tools.org/osm/{zoom}/{x}/{y}.png",zoomExtent:[0,20],polygon:[[[92.10238,20.81356],[93.56905,24.09755],[94.1733,23.92695],[95.19503,26.70727],[96.75509,27.52867],[97.58456,28.5806],[98.73812,27.51405],[98.74362,25.87992],[97.67794,24.75774],[97.96359,24.04238],[98.82052,24.16272],[99.52364,22.95934],[100.36959,21.50514],[101.79232,22.48305],[105.36288,23.33311],[106.81857,22.84801],[108.19735,21.36197],[107.43895,18.85398],[117.14537,7.46562],[119.6173,5.28754],[118.12315,4.05023],[117.25523,4.36249],[115.86546,4.34606],[115.50841,3.02498],[114.5526,1.5101],[113.54186,1.25748],[112.96507,1.5705],[112.24547,1.5101],[111.67418,1.01583],[110.4547,0.90049],[109.49889,1.9219],[103.22569,1.12568],[100.46263,3.23889],[97.6721,8.05888],[93.89281,15.93987],[92.10238,20.81356]]],terms_url:"http://www.osm-tools.org",terms_text:"© osm-tools.org & OpenStreetMap contributors, CC-BY-SA"},{id:"campo_alegre_al",name:"Campo Alegre AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Campo%20Alegre&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.30643,-9.82332],[-36.30603,-9.78597],[-36.30602,-9.78263],[-36.30609,-9.78168],[-36.30604,-9.78081],[-36.3059,-9.77531],[-36.30586,-9.76496],[-36.30545,-9.73336],[-36.39634,-9.73248],[-36.39627,-9.73744],[-36.39636,-9.74336],[-36.39644,-9.75535],[-36.3966,-9.75856],[-36.39665,-9.75979],[-36.39655,-9.76244],[-36.39661,-9.76489],[-36.39658,-9.76648],[-36.39661,-9.76684],[-36.39659,-9.7696],[-36.3967,-9.77896],[-36.39675,-9.78464],[-36.39684,-9.79067],[-36.39693,-9.79681],[-36.39703,-9.80298],[-36.39719,-9.82033],[-36.39722,-9.82234],[-36.39392,-9.82233],[-36.35375,-9.82279],[-36.34822,-9.82286],[-36.31697,-9.82317],[-36.31191,-9.82324],[-36.30879,-9.82327],[-36.30643,-9.82332]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"canaan_drone_red_cross_201712",name:"Canaan - American Red Cross, Dec-2017",type:"tms",template:"https://tiles.openaerialmap.org/5ac65a9f91b5310010e0d489/0/5ac65a9f91b5310010e0d48a/{zoom}/{x}/{y}.png",endDate:"2017-12-20T00:00:00.000Z",startDate:"2017-12-11T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[-72.26734,18.63561],[-72.2636,18.6373],[-72.26116,18.64141],[-72.25983,18.64588],[-72.25811,18.64742],[-72.24502,18.64795],[-72.23433,18.64807],[-72.22734,18.6482],[-72.21953,18.65438],[-72.2161,18.65446],[-72.21584,18.66222],[-72.21725,18.66739],[-72.21889,18.67019],[-72.22309,18.66958],[-72.22343,18.67312],[-72.22502,18.6732],[-72.22545,18.67609],[-72.23288,18.67597],[-72.23339,18.67877],[-72.23674,18.67857],[-72.23854,18.67975],[-72.24,18.68129],[-72.24463,18.68207],[-72.24682,18.6817],[-72.24605,18.67698],[-72.25094,18.67698],[-72.25511,18.67902],[-72.25961,18.67898],[-72.26081,18.67743],[-72.27038,18.67711],[-72.27901,18.67682],[-72.28373,18.67893],[-72.28613,18.68154],[-72.29665,18.68178],[-72.30184,18.68568],[-72.3012,18.68824],[-72.30802,18.69324],[-72.30948,18.69308],[-72.31699,18.69682],[-72.32806,18.70528],[-72.3384,18.69902],[-72.34012,18.69666],[-72.33961,18.69426],[-72.33377,18.68357],[-72.33135,18.68192],[-72.32551,18.68093],[-72.32027,18.67741],[-72.31626,18.67477],[-72.31167,18.672],[-72.308,18.66995],[-72.30534,18.66926],[-72.30068,18.66499],[-72.29796,18.66479],[-72.29609,18.66129],[-72.29315,18.65999],[-72.29519,18.65497],[-72.28414,18.64962],[-72.27804,18.64523],[-72.27487,18.64212],[-72.27352,18.64057],[-72.2706,18.63901],[-72.26734,18.63561]]],terms_url:"http://americanredcross.github.io/",terms_text:"American Red Cross",description:"Drone imagery collected December 2017 for Canaan, Haiti by American Red Cross in coordination with the Haitian Red Cross."},{id:"Geneve-SITG-2011",name:"Canton de Génève 5cm (SITG 2011)",type:"wms",template:"https://ge.ch/ags2/services/Orthophotos_2011/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[6.18221,46.22618],[6.18348,46.22772],[6.18929,46.23329],[6.19196,46.23858],[6.19253,46.24239],[6.19061,46.24397],[6.19046,46.24654],[6.19256,46.25045],[6.19186,46.25262],[6.19325,46.256],[6.19287,46.25776],[6.19543,46.26181],[6.1979,46.26454],[6.20045,46.26569],[6.20917,46.26634],[6.21716,46.27388],[6.22046,46.27895],[6.2275,46.28649],[6.23433,46.28955],[6.23643,46.2932],[6.24074,46.29774],[6.23958,46.30396],[6.2413,46.30529],[6.2432,46.30453],[6.24513,46.30492],[6.24627,46.30372],[6.24983,46.3027],[6.25032,46.3014],[6.24938,46.30018],[6.25146,46.29647],[6.25063,46.29451],[6.25223,46.29382],[6.25429,46.2907],[6.25231,46.28735],[6.25032,46.2868],[6.24974,46.28574],[6.24636,46.28433],[6.24323,46.28428],[6.23985,46.28098],[6.23934,46.27627],[6.24372,46.27356],[6.25113,46.26258],[6.26244,46.2553],[6.26301,46.25457],[6.262,46.25215],[6.26736,46.24887],[6.27732,46.25211],[6.27725,46.25298],[6.2832,46.25503],[6.28231,46.25568],[6.28278,46.25677],[6.28868,46.26046],[6.29154,46.2644],[6.29457,46.26556],[6.29729,46.26489],[6.29783,46.2631],[6.29541,46.25827],[6.29663,46.2566],[6.3024,46.2558],[6.30678,46.25753],[6.311,46.25666],[6.30768,46.25184],[6.31046,46.25057],[6.31011,46.24749],[6.31156,46.24386],[6.29606,46.22501],[6.29012,46.22241],[6.27773,46.21493],[6.26707,46.21276],[6.25668,46.20926],[6.25089,46.20574],[6.25076,46.20456],[6.2495,46.20404],[6.24643,46.20454],[6.24251,46.20364],[6.23594,46.20541],[6.23347,46.20509],[6.22889,46.20172],[6.22323,46.20005],[6.22355,46.19881],[6.22257,46.19791],[6.21935,46.19765],[6.21688,46.19448],[6.21259,46.19189],[6.20727,46.19137],[6.20588,46.18908],[6.2034,46.18806],[6.20282,46.18642],[6.20035,46.18504],[6.19905,46.18296],[6.19615,46.18288],[6.1885,46.17967],[6.18751,46.17539],[6.18982,46.16584],[6.1748,46.15694],[6.1688,46.15624],[6.15829,46.15195],[6.15434,46.15141],[6.14952,46.14933],[6.14805,46.14748],[6.14832,46.14619],[6.14561,46.14417],[6.14244,46.14493],[6.13768,46.14217],[6.13692,46.14071],[6.13074,46.13946],[6.12598,46.13966],[6.12014,46.14181],[6.1077,46.14203],[6.10537,46.14313],[6.09746,46.14325],[6.09151,46.15095],[6.07476,46.14795],[6.07188,46.14908],[6.05295,46.15046],[6.04973,46.1468],[6.04862,46.14153],[6.04571,46.13916],[6.04287,46.14006],[6.04013,46.13894],[6.03783,46.13716],[6.03647,46.13381],[6.03531,46.13344],[6.03,46.13816],[6.02079,46.14024],[6.01693,46.14191],[6.01282,46.14119],[6.00814,46.14171],[6.00364,46.14088],[5.99338,46.1432],[5.98728,46.14171],[5.98464,46.14232],[5.98309,46.13712],[5.97603,46.1319],[5.97314,46.13081],[5.97037,46.13108],[5.96536,46.12882],[5.96163,46.12976],[5.9573,46.12767],[5.95575,46.12836],[5.95484,46.13214],[5.9589,46.13553],[5.96446,46.13738],[5.96517,46.13845],[5.9631,46.14241],[5.96383,46.14656],[5.97157,46.1558],[5.97884,46.16721],[5.98022,46.17354],[5.98322,46.17507],[5.98537,46.17478],[5.98754,46.17306],[5.99029,46.17955],[5.9936,46.18203],[5.98976,46.18692],[5.98287,46.18822],[5.98068,46.1904],[5.96282,46.1963],[5.96225,46.19719],[5.96465,46.20022],[5.97164,46.20302],[5.96985,46.20383],[5.96794,46.20675],[5.97227,46.21418],[5.97364,46.21563],[5.97897,46.21821],[6.00857,46.24444],[6.01422,46.24855],[6.06593,46.28345],[6.11511,46.31511],[6.12573,46.31843],[6.12972,46.31568],[6.12978,46.31407],[6.13604,46.30896],[6.14179,46.30555],[6.15393,46.30014],[6.17157,46.29507],[6.17125,46.29223],[6.17277,46.28629],[6.17018,46.28533],[6.16834,46.28109],[6.17201,46.27554],[6.1722,46.27301],[6.1691,46.26785],[6.16746,46.26217],[6.16531,46.26195],[6.16455,46.26274],[6.15943,46.25898],[6.15532,46.25216],[6.15387,46.25212],[6.15273,46.25037],[6.15311,46.2477],[6.15494,46.24591],[6.1521,46.23878],[6.15217,46.23273],[6.15034,46.22659],[6.15454,46.22191],[6.15483,46.22044],[6.15296,46.21738],[6.154,46.21355],[6.1571,46.21097],[6.16263,46.21043],[6.16387,46.2097],[6.16911,46.21191],[6.16867,46.21318],[6.17073,46.21478],[6.17471,46.21603],[6.18221,46.22618]],[[6.18834,46.34901],[6.18696,46.34862],[6.18195,46.35015],[6.17961,46.352],[6.17142,46.35444],[6.17022,46.35911],[6.17415,46.36036],[6.17272,46.36189],[6.17348,46.36288],[6.17999,46.36547],[6.1877,46.36132],[6.19447,46.36175],[6.19905,46.36086],[6.20113,46.35634],[6.20258,46.35567],[6.20791,46.35583],[6.21374,46.35379],[6.21247,46.35085],[6.20846,46.34665],[6.2086,46.33991],[6.20659,46.33792],[6.20493,46.33861],[6.20348,46.33793],[6.19181,46.34333],[6.19318,46.34787],[6.19076,46.3477],[6.18834,46.34901]],[[6.18182,46.34281],[6.18016,46.34318],[6.1752,46.34532],[6.17341,46.34398],[6.17324,46.34054],[6.1714,46.33952],[6.16588,46.34254],[6.16564,46.34339],[6.17091,46.35054],[6.17341,46.35029],[6.17458,46.35192],[6.17587,46.35205],[6.18579,46.34593],[6.18182,46.34281]]],terms_url:"http://ge.ch/sitg/donnees/conditions-d-utilisation/open-data",terms_text:"Orthophotos du SITG 2011"},{id:"CTFRIBOURG2016",name:"Canton Fribourg 2016",type:"tms",template:"https://mapproxy.osm.ch/tiles/fribourg_2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[6.79478,46.57542],[6.79949,46.57407],[6.80256,46.57491],[6.80336,46.57687],[6.80427,46.57664],[6.80489,46.57792],[6.80794,46.57761],[6.8094,46.57885],[6.81084,46.57896],[6.81322,46.57823],[6.81153,46.58099],[6.8142,46.58396],[6.81411,46.58567],[6.8206,46.58368],[6.82371,46.57747],[6.82693,46.57796],[6.82927,46.57637],[6.83485,46.57533],[6.83744,46.57677],[6.83691,46.57748],[6.83982,46.57896],[6.84239,46.58244],[6.84532,46.58276],[6.84644,46.58394],[6.84857,46.58331],[6.85087,46.58113],[6.85262,46.58197],[6.85996,46.57987],[6.86554,46.57725],[6.86507,46.57623],[6.8679,46.57515],[6.87446,46.56497],[6.8845,46.56195],[6.88686,46.56341],[6.89214,46.5679],[6.89918,46.56671],[6.89885,46.56499],[6.89393,46.55991],[6.88822,46.55815],[6.86839,46.54164],[6.86498,46.53896],[6.86015,46.53597],[6.85563,46.54086],[6.85501,46.54144],[6.85087,46.54111],[6.8407,46.53819],[6.83032,46.53744],[6.82783,46.54298],[6.82553,46.54357],[6.81278,46.52707],[6.81088,46.52513],[6.81534,46.52139],[6.8181,46.5165],[6.82263,46.51411],[6.82429,46.51207],[6.83034,46.51246],[6.83239,46.50544],[6.83503,46.50231],[6.84126,46.49706],[6.84294,46.49632],[6.84554,46.49667],[6.84775,46.49369],[6.84891,46.49337],[6.85729,46.49305],[6.86276,46.49384],[6.86634,46.50079],[6.87244,46.50431],[6.88168,46.51257],[6.8967,46.52044],[6.89773,46.52005],[6.89711,46.51766],[6.89767,46.51483],[6.89522,46.51079],[6.89572,46.50773],[6.89974,46.51039],[6.90142,46.51233],[6.92517,46.50769],[6.92759,46.50467],[6.93363,46.50167],[6.93674,46.50096],[6.95614,46.49949],[6.97239,46.48879],[6.97581,46.4784],[6.97783,46.47289],[6.97815,46.46833],[6.97906,46.46107],[6.98016,46.45896],[6.99212,46.44891],[6.98361,46.43873],[6.98394,46.43799],[6.98746,46.43794],[7.01786,46.44707],[7.02103,46.45729],[7.06583,46.48904],[7.0724,46.4864],[7.10037,46.48699],[7.12279,46.49869],[7.1264,46.50317],[7.13096,46.50466],[7.13624,46.50861],[7.13704,46.51308],[7.14005,46.51688],[7.14044,46.51988],[7.14318,46.52183],[7.1437,46.52475],[7.1453,46.52701],[7.14835,46.52846],[7.15834,46.52681],[7.16346,46.52855],[7.16709,46.53101],[7.18234,46.53837],[7.19218,46.54656],[7.20081,46.54169],[7.20108,46.543],[7.20765,46.53291],[7.21417,46.53762],[7.21811,46.54211],[7.22171,46.54481],[7.22311,46.5476],[7.22543,46.54923],[7.2322,46.55123],[7.23614,46.554],[7.24047,46.55424],[7.24705,46.55623],[7.25574,46.56029],[7.26385,46.56752],[7.2681,46.57369],[7.28136,46.58411],[7.2992,46.5791],[7.30805,46.58132],[7.31254,46.58917],[7.3207,46.59183],[7.31479,46.60042],[7.3162,46.60937],[7.31826,46.61615],[7.3178,46.61856],[7.31213,46.6217],[7.31327,46.63662],[7.32284,46.63731],[7.32684,46.63873],[7.32975,46.64171],[7.32787,46.64616],[7.321,46.65465],[7.32345,46.65526],[7.32914,46.65459],[7.33116,46.65522],[7.33403,46.65471],[7.34549,46.6553],[7.34756,46.65307],[7.35063,46.65164],[7.35079,46.64799],[7.35456,46.64669],[7.3558,46.64533],[7.35528,46.64193],[7.35714,46.63927],[7.35877,46.64418],[7.36209,46.64683],[7.36229,46.64791],[7.36608,46.64898],[7.37747,46.65636],[7.36933,46.65564],[7.36953,46.65748],[7.37103,46.65907],[7.37083,46.66085],[7.37187,46.66283],[7.37122,46.66375],[7.37252,46.66757],[7.37108,46.66942],[7.37649,46.67503],[7.37293,46.68012],[7.37777,46.68357],[7.37587,46.68645],[7.376,46.6878],[7.38027,46.69018],[7.37693,46.69272],[7.3686,46.69265],[7.3649,46.69505],[7.36261,46.69928],[7.3598,46.69802],[7.34598,46.69895],[7.34604,46.7019],[7.34939,46.70555],[7.35037,46.70874],[7.35021,46.71119],[7.34903,46.71249],[7.34065,46.71464],[7.33277,46.71491],[7.32868,46.71641],[7.31011,46.71815],[7.30785,46.71717],[7.30002,46.72247],[7.29683,46.72737],[7.29685,46.73565],[7.29834,46.74013],[7.30304,46.74517],[7.30454,46.74816],[7.30486,46.75026],[7.30335,46.7514],[7.30309,46.75261],[7.30359,46.75919],[7.29987,46.76375],[7.29881,46.76513],[7.29307,46.77136],[7.29532,46.77537],[7.29639,46.77729],[7.30081,46.77905],[7.30053,46.78064],[7.30113,46.78134],[7.30447,46.78321],[7.30447,46.78415],[7.30207,46.78638],[7.30351,46.78887],[7.30201,46.79079],[7.30159,46.79283],[7.30732,46.79872],[7.31044,46.80823],[7.31537,46.81246],[7.32028,46.8149],[7.32047,46.81564],[7.32072,46.82011],[7.31981,46.82515],[7.32891,46.829],[7.3302,46.82968],[7.33123,46.83177],[7.33103,46.8328],[7.32926,46.83563],[7.32333,46.84041],[7.30755,46.84704],[7.30775,46.84808],[7.30613,46.84999],[7.31207,46.85557],[7.31351,46.85936],[7.31739,46.8606],[7.32087,46.86154],[7.32576,46.85681],[7.323,46.85476],[7.32603,46.85163],[7.33181,46.8512],[7.33536,46.85043],[7.33678,46.84979],[7.33821,46.84946],[7.34726,46.85375],[7.34934,46.85331],[7.35167,46.85502],[7.35444,46.85875],[7.35772,46.86065],[7.35925,46.86311],[7.35794,46.86513],[7.35838,46.8688],[7.35738,46.8701],[7.35386,46.87129],[7.35253,46.87555],[7.35339,46.88676],[7.34843,46.88934],[7.32573,46.89373],[7.30935,46.89152],[7.29618,46.89377],[7.28938,46.89377],[7.28639,46.89269],[7.28245,46.8898],[7.2802,46.8896],[7.27259,46.89249],[7.26634,46.89361],[7.25931,46.89797],[7.24433,46.90037],[7.24314,46.89792],[7.23633,46.89809],[7.23203,46.90029],[7.2309,46.9024],[7.23032,46.90394],[7.22351,46.90276],[7.21755,46.89735],[7.21244,46.90173],[7.2088,46.9026],[7.20781,46.90913],[7.20578,46.91477],[7.20692,46.92481],[7.2111,46.92527],[7.21854,46.92434],[7.2342,46.92939],[7.23411,46.93669],[7.23477,46.93827],[7.2302,46.93995],[7.2282,46.93881],[7.22555,46.93633],[7.2174,46.93307],[7.2093,46.93334],[7.20823,46.93323],[7.2058,46.94023],[7.2055,46.94112],[7.20951,46.94188],[7.21027,46.94302],[7.21044,46.94569],[7.21011,46.94781],[7.20885,46.95435],[7.21102,46.95652],[7.20838,46.95768],[7.20742,46.95967],[7.19764,46.96065],[7.19459,46.96135],[7.19463,46.9629],[7.19552,46.96416],[7.19633,46.96365],[7.19794,46.96445],[7.1993,46.9638],[7.20646,46.96413],[7.20745,46.96751],[7.21422,46.96692],[7.21467,46.97133],[7.21739,46.97147],[7.21686,46.97271],[7.22247,46.97454],[7.22163,46.97556],[7.22821,46.97836],[7.23569,46.98456],[7.23486,46.98675],[7.22594,46.9924],[7.22625,46.99868],[7.22575,46.99915],[7.21779,47.00641],[7.21299,47.0068],[7.09058,46.978],[7.03295,46.98265],[6.73785,46.81195],[6.73908,46.71021],[6.81908,46.65533],[6.82741,46.65982],[6.82089,46.65179],[6.81729,46.64923],[6.81851,46.6478],[6.81458,46.64747],[6.81344,46.64953],[6.81194,46.6492],[6.81081,46.65038],[6.80674,46.65059],[6.80203,46.64889],[6.79891,46.64914],[6.79879,46.64781],[6.80367,46.64567],[6.80325,46.6448],[6.8038,46.64451],[6.80321,46.64376],[6.80171,46.64421],[6.79895,46.63959],[6.79692,46.63314],[6.79838,46.63016],[6.80043,46.62991],[6.80065,46.62843],[6.80172,46.62854],[6.80228,46.62775],[6.80197,46.62507],[6.80355,46.62124],[6.80244,46.61877],[6.80296,46.61615],[6.80185,46.61555],[6.80389,46.60903],[6.80239,46.60142],[6.79833,46.59986],[6.8002,46.59362],[6.80124,46.5925],[6.79848,46.58616],[6.79948,46.58559],[6.79894,46.58205],[6.79611,46.57932],[6.79626,46.57728],[6.79478,46.57542]]],terms_text:"Canton Fribourg 2016 'orthophoto technique'"},{id:"Canvec",name:"Canvec - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/canvec_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"Canvec_French",name:"Canvec - French",type:"wms",template:"https://maps.geogratis.gc.ca/wms/canvec_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=canvec&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"capela_al",name:"Capela AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Capela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.03321,-9.45741],[-36.03322,-9.45581],[-36.03336,-9.45483],[-36.0334,-9.45291],[-36.03327,-9.45141],[-36.03336,-9.44287],[-36.0335,-9.43821],[-36.03353,-9.42881],[-36.03363,-9.42027],[-36.03389,-9.41091],[-36.03389,-9.40032],[-36.03401,-9.3888],[-36.03413,-9.38528],[-36.03428,-9.38265],[-36.03417,-9.37849],[-36.03444,-9.36688],[-36.05246,-9.3671],[-36.05791,-9.36711],[-36.0716,-9.36727],[-36.08622,-9.36731],[-36.103,-9.3675],[-36.11652,-9.36755],[-36.12515,-9.36768],[-36.12522,-9.37473],[-36.12521,-9.37721],[-36.12511,-9.38038],[-36.12514,-9.38529],[-36.12505,-9.39026],[-36.12504,-9.39477],[-36.12506,-9.40172],[-36.12499,-9.40382],[-36.1248,-9.40679],[-36.12463,-9.41123],[-36.12474,-9.4136],[-36.12456,-9.4163],[-36.12459,-9.42461],[-36.12466,-9.42691],[-36.12465,-9.42925],[-36.12457,-9.4297],[-36.12464,-9.43538],[-36.12438,-9.44109],[-36.12446,-9.44387],[-36.12452,-9.44579],[-36.12438,-9.44736],[-36.12448,-9.44856],[-36.12448,-9.45095],[-36.12436,-9.45392],[-36.12434,-9.45791],[-36.11758,-9.45783],[-36.1089,-9.45778],[-36.10419,-9.4578],[-36.10116,-9.45773],[-36.0953,-9.45773],[-36.08461,-9.45767],[-36.07361,-9.45757],[-36.05726,-9.45741],[-36.04816,-9.45747],[-36.04177,-9.45739],[-36.03767,-9.45739],[-36.03321,-9.45741]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"COS2010_v1.0",name:"Carta de Uso do Solo 2010 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt/wms-inspire/cos2010v1?language=por&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=COS2010_v1.0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2010-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[14,18],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/cos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"Cartoriviera-2012",name:"Cartoriviera - Orthophoto 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/cartoriviera2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[7.02235,46.42856],[7.0224,46.42045],[7.02176,46.41955],[7.02225,46.41954],[7.02161,46.41749],[7.02242,46.4174],[7.02242,46.41681],[7.02113,46.41443],[7.02164,46.41259],[7.0216,46.41188],[7.01918,46.41055],[7.01896,46.41004],[7.01757,46.40826],[7.01426,46.40696],[7.00948,46.40695],[7.00952,46.40451],[7.00368,46.40153],[6.97052,46.40139],[6.97056,46.39354],[6.96507,46.38333],[6.89379,46.383],[6.89327,46.39209],[6.8968,46.4],[6.89678,46.40097],[6.89395,46.401],[6.89768,46.40888],[6.89246,46.41386],[6.89237,46.41807],[6.8949,46.4193],[6.89285,46.41948],[6.89395,46.42312],[6.89225,46.42339],[6.89219,46.42802],[6.88743,46.428],[6.87652,46.43163],[6.86624,46.43633],[6.84003,46.44591],[6.83504,46.44934],[6.827,46.45204],[6.82695,46.45379],[6.81953,46.45655],[6.80361,46.45993],[6.78775,46.46253],[6.78697,46.5246],[6.82604,46.5248],[6.82609,46.52662],[6.83907,46.5267],[6.83888,46.55006],[6.90658,46.55042],[6.912,46.54301],[6.91083,46.53983],[6.90979,46.53512],[6.90931,46.53517],[6.90867,46.53373],[6.91195,46.53297],[6.91335,46.53604],[6.9268,46.53364],[6.92723,46.5349],[6.93714,46.53311],[6.93691,46.5327],[6.94028,46.53196],[6.94164,46.53477],[6.94309,46.53455],[6.94345,46.53528],[6.95641,46.53003],[6.95632,46.52733],[6.95111,46.52725],[6.95301,46.52611],[6.94341,46.52605],[6.94343,46.52546],[7.01629,46.52568],[7.02158,46.52211],[7.02196,46.47355],[7.07099,46.47368],[7.07402,46.4719],[7.07383,46.4326],[7.05947,46.43233],[7.05278,46.42879],[7.02235,46.42856]]],terms_url:"https://map.cartoriviera.ch/?baselayer_ref=orthos_2012_mobile&baselayer_opacity=100",terms_text:"Cartoriviera"},{id:"Catastro-Spain",name:"Catastro Spain",type:"wms",template:"http://ovc.catastro.meh.es/Cartografia/WMS/ServidorWMS.aspx?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Catastro&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-17.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]]},{id:"Chorzow-buildings",name:"Chorzów: Buildings",type:"wms",template:"http://e-odgik.chorzow.eu/services/wms/wms_funkcje_bud/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,2,1,8,7,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.94562,50.31836],[18.94349,50.32385],[18.95466,50.32599],[18.96426,50.33307],[18.96521,50.33777],[18.98692,50.33621],[18.98468,50.32501],[18.99777,50.32204],[18.99686,50.31716],[18.98774,50.31736],[18.98695,50.30989],[18.99736,50.30031],[18.99744,50.29722],[19.00546,50.29548],[19.0073,50.28342],[19.00574,50.27871],[18.99236,50.27091],[18.96792,50.28661],[18.96215,50.27972],[18.96169,50.27337],[18.95824,50.27291],[18.95492,50.26193],[18.96014,50.24927],[18.95672,50.2452],[18.95555,50.23891],[18.94132,50.243],[18.93475,50.25314],[18.93324,50.26032],[18.93262,50.26588],[18.9296,50.26774],[18.92976,50.27131],[18.92669,50.27289],[18.92632,50.27623],[18.93071,50.27619],[18.93437,50.28729],[18.92383,50.29533],[18.92635,50.29986],[18.91905,50.30212],[18.91955,50.30576],[18.92463,50.31192],[18.9262,50.31883],[18.94562,50.31836]]],terms_text:"Urząd Miasta Chorzowa"},{id:"South_Africa-CapeTown-Aerial-2013",name:"City of Cape Town 2013 Aerial",type:"tms",template:"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2013/{zoom}/{x}/{y}.jpg",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[18.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],terms_url:"https://www.capetown.gov.za",terms_text:"City of Cape Town Aerial - OPENSTREETMAP USE ONLY",description:"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 12cm ground sample distance"},{id:"South_Africa-CapeTown-Aerial",name:"City of Cape Town 2015 Aerial",type:"tms",template:"https://{switch:a,b,c}.coct.aerial.openstreetmap.org.za/layer/za_coct_aerial_2015/{zoom}/{x}/{y}.jpg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[18.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],terms_url:"https://www.capetown.gov.za",terms_text:"City of Cape Town Aerial - OPENSTREETMAP USE ONLY",best:true,description:"OpenStreetMap use only. City of Cape Town Aerial ortho-photography of the municipal area. 8cm ground sample distance"},{id:"Zuerich-aerial_2011",name:"City of Zürich Orthophoto 2011",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_2011&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],terms_text:"Stadt Zürich Open Government Data"},{id:"Zuerich-overview",name:"City of Zürich Overview map (Steets, buildings, house numbers)",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Uebersichtsplan&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[8.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.6023,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33678],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data"},{id:"Czech_CUZK-KM",name:"Czech CUZK:KM",type:"wms",template:"https://wms.cuzk.cz/wms.asp?service=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&LAYERS=parcelni_cisla_i,obrazy_parcel_i,RST_KMD_I,hranice_parcel_i,DEF_BUDOVY,RST_KN_I,dalsi_p_mapy_i,prehledka_kat_prac,prehledka_kat_uz,prehledka_kraju-linie&FORMAT=image/png&transparent=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],overlay:true},{id:"Czech_CUZK-KM-tms",name:"Czech CUZK:KM tiles proxy",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_cuzk.php/{zoom}/{x}/{y}.png",zoomExtent:[13,18],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],overlay:true},{id:"Czech_pLPIS",name:"Czech pLPIS",type:"wms",template:"https://eagri.cz/public/app/wms/plpis.fcgi?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LPIS_FB4,LPIS_FB4_KOD&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:4326",polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]]},{id:"Czech_RUIAN-budovy",name:"Czech RUIAN budovy",type:"tms",template:"https://tile.poloha.net/budovy/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],terms_url:"https://poloha.net/",terms_text:"Czech RUIAN"},{id:"Czech_RUIAN-parcely",name:"Czech RUIAN parcely",type:"tms",template:"https://tile.poloha.net/parcely/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],terms_url:"https://poloha.net/",terms_text:"Czech RUIAN"},{id:"Czestochowa-buildings",name:"Częstochowa: Buildings",type:"wms",template:"http://geoportal.czestochowa.um.gov.pl/isdp/scripts/isdp.dll/wms?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ieg_budynek&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.08183,50.8554],[19.0888,50.86563],[19.11082,50.86616],[19.10961,50.86092],[19.11709,50.85933],[19.11531,50.86283],[19.11997,50.86327],[19.1227,50.85452],[19.12938,50.85519],[19.12566,50.86165],[19.13364,50.86147],[19.14318,50.86815],[19.1498,50.87916],[19.16507,50.8794],[19.16816,50.88501],[19.17265,50.88477],[19.18346,50.87706],[19.18084,50.86562],[19.18711,50.84712],[19.19973,50.84395],[19.19637,50.83678],[19.19358,50.83357],[19.19454,50.83145],[19.20696,50.82985],[19.20838,50.82484],[19.21831,50.82571],[19.22564,50.82475],[19.23075,50.82509],[19.2308,50.82666],[19.23351,50.82683],[19.23303,50.82335],[19.21868,50.80115],[19.21753,50.79272],[19.22592,50.78822],[19.20889,50.77561],[19.19891,50.76355],[19.19521,50.75182],[19.19074,50.75211],[19.18245,50.7545],[19.16504,50.7535],[19.16417,50.75586],[19.14559,50.75805],[19.14282,50.75543],[19.13021,50.75786],[19.127,50.75314],[19.1216,50.75363],[19.12066,50.74981],[19.10348,50.75228],[19.09598,50.75201],[19.0956,50.74912],[19.09351,50.7488],[19.09285,50.75027],[19.08442,50.74986],[19.08473,50.74349],[19.08382,50.73741],[19.07878,50.73668],[19.07503,50.73465],[19.07284,50.73708],[19.07153,50.74042],[19.0685,50.74339],[19.06632,50.74233],[19.06392,50.74554],[19.06595,50.7466],[19.06548,50.7496],[19.06202,50.75041],[19.06018,50.74455],[19.04257,50.74466],[19.0333,50.74827],[19.01869,50.76252],[19.01554,50.77044],[19.01101,50.7718],[19.01353,50.77766],[19.01159,50.78077],[19.01081,50.78759],[19.01362,50.79262],[19.01972,50.79555],[19.01896,50.80703],[19.03439,50.80116],[19.03453,50.804],[19.02593,50.80731],[19.02308,50.81499],[19.03154,50.81614],[19.02909,50.82435],[19.03787,50.82584],[19.03921,50.84083],[19.04676,50.84934],[19.05993,50.8532],[19.06209,50.8596],[19.06492,50.86134],[19.08183,50.8554]]],terms_text:"Urząd Miasta Częstochowy"},{id:"Duna_2013",name:"Danube flood orthophoto 2013",type:"tms",template:"http://e.tile.openstreetmap.hu/dunai-arviz-2013/{zoom}/{x}/{y}.jpg",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[10,20],polygon:[[[19.07732,47.69597],[19.07799,47.69598],[19.09462,47.69446],[19.08056,47.59587],[19.07434,47.58909],[19.07952,47.58883],[19.07717,47.57241],[19.05779,47.57209],[19.07732,47.69597]]],terms_url:"http://fototerkep.hu",terms_text:"Fotótérkép.hu",description:"Riverbank of Danube at Budapest, Szentendre and Szigetmonostor"},{id:"Delaware2012Orthophotography",name:"Delaware 2012 Orthophotography",type:"wms",template:"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2012/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[-75.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],terms_url:"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2012/ImageServer",terms_text:"Digital Aerial Solutions, LLC",description:"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{id:"Delaware2017Orthophotography",name:"Delaware 2017 Orthophotography",type:"wms",template:"https://firstmap.delaware.gov/arcgis/services/DE_Imagery/DE_Imagery_2017/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[-75.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],terms_url:"https://firstmap.delaware.gov/arcgis/rest/services/DE_Imagery/DE_Imagery_2017/ImageServer",terms_text:"Digital Aerial Solutions, LLC",description:"This data set consists of 0.3-meter pixel resolution (approximately 1-foot), 4-band true color and near infrared (R, G, B, IR) orthoimages covering New Castle, Kent and Sussex Counties in Delaware."},{id:"delmiro_gouveia",name:"Delmiro Gouveia AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Delmiro%20Gouveia&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.94962,-9.42957],[-37.94834,-9.33972],[-38.03903,-9.33834],[-38.04034,-9.42846],[-37.94962,-9.42957]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"der-es",name:"DER-ES",type:"wms",template:"http://portal.der.es.gov.br/geoserver/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=deres-ext:TRECHOINFO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-40.94577,-21.31404],[-40.6231,-20.86278],[-40.38882,-20.65177],[-40.22209,-20.29831],[-39.80383,-19.66412],[-39.69603,-19.42573],[-39.67304,-19.30437],[-39.70538,-18.61384],[-39.65292,-18.33096],[-40.22281,-17.97587],[-40.34282,-17.9198],[-40.45278,-17.91502],[-40.46499,-17.92049],[-40.48368,-17.90408],[-40.50164,-17.90681],[-40.51602,-17.88903],[-40.53326,-17.88903],[-40.54548,-17.90134],[-40.58932,-17.91502],[-40.58932,-17.93211],[-40.61519,-17.93416],[-40.62956,-17.9868],[-40.64609,-17.9868],[-40.65903,-18.00731],[-40.68777,-18.00594],[-40.70574,-18.01756],[-40.71365,-18.00184],[-40.72155,-17.99774],[-40.75102,-18.00252],[-40.76754,-17.99842],[-40.76754,-17.98133],[-40.80923,-17.94852],[-40.82432,-17.96014],[-40.83151,-17.94989],[-40.86528,-17.9827],[-40.88397,-17.96766],[-40.90912,-17.98475],[-40.77761,-18.10775],[-40.77832,-18.15146],[-40.79054,-18.15351],[-40.8351,-18.14531],[-40.89547,-18.10365],[-40.93283,-18.12755],[-40.95583,-18.1255],[-40.95296,-18.14463],[-40.96014,-18.15009],[-40.96374,-18.14326],[-40.97955,-18.13643],[-40.99248,-18.15009],[-40.99105,-18.16307],[-41.00901,-18.16307],[-41.05788,-18.1658],[-41.05788,-18.17536],[-41.09597,-18.19243],[-41.09597,-18.2054],[-41.1089,-18.21291],[-41.09812,-18.22997],[-41.10531,-18.2327],[-41.09884,-18.25591],[-41.12903,-18.27502],[-41.16137,-18.30572],[-41.15059,-18.37394],[-41.16424,-18.37939],[-41.16424,-18.4019],[-41.15059,-18.40735],[-41.15849,-18.41144],[-41.17358,-18.41144],[-41.18868,-18.44485],[-41.02123,-18.46667],[-41.04638,-18.60362],[-41.03776,-18.61452],[-41.05788,-18.62678],[-41.0471,-18.64857],[-41.03488,-18.65402],[-40.99895,-18.67716],[-40.94505,-18.69418],[-40.94433,-18.76973],[-40.92134,-18.81055],[-40.93715,-18.82347],[-40.94721,-18.82143],[-40.97092,-18.83572],[-41.08375,-18.83232],[-41.10675,-18.83572],[-41.11753,-18.80783],[-41.13118,-18.79286],[-41.23611,-18.7949],[-41.2512,-18.81667],[-41.2476,-18.85544],[-41.2203,-18.87992],[-41.20808,-18.87992],[-41.20664,-18.86632],[-41.16424,-18.867],[-41.15634,-18.88876],[-41.12903,-18.9044],[-41.12112,-18.92412],[-41.0392,-18.98665],[-41.07585,-19.00567],[-41.06507,-19.06342],[-40.96877,-19.12726],[-40.96158,-19.15102],[-40.92996,-19.206],[-40.94649,-19.22296],[-40.94793,-19.24264],[-40.92565,-19.26299],[-40.94936,-19.2786],[-40.92277,-19.31048],[-40.94361,-19.35252],[-40.93427,-19.381],[-40.95727,-19.39184],[-40.9738,-19.42641],[-40.95439,-19.46165],[-40.97883,-19.50298],[-41.01332,-19.50298],[-41.04638,-19.48333],[-41.05429,-19.48401],[-41.04135,-19.56664],[-41.09238,-19.58966],[-41.14627,-19.656],[-41.16496,-19.65871],[-41.17933,-19.6939],[-41.19658,-19.74599],[-41.16999,-19.80618],[-41.18939,-19.82375],[-41.18868,-19.88526],[-41.21239,-19.89743],[-41.22964,-19.90216],[-41.24689,-19.93324],[-41.25479,-19.92919],[-41.26988,-19.93797],[-41.30653,-19.93392],[-41.31516,-19.96972],[-41.3245,-19.97647],[-41.313,-20.01226],[-41.33672,-20.05548],[-41.34822,-20.08653],[-41.3554,-20.12094],[-41.37768,-20.15805],[-41.38702,-20.18638],[-41.41074,-20.19448],[-41.4208,-20.20257],[-41.7636,-20.2046],[-41.78516,-20.28483],[-41.85055,-20.3246],[-41.86349,-20.37513],[-41.85127,-20.38187],[-41.84337,-20.40949],[-41.80887,-20.42498],[-41.80672,-20.47211],[-41.83115,-20.47885],[-41.81103,-20.54212],[-41.83115,-20.55086],[-41.86205,-20.61814],[-41.82109,-20.64437],[-41.85343,-20.68068],[-41.87139,-20.72102],[-41.8678,-20.73849],[-41.88002,-20.73984],[-41.88289,-20.76739],[-41.85415,-20.77478],[-41.83331,-20.7983],[-41.80887,-20.80905],[-41.78444,-20.80569],[-41.75138,-20.82382],[-41.74707,-20.87487],[-41.72335,-20.87554],[-41.74132,-20.92723],[-41.72335,-20.97757],[-41.74347,-21.09763],[-41.7291,-21.12579],[-41.594,-21.16332],[-41.57244,-21.18678],[-41.49051,-21.18879],[-41.48332,-21.20085],[-41.43948,-21.22095],[-41.41289,-21.20956],[-41.34965,-21.21291],[-41.27994,-21.2464],[-41.24473,-21.23234],[-41.17718,-21.25511],[-41.09238,-21.2243],[-41.04854,-21.25913],[-41.01548,-21.25578],[-41.00254,-21.28726],[-40.94577,-21.31404]]],terms_url:"https://der.es.gov.br",terms_text:"Departamento de Estradas de Rodagem do Estado do Espírito Santo",overlay:true},{id:"db-inspire-2013-11",name:"Deutsche Bahn VzG lines January 2017",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2017?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-11-01T00:00:00.000Z",startDate:"2013-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",overlay:true},{id:"db-inspire-2015-11",name:"Deutsche Bahn VzG lines Nov 2015",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2015?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",overlay:true},{id:"DigitalGlobe-Premium",name:"DigitalGlobe Premium Imagery",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.316c9a2e/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ2c2dzFlMWgyd2x0ZHdmMDB6NzYifQ.9Pl3XOO82ArX94fHV289Pg",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png"},{id:"DigitalGlobe-Premium-vintage",name:"DigitalGlobe Premium Imagery Vintage",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.2850d66c/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBkcmZjNzJ5ZnozNHF6NnVkOGd6ODYifQ.grAnqgpCjOaeq-ozqt4QNw",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback",description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",overlay:true},{id:"DigitalGlobe-Standard",name:"DigitalGlobe Standard Imagery",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.0a8e44ba/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqZGFrZ3pjczNpaHYycXFyMGo0djY3N2IifQ.90uebT4-ow1uqZKTUrf6RQ",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png"},{id:"DigitalGlobe-Standard-vintage",name:"DigitalGlobe Standard Imagery Vintage",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/digitalglobe.1412531a/{zoom}/{x}/{y}.png?access_token=pk.eyJ1IjoiZGlnaXRhbGdsb2JlIiwiYSI6ImNqOTBlYWJ1ZDAza2YyeG14NWVodTA4OWUifQ.wVc8ZOuPuYVw39lhS2j3_g",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback",description:"Imagery boundaries and capture dates. Labels appear at zoom level 13 and higher.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",overlay:true},{id:"drone-imagery-2014",name:"Drone Imagery 2014 (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_2014/{zoom}/{x}/{y}",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[-72.3286,18.69461],[-72.33034,18.69412],[-72.33117,18.69284],[-72.33413,18.68542],[-72.33452,18.68414],[-72.33443,18.68355],[-72.33375,18.68235],[-72.32147,18.67721],[-72.32027,18.67698],[-72.31909,18.67713],[-72.3183,18.67804],[-72.31508,18.68457],[-72.31394,18.689],[-72.31553,18.68993],[-72.3286,18.69461]],[[-72.34695,18.61833],[-72.34553,18.62166],[-72.34355,18.62447],[-72.34245,18.62553],[-72.34076,18.62658],[-72.33786,18.62639],[-72.33649,18.62597],[-72.33589,18.62504],[-72.33482,18.62559],[-72.33472,18.6255],[-72.33459,18.62513],[-72.33343,18.62438],[-72.33174,18.62469],[-72.3313,18.62457],[-72.33126,18.62321],[-72.33088,18.62276],[-72.33066,18.62277],[-72.32985,18.62345],[-72.32862,18.62186],[-72.32829,18.6218],[-72.32817,18.62193],[-72.32809,18.6218],[-72.32734,18.62261],[-72.32541,18.62101],[-72.32422,18.62122],[-72.32396,18.61869],[-72.32354,18.61815],[-72.32325,18.61818],[-72.32351,18.61877],[-72.32058,18.62031],[-72.32043,18.61993],[-72.31978,18.62066],[-72.31807,18.61907],[-72.31742,18.61958],[-72.31523,18.61782],[-72.31463,18.61844],[-72.31324,18.6165],[-72.31275,18.61677],[-72.31232,18.6172],[-72.31198,18.61704],[-72.31042,18.61764],[-72.31062,18.61564],[-72.30996,18.61526],[-72.30936,18.61623],[-72.30786,18.61542],[-72.30669,18.61623],[-72.30604,18.61704],[-72.30419,18.61545],[-72.30288,18.61688],[-72.30191,18.61637],[-72.30131,18.61552],[-72.30118,18.6158],[-72.30087,18.61546],[-72.30076,18.61567],[-72.30062,18.6156],[-72.30012,18.61609],[-72.29198,18.61365],[-72.29194,18.61347],[-72.29143,18.61342],[-72.29094,18.61323],[-72.29105,18.61199],[-72.29057,18.61152],[-72.28772,18.61145],[-72.28801,18.6096],[-72.2865,18.60968],[-72.28635,18.60799],[-72.28448,18.60844],[-72.28436,18.60789],[-72.283,18.60808],[-72.283,18.60658],[-72.2828,18.60676],[-72.2816,18.60537],[-72.28106,18.60533],[-72.27973,18.60682],[-72.27805,18.60525],[-72.27793,18.6053],[-72.2778,18.60524],[-72.2772,18.60638],[-72.27589,18.60564],[-72.27544,18.60629],[-72.27385,18.60508],[-72.27341,18.60508],[-72.27241,18.60593],[-72.27099,18.60442],[-72.27047,18.60429],[-72.27038,18.60446],[-72.27024,18.60427],[-72.27011,18.60433],[-72.26862,18.60368],[-72.26778,18.6037],[-72.26751,18.60429],[-72.2655,18.60318],[-72.26539,18.60336],[-72.26515,18.60309],[-72.26471,18.603],[-72.26436,18.60331],[-72.26312,18.60193],[-72.26258,18.60188],[-72.262,18.60251],[-72.26139,18.60184],[-72.26106,18.60182],[-72.26106,18.60148],[-72.26014,18.6005],[-72.25994,18.60049],[-72.25803,18.60079],[-72.2576,18.60054],[-72.25691,18.60094],[-72.25413,18.59992],[-72.25093,18.59739],[-72.25062,18.59676],[-72.25033,18.59701],[-72.24451,18.59231],[-72.24215,18.58872],[-72.24167,18.58756],[-72.24077,18.58654],[-72.24147,18.58592],[-72.2413,18.58543],[-72.2395,18.58424],[-72.24007,18.58358],[-72.2382,18.58197],[-72.23868,18.58157],[-72.2385,18.58119],[-72.23703,18.58054],[-72.23612,18.57894],[-72.23646,18.57825],[-72.23636,18.5777],[-72.23467,18.57684],[-72.2353,18.57562],[-72.235,18.57499],[-72.23335,18.57423],[-72.23399,18.57293],[-72.23182,18.57169],[-72.23188,18.57137],[-72.23175,18.57127],[-72.23198,18.5708],[-72.23072,18.5694],[-72.23097,18.56874],[-72.23082,18.56844],[-72.23046,18.56855],[-72.23009,18.56754],[-72.22942,18.56715],[-72.22972,18.56651],[-72.22961,18.566],[-72.22908,18.56612],[-72.22848,18.56396],[-72.22818,18.56395],[-72.22733,18.56421],[-72.2265,18.56179],[-72.22623,18.56191],[-72.22436,18.55908],[-72.22471,18.55882],[-72.22357,18.55689],[-72.22379,18.55675],[-72.22325,18.55579],[-72.22387,18.55544],[-72.22382,18.55528],[-72.22458,18.55483],[-72.22453,18.55439],[-72.22625,18.55408],[-72.22705,18.55349],[-72.22692,18.55333],[-72.2271,18.55324],[-72.22687,18.55273],[-72.22592,18.55308],[-72.22465,18.55027],[-72.22483,18.5501],[-72.22457,18.54956],[-72.22327,18.55014],[-72.22261,18.54869],[-72.2208,18.54918],[-72.22051,18.54852],[-72.22034,18.54865],[-72.2201,18.54845],[-72.21952,18.54876],[-72.21862,18.54755],[-72.2174,18.5478],[-72.21714,18.54733],[-72.21694,18.54734],[-72.21583,18.54517],[-72.21505,18.54533],[-72.21477,18.54494],[-72.21442,18.54218],[-72.21421,18.54233],[-72.21293,18.5401],[-72.21199,18.5404],[-72.21188,18.54025],[-72.21145,18.53781],[-72.21085,18.53797],[-72.21028,18.53545],[-72.20993,18.53465],[-72.20942,18.53478],[-72.20942,18.53456],[-72.20851,18.53472],[-72.2057,18.53039],[-72.20444,18.52693],[-72.20438,18.52643],[-72.20418,18.52637],[-72.20399,18.52572],[-72.20263,18.5222],[-72.20182,18.5197],[-72.20148,18.51742],[-72.20301,18.51606],[-72.20503,18.51506],[-72.20767,18.51432],[-72.20936,18.5142],[-72.2095,18.51448],[-72.21082,18.51416],[-72.21095,18.51444],[-72.21189,18.51412],[-72.21266,18.51403],[-72.21277,18.51417],[-72.21462,18.51393],[-72.21697,18.51569],[-72.21731,18.51648],[-72.21787,18.51642],[-72.21818,18.51975],[-72.21798,18.51984],[-72.21909,18.52189],[-72.22031,18.52152],[-72.22096,18.52382],[-72.22209,18.52355],[-72.22251,18.52685],[-72.22229,18.52693],[-72.22271,18.52726],[-72.22289,18.52707],[-72.2231,18.52722],[-72.22404,18.52681],[-72.22551,18.52936],[-72.22596,18.5297],[-72.22642,18.52964],[-72.2265,18.53018],[-72.2275,18.53118],[-72.22673,18.53171],[-72.22885,18.53383],[-72.22811,18.53435],[-72.22981,18.53623],[-72.22912,18.5367],[-72.22935,18.53731],[-72.23059,18.53875],[-72.23222,18.54189],[-72.23215,18.5421],[-72.23258,18.54324],[-72.23311,18.54304],[-72.2342,18.54558],[-72.23436,18.5455],[-72.23554,18.54776],[-72.23571,18.54779],[-72.23601,18.54899],[-72.23839,18.55165],[-72.23747,18.55231],[-72.23951,18.55397],[-72.23918,18.55413],[-72.2407,18.55661],[-72.24014,18.5568],[-72.24079,18.55824],[-72.24063,18.55835],[-72.24067,18.55845],[-72.24117,18.55815],[-72.24161,18.55898],[-72.24216,18.55882],[-72.24242,18.56062],[-72.24262,18.56101],[-72.24294,18.56089],[-72.24399,18.56371],[-72.24466,18.56356],[-72.24475,18.56413],[-72.24536,18.56445],[-72.2449,18.56525],[-72.24518,18.56549],[-72.245,18.56581],[-72.24499,18.56607],[-72.24543,18.56633],[-72.24559,18.56618],[-72.24588,18.56662],[-72.24687,18.56727],[-72.24662,18.56749],[-72.24781,18.56897],[-72.24728,18.56938],[-72.24859,18.57137],[-72.24894,18.57159],[-72.24865,18.57222],[-72.2488,18.57219],[-72.24885,18.5723],[-72.24945,18.57197],[-72.25068,18.57411],[-72.25147,18.5737],[-72.25251,18.57598],[-72.25339,18.57551],[-72.25491,18.57848],[-72.25462,18.57863],[-72.25467,18.57878],[-72.25505,18.57894],[-72.25495,18.57913],[-72.256,18.58074],[-72.2563,18.58054],[-72.25752,18.58237],[-72.25769,18.58227],[-72.2578,18.5824],[-72.25808,18.5823],[-72.25857,18.5821],[-72.25862,18.58222],[-72.25889,18.58219],[-72.25894,18.58302],[-72.25958,18.58445],[-72.25984,18.58472],[-72.26072,18.58443],[-72.26094,18.58565],[-72.2622,18.58722],[-72.26351,18.58643],[-72.2643,18.58738],[-72.26474,18.58708],[-72.26594,18.58862],[-72.26756,18.58877],[-72.26742,18.58917],[-72.27039,18.58893],[-72.27021,18.5903],[-72.2722,18.59048],[-72.27211,18.59145],[-72.27381,18.59188],[-72.27384,18.59168],[-72.27729,18.59169],[-72.28014,18.59129],[-72.28059,18.59048],[-72.28106,18.59071],[-72.28226,18.58989],[-72.28286,18.59047],[-72.28367,18.58966],[-72.28401,18.59014],[-72.28468,18.59029],[-72.2851,18.58997],[-72.2857,18.59062],[-72.28661,18.59068],[-72.28681,18.59014],[-72.28728,18.59032],[-72.28741,18.59013],[-72.28801,18.59052],[-72.28991,18.59071],[-72.29077,18.58997],[-72.29196,18.59186],[-72.2945,18.59148],[-72.29454,18.59361],[-72.29654,18.59322],[-72.29689,18.59586],[-72.2976,18.59675],[-72.29824,18.59722],[-72.29871,18.5962],[-72.30053,18.59733],[-72.30081,18.59675],[-72.30113,18.59691],[-72.30131,18.59676],[-72.30175,18.59721],[-72.30303,18.59774],[-72.3033,18.59729],[-72.30394,18.59761],[-72.30394,18.59736],[-72.30555,18.59794],[-72.30598,18.59756],[-72.30703,18.59838],[-72.30723,18.59799],[-72.30862,18.59833],[-72.30938,18.59752],[-72.31013,18.5981],[-72.31037,18.59739],[-72.3121,18.5983],[-72.3122,18.59807],[-72.31424,18.59902],[-72.31456,18.59873],[-72.31524,18.59922],[-72.31681,18.59952],[-72.31662,18.60004],[-72.31958,18.60072],[-72.31907,18.60202],[-72.32042,18.60247],[-72.32061,18.60242],[-72.32082,18.60267],[-72.3211,18.6027],[-72.32105,18.60298],[-72.32144,18.60347],[-72.32368,18.60322],[-72.32375,18.60432],[-72.32584,18.60436],[-72.32588,18.60522],[-72.32617,18.60585],[-72.32864,18.60525],[-72.32897,18.60527],[-72.32916,18.60727],[-72.33006,18.60812],[-72.3294,18.60867],[-72.33004,18.60959],[-72.33282,18.60949],[-72.33258,18.61058],[-72.33302,18.61005],[-72.3335,18.61054],[-72.33477,18.61035],[-72.33485,18.61167],[-72.33735,18.61174],[-72.33725,18.61237],[-72.33767,18.61298],[-72.34038,18.61306],[-72.34016,18.6138],[-72.34153,18.61384],[-72.34258,18.61457],[-72.3426,18.61512],[-72.34306,18.61499],[-72.34682,18.61792],[-72.34695,18.61833]],[[-72.72363,19.09461],[-72.72302,19.09518],[-72.72206,19.0965],[-72.72169,19.09612],[-72.72164,19.0962],[-72.72132,19.09609],[-72.72073,19.0967],[-72.7198,19.09587],[-72.71965,19.09591],[-72.7197,19.09601],[-72.71955,19.09602],[-72.71911,19.09623],[-72.71906,19.09627],[-72.71904,19.09625],[-72.71888,19.09631],[-72.71886,19.09626],[-72.71817,19.09643],[-72.71776,19.09679],[-72.71756,19.09657],[-72.71693,19.09705],[-72.71713,19.09735],[-72.71495,19.0988],[-72.71479,19.09852],[-72.71483,19.09849],[-72.7148,19.0984],[-72.71455,19.09859],[-72.71449,19.09851],[-72.71413,19.09877],[-72.71413,19.09893],[-72.71419,19.09891],[-72.71417,19.09978],[-72.71324,19.09971],[-72.71287,19.09974],[-72.71295,19.09967],[-72.71278,19.09968],[-72.71278,19.09977],[-72.71282,19.09976],[-72.71285,19.09988],[-72.71266,19.09989],[-72.71266,19.09987],[-72.71245,19.09987],[-72.71182,19.09991],[-72.71178,19.10012],[-72.71157,19.10009],[-72.71147,19.10102],[-72.71042,19.10086],[-72.71039,19.10119],[-72.7103,19.1012],[-72.71031,19.10151],[-72.7097,19.10156],[-72.7097,19.10162],[-72.70917,19.10169],[-72.70917,19.1021],[-72.70828,19.10211],[-72.70809,19.10289],[-72.70788,19.10284],[-72.70798,19.10367],[-72.70724,19.1038],[-72.70731,19.10501],[-72.70723,19.10501],[-72.70736,19.10565],[-72.70637,19.10584],[-72.7062,19.10714],[-72.70588,19.10706],[-72.70591,19.10747],[-72.7053,19.10757],[-72.7054,19.10813],[-72.70568,19.10809],[-72.70568,19.10928],[-72.70591,19.11013],[-72.70589,19.11022],[-72.70574,19.11025],[-72.70574,19.11116],[-72.70538,19.11114],[-72.70557,19.11247],[-72.70499,19.11256],[-72.70537,19.11361],[-72.7047,19.11388],[-72.70496,19.11563],[-72.70418,19.11564],[-72.70442,19.11762],[-72.70371,19.11764],[-72.70371,19.1178],[-72.70352,19.11779],[-72.70339,19.12227],[-72.70264,19.12205],[-72.70253,19.12301],[-72.70289,19.12592],[-72.70308,19.12595],[-72.70316,19.12864],[-72.70234,19.12997],[-72.70206,19.1301],[-72.69987,19.1305],[-72.69325,19.13064],[-72.687,19.13075],[-72.68456,19.13073],[-72.68338,19.13056],[-72.6828,19.1297],[-72.68203,19.1283],[-72.68201,19.12715],[-72.68158,19.12714],[-72.68187,19.12508],[-72.68185,19.12507],[-72.68215,19.12414],[-72.68253,19.12295],[-72.68265,19.12243],[-72.68263,19.12185],[-72.68302,19.12185],[-72.68301,19.12132],[-72.68286,19.12133],[-72.68293,19.11947],[-72.68251,19.11946],[-72.68256,19.11803],[-72.68265,19.11751],[-72.68265,19.11703],[-72.68318,19.11704],[-72.68319,19.11685],[-72.68371,19.11687],[-72.68384,19.11684],[-72.684,19.11685],[-72.68398,19.11689],[-72.68426,19.11688],[-72.68426,19.11679],[-72.68481,19.11674],[-72.68546,19.11667],[-72.68557,19.11664],[-72.68551,19.11664],[-72.6856,19.11662],[-72.68595,19.11658],[-72.68596,19.11654],[-72.68608,19.11654],[-72.68661,19.11663],[-72.68662,19.11656],[-72.68713,19.11665],[-72.68721,19.11666],[-72.68721,19.11663],[-72.6878,19.11666],[-72.68779,19.11659],[-72.68833,19.11663],[-72.68832,19.11658],[-72.68928,19.11657],[-72.6897,19.11656],[-72.68998,19.11644],[-72.6902,19.11644],[-72.69019,19.11615],[-72.69027,19.11563],[-72.69029,19.11541],[-72.69017,19.11543],[-72.69018,19.11493],[-72.69018,19.11458],[-72.69019,19.11445],[-72.69022,19.11433],[-72.6902,19.11406],[-72.68972,19.11398],[-72.68968,19.11397],[-72.68973,19.11415],[-72.68974,19.1142],[-72.68937,19.11417],[-72.68872,19.11412],[-72.688,19.11412],[-72.68758,19.11409],[-72.68759,19.11401],[-72.68736,19.11403],[-72.68711,19.11406],[-72.68682,19.11406],[-72.68677,19.11405],[-72.68591,19.11422],[-72.68554,19.11421],[-72.68557,19.11369],[-72.68554,19.11308],[-72.68533,19.11314],[-72.6852,19.11316],[-72.68519,19.1132],[-72.68504,19.11325],[-72.68495,19.1127],[-72.68474,19.11278],[-72.68468,19.11277],[-72.68446,19.11281],[-72.68416,19.1128],[-72.6836,19.11254],[-72.68353,19.11102],[-72.68363,19.11007],[-72.68338,19.11003],[-72.68344,19.10974],[-72.68295,19.1096],[-72.68305,19.10892],[-72.68111,19.10826],[-72.68112,19.1081],[-72.67965,19.10781],[-72.67968,19.10765],[-72.67923,19.10749],[-72.67916,19.10802],[-72.67838,19.10755],[-72.67779,19.10753],[-72.67775,19.10769],[-72.67623,19.10765],[-72.67606,19.10762],[-72.67621,19.10797],[-72.67549,19.10804],[-72.67548,19.1079],[-72.67431,19.10804],[-72.67432,19.10795],[-72.67398,19.10794],[-72.67382,19.10798],[-72.6739,19.10864],[-72.67319,19.10856],[-72.67307,19.10852],[-72.67284,19.10855],[-72.67276,19.10855],[-72.67286,19.10907],[-72.67284,19.10915],[-72.67251,19.10903],[-72.67236,19.10906],[-72.6723,19.10905],[-72.67224,19.10913],[-72.67179,19.10912],[-72.67051,19.10679],[-72.6704,19.10401],[-72.67048,19.10396],[-72.67032,19.10223],[-72.67034,19.1016],[-72.67062,19.09856],[-72.67121,19.09697],[-72.67278,19.09595],[-72.67277,19.09629],[-72.67364,19.09636],[-72.6736,19.09662],[-72.67484,19.09623],[-72.67489,19.09666],[-72.67566,19.09655],[-72.67566,19.09648],[-72.67655,19.09642],[-72.67772,19.09626],[-72.67786,19.09675],[-72.67784,19.09689],[-72.67826,19.09677],[-72.67837,19.09698],[-72.67858,19.09698],[-72.67853,19.09665],[-72.67878,19.09666],[-72.67861,19.09635],[-72.67927,19.09633],[-72.67973,19.0962],[-72.68015,19.09604],[-72.68058,19.09598],[-72.68029,19.09501],[-72.68072,19.095],[-72.68066,19.09474],[-72.68048,19.09418],[-72.68037,19.09335],[-72.68064,19.09335],[-72.68064,19.09266],[-72.67973,19.09263],[-72.67972,19.09269],[-72.67943,19.09266],[-72.67966,19.09132],[-72.67977,19.09107],[-72.68249,19.0892],[-72.68272,19.08907],[-72.68506,19.0888],[-72.68508,19.08888],[-72.68616,19.08873],[-72.6862,19.08887],[-72.68718,19.08866],[-72.68717,19.0886],[-72.68849,19.08844],[-72.68852,19.08847],[-72.69006,19.0884],[-72.69018,19.08871],[-72.69227,19.08828],[-72.69229,19.08887],[-72.69218,19.08924],[-72.69222,19.08928],[-72.69277,19.08923],[-72.69279,19.08933],[-72.69335,19.08934],[-72.69289,19.0888],[-72.69274,19.0883],[-72.69496,19.08857],[-72.69571,19.08831],[-72.69579,19.08892],[-72.69625,19.08904],[-72.69649,19.08889],[-72.69849,19.08845],[-72.69849,19.08866],[-72.6988,19.08858],[-72.69885,19.08895],[-72.69884,19.08903],[-72.69926,19.08895],[-72.70023,19.08884],[-72.70023,19.08893],[-72.70088,19.08892],[-72.7014,19.08887],[-72.70128,19.08828],[-72.70257,19.08859],[-72.70282,19.08874],[-72.70309,19.08883],[-72.70293,19.08855],[-72.70341,19.08862],[-72.70557,19.08863],[-72.70552,19.08906],[-72.70665,19.08889],[-72.70666,19.08938],[-72.70902,19.08917],[-72.70898,19.0891],[-72.71116,19.08894],[-72.71121,19.0892],[-72.71281,19.08912],[-72.71286,19.0898],[-72.71502,19.08882],[-72.71569,19.08838],[-72.71573,19.08847],[-72.7161,19.08824],[-72.71598,19.08795],[-72.71653,19.0877],[-72.71653,19.08761],[-72.71579,19.08781],[-72.71676,19.08727],[-72.71671,19.08717],[-72.71815,19.08638],[-72.71795,19.08602],[-72.71954,19.08518],[-72.71954,19.08511],[-72.72217,19.08467],[-72.72327,19.08506],[-72.72622,19.08712],[-72.72763,19.0891],[-72.72752,19.08973],[-72.72548,19.09295],[-72.72482,19.09403],[-72.72399,19.09495],[-72.72363,19.09461]],[[-72.06537,19.65239],[-72.06565,19.6518],[-72.06603,19.65128],[-72.06697,19.65109],[-72.0676,19.6511],[-72.07102,19.65223],[-72.0719,19.65254],[-72.07189,19.65255],[-72.07264,19.6528],[-72.07262,19.65284],[-72.07268,19.65286],[-72.07269,19.65283],[-72.0733,19.65305],[-72.07393,19.65327],[-72.07416,19.65347],[-72.07418,19.65351],[-72.07435,19.65395],[-72.07432,19.65425],[-72.07419,19.65495],[-72.07399,19.65583],[-72.07384,19.65648],[-72.07307,19.65805],[-72.07274,19.65866],[-72.0727,19.65869],[-72.07228,19.65915],[-72.07221,19.65917],[-72.07196,19.65916],[-72.0714,19.65909],[-72.07012,19.65866],[-72.07017,19.65856],[-72.06983,19.65852],[-72.06984,19.65848],[-72.06939,19.65841],[-72.06944,19.65823],[-72.06941,19.65823],[-72.06937,19.65836],[-72.06842,19.65807],[-72.06707,19.65759],[-72.06451,19.65663],[-72.06434,19.65632],[-72.06421,19.65547],[-72.06422,19.65541],[-72.06472,19.65379],[-72.06487,19.65351],[-72.06537,19.65239]],[[-72.23222,18.69173],[-72.23182,18.69172],[-72.23115,18.69168],[-72.23128,18.69161],[-72.23072,18.69152],[-72.23068,18.69147],[-72.23135,18.69159],[-72.23157,18.69149],[-72.23162,18.69137],[-72.23165,18.69134],[-72.23165,18.69164],[-72.23222,18.69173]],[[-72.2406,18.69192],[-72.23953,18.6921],[-72.23891,18.69207],[-72.23878,18.69207],[-72.23856,18.692],[-72.23818,18.69192],[-72.23186,18.69054],[-72.22977,18.69113],[-72.21709,18.68967],[-72.21618,18.68724],[-72.21599,18.68673],[-72.21602,18.68659],[-72.2159,18.68601],[-72.21581,18.68593],[-72.21561,18.68483],[-72.21569,18.6847],[-72.21578,18.68435],[-72.21595,18.68347],[-72.21629,18.68289],[-72.2164,18.68221],[-72.21633,18.68211],[-72.21641,18.68208],[-72.21642,18.68189],[-72.21694,18.6813],[-72.21685,18.68096],[-72.21693,18.68099],[-72.21722,18.68091],[-72.21734,18.6808],[-72.21731,18.67964],[-72.21749,18.67958],[-72.21749,18.67946],[-72.21747,18.67908],[-72.21743,18.67853],[-72.21739,18.6785],[-72.21718,18.6786],[-72.2171,18.67856],[-72.21708,18.67838],[-72.21724,18.67767],[-72.21724,18.67745],[-72.21721,18.67744],[-72.21681,18.67754],[-72.21671,18.67688],[-72.21662,18.67612],[-72.21642,18.67621],[-72.21601,18.67548],[-72.21596,18.67551],[-72.21589,18.67549],[-72.21552,18.6756],[-72.2154,18.67561],[-72.21529,18.6757],[-72.21521,18.67571],[-72.21491,18.67472],[-72.21464,18.67387],[-72.21456,18.6737],[-72.21447,18.67348],[-72.21413,18.67301],[-72.21427,18.67293],[-72.21413,18.67271],[-72.21383,18.67278],[-72.21339,18.67181],[-72.21178,18.67209],[-72.21169,18.67172],[-72.21135,18.67183],[-72.21116,18.67196],[-72.21077,18.67121],[-72.21058,18.67129],[-72.20984,18.66963],[-72.20972,18.6697],[-72.20966,18.66968],[-72.20918,18.66838],[-72.20895,18.66773],[-72.2093,18.66606],[-72.20937,18.66571],[-72.20974,18.66536],[-72.21031,18.66477],[-72.21021,18.66416],[-72.21042,18.66401],[-72.2111,18.66329],[-72.21167,18.66268],[-72.21179,18.66236],[-72.21206,18.66242],[-72.21193,18.66185],[-72.21188,18.66155],[-72.21199,18.66147],[-72.21239,18.66137],[-72.21331,18.66103],[-72.21393,18.66039],[-72.21376,18.65992],[-72.21355,18.65956],[-72.21376,18.65943],[-72.21349,18.65869],[-72.21296,18.65736],[-72.21357,18.6572],[-72.21312,18.65639],[-72.21281,18.65534],[-72.21317,18.6551],[-72.21308,18.65459],[-72.21347,18.65438],[-72.21374,18.65436],[-72.21382,18.65416],[-72.2135,18.65353],[-72.21304,18.65171],[-72.21345,18.65143],[-72.21341,18.65133],[-72.21364,18.65105],[-72.21418,18.65077],[-72.21378,18.65016],[-72.21364,18.64989],[-72.21372,18.64975],[-72.21429,18.64943],[-72.21379,18.64934],[-72.21362,18.64922],[-72.21382,18.64869],[-72.21354,18.64765],[-72.21331,18.64717],[-72.21366,18.64552],[-72.21389,18.64539],[-72.21377,18.6451],[-72.214,18.64399],[-72.21412,18.64378],[-72.21437,18.64347],[-72.2158,18.64222],[-72.21601,18.64217],[-72.21761,18.64218],[-72.21778,18.64272],[-72.21798,18.64256],[-72.21816,18.64236],[-72.21821,18.6422],[-72.22119,18.64222],[-72.22125,18.6423],[-72.22135,18.64224],[-72.2215,18.64223],[-72.22293,18.64229],[-72.22299,18.64235],[-72.22311,18.64227],[-72.22717,18.64249],[-72.22828,18.64281],[-72.22811,18.6432],[-72.22848,18.64325],[-72.22919,18.64258],[-72.2304,18.64263],[-72.23711,18.64295],[-72.23719,18.64317],[-72.23807,18.64322],[-72.23828,18.64298],[-72.23988,18.64306],[-72.24332,18.6434],[-72.24367,18.64387],[-72.24518,18.64437],[-72.2456,18.64364],[-72.24562,18.64372],[-72.24574,18.64363],[-72.24723,18.64378],[-72.24853,18.64441],[-72.24918,18.64397],[-72.25155,18.64418],[-72.25382,18.64516],[-72.2546,18.64564],[-72.25517,18.64642],[-72.2554,18.64807],[-72.25531,18.64812],[-72.2552,18.64828],[-72.2555,18.64881],[-72.25586,18.64847],[-72.25603,18.64856],[-72.25625,18.64848],[-72.25685,18.64755],[-72.25965,18.64494],[-72.26253,18.64336],[-72.26304,18.64362],[-72.26388,18.64308],[-72.26486,18.64445],[-72.26525,18.64373],[-72.26533,18.64378],[-72.26576,18.64259],[-72.26652,18.64289],[-72.26641,18.64135],[-72.26714,18.64137],[-72.26737,18.6407],[-72.26824,18.64023],[-72.26853,18.6403],[-72.26901,18.63988],[-72.26908,18.63978],[-72.26948,18.63958],[-72.27214,18.63895],[-72.27383,18.63988],[-72.27375,18.64004],[-72.27476,18.64088],[-72.27501,18.64054],[-72.27622,18.64161],[-72.27639,18.64131],[-72.27652,18.64138],[-72.27845,18.643],[-72.27896,18.64273],[-72.2823,18.64457],[-72.28387,18.64607],[-72.28384,18.64611],[-72.28412,18.64641],[-72.28401,18.64647],[-72.28455,18.6471],[-72.28538,18.64803],[-72.28569,18.64785],[-72.28642,18.64857],[-72.28724,18.64936],[-72.28775,18.65003],[-72.28724,18.65028],[-72.28768,18.65089],[-72.28708,18.65122],[-72.28656,18.65188],[-72.28736,18.6532],[-72.2872,18.65332],[-72.2873,18.65355],[-72.28905,18.65383],[-72.28882,18.65459],[-72.28889,18.6546],[-72.28878,18.65512],[-72.29013,18.65481],[-72.29084,18.65766],[-72.2902,18.65767],[-72.29076,18.66015],[-72.28998,18.66022],[-72.29045,18.66151],[-72.29022,18.66161],[-72.29033,18.66256],[-72.29138,18.66227],[-72.29155,18.66276],[-72.29368,18.66243],[-72.29377,18.663],[-72.29441,18.66289],[-72.29444,18.66273],[-72.29656,18.66246],[-72.29662,18.66262],[-72.29708,18.66261],[-72.29692,18.66184],[-72.30025,18.66195],[-72.30141,18.66311],[-72.30141,18.66397],[-72.30192,18.66392],[-72.30197,18.66454],[-72.30311,18.66471],[-72.30471,18.66632],[-72.30471,18.66668],[-72.30505,18.66666],[-72.30529,18.66692],[-72.30519,18.66768],[-72.30607,18.66759],[-72.30749,18.66901],[-72.30782,18.67109],[-72.30784,18.67216],[-72.30757,18.67405],[-72.30716,18.67526],[-72.30674,18.67537],[-72.30687,18.67599],[-72.30657,18.67612],[-72.30611,18.67602],[-72.30585,18.67705],[-72.30607,18.67726],[-72.3061,18.67744],[-72.30635,18.678],[-72.30609,18.67871],[-72.30587,18.67881],[-72.3059,18.67951],[-72.30556,18.68062],[-72.30395,18.68368],[-72.30377,18.68373],[-72.30139,18.68415],[-72.29912,18.68452],[-72.29899,18.68432],[-72.29826,18.6844],[-72.29828,18.6845],[-72.29502,18.68412],[-72.29419,18.68422],[-72.29408,18.68376],[-72.29202,18.68398],[-72.29191,18.68364],[-72.29101,18.68377],[-72.29095,18.68347],[-72.29037,18.68378],[-72.29035,18.68363],[-72.28936,18.68384],[-72.28913,18.68345],[-72.28766,18.6835],[-72.2877,18.68329],[-72.28538,18.68344],[-72.2849,18.68243],[-72.28449,18.68243],[-72.28376,18.68198],[-72.28268,18.68186],[-72.2822,18.68284],[-72.28268,18.68296],[-72.28164,18.68413],[-72.28111,18.68523],[-72.28129,18.68628],[-72.28089,18.68726],[-72.28036,18.68726],[-72.28036,18.68762],[-72.2715,18.688],[-72.2715,18.68774],[-72.27171,18.6875],[-72.27193,18.68611],[-72.2713,18.68611],[-72.27115,18.68635],[-72.27115,18.68735],[-72.26903,18.68805],[-72.26661,18.68821],[-72.26315,18.68817],[-72.25798,18.6868],[-72.25503,18.68501],[-72.25415,18.68242],[-72.25408,18.68278],[-72.25266,18.68732],[-72.25106,18.68819],[-72.24828,18.68927],[-72.24695,18.68917],[-72.24718,18.68966],[-72.24628,18.68966],[-72.24632,18.68997],[-72.24527,18.69032],[-72.24487,18.69045],[-72.24361,18.69036],[-72.24351,18.69029],[-72.24321,18.6903],[-72.24318,18.69051],[-72.24324,18.69061],[-72.24325,18.691],[-72.24303,18.69122],[-72.24166,18.69171],[-72.24149,18.69178],[-72.2406,18.69192]],[[-72.27545,18.56614],[-72.27419,18.56701],[-72.27356,18.56701],[-72.27297,18.56706],[-72.27227,18.56707],[-72.27191,18.56707],[-72.27178,18.56718],[-72.2709,18.56724],[-72.27064,18.56724],[-72.26998,18.56708],[-72.26875,18.56671],[-72.2684,18.56661],[-72.26809,18.56639],[-72.26781,18.56611],[-72.26744,18.5652],[-72.26739,18.56308],[-72.26738,18.5626],[-72.26742,18.56195],[-72.26799,18.56064],[-72.26822,18.56014],[-72.26856,18.55975],[-72.26871,18.55962],[-72.2702,18.55963],[-72.27181,18.55967],[-72.27491,18.55982],[-72.27579,18.55986],[-72.27588,18.55999],[-72.2758,18.56491],[-72.27578,18.56541],[-72.27575,18.56556],[-72.27552,18.56608],[-72.27545,18.56614]],[[-72.33318,18.56014],[-72.33166,18.55959],[-72.33021,18.55904],[-72.32919,18.55866],[-72.3292,18.55861],[-72.32887,18.55838],[-72.32868,18.55826],[-72.3282,18.55827],[-72.32815,18.55828],[-72.3261,18.55752],[-72.32604,18.5575],[-72.32604,18.55745],[-72.32589,18.55732],[-72.32551,18.5573],[-72.32437,18.55688],[-72.32411,18.55678],[-72.32379,18.55662],[-72.32348,18.55633],[-72.32315,18.55628],[-72.32174,18.55556],[-72.32143,18.55541],[-72.3205,18.55488],[-72.32019,18.5547],[-72.32007,18.55453],[-72.31984,18.55412],[-72.31984,18.55385],[-72.31998,18.55322],[-72.32046,18.55124],[-72.32056,18.55083],[-72.32066,18.55047],[-72.32068,18.55039],[-72.32111,18.54857],[-72.32127,18.54791],[-72.32147,18.54719],[-72.32153,18.54699],[-72.322,18.5458],[-72.32203,18.54575],[-72.32354,18.54486],[-72.3236,18.54483],[-72.3236,18.54481],[-72.32486,18.54407],[-72.32534,18.54378],[-72.32533,18.5439],[-72.32534,18.54392],[-72.32555,18.54416],[-72.32588,18.54452],[-72.3259,18.54453],[-72.32621,18.54452],[-72.3266,18.54452],[-72.32666,18.54398],[-72.32669,18.54367],[-72.32666,18.54361],[-72.32666,18.54356],[-72.32669,18.54356],[-72.32677,18.5436],[-72.32704,18.54363],[-72.32714,18.5432],[-72.32713,18.54314],[-72.32704,18.54317],[-72.32697,18.54316],[-72.32698,18.54296],[-72.32697,18.54293],[-72.32697,18.54281],[-72.32728,18.54263],[-72.32814,18.5424],[-72.32864,18.54226],[-72.3297,18.54228],[-72.32979,18.54228],[-72.33174,18.54279],[-72.33242,18.54298],[-72.33329,18.54319],[-72.33328,18.54321],[-72.33529,18.54372],[-72.33589,18.54387],[-72.33689,18.54504],[-72.33734,18.54555],[-72.33761,18.546],[-72.33783,18.54639],[-72.33788,18.54658],[-72.33791,18.54693],[-72.33792,18.54705],[-72.33763,18.54705],[-72.33749,18.54705],[-72.33751,18.54753],[-72.33751,18.54764],[-72.33747,18.54764],[-72.33748,18.54773],[-72.33742,18.54773],[-72.33739,18.54776],[-72.33735,18.54773],[-72.33734,18.54774],[-72.33726,18.54774],[-72.33725,18.54782],[-72.33725,18.54804],[-72.33728,18.548],[-72.3373,18.54798],[-72.3373,18.54796],[-72.33737,18.54788],[-72.33739,18.54789],[-72.33741,18.5478],[-72.33744,18.5478],[-72.33755,18.5477],[-72.33752,18.54764],[-72.33773,18.54741],[-72.33775,18.54741],[-72.33775,18.54737],[-72.33789,18.54721],[-72.3389,18.54828],[-72.33902,18.54842],[-72.34008,18.55026],[-72.34014,18.55034],[-72.34028,18.55068],[-72.34041,18.55099],[-72.34029,18.55156],[-72.34021,18.55185],[-72.33985,18.55283],[-72.33973,18.55315],[-72.33927,18.55425],[-72.33914,18.55457],[-72.33915,18.55458],[-72.3391,18.5547],[-72.33896,18.55506],[-72.33847,18.55626],[-72.33842,18.55625],[-72.33844,18.55631],[-72.33832,18.55661],[-72.33822,18.55686],[-72.33821,18.55687],[-72.33816,18.55699],[-72.33815,18.55698],[-72.33807,18.557],[-72.33803,18.557],[-72.33806,18.55726],[-72.338,18.55742],[-72.33716,18.5593],[-72.33709,18.55945],[-72.33843,18.55931],[-72.33929,18.55922],[-72.33982,18.55941],[-72.33983,18.55943],[-72.34028,18.55975],[-72.34092,18.5598],[-72.34096,18.5598],[-72.34413,18.5609],[-72.3446,18.56107],[-72.34472,18.56111],[-72.34472,18.56109],[-72.34829,18.5623],[-72.34912,18.5626],[-72.35035,18.56335],[-72.35302,18.56496],[-72.35333,18.56616],[-72.35351,18.56901],[-72.35337,18.56949],[-72.35156,18.57185],[-72.35042,18.57341],[-72.35036,18.57338],[-72.34849,18.57592],[-72.34815,18.57636],[-72.34756,18.57636],[-72.34753,18.57634],[-72.34746,18.57647],[-72.34745,18.57639],[-72.34705,18.57703],[-72.34659,18.57672],[-72.34649,18.57683],[-72.34544,18.57618],[-72.34365,18.57629],[-72.34361,18.57636],[-72.34354,18.57631],[-72.34258,18.5764],[-72.34252,18.57699],[-72.3428,18.57707],[-72.343,18.57715],[-72.3429,18.57737],[-72.34338,18.5774],[-72.34321,18.57803],[-72.34324,18.57803],[-72.3432,18.57816],[-72.3444,18.57852],[-72.34395,18.57972],[-72.34414,18.57976],[-72.34377,18.58067],[-72.34424,18.58074],[-72.34398,18.58155],[-72.34388,18.58181],[-72.34392,18.5818],[-72.34371,18.5823],[-72.34375,18.58229],[-72.34371,18.58237],[-72.34283,18.58355],[-72.3424,18.58413],[-72.34238,18.58411],[-72.34234,18.58411],[-72.34209,18.58403],[-72.34207,18.58434],[-72.342,18.58433],[-72.34192,18.58474],[-72.34192,18.58477],[-72.34118,18.58575],[-72.3408,18.58627],[-72.34024,18.58655],[-72.33983,18.58675],[-72.33542,18.58843],[-72.33539,18.58845],[-72.33539,18.58843],[-72.33517,18.58851],[-72.3346,18.58806],[-72.33372,18.58896],[-72.33361,18.58917],[-72.33295,18.58941],[-72.33253,18.58912],[-72.33252,18.58916],[-72.33168,18.58889],[-72.33157,18.5891],[-72.33152,18.58918],[-72.33153,18.58917],[-72.33152,18.5892],[-72.33158,18.58929],[-72.33161,18.58934],[-72.33136,18.58951],[-72.33134,18.58953],[-72.33135,18.58954],[-72.3313,18.58963],[-72.33132,18.58976],[-72.33112,18.58977],[-72.33118,18.58983],[-72.33097,18.59017],[-72.33011,18.5905],[-72.32965,18.59068],[-72.32418,18.59182],[-72.3238,18.59189],[-72.32228,18.59068],[-72.32079,18.58947],[-72.32076,18.58801],[-72.32078,18.588],[-72.32078,18.58706],[-72.32073,18.58691],[-72.32073,18.58626],[-72.32092,18.58625],[-72.32081,18.58589],[-72.32074,18.58593],[-72.3207,18.58531],[-72.32114,18.58437],[-72.32185,18.58274],[-72.32202,18.58277],[-72.3222,18.58276],[-72.32211,18.58251],[-72.32196,18.58249],[-72.32242,18.5815],[-72.32245,18.5815],[-72.32295,18.58034],[-72.32368,18.579],[-72.32465,18.57947],[-72.32575,18.57852],[-72.32661,18.5778],[-72.32721,18.57838],[-72.32824,18.57817],[-72.32848,18.57756],[-72.32855,18.5776],[-72.32938,18.57666],[-72.32907,18.57629],[-72.32936,18.57607],[-72.32877,18.57563],[-72.32975,18.57451],[-72.32968,18.57443],[-72.32989,18.57408],[-72.32994,18.57359],[-72.3296,18.57363],[-72.32997,18.57247],[-72.33009,18.57153],[-72.33017,18.57152],[-72.33047,18.57045],[-72.3314,18.57052],[-72.33167,18.56999],[-72.33027,18.56999],[-72.33025,18.57003],[-72.33006,18.57004],[-72.3297,18.57],[-72.32981,18.56877],[-72.32877,18.56765],[-72.32858,18.56749],[-72.32877,18.56711],[-72.32912,18.5668],[-72.32897,18.56664],[-72.32938,18.56572],[-72.32946,18.56554],[-72.33052,18.56424],[-72.33056,18.56424],[-72.33056,18.5642],[-72.33105,18.56367],[-72.33112,18.56374],[-72.33111,18.56376],[-72.33117,18.56377],[-72.33131,18.56391],[-72.33153,18.5641],[-72.33154,18.56385],[-72.33161,18.56365],[-72.33168,18.56329],[-72.33169,18.56322],[-72.33171,18.56319],[-72.33181,18.5628],[-72.33187,18.5626],[-72.33299,18.56123],[-72.33318,18.561],[-72.33365,18.56064],[-72.33393,18.56042],[-72.33367,18.56033],[-72.33367,18.56027],[-72.33332,18.56011],[-72.33318,18.56014]],[[-72.31173,18.56168],[-72.31195,18.56259],[-72.31221,18.56365],[-72.31259,18.56628],[-72.31254,18.5663],[-72.31264,18.56654],[-72.31266,18.56682],[-72.3127,18.56687],[-72.31276,18.56734],[-72.31256,18.56746],[-72.31232,18.56754],[-72.31229,18.56757],[-72.31199,18.5677],[-72.31216,18.56801],[-72.31227,18.56815],[-72.31231,18.56828],[-72.31239,18.56841],[-72.31291,18.56909],[-72.31281,18.56916],[-72.31306,18.56945],[-72.31309,18.56956],[-72.31323,18.57061],[-72.31325,18.57137],[-72.31325,18.57213],[-72.31234,18.57268],[-72.31117,18.57341],[-72.30971,18.5739],[-72.30911,18.5739],[-72.30894,18.57369],[-72.3086,18.57389],[-72.30712,18.57389],[-72.307,18.57357],[-72.30666,18.57388],[-72.30605,18.57389],[-72.30581,18.57367],[-72.30555,18.57388],[-72.3007,18.57387],[-72.30059,18.57369],[-72.30044,18.57386],[-72.29691,18.57388],[-72.29518,18.57386],[-72.295,18.57371],[-72.29473,18.57341],[-72.29387,18.5722],[-72.29341,18.57156],[-72.29338,18.57142],[-72.2933,18.57075],[-72.29338,18.57008],[-72.29349,18.56992],[-72.29361,18.56978],[-72.29361,18.56985],[-72.29378,18.56959],[-72.29364,18.56957],[-72.29345,18.56951],[-72.29358,18.56919],[-72.29389,18.56859],[-72.29373,18.56847],[-72.29359,18.56827],[-72.29359,18.5681],[-72.29379,18.5679],[-72.29403,18.56774],[-72.29387,18.56762],[-72.29368,18.56743],[-72.29396,18.56457],[-72.29411,18.56426],[-72.29401,18.56418],[-72.29402,18.5638],[-72.29412,18.56283],[-72.29451,18.56209],[-72.29462,18.56196],[-72.29767,18.5617],[-72.29849,18.56192],[-72.29864,18.56184],[-72.29857,18.56174],[-72.2988,18.56157],[-72.30144,18.56133],[-72.30181,18.56176],[-72.30228,18.56125],[-72.30275,18.56122],[-72.30427,18.56126],[-72.30505,18.56147],[-72.30522,18.5613],[-72.30609,18.56132],[-72.30821,18.56138],[-72.31173,18.56168]]]},{id:"DroneImageryCanaanHaitiNovember2015",name:"Drone Imagery Canaan(Haiti) November 2015",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_canaan_nov2015/{zoom}/{x}/{y}",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[-72.23109,18.67676],[-72.23101,18.67675],[-72.23108,18.67675],[-72.23104,18.67669],[-72.23105,18.67665],[-72.23151,18.67663],[-72.23153,18.67665],[-72.23146,18.67676],[-72.23285,18.67669],[-72.23506,18.67641],[-72.23507,18.67638],[-72.23507,18.67635],[-72.23505,18.67635],[-72.23511,18.6762],[-72.23509,18.67614],[-72.23523,18.67613],[-72.23522,18.67611],[-72.23523,18.67606],[-72.2352,18.67598],[-72.23515,18.6758],[-72.23629,18.67565],[-72.23625,18.67553],[-72.23624,18.67551],[-72.23648,18.67548],[-72.23648,18.67565],[-72.23648,18.67581],[-72.23689,18.67575],[-72.2372,18.67571],[-72.23747,18.67567],[-72.23772,18.67563],[-72.23805,18.6756],[-72.23854,18.67555],[-72.23888,18.67552],[-72.239,18.67551],[-72.23897,18.67565],[-72.23897,18.67571],[-72.23901,18.67576],[-72.239,18.67576],[-72.23902,18.67584],[-72.23905,18.67589],[-72.23929,18.67587],[-72.23981,18.67581],[-72.24059,18.67571],[-72.24142,18.67561],[-72.24177,18.67556],[-72.24179,18.67553],[-72.2421,18.67551],[-72.24272,18.67545],[-72.24276,18.67536],[-72.24278,18.67537],[-72.24279,18.67537],[-72.24299,18.67536],[-72.24334,18.67535],[-72.24339,18.67535],[-72.2434,18.67534],[-72.24372,18.67532],[-72.24424,18.67525],[-72.24443,18.67509],[-72.2474,18.67253],[-72.24731,18.67233],[-72.24681,18.67157],[-72.2469,18.67061],[-72.24652,18.67055],[-72.24661,18.66991],[-72.24669,18.66991],[-72.24688,18.66884],[-72.24707,18.66789],[-72.24709,18.66749],[-72.24728,18.66743],[-72.24716,18.66691],[-72.24717,18.66642],[-72.24703,18.66644],[-72.24701,18.66616],[-72.24971,18.66598],[-72.24947,18.66475],[-72.24989,18.66489],[-72.24989,18.66507],[-72.25113,18.66515],[-72.25102,18.66548],[-72.25111,18.66548],[-72.25111,18.66559],[-72.25219,18.66551],[-72.25387,18.66554],[-72.25387,18.66563],[-72.25551,18.66559],[-72.25638,18.66484],[-72.25719,18.66359],[-72.25763,18.66208],[-72.25768,18.65694],[-72.25779,18.64996],[-72.25713,18.64563],[-72.25696,18.64517],[-72.25564,18.64352],[-72.2493,18.64358],[-72.2482,18.64361],[-72.24637,18.64397],[-72.24629,18.64462],[-72.24454,18.64436],[-72.24442,18.64527],[-72.24311,18.6455],[-72.24326,18.64639],[-72.24286,18.64794],[-72.24272,18.64801],[-72.24282,18.6482],[-72.24257,18.64894],[-72.24109,18.64902],[-72.24109,18.64918],[-72.2405,18.64906],[-72.24036,18.6495],[-72.2403,18.64863],[-72.23753,18.64915],[-72.23664,18.64899],[-72.23666,18.64883],[-72.23582,18.64888],[-72.23488,18.64878],[-72.23487,18.64893],[-72.2338,18.649],[-72.23384,18.64932],[-72.23262,18.64927],[-72.2325,18.64824],[-72.23028,18.64837],[-72.23028,18.64821],[-72.22743,18.64815],[-72.2263,18.64775],[-72.22608,18.64845],[-72.22583,18.64841],[-72.22576,18.64828],[-72.22417,18.64849],[-72.22417,18.64805],[-72.22166,18.64804],[-72.21921,18.6485],[-72.21767,18.64995],[-72.21719,18.6509],[-72.21637,18.65422],[-72.21633,18.65888],[-72.21633,18.66198],[-72.2171,18.66448],[-72.21737,18.66441],[-72.21814,18.66454],[-72.21864,18.66568],[-72.21837,18.66588],[-72.21881,18.66817],[-72.21881,18.66893],[-72.21846,18.66888],[-72.21884,18.67018],[-72.22015,18.67173],[-72.22175,18.67311],[-72.22175,18.67288],[-72.2225,18.67317],[-72.22257,18.67357],[-72.22241,18.67368],[-72.22489,18.67588],[-72.2287,18.67693],[-72.23073,18.6768],[-72.23111,18.67678],[-72.23109,18.67676]]]},{id:"drone-imagery-2016",name:"Drone Imagery Matthew(Haiti) October 2016",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/haiti_uav_201610/{zoom}/{x}/{y}",endDate:"2016-10-01T00:00:00.000Z",startDate:"2016-10-01T00:00:00.000Z",polygon:[[[-74.11291,18.64948],[-74.10903,18.64598],[-74.10873,18.64446],[-74.1095,18.64452],[-74.1095,18.64181],[-74.10968,18.64187],[-74.11053,18.64103],[-74.10988,18.64034],[-74.11005,18.64014],[-74.11005,18.64009],[-74.11011,18.64002],[-74.10949,18.63959],[-74.1095,18.63924],[-74.10904,18.63926],[-74.10894,18.63917],[-74.10905,18.63912],[-74.10898,18.63899],[-74.10782,18.63839],[-74.10823,18.63775],[-74.10812,18.63764],[-74.10786,18.63774],[-74.10768,18.63733],[-74.10748,18.63719],[-74.10722,18.63559],[-74.10901,18.63394],[-74.11678,18.62847],[-74.11952,18.62815],[-74.12251,18.63132],[-74.12731,18.63703],[-74.12684,18.6374],[-74.12731,18.63771],[-74.12768,18.63756],[-74.13403,18.64671],[-74.13401,18.64897],[-74.13087,18.65167],[-74.13076,18.65153],[-74.13053,18.65179],[-74.13054,18.65195],[-74.12878,18.65342],[-74.1274,18.65412],[-74.12514,18.65497],[-74.11997,18.65432],[-74.11938,18.65429],[-74.11291,18.64948]],[[-74.11305,18.4922],[-74.10884,18.49216],[-74.10118,18.49095],[-74.10105,18.49057],[-74.10131,18.4902],[-74.10101,18.48996],[-74.10142,18.48933],[-74.10099,18.48931],[-74.1009,18.48886],[-74.10166,18.48725],[-74.10108,18.48713],[-74.10133,18.48664],[-74.10058,18.48654],[-74.10048,18.48552],[-74.10062,18.4849],[-74.10037,18.48478],[-74.10012,18.4827],[-74.09994,18.48123],[-74.10033,18.48114],[-74.10242,18.48116],[-74.10492,18.48149],[-74.10771,18.48189],[-74.1099,18.48226],[-74.10987,18.48243],[-74.10992,18.48246],[-74.11018,18.48232],[-74.11196,18.48261],[-74.11247,18.48278],[-74.11316,18.48382],[-74.1134,18.48521],[-74.11349,18.48709],[-74.11338,18.48704],[-74.11336,18.48717],[-74.11349,18.48727],[-74.11355,18.48931],[-74.11349,18.48949],[-74.1135,18.48951],[-74.11349,18.48952],[-74.11347,18.48951],[-74.11334,18.48957],[-74.11336,18.48962],[-74.11341,18.48958],[-74.11344,18.48959],[-74.11349,18.48956],[-74.11352,18.48957],[-74.11355,18.48956],[-74.11357,18.48998],[-74.11359,18.49067],[-74.11354,18.49108],[-74.11322,18.492],[-74.11305,18.4922]],[[-74.10198,18.24954],[-74.09767,18.24744],[-74.09419,18.2474],[-74.09338,18.24885],[-74.09638,18.25292],[-74.09934,18.25335],[-74.10198,18.24954]],[[-74.02901,18.59744],[-74.02881,18.60255],[-74.00847,18.60182],[-74.00867,18.59671],[-74.02901,18.59744]],[[-73.91991,18.07466],[-73.91468,18.07482],[-73.91535,18.07742],[-73.91478,18.08009],[-73.91997,18.08014],[-73.91924,18.07802],[-73.91999,18.07637],[-73.91991,18.07466]],[[-74.22365,18.3081],[-74.22061,18.30272],[-74.21902,18.30278],[-74.21592,18.30364],[-74.21615,18.30804],[-74.22365,18.3081]],[[-74.00508,18.17646],[-74.00072,18.17657],[-74.00186,18.18175],[-74.00269,18.18344],[-74.00653,18.18336],[-74.00715,18.18218],[-74.00649,18.18056],[-74.0052,18.17922],[-74.00508,18.17646]],[[-74.0653,18.22881],[-74.06361,18.2268],[-74.06114,18.22672],[-74.05968,18.22853],[-74.06281,18.23083],[-74.06446,18.23034],[-74.0653,18.22881]],[[-74.11371,18.47184],[-74.11002,18.47177],[-74.10959,18.47536],[-74.11341,18.47497],[-74.11371,18.47184]],[[-73.95852,18.47452],[-73.95446,18.47465],[-73.95548,18.4794],[-73.95965,18.47878],[-73.95852,18.47452]],[[-74.16719,18.27229],[-74.16196,18.27232],[-74.16175,18.27303],[-74.16255,18.27452],[-74.16372,18.27542],[-74.16341,18.27749],[-74.16404,18.27854],[-74.16756,18.27868],[-74.16742,18.27592],[-74.16775,18.27416],[-74.16719,18.27229]],[[-74.11091,18.45286],[-74.10701,18.45258],[-74.10684,18.4586],[-74.11102,18.45781],[-74.11091,18.45286]],[[-73.76854,18.18022],[-73.75773,18.18006],[-73.73559,18.19311],[-73.73567,18.20143],[-73.74563,18.20191],[-73.74468,18.22311],[-73.77121,18.22417],[-73.77129,18.20844],[-73.76915,18.2064],[-73.76854,18.18022]],[[-74.13455,18.60914],[-74.1388,18.60929],[-74.13871,18.61165],[-74.13447,18.6115],[-74.13455,18.60914]],[[-74.04228,18.20945],[-74.042,18.20484],[-74.04155,18.20239],[-74.03959,18.20051],[-74.03836,18.20028],[-74.03764,18.20242],[-74.03792,18.20562],[-74.03918,18.20932],[-74.04228,18.20945]],[[-74.08668,18.61121],[-74.08669,18.61217],[-74.09146,18.61689],[-74.09211,18.61603],[-74.09313,18.61699],[-74.09603,18.62025],[-74.09627,18.6206],[-74.0967,18.62202],[-74.09337,18.62651],[-74.09237,18.62754],[-74.08862,18.62596],[-74.08863,18.62561],[-74.08778,18.62561],[-74.08661,18.6251],[-74.08662,18.62368],[-74.08514,18.62367],[-74.08462,18.62289],[-74.08463,18.62175],[-74.08339,18.62174],[-74.08261,18.62057],[-74.08262,18.61982],[-74.07659,18.6198],[-74.07658,18.61596],[-74.07255,18.61591],[-74.07259,18.61403],[-74.07062,18.61402],[-74.06858,18.6129],[-74.06855,18.61208],[-74.06614,18.61207],[-74.06414,18.61206],[-74.0625,18.61105],[-74.06254,18.61011],[-74.05927,18.61013],[-74.0545,18.60876],[-74.05451,18.60817],[-74.05168,18.60816],[-74.04932,18.60776],[-74.04647,18.60664],[-74.04646,18.6062],[-74.04243,18.6062],[-74.04133,18.60592],[-74.03625,18.60378],[-74.03597,18.60345],[-74.03642,18.60252],[-74.03719,18.6019],[-74.04003,18.60217],[-74.05608,18.60473],[-74.05851,18.6054],[-74.05861,18.60623],[-74.0611,18.60627],[-74.06481,18.60745],[-74.06518,18.60686],[-74.06679,18.60802],[-74.0696,18.60885],[-74.07142,18.60711],[-74.07239,18.60736],[-74.07515,18.61024],[-74.07701,18.61019],[-74.07798,18.61096],[-74.07901,18.61013],[-74.08109,18.61234],[-74.08234,18.60896],[-74.08383,18.60922],[-74.08513,18.60977],[-74.08668,18.61121]],[[-74.45922,18.4663],[-74.45589,18.46471],[-74.44779,18.47],[-74.44693,18.4713],[-74.44726,18.47934],[-74.44554,18.47915],[-74.44515,18.48326],[-74.43968,18.4839],[-74.439,18.48762],[-74.44299,18.49004],[-74.44906,18.49104],[-74.45382,18.49311],[-74.45571,18.49635],[-74.45786,18.49725],[-74.46052,18.49523],[-74.46241,18.49143],[-74.46198,18.48799],[-74.45537,18.48597],[-74.45526,18.47111],[-74.45944,18.46871],[-74.45922,18.4663]],[[-74.41888,18.57551],[-74.41499,18.57331],[-74.41045,18.57648],[-74.40824,18.58233],[-74.40954,18.58894],[-74.4112,18.59195],[-74.41081,18.59689],[-74.41663,18.60063],[-74.42178,18.59671],[-74.42146,18.59416],[-74.41745,18.59419],[-74.41753,18.59067],[-74.41538,18.59002],[-74.41533,18.58382],[-74.41652,18.58382],[-74.41756,18.5814],[-74.41756,18.57967],[-74.41924,18.57754],[-74.41888,18.57551]]]},{id:"Erlangen-2011",name:"Erlangen Luftbild (2011 5,0 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbilder2011/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio10_5cm_gk4.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[10.92791,49.53196],[10.97194,49.52969],[10.97821,49.53568],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03663,49.57167],[11.04029,49.58572],[11.07287,49.58587],[11.07243,49.63486],[11.0054,49.6344],[11.00397,49.62599],[10.9748,49.62541],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],terms_text:"© Stadt Erlangen | © Aerowest GmbH"},{id:"Erlangen-2013",name:"Erlangen Luftbild (2013 6,25 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbilder2013/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Erlangen_ratio5_6.25cm.jp2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[10.92791,49.53196],[10.9726,49.52939],[10.97909,49.53475],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03743,49.57873],[11.0568,49.592],[11.05748,49.61358],[11.04681,49.61447],[11.04788,49.6187],[11.00308,49.62367],[10.98107,49.62339],[10.98069,49.62617],[10.96737,49.62781],[10.96539,49.63415],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],terms_text:"© Stadt Erlangen | © Aerowest GmbH"},{id:"Erlangen-2016",name:"Erlangen Luftbild (2016 5,0 cm)",type:"wms",template:"https://secure.erlangen.de/arcgiser/services/Luftbild2016/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-03-18T00:00:00.000Z",startDate:"2016-03-18T00:00:00.000Z",polygon:[[[10.97664,49.53765],[10.99101,49.53392],[10.99389,49.53835],[11.02784,49.53254],[11.0346,49.53462],[11.03407,49.53759],[11.04318,49.54321],[11.03557,49.55303],[11.0384,49.55842],[11.03508,49.56929],[11.03791,49.58659],[11.04797,49.5902],[11.04922,49.5937],[11.05749,49.59521],[11.05623,49.59905],[11.05127,49.6003],[11.05351,49.60904],[11.04309,49.61381],[11.04076,49.61823],[11.0285,49.61735],[11.01929,49.61896],[11.0152,49.61372],[11.00581,49.61448],[11.00639,49.61931],[11.00083,49.6221],[10.9856,49.61651],[10.97837,49.61753],[10.9737,49.62495],[10.96539,49.62557],[10.96063,49.62856],[10.96382,49.63176],[10.95474,49.6379],[10.94837,49.637],[10.94185,49.64377],[10.9273,49.64837],[10.92063,49.63963],[10.91136,49.63773],[10.92429,49.60505],[10.92205,49.58004],[10.91221,49.57008],[10.91441,49.5618],[10.92353,49.55842],[10.92712,49.55976],[10.93345,49.55892],[10.93071,49.54467],[10.93067,49.53225],[10.9406,49.53325],[10.95488,49.53021],[10.97199,49.53126],[10.97664,49.53765]]],terms_text:"© Stadt Erlangen | © Geocart GmbH",best:true},{id:"EsriWorldImagery",name:"Esri World Imagery",type:"tms",template:"https://{switch:services,server}.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/Esri",terms_text:"Terms & Feedback","default":true,description:"Esri world imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{id:"EsriWorldImageryClarity",name:"Esri World Imagery (Clarity) Beta",type:"tms",template:"https://clarity.maptiles.arcgis.com/arcgis/rest/services/World_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/Esri",terms_text:"Terms & Feedback","default":true,description:"Esri archive imagery that may be clearer and more accurate than the default layer.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{id:"maaamet.ee-pohi_vr2",name:"Estonia Basemap (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=pohi_vr2&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti põhikaart"},{id:"Maaamet-Estonia_Cadastre",name:"Estonia Cadastre (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=of10000,TOPOYKSUS_6569,TOPOYKSUS_6573&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti katastrikaart ortofoto alusel"},{id:"maaamet.ee-cir_ngr",name:"Estonia Forestry (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=cir_ngr&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti metsanduslik ortofoto"},{id:"maaamet.ee-reljeef",name:"Estonia Hillshading (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=reljeef&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti reljeefikaart"},{id:"maaamet.ee-orto",name:"Estonia Ortho (Maaamet)",type:"tms",template:"https://tiles.maaamet.ee/tm/tms/1.0.0/foto@GMC/{zoom}/{x}/{-y}.png",zoomExtent:[14,18],polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti ortofoto"},{id:"estrela_de_alagoas",name:"Estrela de Alagoas",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Estrela%20de%20Alagoas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.71382,-9.43476],[-36.71477,-9.34443],[-36.80586,-9.34498],[-36.80525,-9.43542],[-36.71382,-9.43476]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"Fiez-2013",name:"Fiez Orthophoto 2013",type:"tms",template:"http://osmdata.asitvd.ch/tiles/fiez2013/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.62313,46.82339],[6.62899,46.82484],[6.62882,46.82674],[6.62531,46.83274],[6.62382,46.83317],[6.61839,46.83194],[6.62313,46.82339]]],terms_url:"http://osmdata.asitvd.ch/",terms_text:"Fiez - Orthophoto technique 2013"},{id:"fiskeridir-akvakultur",name:"Fiskeridirektoratet Aquaculture overlay",type:"wms",template:"https://ogc.fiskeridir.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_262&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.fiskeridir.no/Kart",terms_text:"© Fiskeridirektoratet",description:"Aquaculture/marine farms (licensed sites, may not yet have any installations)",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg/175px-Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg.png",overlay:true},{id:"FOMI_2000",name:"FÖMI orthophoto 2000",type:"tms",template:"http://e.tile.openstreetmap.hu/ortofoto2000/{zoom}/{x}/{y}.jpg",endDate:"2000-01-01T00:00:00.000Z",startDate:"2000-01-01T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[16.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],terms_url:"https://www.fomi.hu",terms_text:"Földmérési és Távérzékelési Intézet"},{id:"FOMI_2005",name:"FÖMI orthophoto 2005",type:"tms",template:"http://e.tile.openstreetmap.hu/ortofoto2005/{zoom}/{x}/{y}.jpg",endDate:"2005-01-01T00:00:00.000Z",startDate:"2005-01-01T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[16.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],terms_url:"https://www.fomi.hu",terms_text:"Földmérési és Távérzékelési Intézet"},{id:"Freemap.sk-Car",name:"Freemap.sk Car",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/A/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Cyclo",name:"Freemap.sk Cyclo",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/C/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Hiking",name:"Freemap.sk Hiking",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/T/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"Freemap.sk-Ski",name:"Freemap.sk Ski",type:"tms",template:"https://{switch:a,b,c,d}.freemap.sk/K/{zoom}/{x}/{y}.jpeg",zoomExtent:[8,16],polygon:[[[19.83682,49.25529],[19.80075,49.42385],[19.60437,49.48058],[19.49179,49.63961],[19.21831,49.52604],[19.16778,49.42521],[19.00308,49.42236],[18.97611,49.5308],[18.54685,49.51425],[18.31432,49.33818],[18.15913,49.2961],[18.05564,49.11134],[17.56396,48.84938],[17.17929,48.88816],[17.058,48.81105],[16.90426,48.61947],[16.79685,48.38561],[17.06762,48.01116],[17.32787,47.97749],[17.51699,47.82535],[17.74776,47.73093],[18.29515,47.72075],[18.67959,47.75541],[18.89755,47.81203],[18.79463,47.88245],[18.84318,48.04046],[19.46212,48.05333],[19.62064,48.22938],[19.89585,48.09387],[20.33766,48.2643],[20.55395,48.52358],[20.82335,48.55714],[21.10271,48.47096],[21.45863,48.55513],[21.74536,48.31435],[22.15293,48.37179],[22.61255,49.08914],[22.09997,49.23814],[21.9686,49.36363],[21.6244,49.46989],[21.06873,49.46402],[20.94336,49.31088],[20.73052,49.44006],[20.22804,49.41714],[20.05234,49.23052],[19.83682,49.25529]]],terms_text:"Copyright ©2007-2012 Freemap Slovakia (www.freemap.sk). Some rights reserved.",icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"fta-digiroad-functional",name:"FTA Road Network",type:"wms",template:"https://extranet.liikennevirasto.fi/inspirepalvelu/beta/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dr_tielinkki_toim_lk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,20],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.liikennevirasto.fi/web/en/open-data/digiroad/",terms_text:"© Liikennevirasto",description:"Digiroad national road network from the Finnish Transport Agency, functional road classes.",icon:"https://www.liikennevirasto.fi/livi-theme/images/general/liikennevirasto_logo_2x.png",overlay:true},{id:"gaza_pleiades_20140706",name:"Gaza Strip - Pléiades - 2014/07/06",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{id:"gaza_pleiades_20140706_nir",name:"Gaza Strip - Pléiades - 2014/07/06 (NIR)",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706_nir/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{id:"Geobase_Hydrography",name:"Geobase Hydrography - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/hydro_network_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]],overlay:true},{id:"Geobase_Hydrography_French",name:"Geobase Hydrography - French",type:"wms",template:"https://maps.geogratis.gc.ca/wms/hydro_network_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nhn:nhn&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]],overlay:true},{id:"Geobase_Roads",name:"Geobase Roads - English",type:"wms",template:"https://maps.geogratis.gc.ca/wms/roads_en?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=roads&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[4,20],polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"Geobase_Roads_French",name:"Geobase Roads - French",type:"wms",template:"https://cartes.geogratis.gc.ca/wms/roads_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=routes&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[4,20],polygon:[[[-141.0678,60.2442],[-139.3842,60.10331],[-137.4746,58.82791],[-135.4766,59.65971],[-134.399,58.86279],[-132.5239,57.08342],[-130.1435,55.27452],[-130.7734,54.75597],[-132.4355,54.71514],[-134.5711,54.38827],[-141.7761,53.58405],[-128.9768,46.41459],[-124.8087,48.42976],[-123.4286,48.17889],[-123.0256,48.40444],[-123.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-114.1499,48.99487],[-95.12094,48.98405],[-95.13419,49.35564],[-94.94415,49.34356],[-94.8839,49.29522],[-94.71704,48.87631],[-94.71791,48.7485],[-93.83204,48.49765],[-93.43778,48.53066],[-93.38216,48.59507],[-92.98471,48.60312],[-92.73847,48.50725],[-92.7095,48.42081],[-92.54293,48.40158],[-92.38361,48.20406],[-92.11564,48.27641],[-91.58697,48.02516],[-91.24658,48.05422],[-90.86275,48.20889],[-90.78308,48.0639],[-90.0774,48.07435],[-89.93835,47.96584],[-89.75469,47.99609],[-89.32745,47.93943],[-88.41489,48.26677],[-84.9566,46.86086],[-84.84795,46.6762],[-84.55904,46.45441],[-84.47642,46.44972],[-84.43758,46.48872],[-84.3669,46.5055],[-84.34899,46.5055],[-84.29026,46.49077],[-84.25742,46.49386],[-84.22507,46.53187],[-84.1962,46.53804],[-84.18027,46.52468],[-84.15987,46.52468],[-84.13449,46.52879],[-84.11558,46.50653],[-84.15944,46.42769],[-84.10024,46.20338],[-83.95558,46.05132],[-83.8864,46.06125],[-83.8203,46.11181],[-83.76975,46.09563],[-83.67498,46.11391],[-83.58084,46.09921],[-83.44747,45.99521],[-83.60888,45.81772],[-82.14271,43.57905],[-82.39133,43.06666],[-82.41252,43.01127],[-82.42522,42.99864],[-82.42618,42.99374],[-82.42363,42.98536],[-82.41503,42.97697],[-82.41853,42.96578],[-82.43064,42.95203],[-82.44911,42.93711],[-82.45739,42.92568],[-82.46472,42.90562],[-82.47228,42.8877],[-82.47228,42.84743],[-82.48536,42.80967],[-82.46844,42.76365],[-82.48586,42.73697],[-82.49155,42.71168],[-82.51488,42.66652],[-82.51224,42.63893],[-82.52421,42.61103],[-82.56854,42.58184],[-82.59498,42.55148],[-82.61286,42.56409],[-82.65158,42.55707],[-82.83439,42.3763],[-83.01489,42.33457],[-83.07244,42.31502],[-83.09647,42.29542],[-83.12823,42.24126],[-83.14167,42.18582],[-83.12799,42.12172],[-83.16266,42.04963],[-83.05136,41.70911],[-82.41932,41.6377],[-81.22563,42.19633],[-80.06688,42.37121],[-78.86642,42.825],[-78.90301,42.92307],[-78.92063,42.95234],[-78.93331,42.95708],[-78.96058,42.9595],[-78.98479,42.9761],[-79.01825,42.9964],[-79.01969,43.01561],[-79.00695,43.0333],[-78.99599,43.06448],[-79.07335,43.07876],[-79.07286,43.083],[-79.0652,43.0917],[-79.05623,43.10825],[-79.05982,43.11563],[-79.06764,43.11992],[-79.05411,43.12801],[-79.04112,43.13986],[-79.04465,43.16192],[-79.05101,43.17037],[-79.04758,43.19974],[-79.05511,43.25682],[-79.18688,43.44858],[-78.68836,43.62502],[-76.77647,43.61369],[-76.41665,44.08498],[-75.49023,44.70772],[-75.29544,44.82587],[-75.16845,44.88548],[-75.1275,44.8975],[-75.00499,44.95265],[-74.98159,44.97728],[-74.90496,44.98222],[-74.8313,45.01108],[-74.77954,45.00158],[-74.74562,44.98526],[-74.70475,44.99877],[-74.49079,44.99343],[-74.23203,44.98552],[-73.93713,44.99512],[-73.01809,45.0121],[-72.63177,45.0121],[-72.54779,45.00506],[-72.32259,45.00286],[-71.49404,45.01093],[-71.48648,45.06221],[-71.42303,45.12765],[-71.43112,45.14037],[-71.37175,45.22117],[-71.28959,45.28578],[-71.23613,45.24302],[-71.11683,45.22933],[-71.0531,45.29866],[-70.98936,45.31088],[-70.90246,45.22525],[-70.82473,45.22714],[-70.77626,45.40013],[-70.7119,45.3754],[-70.63387,45.37346],[-70.60302,45.41179],[-70.67659,45.56319],[-70.3752,45.73075],[-70.36334,45.82013],[-70.25417,45.87468],[-70.22569,45.94403],[-70.27316,45.99022],[-70.17586,46.33538],[-70.06195,46.4107],[-69.98891,46.69363],[-69.22424,47.44463],[-69.06999,47.41092],[-69.07473,47.24202],[-68.89684,47.17469],[-68.78685,47.21493],[-68.72415,47.23217],[-68.68583,47.24028],[-68.66044,47.23183],[-68.62162,47.24028],[-68.59425,47.24974],[-68.59226,47.27001],[-68.57385,47.28486],[-68.55941,47.2798],[-68.542,47.2798],[-68.51214,47.29195],[-68.47381,47.29229],[-68.46038,47.28149],[-68.43898,47.27777],[-68.37229,47.2825],[-68.3703,47.34796],[-68.33173,47.35822],[-68.29664,47.352],[-68.2399,47.34897],[-68.0906,47.26798],[-68.00002,47.21223],[-67.96344,47.19753],[-67.93582,47.15947],[-67.88619,47.10424],[-67.80218,47.06386],[-67.79415,45.93923],[-67.82753,45.8489],[-67.82753,45.6704],[-67.54943,45.57445],[-67.45302,45.58742],[-67.44189,45.52251],[-67.54201,45.49393],[-67.4456,45.38726],[-67.51605,45.29343],[-67.38257,45.11839],[-67.3047,45.11316],[-67.26762,45.18116],[-67.12671,45.09484],[-66.94835,44.78406],[-66.52283,43.61294],[-65.02339,42.10691],[-42.53366,47.50263],[-75.90901,77.3176],[-71.86482,78.7359],[-67.20011,80.66812],[-66.20727,80.78637],[-54.82473,83.07464],[-57.62518,85.04043],[-106.7949,85.04625],[-141.3957,79.2514],[-141.0678,60.2442]]]},{id:"geoimage.at",name:"Geoimage.at MaxRes",type:"wms",template:"https://gis.bmlfuw.gv.at/wmsgw/?key=4d80de696cd562a63ce463a58a61488d&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=Luftbild_MR,Luftbild_1m,Luftbild_8m,Satellitenbild_30m&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[16.50733,46.99293],[16.28342,46.99293],[16.13584,46.8713],[15.98317,46.81909],[16.04933,46.65517],[15.86104,46.71801],[15.75926,46.69009],[15.56079,46.67962],[15.57606,46.63421],[15.47937,46.60276],[15.43357,46.65168],[15.22493,46.63421],[15.04682,46.64819],[14.99084,46.58877],[14.9603,46.62373],[14.85344,46.60276],[14.83308,46.50127],[14.75166,46.49776],[14.68041,46.43818],[14.61426,46.43818],[14.57864,46.37853],[14.44124,46.43116],[14.16135,46.42766],[14.12573,46.47674],[14.01886,46.47674],[13.91199,46.52578],[13.82548,46.50477],[13.44381,46.56078],[13.30641,46.55028],[13.1283,46.58877],[12.84332,46.61324],[12.72628,46.6412],[12.51255,46.66565],[12.35988,46.70405],[12.36497,46.77032],[12.28863,46.77729],[12.27337,46.88522],[12.20721,46.87478],[12.13088,46.90261],[12.11561,46.99987],[12.25301,47.06577],[12.2123,47.0935],[11.9833,47.04497],[11.73394,46.96168],[11.63217,47.01028],[11.54057,46.97557],[11.49986,47.00681],[11.41843,46.96515],[11.25559,46.97557],[11.1131,46.91304],[11.04185,46.76335],[10.88919,46.75986],[10.74161,46.78426],[10.70599,46.86435],[10.57877,46.83998],[10.45663,46.85043],[10.47699,46.92694],[10.38539,46.98946],[10.23272,46.86435],[10.12076,46.83302],[9.86632,46.94084],[9.90194,47.00334],[9.68312,47.05884],[9.61188,47.03804],[9.63223,47.12813],[9.58134,47.1662],[9.54063,47.26644],[9.60679,47.34926],[9.67294,47.36994],[9.64241,47.44571],[9.56608,47.48011],[9.71365,47.52824],[9.7849,47.59692],[9.83579,47.54542],[9.94774,47.53855],[10.09023,47.44915],[10.11059,47.36649],[10.2429,47.38717],[10.18692,47.2699],[10.32432,47.29751],[10.48208,47.44915],[10.43119,47.48699],[10.44137,47.59005],[10.48717,47.55229],[10.54823,47.53511],[10.59912,47.56602],[10.75688,47.53168],[10.88919,47.54542],[10.94008,47.48699],[10.99605,47.39061],[11.23523,47.44227],[11.28103,47.3975],[11.42352,47.51449],[11.57619,47.50762],[11.60672,47.59005],[11.83572,47.58662],[12.00366,47.62436],[12.20721,47.60378],[12.16141,47.69634],[12.2581,47.74427],[12.25301,47.67921],[12.43112,47.71004],[12.49219,47.63122],[12.56852,47.62779],[12.62959,47.68949],[12.77208,47.66893],[12.83315,47.54198],[12.97564,47.47323],[13.04179,47.49387],[13.0367,47.55572],[13.09777,47.64151],[13.03161,47.71004],[12.90439,47.72031],[13.00617,47.84683],[12.9451,47.93555],[12.86368,47.95941],[12.86368,48.00369],[12.75172,48.09894],[12.87386,48.21097],[12.96037,48.21097],[13.04179,48.2652],[13.18428,48.29907],[13.26061,48.2923],[13.39801,48.35659],[13.44381,48.41742],[13.43872,48.55234],[13.50997,48.58601],[13.61175,48.57255],[13.72879,48.5119],[13.78477,48.57255],[13.82039,48.62639],[13.79495,48.71713],[13.85093,48.77417],[14.05957,48.66338],[14.01377,48.63312],[14.07484,48.59274],[14.21733,48.59611],[14.3649,48.54897],[14.46668,48.64993],[14.55828,48.59611],[14.59899,48.62639],[14.72113,48.57591],[14.72113,48.6869],[14.8229,48.7272],[14.81782,48.77753],[14.96472,48.78518],[14.98936,49.01266],[15.14859,48.99503],[15.19439,48.93155],[15.30635,48.98501],[15.39286,48.98501],[15.48446,48.92821],[15.74908,48.8546],[15.84068,48.88807],[16.00862,48.78088],[16.20708,48.73391],[16.39537,48.73727],[16.49206,48.81105],[16.69053,48.77417],[16.7058,48.73391],[16.89917,48.71377],[16.97551,48.51527],[16.84828,48.45118],[16.85337,48.34644],[16.95515,48.25165],[16.99077,48.1499],[17.09255,48.13971],[17.08237,48.02412],[17.17397,48.02071],[17.08237,47.87414],[16.98568,47.86732],[17.08237,47.80925],[17.09255,47.70319],[16.74142,47.67921],[16.7058,47.75112],[16.53786,47.75454],[16.54804,47.70662],[16.42082,47.66893],[16.57348,47.6175],[16.67017,47.63122],[16.71088,47.53855],[16.66,47.44915],[16.54295,47.39406],[16.46153,47.39406],[16.49206,47.2768],[16.42591,47.19733],[16.47171,47.1489],[16.54804,47.1489],[16.47679,47.07964],[16.52768,47.05884],[16.50733,46.99293]]],terms_url:"http://geoimage.at",terms_text:"geoimage.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/GeoimageatMaxRes.png"},{id:"Geolittoral-Orthophotos2000",name:"Géolittoral - Orthophotos 2000",type:"wms",template:"http://geolittoral.application.developpement-durable.gouv.fr/wms2/metropole?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2000-01-01T00:00:00.000Z",startDate:"2000-01-01T00:00:00.000Z",polygon:[[[-1.07962,46.10959],[-0.94115,46.01474],[-0.56306,45.15178],[-0.7266,45.08425],[-0.87904,45.34094],[-0.99794,45.33779],[-0.95558,44.69982],[-1.15862,44.19865],[-1.21512,44.20558],[-1.24654,44.1162],[-1.27903,44.03937],[-1.28825,44.02304],[-1.32117,43.94094],[-1.32151,43.92296],[-1.3092,43.92337],[-1.3085,43.91439],[-1.28366,43.91514],[-1.28302,43.90624],[-1.2761,43.90655],[-1.28211,43.89254],[-1.30102,43.85159],[-1.30384,43.8424],[-1.30923,43.83498],[-1.33474,43.76946],[-1.34407,43.74875],[-1.3456,43.74214],[-1.34673,43.73688],[-1.43284,43.53152],[-1.42806,43.46812],[-1.60627,43.40591],[-1.6061,43.36012],[-1.77441,43.30357],[-1.82995,43.38484],[-1.58551,43.46856],[-1.35706,44.03374],[-1.40217,44.06461],[-1.33584,44.22832],[-1.21836,44.23033],[-1.16795,44.41097],[-1.30744,44.41847],[-1.16979,45.59107],[-1.48685,46.06042],[-1.36364,46.09146],[-1.60176,46.17019],[-1.64442,46.22375],[-1.58595,46.30426],[-1.51008,46.33888],[-1.75643,46.42214],[-2.1872,46.81857],[-2.16423,46.85534],[-2.23654,46.9337],[-2.39769,46.96718],[-2.282,47.07631],[-2.12563,47.01875],[-2.09013,47.06562],[-2.18487,47.10698],[-2.2647,47.10763],[-2.24489,47.18562],[-2.56779,47.24467],[-2.66727,47.46686],[-2.74787,47.47122],[-2.75771,47.43461],[-2.89321,47.4629],[-2.90369,47.50905],[-3.03383,47.53833],[-3.07113,47.51185],[-3.01653,47.49873],[-3.12502,47.42693],[-3.18803,47.48441],[-3.22791,47.61132],[-3.2967,47.63161],[-3.2876,47.67154],[-3.34074,47.66893],[-3.38912,47.59473],[-3.55087,47.63827],[-3.53384,47.72488],[-3.76577,47.76476],[-3.77595,47.7371],[-3.91168,47.75915],[-3.8959,47.79911],[-3.97236,47.81526],[-3.99722,47.7975],[-3.97956,47.76268],[-3.8945,47.72193],[-3.9162,47.67831],[-4.10163,47.70921],[-4.08989,47.78944],[-4.03798,47.79909],[-4.04125,47.83109],[-4.08765,47.84221],[-4.14781,47.82525],[-4.14314,47.78847],[-4.35162,47.7415],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.63576,48.07798],[-4.60147,48.11469],[-4.385,48.10962],[-4.38955,48.14543],[-4.30925,48.15009],[-4.31268,48.17694],[-4.46369,48.18468],[-4.49748,48.1453],[-4.5921,48.14758],[-4.57537,48.22488],[-4.67101,48.2331],[-4.65434,48.31049],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.81465,48.39413],[-4.83515,48.54319],[-4.63387,48.66373],[-3.96692,48.77978],[-3.94939,48.74715],[-3.6502,48.75356],[-3.65853,48.82527],[-3.53931,48.85834],[-3.54444,48.90297],[-3.40954,48.91866],[-3.40755,48.87366],[-3.02769,48.9275],[-2.67861,48.58841],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.80392,48.66126],[-1.61161,48.68582],[-1.71645,49.24781],[-1.8026,49.32721],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.17134,49.55412],[-1.27353,49.55245],[-1.1328,49.3934],[-0.93059,49.40804],[-0.74827,49.35976],[-0.38935,49.34167],[-0.24704,49.29995],[-0.12454,49.29353],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.4521,51.12144],[2.59286,51.12124],[2.60683,51.05779],[1.7976,50.89906],[1.66458,50.82379],[1.70786,50.1282],[1.05936,49.85],[0.61607,49.79062],[0.24731,49.65027],[0.1709,49.53174],[0.57065,49.49622],[0.41115,49.3396],[0.19504,49.35736],[0.01718,49.25479],[-0.24453,49.26312],[-0.38408,49.30495],[-0.74091,49.32438],[-0.9954,49.37133],[-1.05453,49.25175],[-1.27704,49.29022],[-1.25966,49.43463],[-1.39141,49.53985],[-1.27535,49.62056],[-1.29775,49.65946],[-1.4905,49.57139],[-1.77517,49.63398],[-1.74601,49.48155],[-1.51294,49.24691],[-1.48261,48.72607],[-1.30574,48.72531],[-1.28323,48.59731],[-2.76114,48.43471],[-3.00174,48.67646],[-3.21062,48.72097],[-3.95404,48.56051],[-4.15643,48.60792],[-4.44475,48.55852],[-4.63683,48.48299],[-4.6319,48.44727],[-4.25022,48.43088],[-4.06141,48.21805],[-4.1757,48.05165],[-4.31904,48.0141],[-4.26781,47.89977],[-3.88484,47.98172],[-3.76375,47.86403],[-2.32727,47.52634],[-2.36911,47.3339],[-1.74067,47.33507],[-1.77062,47.20451],[-2.03678,47.21942],[-2.0968,47.15548],[-1.88786,47.01239],[-2.08797,46.83007],[-2.01214,46.83436],[-1.84079,46.69651],[-1.87318,46.65484],[-1.68859,46.50392],[-1.62117,46.51513],[-1.42428,46.41675],[-1.01761,46.35917],[-1.07962,46.10959]],[[-2.41232,46.69242],[-2.37197,46.67611],[-2.26749,46.68033],[-2.27007,46.70705],[-2.29827,46.73286],[-2.41655,46.73711],[-2.41232,46.69242]],[[-3.06018,47.40542],[-2.82587,47.29635],[-2.78787,47.33417],[-3.02436,47.44563],[-3.06018,47.40542]],[[-3.26482,47.4295],[-3.3343,47.35928],[-3.29614,47.34133],[-3.31489,47.30057],[-3.19941,47.24492],[-3.16567,47.27751],[-3.08686,47.23612],[-3.00637,47.30855],[-3.26482,47.4295]],[[-1.93966,48.86346],[-1.93993,48.91179],[-1.701,48.91105],[-1.69726,48.86173],[-1.93966,48.86346]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho littorale 2000"},{id:"Geolittoral-Sentiers",name:"Géolittoral - Sentiers",type:"wms",template:"http://geolittoral.application.developpement-durable.gouv.fr/wms2/metropole?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n_sentier_littoral_l&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-0.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho littorale 2000"},{id:"GeolittoralV2-Orthophotos",name:"Géolittoral V2 - Orthophotos 2011-2014",type:"wms",template:"http://geolittoral.application.developpement-durable.gouv.fr/wms2/metropole?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortholittorale_v2_rvb&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[-0.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],terms_url:"https://wiki.openstreetmap.org/wiki/WikiProject_France/G%C3%A9oLittoral",terms_text:"Ortho Littorale V2 - MEDDE"},{id:"lu.geoportail.opendata.ortho_10cm_proto_lidar",name:"geoportail.lu LIDAR prototype Nordstad 2017",type:"tms",template:"https://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_10cm_proto_lidar/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-04-09T00:00:00.000Z",startDate:"2017-04-09T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[6.05001,49.82175],[6.04979,49.91166],[6.18901,49.91172],[6.18897,49.82181],[6.05001,49.82175]]],terms_url:"https://act.public.lu/fr/cartographie/lidar",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"Geoportal2-PL-aerial_image",name:"Geoportal 2: Orthophotomap (aerial image)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/img/guest/ORTO/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Raster&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"https://geoportal.gov.pl/web/guest/regulamin",terms_text:"Główny Urząd Geodezji i Kartografii",best:true,icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png"},{id:"Geoportal2-PL-prng",name:"Geoportal 2: PRNG (geo names)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/pub/guest/G2_PRNG_WMS/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=PozostaleObiektyFizjograficzne,Hydrografia,PozostaleMiejscowosci,Wies,UksztaltowanieTerenu&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"http://www.codgik.gov.pl/index.php/darmowe-dane/prng.html",terms_text:"Centralny Ośrodek Dokumentacji Geodezyjnej i Kartograficznej",icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png",overlay:true},{id:"Geoportal-PL-aerial_image",name:"Geoportal.gov.pl (Orthophotomap)",type:"tms",template:"https://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}",zoomExtent:[6,24],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_text:"Copyright © Główny Urząd Geodezji i Kartografii.",best:true,icon:"https://i.imgur.com/aFlvMpM.png"},{id:"girau_do_pnciano",name:"Girau do Ponciano",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Girau%20do%20Ponciano&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.78013,-9.92939],[-36.78087,-9.83892],[-36.87233,-9.83917],[-36.87173,-9.90542],[-36.87037,-9.92989],[-36.86156,-9.92994],[-36.85566,-9.92981],[-36.85146,-9.92973],[-36.84575,-9.92977],[-36.83213,-9.92967],[-36.81456,-9.9296],[-36.78013,-9.92939]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"Gliwice-buildings",name:"Gliwice: Buildings",type:"wms",template:"http://185.60.246.14:9090/isdp/gs/ows?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=default:EGIB_budynek,default:pkt_adr&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.57376,50.34828],[18.58723,50.35464],[18.58421,50.3601],[18.59264,50.37522],[18.65228,50.38297],[18.67384,50.37675],[18.67672,50.36174],[18.69218,50.34467],[18.70805,50.33799],[18.74154,50.3391],[18.75145,50.33046],[18.74679,50.31236],[18.75512,50.30193],[18.76358,50.29989],[18.76539,50.26873],[18.744,50.26541],[18.73482,50.25377],[18.72775,50.22843],[18.71439,50.22835],[18.71426,50.21978],[18.67522,50.21969],[18.67607,50.22562],[18.65098,50.23169],[18.6288,50.22539],[18.61744,50.24044],[18.62699,50.24369],[18.6315,50.25487],[18.61406,50.2576],[18.60319,50.25206],[18.56536,50.24763],[18.54841,50.2492],[18.55857,50.2826],[18.5459,50.29947],[18.52896,50.33687],[18.55118,50.35332],[18.57376,50.34828]]],terms_text:"Urząd Miasta Gliwice"},{id:"GRAFCAN-Canary_Islands",name:"GRAFCAN - Canary Islands",type:"wms",template:"https://idecan1.grafcan.es/ServicioWMS/OrtoUrb?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OU&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-17.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress Urbana 2009"},{id:"GRAFCAN_Express-Canary_Islands",name:"GRAFCAN Express - Canary Islands",type:"wms",template:"https://idecan1.grafcan.es/ServicioWMS/OrtoExpress?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=ortoexpress&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-17.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress"},{id:"GrandNancy_Orthophotographie_2012",name:"GrandNancy - Orthophoto - 2012",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/nancy_2012/{zoom}/{x}/{y}",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[6.06066,48.60554],[6.29717,48.59923],[6.30611,48.74077],[6.06896,48.7471],[6.06066,48.60554]]],terms_url:"https://wiki.openstreetmap.org/wiki/Nancy/Orthophotographie",terms_text:"GrandNancy Orthophotographie 2012"},{id:"GURS-buildings",name:"GURS: Building outlines",type:"tms",template:"http://wms.openstreetmap.de/tms/GURS-building-outlines/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2018 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"GURS-roads",name:"GURS: Road lines",type:"tms",template:"http://wms.openstreetmap.de/tms/GURS-road-lines/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2018 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"hamburg-20cm",name:"Hamburg (20 cm)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DOP20?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{id:"Hamburg-DK5",name:"Hamburg (DK5)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DK5?FORMAT=image/png&TRANSPARENT=false&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{id:"Hampshire-Aerial-FCIR",name:"Hampshire Aerial FCIR",type:"tms",template:"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_fcir/{zoom}/{x}/{y}.png",endDate:"2014-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-1.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,50.77809]]]},{id:"Hampshire-Aerial-RGB",name:"Hampshire Aerial RGB",type:"tms",template:"https://{switch:a,b,c}.hampshire.aerial.openstreetmap.org.uk/layer/gb_hampshire_aerial_rgb/{zoom}/{x}/{y}.png",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[8,20],polygon:[[[-1.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,50.77809]]]},{id:"hu-hillshade",name:"Hillshade Hungary",type:"tms",template:"https://{switch:a,b,c}.map.turistautak.hu/tiles/shading/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[15,45],[24,45],[24,49],[15,49],[15,45]]],terms_text:"SRTM",overlay:true},{id:"hri-orto",name:"HRI Orthophoto",type:"wms",template:"https://kartta.hsy.fi/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=taustakartat_ja_aluejaot:Ortoilmakuva_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[24.26948,59.8593],[24.26674,60.22549],[24.55307,60.36703],[24.50363,60.49038],[24.76387,60.60079],[25.00625,60.54175],[24.90051,60.38197],[24.9884,60.35073],[25.06943,60.44096],[25.17517,60.45248],[25.18066,60.34122],[25.27954,60.2943],[25.19577,60.08813],[24.26948,59.8593]]],terms_url:"https://www.hsy.fi/",terms_text:"© Helsingin kaupunkiympäristön toimiala",best:true,description:"Ortophotos from Helsinki Region Infoshare",icon:"https://github.com/osmlab/editor-layer-index/blob/gh-pages/sources/europe/fi/hri_logo.png"},{id:"IBGE_DF_Addresses",name:"IBGE Distrito Federal",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/wille/cirnnxni1000jg8nfppc8g7pm/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g",zoomExtent:[0,20],polygon:[[[-48.2444,-16.0508],[-48.2444,-15.5005],[-47.5695,-15.5005],[-47.5695,-16.0508],[-48.2444,-16.0508]]],terms_text:"IBGE",description:"Addresses data from IBGE",overlay:true},{id:"IBGE_Setores_Rurais",name:"IBGE Mapa de Setores Rurais",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.i00mo1kj/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw",zoomExtent:[0,14],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE_Setores_Rurais.png"},{id:"IBGE_Setores_Urbanos",name:"IBGE Mapa de Setores Urbanos",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/tmpsantos.hgda0m6h/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJncjlmd0t3In0.DmZsIeOW-3x-C5eX-wAqTw",zoomExtent:[0,19],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-64.164,4.127],[-63.964,3.868],[-63.928,3.925],[-63.85,3.95],[-63.682,3.908],[-63.676,4.019],[-63.591,3.886],[-63.497,3.84],[-63.489,3.874],[-63.434,3.865],[-63.428,3.977],[-63.204,3.952],[-63.226,3.836],[-63.103,3.794],[-63.059,3.748],[-63.081,3.694],[-62.96,3.608],[-62.835,3.739],[-62.743,3.674],[-62.729,3.805],[-62.788,3.894],[-62.753,4.032],[-62.555,4.019],[-62.552,4.109],[-62.437,4.183],[-62.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-61.824,4.164],[-61.802,4.229],[-61.724,4.27],[-61.56,4.252],[-61.508,4.322],[-61.513,4.406],[-61.288,4.458],[-61.323,4.535],[-61.217,4.536],[-61.14559,4.48016],[-61.095,4.522],[-60.994,4.519],[-60.932,4.587],[-60.949,4.653],[-60.899,4.717],[-60.751,4.756],[-60.591,4.927],[-60.661,5.164],[-60.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-59.751,1.859],[-59.677,1.839],[-59.663,1.871],[-59.69,1.757],[-59.539,1.723],[-59.381,1.507],[-59.329,1.514],[-59.327,1.464],[-59.284,1.45],[-59.253,1.389],[-58.978,1.302],[-58.918,1.317],[-58.886,1.261],[-58.912,1.239],[-58.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-55.196,-27.856],[-55.133,-27.897],[-55.106,-27.846],[-55.035,-27.858],[-55.081,-27.779],[-54.936,-27.772],[-54.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-54.098,-25.619],[-54.099,-25.495],[-54.206,-25.541],[-54.178,-25.584],[-54.23,-25.562],[-54.25,-25.597],[-54.28,-25.556],[-54.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-58.131,-19.758],[-57.784,-19.033],[-57.694,-19.011],[-57.719,-18.899],[-57.766,-18.899],[-57.557,-18.24],[-57.453,-18.231],[-57.574,-18.131],[-57.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-57.883,-17.449],[-57.996,-17.515],[-58.06,-17.45],[-58.116,-17.451],[-58.151,-17.384],[-58.263,-17.344],[-58.396,-17.181],[-58.423,-16.989],[-58.474,-16.935],[-58.47,-16.703],[-58.436,-16.592],[-58.333,-16.49],[-58.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE_Setores_Rurais.png"},{id:"IBGE_BC250_Aglomerado_Rural",name:"IBGE-BC250-Aglomerado Rural Isolado",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Aglomerado_Rural_Isolado_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Pista_Pouso",name:"IBGE-BC250-Pista de Pouso",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Pista_Ponto_Pouso_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Rios_Drenagem",name:"IBGE-BC250-Rios Drenagem",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Drenagem_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Terra_Indegina",name:"IBGE-BC250-Terra Indigena",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Terra_Indigena_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Rodoviario",name:"IBGE-BC250-Trecho Rodoviario",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Trecho_Rodoviario_L&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image/png&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Uso_Sustentavel",name:"IBGE-BC250-Unidade de Uso Sistentável - APA",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Unidade_Uso_Sustentavel_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BC250_Villa",name:"IBGE-BC250-Villa",type:"wms",template:"http://geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BC250_Vila_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BCIM_Gerador_Eletrica",name:"IBGE-BCIM-Estações Geradora de Energia Elétrica",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Est_Gerad_Energia_Eletrica_P&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"IBGE_BCIM_Municipio",name:"IBGE-BCIM-Município",type:"wms",template:"http://www.geoservicos.ibge.gov.br/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=CCAR:BCIM_Municipio_A&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&FORMAT=image%2Fpng&TRANSPARENT=TRUE",projection:"EPSG:3857",polygon:[[[-29.3325,2.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-27.67249,-22.20839],[-51.11495,-35.46552],[-53.39394,-33.85064],[-53.62553,-33.72493],[-53.62503,-33.15428],[-53.24498,-32.73392],[-53.65747,-32.51873],[-53.8329,-32.16592],[-54.64174,-31.55507],[-55.29638,-31.3429],[-55.57371,-30.99691],[-56.06384,-31.16749],[-56.10468,-30.86436],[-56.86862,-30.20752],[-57.39671,-30.40464],[-57.74384,-30.22142],[-55.83724,-28.16598],[-54.86969,-27.44994],[-53.9016,-27.02998],[-53.74972,-26.25781],[-53.97158,-25.74513],[-54.44723,-25.79609],[-54.67802,-25.64668],[-54.36097,-24.35145],[-54.41679,-24.06527],[-54.64355,-23.94107],[-55.22163,-24.11355],[-55.49138,-24.02797],[-55.71734,-22.68488],[-55.90555,-22.39886],[-56.45255,-22.21731],[-56.8256,-22.4002],[-57.34109,-22.34351],[-58.08472,-22.13075],[-57.95766,-20.99818],[-58.26551,-20.24147],[-58.03577,-19.95871],[-58.23083,-19.75211],[-57.64739,-18.19828],[-57.89356,-17.57377],[-58.16997,-17.53519],[-58.48825,-17.21961],[-58.57691,-16.81466],[-58.45563,-16.42158],[-60.2541,-16.32571],[-60.33481,-15.51483],[-60.67423,-15.1122],[-60.34999,-14.99707],[-60.63603,-13.84119],[-61.07283,-13.62569],[-61.9025,-13.62647],[-62.21395,-13.25048],[-62.80185,-13.10905],[-63.17194,-12.76568],[-63.74229,-12.54071],[-64.32845,-12.59578],[-65.10261,-12.0682],[-65.45781,-11.27865],[-65.41641,-9.83894],[-66.52331,-9.98587],[-67.66452,-10.80093],[-67.99778,-10.75991],[-68.52286,-11.20807],[-69.88988,-11.02776],[-70.30957,-11.1699],[-70.71896,-11.02003],[-70.68128,-9.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"ign-topografico-tms",name:"IGN topographical map (TMS)",type:"tms",template:"https://ide.ign.gob.ar/geoservicios/rest/services/Mapas_IGN/mapa_topografico/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,20],polygon:[[[-55.5438,-35.77219],[-64.31743,-49.44788],[-61.52546,-55.68296],[-66.04226,-55.24192],[-66.6896,-55.17191],[-66.86233,-55.04496],[-67.23387,-54.9245],[-67.47633,-54.92785],[-67.71808,-54.91261],[-67.96138,-54.88571],[-68.18753,-54.89288],[-68.61804,-54.92151],[-68.66375,-52.66716],[-68.51023,-52.39432],[-70.01629,-52.05707],[-72.05562,-52.01749],[-72.09055,-51.93758],[-72.02273,-51.88832],[-72.49598,-51.597],[-72.3623,-51.25935],[-72.46252,-51.08654],[-72.31217,-50.90093],[-72.39293,-50.69005],[-72.49148,-50.66866],[-72.59646,-50.73916],[-72.76983,-50.68829],[-73.22154,-50.87193],[-73.22709,-50.66897],[-73.39438,-50.58008],[-73.57703,-50.15788],[-73.53993,-50.01443],[-73.61453,-49.91795],[-73.52684,-49.7716],[-73.02779,-49.70085],[-73.02788,-49.23743],[-73.16148,-49.13062],[-72.96385,-48.89084],[-72.80952,-48.90039],[-72.59462,-48.77255],[-72.63621,-48.45823],[-72.46698,-48.45706],[-72.42158,-48.31422],[-72.3428,-48.29046],[-72.37166,-48.15995],[-72.57678,-47.96054],[-72.5731,-47.72062],[-72.3839,-47.57888],[-72.38448,-47.41759],[-72.07162,-47.2755],[-72.04726,-47.14867],[-71.93566,-47.15037],[-72.00956,-47.08473],[-72.00759,-46.78833],[-71.71488,-46.64453],[-71.7985,-46.26925],[-71.97019,-46.14972],[-71.63332,-45.97063],[-71.66595,-45.89232],[-71.77408,-45.85187],[-71.8548,-45.61169],[-71.7885,-45.50505],[-71.58354,-45.45607],[-71.58236,-45.36316],[-71.40574,-45.27206],[-71.61593,-45.03146],[-72.07949,-44.93988],[-72.11766,-44.73884],[-71.47444,-44.68048],[-71.2897,-44.75036],[-71.28469,-44.60892],[-71.20209,-44.5359],[-71.40536,-44.44891],[-71.86374,-44.44274],[-71.9047,-44.10354],[-71.70007,-43.98287],[-71.78725,-43.80985],[-71.63263,-43.65888],[-71.87866,-43.56195],[-71.95542,-43.44292],[-71.91512,-43.319],[-71.80268,-43.29535],[-71.73869,-43.19234],[-71.94149,-43.11061],[-72.18001,-42.8948],[-72.18733,-42.66619],[-72.06314,-42.53751],[-72.0441,-42.41231],[-72.14365,-42.40333],[-72.20024,-42.17229],[-72.17802,-42.13207],[-72.06032,-42.10593],[-71.78041,-42.12128],[-71.83133,-41.78089],[-71.94135,-41.60926],[-71.9023,-41.06778],[-72.02097,-40.73647],[-71.91507,-40.61832],[-71.87117,-40.38959],[-71.76665,-40.35676],[-71.87961,-40.24227],[-71.8856,-40.10093],[-71.67779,-39.92156],[-71.74365,-39.86164],[-71.77001,-39.61946],[-71.68665,-39.50983],[-71.58545,-39.55159],[-71.45202,-39.31025],[-71.47673,-38.89162],[-71.25594,-38.74909],[-70.95844,-38.70272],[-70.89411,-38.57644],[-71.03346,-38.45451],[-71.08724,-38.09054],[-71.23505,-37.86541],[-71.26668,-37.68295],[-71.18031,-37.4828],[-71.27241,-37.28686],[-71.17697,-37.1077],[-71.27586,-36.9637],[-71.20495,-36.91075],[-71.2345,-36.83303],[-71.07654,-36.43571],[-70.96469,-36.43366],[-70.90086,-36.34336],[-70.77062,-36.35412],[-70.59553,-36.12118],[-70.44219,-36.14876],[-70.42788,-35.73781],[-70.50607,-35.38014],[-70.59764,-35.34459],[-70.63128,-35.23712],[-70.42629,-35.12462],[-70.32933,-34.83081],[-70.35687,-34.72532],[-70.07752,-34.38253],[-70.06901,-34.24694],[-69.87771,-34.20233],[-69.95948,-33.77235],[-69.83371,-33.34911],[-70.02502,-33.37388],[-70.14906,-33.04145],[-70.06223,-33.01233],[-70.00981,-32.90747],[-70.19517,-32.75732],[-70.19589,-32.50891],[-70.28486,-32.45564],[-70.44343,-32.05325],[-70.41077,-31.9809],[-70.29402,-31.95849],[-70.5117,-31.85844],[-70.62295,-31.59949],[-70.59941,-31.29869],[-70.5377,-31.08557],[-70.35748,-31.0002],[-70.20264,-30.32249],[-69.97775,-30.32288],[-69.847,-30.16294],[-70.01824,-30.10003],[-69.95038,-29.73744],[-70.03755,-29.35428],[-69.97565,-29.18743],[-69.85112,-29.06923],[-69.70118,-28.37779],[-69.20484,-27.90816],[-68.84844,-27.13115],[-68.76133,-27.08588],[-68.60693,-27.09636],[-68.3489,-26.92771],[-68.64137,-26.50722],[-68.60352,-26.25391],[-68.45177,-26.1377],[-68.63052,-25.43524],[-68.55582,-25.14476],[-68.44595,-25.0658],[-68.62011,-24.81717],[-68.55162,-24.58836],[-68.28078,-24.34935],[-67.32648,-24.02538],[-66.99882,-23.00044],[-67.18775,-22.81375],[-67.08088,-22.62433],[-67.03366,-22.53815],[-66.84345,-22.39746],[-66.73734,-22.22282],[-66.38248,-22.07602],[-66.28978,-21.76554],[-66.21845,-21.72575],[-65.89675,-21.88263],[-65.71368,-22.09054],[-65.61493,-22.09152],[-65.60973,-22.09505],[-65.60607,-22.09358],[-65.60256,-22.09658],[-65.60015,-22.09543],[-65.59229,-22.09511],[-65.59015,-22.09735],[-65.58691,-22.09645],[-65.58512,-22.08432],[-65.57523,-22.07312],[-65.47487,-22.08487],[-64.99026,-22.06739],[-64.59768,-22.19269],[-64.52643,-22.29504],[-64.33114,-22.68517],[-64.10381,-22.34114],[-64.10712,-22.32023],[-64.06522,-22.23093],[-64.04702,-22.23757],[-64.03654,-22.19469],[-64.0029,-22.10735],[-63.99022,-22.07925],[-63.97147,-22.07619],[-63.94118,-21.99823],[-63.70932,-21.99896],[-63.68839,-22.01037],[-63.68079,-22.03116],[-63.68507,-22.04019],[-63.68156,-22.05185],[-63.67659,-22.03287],[-63.67201,-22.02293],[-63.66821,-22.01634],[-63.67191,-22.01399],[-63.66566,-21.99839],[-62.79606,-21.98778],[-62.74618,-22.10033],[-62.18511,-22.50843],[-61.93761,-22.97376],[-61.45605,-23.36182],[-61.05842,-23.56621],[-60.95137,-23.75997],[-60.28746,-24.01906],[-60.03728,-24.00408],[-59.46607,-24.33428],[-59.12256,-24.59772],[-58.46645,-24.84584],[-58.332,-24.98132],[-58.2349,-24.91756],[-57.8565,-25.08005],[-57.76981,-25.15013],[-57.75374,-25.17277],[-57.71597,-25.26456],[-57.71837,-25.27146],[-57.71111,-25.27265],[-57.71008,-25.28146],[-57.70692,-25.2845],[-57.70438,-25.28159],[-57.70273,-25.28239],[-57.70175,-25.28459],[-57.69741,-25.28283],[-57.69281,-25.28588],[-57.69733,-25.29337],[-57.70246,-25.29847],[-57.69612,-25.30832],[-57.69763,-25.3199],[-57.69143,-25.32127],[-57.67993,-25.33318],[-57.64822,-25.3679],[-57.63902,-25.38287],[-57.61504,-25.38841],[-57.59954,-25.39704],[-57.57673,-25.42029],[-57.56698,-25.43147],[-57.55477,-25.43999],[-57.55285,-25.44705],[-57.55811,-25.45717],[-57.55763,-25.46897],[-57.56523,-25.48014],[-57.56806,-25.49501],[-57.57722,-25.50575],[-57.57566,-25.52264],[-57.5661,-25.54112],[-57.56809,-25.55797],[-57.58142,-25.57145],[-57.59952,-25.57438],[-57.60444,-25.59855],[-57.6122,-25.61963],[-57.6367,-25.61807],[-57.66569,-25.60273],[-57.67006,-25.65579],[-57.67513,-25.66052],[-57.68626,-25.66287],[-57.69808,-25.65933],[-57.71855,-25.64914],[-57.72537,-25.71924],[-57.77786,-25.77559],[-57.84986,-26.01142],[-58.08597,-26.14202],[-58.13896,-26.66834],[-58.28224,-26.80127],[-58.32056,-26.82169],[-58.3167,-26.86081],[-58.32384,-26.87074],[-58.56858,-27.20629],[-57.90834,-27.24265],[-56.99114,-27.41858],[-56.60886,-27.36586],[-56.40607,-27.52701],[-56.32355,-27.36897],[-56.09353,-27.25219],[-55.76168,-27.38106],[-55.65541,-27.30153],[-55.67524,-27.17004],[-55.59643,-27.06538],[-55.40826,-26.91763],[-55.20788,-26.89214],[-54.97304,-26.63717],[-54.8532,-26.59894],[-54.72264,-26.31238],[-54.73235,-25.98554],[-54.65309,-25.84138],[-54.71357,-25.66721],[-54.62995,-25.55106],[-54.44288,-25.5795],[-54.11451,-25.4396],[-53.80059,-25.65093],[-53.766,-25.94301],[-53.59024,-26.19274],[-53.67264,-26.61495],[-53.61669,-26.95395],[-53.76351,-27.18917],[-54.15393,-27.36033],[-54.26461,-27.49923],[-54.79439,-27.6397],[-55.0044,-27.90341],[-55.19076,-27.92946],[-55.41589,-28.14304],[-55.66542,-28.26547],[-55.61633,-28.32205],[-55.65957,-28.46539],[-55.83413,-28.42136],[-55.87339,-28.49468],[-56.13558,-28.7265],[-56.37343,-29.10817],[-56.569,-29.13892],[-56.76306,-29.48638],[-57.05958,-29.72263],[-57.24463,-29.86452],[-57.3045,-30.03966],[-57.61942,-30.20517],[-57.60863,-30.32424],[-57.82983,-30.53118],[-57.75241,-30.68756],[-57.75273,-30.91942],[-57.93419,-31.27388],[-57.99,-31.36053],[-57.98302,-31.3734],[-57.97736,-31.38022],[-57.97778,-31.38599],[-57.98203,-31.39213],[-58.00944,-31.41341],[-58.06637,-31.47395],[-57.92613,-31.57745],[-57.98622,-31.77449],[-58.12179,-31.89772],[-58.11905,-32.14059],[-58.04227,-32.29153],[-58.14327,-32.45845],[-58.0758,-33.00587],[-58.18964,-33.09402],[-58.2723,-33.1061],[-58.31012,-33.1048],[-58.35418,-33.1221],[-58.37567,-33.17644],[-58.44465,-33.5853],[-58.43016,-33.71813],[-58.42434,-33.86887],[-58.41858,-33.91742],[-58.33697,-34.00477],[-58.241,-34.16246],[-57.84696,-34.50017],[-55.5438,-35.77219]]],terms_url:"http://www.ign.gob.ar/",terms_text:"Instituto Geográfico Nacional de la República Argentina",icon:"http://www.ign.gob.ar/sites/default/files/favicon.png"},{id:"Haiti-Drone",name:"Imagerie Drone (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}",zoomExtent:[0,21],polygon:[[[-72.15474,19.6879],[-72.15458,19.6878],[-72.15485,19.68776],[-72.15472,19.68685],[-72.15431,19.68707],[-72.15463,19.68544],[-72.15301,19.68499],[-72.15086,19.68435],[-72.15045,19.68479],[-72.15078,19.68315],[-72.15223,19.6833],[-72.15282,19.68066],[-72.15186,19.68051],[-72.15191,19.68034],[-72.15227,19.68035],[-72.15238,19.67972],[-72.15328,19.67965],[-72.15333,19.67698],[-72.15308,19.67694],[-72.15348,19.67638],[-72.14878,19.67107],[-72.13664,19.67081],[-72.13557,19.67408],[-72.13573,19.68351],[-72.13679,19.68407],[-72.13695,19.68559],[-72.13778,19.685],[-72.13782,19.68727],[-72.13888,19.68767],[-72.13881,19.69013],[-72.13853,19.68949],[-72.13806,19.68964],[-72.13869,19.69232],[-72.13825,19.69276],[-72.13948,19.69737],[-72.14101,19.7],[-72.1437,19.70112],[-72.14851,19.70015],[-72.14772,19.70268],[-72.14874,19.7029],[-72.1616,19.70357],[-72.16578,19.698],[-72.165,19.69324],[-72.16223,19.68901],[-72.15474,19.6879]],[[-72.13106,19.67189],[-72.12598,19.67728],[-72.12554,19.67762],[-72.12169,19.67764],[-72.11497,19.6726],[-72.11527,19.66872],[-72.11982,19.66275],[-72.12278,19.66257],[-72.1249,19.6627],[-72.12858,19.66454],[-72.13081,19.66617],[-72.13167,19.66879],[-72.13156,19.671],[-72.13106,19.67189]],[[-71.84579,19.67098],[-71.84294,19.67595],[-71.841,19.67595],[-71.83802,19.67553],[-71.83787,19.6745],[-71.83905,19.67439],[-71.83901,19.67411],[-71.83984,19.67395],[-71.83891,19.67361],[-71.83802,19.67209],[-71.83801,19.67263],[-71.83767,19.67272],[-71.83763,19.67254],[-71.83544,19.67321],[-71.83533,19.673],[-71.83312,19.67346],[-71.83267,19.67168],[-71.83216,19.67209],[-71.83072,19.66949],[-71.8306,19.66976],[-71.83022,19.66989],[-71.82918,19.66721],[-71.82907,19.66721],[-71.82891,19.66679],[-71.82895,19.66662],[-71.82883,19.66635],[-71.82856,19.66648],[-71.82887,19.66725],[-71.82876,19.66741],[-71.8278,19.66782],[-71.82771,19.66786],[-71.82783,19.66796],[-71.82718,19.66812],[-71.82718,19.66809],[-71.82644,19.66839],[-71.82641,19.66832],[-71.8262,19.66843],[-71.82618,19.66836],[-71.82589,19.66842],[-71.82589,19.66866],[-71.82516,19.66875],[-71.82545,19.66916],[-71.82293,19.66957],[-71.82271,19.66967],[-71.82277,19.66976],[-71.82018,19.67099],[-71.81985,19.67045],[-71.8198,19.6706],[-71.81947,19.67076],[-71.81825,19.67134],[-71.81814,19.67114],[-71.81758,19.67143],[-71.81696,19.67077],[-71.81764,19.6719],[-71.81714,19.67204],[-71.81582,19.6718],[-71.81384,19.67119],[-71.81233,19.6707],[-71.81218,19.67043],[-71.81243,19.67015],[-71.81192,19.67001],[-71.81188,19.67058],[-71.81117,19.67035],[-71.80959,19.66985],[-71.8078,19.66928],[-71.8056,19.66861],[-71.80514,19.66689],[-71.80512,19.66523],[-71.80523,19.66198],[-71.80656,19.65239],[-71.80734,19.64829],[-71.80997,19.64683],[-71.81475,19.64545],[-71.81477,19.64556],[-71.815,19.64551],[-71.81495,19.64538],[-71.81599,19.64502],[-71.81589,19.64489],[-71.81659,19.64461],[-71.81901,19.6438],[-71.82115,19.64345],[-71.82216,19.64333],[-71.8269,19.64321],[-71.82805,19.64322],[-71.83045,19.64408],[-71.83064,19.64486],[-71.82953,19.64504],[-71.82961,19.64561],[-71.82994,19.64557],[-71.83037,19.64517],[-71.83047,19.64535],[-71.83081,19.6452],[-71.83102,19.64511],[-71.83125,19.64585],[-71.83111,19.64582],[-71.83137,19.64659],[-71.83289,19.64619],[-71.83446,19.64571],[-71.83447,19.64631],[-71.83422,19.64619],[-71.8342,19.64655],[-71.83467,19.6463],[-71.83491,19.64639],[-71.8348,19.64622],[-71.83544,19.64585],[-71.8355,19.6458],[-71.83647,19.64613],[-71.83764,19.64727],[-71.83791,19.64789],[-71.83905,19.6508],[-71.84569,19.66962],[-71.84579,19.67098]],[[-72.09888,18.54843],[-72.09907,18.54838],[-72.09991,18.54809],[-72.10234,18.54813],[-72.10252,18.54814],[-72.10229,18.54826],[-72.10229,18.54828],[-72.10256,18.54815],[-72.10272,18.54814],[-72.10343,18.54871],[-72.10354,18.5489],[-72.10352,18.54974],[-72.10349,18.54974],[-72.10351,18.55003],[-72.10285,18.55018],[-72.1029,18.55025],[-72.10287,18.55031],[-72.10352,18.55024],[-72.1035,18.55152],[-72.10338,18.55152],[-72.10308,18.55161],[-72.10348,18.55162],[-72.10342,18.55435],[-72.10243,18.5555],[-72.10149,18.55562],[-72.10062,18.55559],[-72.0979,18.55521],[-72.09688,18.55466],[-72.09652,18.55421],[-72.09661,18.55417],[-72.09651,18.55417],[-72.09654,18.55398],[-72.09644,18.55355],[-72.09628,18.55357],[-72.09621,18.5532],[-72.09599,18.55337],[-72.09564,18.55267],[-72.09556,18.55185],[-72.09685,18.55035],[-72.09729,18.55032],[-72.09699,18.5502],[-72.09888,18.54843]],[[-72.25425,18.56826],[-72.25603,18.57178],[-72.25579,18.5748],[-72.2535,18.57555],[-72.25228,18.57555],[-72.24999,18.57409],[-72.24739,18.56983],[-72.24601,18.56673],[-72.24585,18.56295],[-72.24794,18.56254],[-72.25015,18.5628],[-72.25192,18.56508],[-72.25425,18.56826]],[[-72.30315,18.53327],[-72.30313,18.53318],[-72.30483,18.53111],[-72.30974,18.53111],[-72.31643,18.53243],[-72.32341,18.53661],[-72.32614,18.53878],[-72.32619,18.54264],[-72.31705,18.55406],[-72.31309,18.55406],[-72.29875,18.54533],[-72.29886,18.54073],[-72.2963,18.54047],[-72.29546,18.53952],[-72.29619,18.53386],[-72.29719,18.53322],[-72.3007,18.53328],[-72.30227,18.53423],[-72.30285,18.53352],[-72.3031,18.53334],[-72.30318,18.5334],[-72.30358,18.53356],[-72.30308,18.53465],[-72.30371,18.53399],[-72.30453,18.53441],[-72.3044,18.53451],[-72.30627,18.53526],[-72.30631,18.53527],[-72.30612,18.53576],[-72.30612,18.53582],[-72.30637,18.53589],[-72.30627,18.53549],[-72.30667,18.53509],[-72.3062,18.53497],[-72.30589,18.53494],[-72.30554,18.53468],[-72.30549,18.53461],[-72.30556,18.53451],[-72.30467,18.53423],[-72.30476,18.53388],[-72.30433,18.53375],[-72.30426,18.53363],[-72.30315,18.53327]],[[-72.29814,18.4775],[-72.29357,18.49486],[-72.29222,18.49643],[-72.29317,18.49725],[-72.28923,18.50571],[-72.28781,18.5081],[-72.28505,18.51199],[-72.28402,18.51132],[-72.28086,18.51588],[-72.27732,18.5176],[-72.27235,18.51752],[-72.26627,18.51446],[-72.26659,18.50668],[-72.26926,18.50462],[-72.2662,18.50298],[-72.26882,18.49652],[-72.26915,18.49594],[-72.27027,18.49615],[-72.27027,18.4956],[-72.26907,18.49557],[-72.26929,18.49377],[-72.2737,18.486],[-72.27467,18.48504],[-72.27518,18.4834],[-72.27654,18.48134],[-72.27735,18.4815],[-72.2783,18.48097],[-72.27785,18.4807],[-72.2771,18.48012],[-72.279,18.47758],[-72.27972,18.47729],[-72.28064,18.47764],[-72.28137,18.47716],[-72.28084,18.47698],[-72.28128,18.47584],[-72.28232,18.47518],[-72.28516,18.4751],[-72.28499,18.47637],[-72.28544,18.47698],[-72.28628,18.47563],[-72.28693,18.47547],[-72.2866,18.47519],[-72.2866,18.475],[-72.29098,18.47473],[-72.29466,18.47494],[-72.29739,18.47684],[-72.29814,18.4775]],[[-72.34667,18.52224],[-72.34683,18.52443],[-72.34753,18.52776],[-72.34555,18.52911],[-72.34031,18.52922],[-72.33833,18.52803],[-72.3369,18.53012],[-72.33381,18.52967],[-72.32893,18.52708],[-72.32865,18.52533],[-72.32921,18.52327],[-72.33041,18.52205],[-72.33216,18.52218],[-72.33225,18.5192],[-72.33692,18.51836],[-72.3382,18.51847],[-72.33815,18.51818],[-72.3412,18.51779],[-72.34549,18.5172],[-72.34926,18.51728],[-72.35043,18.51889],[-72.35035,18.52061],[-72.34968,18.52204],[-72.34667,18.52224]],[[-72.33031,18.54865],[-72.34297,18.55081],[-72.34332,18.55306],[-72.34131,18.56143],[-72.33906,18.56136],[-72.33847,18.56383],[-72.33753,18.56543],[-72.33484,18.56506],[-72.33118,18.56383],[-72.33121,18.56162],[-72.32321,18.56069],[-72.32124,18.5596],[-72.3208,18.5587],[-72.32088,18.55788],[-72.32595,18.55803],[-72.32662,18.5582],[-72.32592,18.55775],[-72.3251,18.55738],[-72.32338,18.55226],[-72.3246,18.54785],[-72.3289,18.54837],[-72.32998,18.54895],[-72.33031,18.54865]],[[-72.32314,18.52698],[-72.32234,18.52807],[-72.32096,18.52797],[-72.32078,18.52713],[-72.32085,18.52537],[-72.32146,18.52496],[-72.32257,18.52489],[-72.32285,18.52533],[-72.32324,18.52648],[-72.32314,18.52698]],[[-72.21608,18.64578],[-72.21596,18.65538],[-72.20303,18.65583],[-72.19471,18.65534],[-72.19222,18.65456],[-72.19206,18.65213],[-72.19348,18.64776],[-72.20125,18.63852],[-72.20693,18.63882],[-72.2121,18.64241],[-72.21181,18.64306],[-72.21217,18.64269],[-72.2128,18.64276],[-72.21347,18.64313],[-72.21356,18.64375],[-72.21542,18.64439],[-72.21589,18.64503],[-72.21608,18.64578]],[[-72.28677,18.6482],[-72.2901,18.65274],[-72.28981,18.65365],[-72.29007,18.65427],[-72.29072,18.65377],[-72.29103,18.65447],[-72.29125,18.65422],[-72.29168,18.65589],[-72.29122,18.65661],[-72.29227,18.65597],[-72.29269,18.65675],[-72.29307,18.65673],[-72.29413,18.65818],[-72.29602,18.66084],[-72.29597,18.66191],[-72.29329,18.66457],[-72.29067,18.666],[-72.28959,18.66613],[-72.28959,18.66657],[-72.2877,18.66647],[-72.28758,18.66766],[-72.28312,18.66972],[-72.27965,18.66965],[-72.27843,18.66908],[-72.2784,18.66877],[-72.27774,18.66917],[-72.27744,18.66914],[-72.27701,18.66832],[-72.27656,18.66811],[-72.27654,18.66806],[-72.27523,18.66852],[-72.27493,18.66746],[-72.27464,18.66743],[-72.27347,18.66821],[-72.27323,18.66827],[-72.27268,18.66716],[-72.27191,18.66743],[-72.27188,18.66734],[-72.26881,18.66819],[-72.26883,18.66718],[-72.26908,18.66682],[-72.26881,18.66679],[-72.26811,18.66707],[-72.26763,18.66738],[-72.26756,18.66669],[-72.26686,18.66695],[-72.26559,18.66736],[-72.26545,18.66701],[-72.26475,18.66741],[-72.26299,18.66819],[-72.26285,18.66818],[-72.26265,18.66761],[-72.2623,18.66771],[-72.26248,18.66792],[-72.26248,18.66823],[-72.26231,18.66826],[-72.2621,18.66797],[-72.26228,18.66892],[-72.26015,18.6689],[-72.25427,18.66879],[-72.25054,18.66835],[-72.25044,18.66954],[-72.24779,18.66989],[-72.24152,18.66979],[-72.24142,18.67419],[-72.23892,18.67398],[-72.23872,18.67346],[-72.23837,18.67331],[-72.2387,18.67395],[-72.23755,18.6739],[-72.23742,18.67351],[-72.23774,18.67334],[-72.23751,18.67326],[-72.23684,18.67349],[-72.23644,18.67241],[-72.23551,18.6726],[-72.2354,18.67242],[-72.2353,18.6729],[-72.23455,18.67269],[-72.23431,18.67246],[-72.23424,18.67347],[-72.23341,18.67346],[-72.23329,18.6733],[-72.23274,18.67329],[-72.23271,18.6735],[-72.2277,18.67253],[-72.22653,18.67165],[-72.2268,18.67157],[-72.2275,18.67159],[-72.22749,18.67145],[-72.22729,18.67146],[-72.22728,18.6713],[-72.22721,18.67136],[-72.22618,18.67137],[-72.2256,18.67088],[-72.22551,18.66945],[-72.22611,18.66969],[-72.22618,18.66959],[-72.22598,18.66955],[-72.22578,18.66914],[-72.22533,18.66946],[-72.22497,18.66947],[-72.22458,18.66788],[-72.22355,18.6677],[-72.22359,18.66759],[-72.22246,18.66763],[-72.22237,18.66702],[-72.22233,18.66709],[-72.22192,18.66703],[-72.22081,18.6669],[-72.22081,18.66653],[-72.22087,18.66636],[-72.2206,18.66681],[-72.22039,18.66664],[-72.21843,18.66505],[-72.21829,18.6641],[-72.21835,18.66084],[-72.21872,18.66065],[-72.21869,18.6606],[-72.21873,18.66045],[-72.21898,18.66032],[-72.21878,18.6602],[-72.2187,18.66024],[-72.21858,18.66004],[-72.21861,18.66],[-72.21878,18.66013],[-72.219,18.66002],[-72.21891,18.65991],[-72.21897,18.65979],[-72.21838,18.65958],[-72.21847,18.65397],[-72.2201,18.65116],[-72.2258,18.64695],[-72.2283,18.64573],[-72.23793,18.64586],[-72.23776,18.6447],[-72.24004,18.64325],[-72.2456,18.64335],[-72.24827,18.64504],[-72.24875,18.64367],[-72.25111,18.64298],[-72.25124,18.64334],[-72.25126,18.64316],[-72.25148,18.64314],[-72.25133,18.64297],[-72.25336,18.64235],[-72.25352,18.64268],[-72.25395,18.64254],[-72.25415,18.64293],[-72.25439,18.64287],[-72.25438,18.64275],[-72.25642,18.64232],[-72.25669,18.64314],[-72.25688,18.64286],[-72.25682,18.64253],[-72.25884,18.6421],[-72.25889,18.64225],[-72.25926,18.64223],[-72.25965,18.64241],[-72.25922,18.64069],[-72.25995,18.64048],[-72.26012,18.64063],[-72.26012,18.63994],[-72.26153,18.63947],[-72.26261,18.6391],[-72.26545,18.63873],[-72.27194,18.63868],[-72.2722,18.63886],[-72.27303,18.63942],[-72.27317,18.64126],[-72.27387,18.64103],[-72.27422,18.64161],[-72.27522,18.6417],[-72.27545,18.64157],[-72.27555,18.64169],[-72.27554,18.64175],[-72.27647,18.64186],[-72.27675,18.6419],[-72.2763,18.6426],[-72.27742,18.643],[-72.27798,18.64272],[-72.27858,18.64313],[-72.27857,18.64323],[-72.2789,18.64335],[-72.27985,18.64397],[-72.28587,18.64697],[-72.28677,18.6482]],[[-72.55572,18.53059],[-72.55559,18.5367],[-72.555,18.53797],[-72.5488,18.53792],[-72.54866,18.53728],[-72.54884,18.53063],[-72.54937,18.5301],[-72.55513,18.53012],[-72.55572,18.53059]],[[-72.62353,18.50799],[-72.62344,18.50952],[-72.62261,18.51043],[-72.62049,18.51185],[-72.61834,18.51075],[-72.61622,18.50832],[-72.61626,18.50647],[-72.61866,18.50444],[-72.6204,18.5045],[-72.62283,18.507],[-72.62353,18.50799]]]},{id:"osmim-imagicode-S2A_R119_N09_20160327T050917",name:"imagico.de: Adams Bridge",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R119_N09_20160327T050917&z={zoom}&x={x}&y={-y}",endDate:"2016-03-27T00:00:00.000Z",startDate:"2016-03-27T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[79.01779,8.82757],[79.01402,9.64678],[80.17642,9.65042],[80.17728,8.8313],[79.01779,8.82757]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Supplementing incomplete coverage in other sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80700162014211LGN00",name:"imagico.de: Alaska Range",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80700162014211LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-07-31T00:00:00.000Z",startDate:"2014-07-31T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-152.70873,62.30357],[-152.70839,62.58153],[-152.00835,63.54646],[-148.99432,63.5333],[-148.99432,62.30357],[-152.70873,62.30357]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent summer image of the Alaska Range for mapping natural features (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-aral2",name:"imagico.de: Aral Sea (high water level)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=aral2&z={zoom}&x={x}&y={-y}",endDate:"2016-03-03T00:00:00.000Z",startDate:"2016-03-03T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[58.049,43.2623],[58.049,46.7189],[58.1014,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4675,45.3416],[60.6317,43.2623],[58.049,43.2623]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Water and wetland extents, dams etc. - some remaining winter ice in the north (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-aral1",name:"imagico.de: Aral Sea (low water level)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=aral1&z={zoom}&x={x}&y={-y}",endDate:"2016-09-09T00:00:00.000Z",startDate:"2016-09-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[58.049,43.2623],[58.049,46.7334],[58.096,46.8645],[61.5524,46.8629],[61.5524,46.3896],[61.4685,45.3544],[60.6267,43.2623],[58.049,43.2623]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Water and wetland extents, dams etc. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R067_S40_20170417T140051",name:"imagico.de: Bahía Blanca (high tide)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170417T140051&z={zoom}&x={x}&y={-y}",endDate:"2017-04-17T00:00:00.000Z",startDate:"2017-04-17T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and islands at the coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R067_S40_20170127T140051",name:"imagico.de: Bahía Blanca (low tide)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R067_S40_20170127T140051&z={zoom}&x={x}&y={-y}",endDate:"2017-01-27T00:00:00.000Z",startDate:"2017-01-27T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-62.9988,-40.7327],[-62.9988,-37.9476],[-61.7505,-37.9474],[-61.7501,-40.7322],[-62.9988,-40.7327]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and islands at the coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81190582014075LGN00",name:"imagico.de: Bakun Reservoir",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81190582014075LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-03-16T00:00:00.000Z",startDate:"2014-03-16T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[114.36,2.02846],[113.53448,2.03],[113.53619,3.07077],[114.76512,3.06751],[114.76254,2.08816],[114.36,2.02846]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in older pre-2011 images (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81250592016107LGN00",name:"imagico.de: Batam",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81250592016107LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[104.00155,-0.00008],[104.00137,1.45099],[104.91015,1.45116],[104.91015,-0.00008],[104.00155,-0.00008]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing Islands in OSM (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80770232017156LGN00",name:"imagico.de: Bogoslof Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80770232017156LGN00&z={zoom}&x={x}&y={-y}",endDate:"2017-06-05T00:00:00.000Z",startDate:"2017-06-05T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-168.2544,53.8749],[-168.2544,54.0213],[-167.8591,54.0213],[-167.8591,53.8749],[-168.2544,53.8749]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image from after the eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81800982013291LGN00",name:"imagico.de: Bouvet Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81800982013291LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-10-18T00:00:00.000Z",startDate:"2013-10-18T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[3.24653,-54.47047],[3.24653,-54.37539],[3.46385,-54.37539],[3.46385,-54.47047],[3.24653,-54.47047]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",best:true,description:"For more accurate coastline and glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R017_S67_20170223T022551",name:"imagico.de: Bunger Hills",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R017_S67_20170223T022551&z={zoom}&x={x}&y={-y}",endDate:"2017-02-23T00:00:00.000Z",startDate:"2017-02-23T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[96.1197,-67.6542],[96.1201,-67.1899],[98.7331,-65.044],[105.1028,-65.044],[105.1028,-65.7224],[103.3017,-67.6542],[96.1197,-67.6542]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Largest ice free area at the East Antarctic coast - shows considerable amounts of non-permanent ice. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R065_N47_20160929T102022",name:"imagico.de: Central Alps in late September 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R065_N47_20160929T102022&z={zoom}&x={x}&y={-y}",endDate:"2016-09-29T00:00:00.000Z",startDate:"2016-09-29T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[10.55906,45.95485],[7.47396,45.95533],[7.55585,46.2708],[8.0547,47.66469],[11.75245,47.66481],[11.75245,46.81334],[11.38424,45.95509],[10.55906,45.95485]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping - beware of some fresh snow at higher altitudes (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82050982015344LGN00",name:"imagico.de: Clerke Rocks",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82050982015344LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-10T00:00:00.000Z",startDate:"2015-12-10T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-34.17701,-55.29693],[-35.19599,-55.28285],[-35.16664,-54.72097],[-34.12517,-54.73465],[-34.1401,-55.29693],[-34.17701,-55.29693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R086_N60_20160831T213532",name:"imagico.de: Cook Inlet",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R086_N60_20160831T213532&z={zoom}&x={x}&y={-y}",endDate:"2016-08-31T00:00:00.000Z",startDate:"2016-08-31T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-154.5102,59.4577],[-154.5097,60.6888],[-153.5403,62.1718],[-148.0423,62.1718],[-148.0445,61.5342],[-149.7291,59.4584],[-154.5102,59.4577]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Tidal flats and glaciers in surrounding mountains (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A0040712016264110KF",name:"imagico.de: Coropuna",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A0040712016264110KF&z={zoom}&x={x}&y={-y}",endDate:"2016-09-21T00:00:00.000Z",startDate:"2016-09-21T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-72.75945,-15.68684],[-72.75945,-15.4957],[-72.74434,-15.4263],[-72.41286,-15.4263],[-72.41286,-15.65296],[-72.42411,-15.68667],[-72.75945,-15.68684]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R022_N06_20151221T103009",name:"imagico.de: Cotonou",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R022_N06_20151221T103009&z={zoom}&x={x}&y={-y}",endDate:"2015-12-21T00:00:00.000Z",startDate:"2015-12-21T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[1.83975,6.2578],[1.83975,7.11427],[2.5494,7.11427],[2.5494,6.48905],[2.49781,6.25806],[1.83975,6.2578]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Patchy and partly cloudy coverage in usual sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R040_N01_20160311T164128",name:"imagico.de: Darwin and Wolf islands, Galapagos",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R040_N01_20160311T164128&z={zoom}&x={x}&y={-y}",endDate:"2016-03-11T00:00:00.000Z",startDate:"2016-03-11T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-92.05216,1.3213],[-92.05216,1.72181],[-91.74849,1.72181],[-91.74849,1.3213],[-92.05216,1.3213]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image, only old and poor images in other sources currently (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80360072014245LGN00",name:"imagico.de: Eastern Devon Island coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80360072014245LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-09-02T00:00:00.000Z",startDate:"2014-09-02T00:00:00.000Z",zoomExtent:[0,11],polygon:[[[-84.34799,74.38946],[-84.34799,75.8903],[-79.14871,75.8903],[-79.14871,74.38946],[-84.34799,74.38946]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastline mostly mapped meanwhile (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82160152013239LGN00",name:"imagico.de: Eastern Iceland",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82160152013239LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-08-27T00:00:00.000Z",startDate:"2013-08-27T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-13.04701,64.21109],[-15.16496,64.22408],[-15.16805,64.81573],[-13.04357,64.8036],[-13.04701,64.21109]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing islets and inaccurate coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-AST_L1T_00302052007154424_20150518041444_91492",name:"imagico.de: El Altar",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00302052007154424_20150518041444_91492&z={zoom}&x={x}&y={-y}",endDate:"2012-02-05T00:00:00.000Z",startDate:"2012-02-05T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-78.532,-1.80509],[-78.532,-1.60811],[-78.33562,-1.60811],[-78.33562,-1.80509],[-78.532,-1.80509]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"2007 ASTER image offering better glacier coverage than common sources (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R009_S61_20160109",name:"imagico.de: Elephant Island/Clarence Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R009_S61_20160109&z={zoom}&x={x}&y={-y}",endDate:"2016-01-09T00:00:00.000Z",startDate:"2016-01-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-56.13476,-61.63472],[-56.13476,-61.19936],[-55.83264,-60.84015],[-53.72343,-60.83982],[-53.72343,-61.63472],[-56.13476,-61.63472]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Fairly clear up-to-date image for updating glacier edges (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-enderby",name:"imagico.de: Enderby Land and Kemp Coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=enderby&z={zoom}&x={x}&y={-y}",endDate:"2017-03-27T00:00:00.000Z",startDate:"2017-01-25T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[45.4547,-68.5091],[45.4547,-67.5724],[49.7155,-65.7176],[59.2693,-65.7176],[67.3735,-67.3449],[67.3735,-68.2581],[67.088,-68.5091],[45.4547,-68.5091]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 images of Enderby Land and Kemp Coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82100502015347LGN00",name:"imagico.de: Fogo, Cape Verde",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82100502015347LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-13T00:00:00.000Z",startDate:"2015-12-13T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-24.75878,14.74814],[-24.75878,15.09249],[-24.26706,15.09249],[-24.26706,14.74814],[-24.75878,14.74814]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Image from after the 2014/2015 eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-greenland",name:"imagico.de: Greenland mosaic",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=greenland&z={zoom}&x={x}&y={-y}",endDate:"2015-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-43.9774,59.7171],[-44.545,59.7302],[-44.9203,59.7672],[-45.3587,59.8218],[-45.763,59.8848],[-46.0859,59.9827],[-46.3381,60.119],[-46.577,60.2652],[-46.8114,60.4418],[-47.2635,60.5314],[-47.6937,60.5549],[-48.1457,60.6192],[-48.5771,60.7015],[-48.8689,60.8506],[-49.0578,61.0555],[-49.396,61.2957],[-49.7601,61.4934],[-50.2064,61.7324],[-50.4699,61.9539],[-50.8647,62.1596],[-51.0631,62.3869],[-51.2121,62.6001],[-51.3005,62.8389],[-51.4238,62.9979],[-51.6767,63.1944],[-51.9465,63.4079],[-52.0253,63.6377],[-52.2255,63.8378],[-52.3658,64.0705],[-52.4829,64.3792],[-52.4988,64.6788],[-52.789,64.9063],[-53.2046,65.1321],[-53.6649,65.4753],[-53.9977,65.8019],[-54.1348,66.1568],[-54.1441,66.5235],[-54.2285,66.8319],[-54.4519,67.303],[-54.5141,67.7648],[-54.604,68.2021],[-54.568,68.5698],[-54.598,68.8347],[-54.7606,69.1207],[-55.0028,69.4125],[-55.2735,69.6187],[-55.3808,69.8283],[-55.3945,70.0838],[-55.3094,70.2573],[-55.4307,70.479],[-55.5501,70.6707],[-55.7654,70.861],[-56.2489,71.2343],[-56.5018,71.5429],[-56.5867,71.9015],[-56.5189,72.2355],[-56.5085,72.5258],[-56.8923,72.8144],[-57.4027,73.1054],[-57.8066,73.4566],[-58.1461,73.7696],[-58.3554,74.0972],[-58.5125,74.3783],[-58.7336,74.6328],[-59.3551,74.8869],[-60.1412,75.102],[-61.0067,75.2763],[-61.911,75.3886],[-62.4706,75.5595],[-62.9776,75.7454],[-64.1463,75.779],[-65.4481,75.7235],[-66.7068,75.6792],[-67.8379,75.6525],[-69.0456,75.6195],[-70.055,75.5344],[-71.0898,75.4705],[-72.1119,75.4476],[-74.2311,76.4102],[-74.5601,76.5328],[-74.5601,82.6959],[-14.4462,82.6959],[-14.3994,82.5997],[-13.5339,82.4379],[-12.0312,82.3426],[-10.7796,82.3196],[-10.7796,80.1902],[-11.2123,80.069],[-11.136,79.8103],[-10.7796,79.5176],[-10.7796,79.0441],[-11.2626,78.7128],[-12.2579,78.3558],[-13.2398,78.1272],[-13.7649,77.9279],[-14.1169,77.6779],[-14.7129,77.5278],[-15.5507,77.3655],[-16.0936,77.0771],[-16.0586,76.5548],[-15.838,75.9611],[-15.6879,75.4726],[-16.253,75.058],[-17.0427,74.6425],[-18.3155,74.2702],[-19.4463,73.9378],[-19.8329,73.632],[-20.2938,73.3524],[-20.7831,73.0446],[-21.01,72.6766],[-20.8774,72.2926],[-20.7672,71.8726],[-20.7765,71.4304],[-20.9411,70.9802],[-21.219,70.6126],[-21.5326,70.3001],[-21.8039,70.0911],[-22.166,69.8947],[-22.4831,69.7539],[-22.9027,69.6585],[-23.3545,69.544],[-23.9177,69.4036],[-24.1794,69.3088],[-24.6745,69.1084],[-25.1222,68.9555],[-25.6659,68.7995],[-26.0994,68.583],[-26.6316,68.4043],[-27.7638,68.2813],[-28.4575,68.0023],[-29.353,67.8135],[-30.6456,67.4911],[-31.7673,67.0005],[-32.9783,66.2596],[-33.9313,66.0156],[-34.8956,65.7403],[-35.5914,65.5208],[-36.1483,65.372],[-36.7532,65.2559],[-37.1858,65.1349],[-37.6032,64.9727],[-38.0624,64.4901],[-38.5304,64.1244],[-39.0545,63.7213],[-39.3131,63.4405],[-39.5739,62.7506],[-39.9532,62.2739],[-40.2757,61.8547],[-40.714,61.3365],[-41.2091,60.8495],[-41.821,60.5526],[-42.4368,60.3264],[-42.8643,60.0299],[-43.1131,59.9147],[-43.3282,59.83],[-43.5459,59.7695],[-43.797,59.7284],[-43.9774,59.7171]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Landsat mosaic of Greenland (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R047_S54_20160411T044330",name:"imagico.de: Heard Island coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R047_S54_20160411T044330&z={zoom}&x={x}&y={-y}",endDate:"2016-04-12T00:00:00.000Z",startDate:"2016-04-12T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[73.06897,-53.27059],[73.06897,-52.87549],[73.67338,-52.87673],[74.08863,-52.9495],[74.08863,-53.27059],[73.06897,-53.27059]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image of Heard island with interior mostly cloud covered but mostly well visible coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82280982013259LGN00",name:"imagico.de: Isla Londonderry",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82280982013259LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-09-16T00:00:00.000Z",startDate:"2013-09-16T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-69.8568,-55.55949],[-72.26521,-55.14943],[-72.26521,-54.51089],[-72.08531,-54.17909],[-69.49116,-54.17889],[-69.4915,-55.28379],[-69.62231,-55.5591],[-69.8568,-55.55949]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"A lot of very coarse coastlines could be improved here, much snow cover though so no use for glacier mapping (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_kangerlussuaq_20151008",name:"imagico.de: Kangerlussuaq Autumn",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20151008&z={zoom}&x={x}&y={-y}",endDate:"2015-10-08T00:00:00.000Z",startDate:"2015-10-08T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[-50.6992,66.9888],[-50.721,67.0017],[-50.7341,67.0125],[-50.7396,67.0193],[-50.7396,67.0212],[-50.7158,67.0265],[-50.7017,67.0265],[-50.6829,67.0176],[-50.6686,67.0077],[-50.6638,66.998],[-50.6642,66.9946],[-50.6891,66.9888],[-50.6992,66.9888]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the airport and settlement - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_kangerlussuaq_20160518",name:"imagico.de: Kangerlussuaq Spring",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_kangerlussuaq_20160518&z={zoom}&x={x}&y={-y}",endDate:"2016-05-18T00:00:00.000Z",startDate:"2016-05-18T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[-50.7519,66.9996],[-50.7555,67.0023],[-50.7555,67.0033],[-50.6395,67.0297],[-50.6162,67.0339],[-50.6097,67.0281],[-50.6331,67.022],[-50.7323,66.9996],[-50.7519,66.9996]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the airport and roads - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R021_N44_20160807T083013",name:"imagico.de: Kerch Strait",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20160807T083013&z={zoom}&x={x}&y={-y}",endDate:"2016-08-07T00:00:00.000Z",startDate:"2016-08-07T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[35.93259,44.96237],[35.93259,45.55926],[37.36991,45.55926],[37.36991,44.96237],[35.93259,44.96237]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"State of bridge construction in August 2016 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R021_N44_20180429T082601",name:"imagico.de: Kerch Strait 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20180429T082601&z={zoom}&x={x}&y={-y}",endDate:"2018-04-29T00:00:00.000Z",startDate:"2018-04-29T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[35.8787,45.0348],[35.8787,45.6095],[36.9208,45.6095],[36.9208,45.0348],[35.8787,45.0348]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Bridge and surrounding after completion in April 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ls_polar2",name:"imagico.de: Landsat off-nadir July 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ls_polar2&z={zoom}&x={x}&y={-y}",endDate:"2016-07-17T00:00:00.000Z",startDate:"2016-07-17T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-79.05175,81.91484],[-79.05175,83.43339],[-73.6039,83.80225],[-26.42449,83.80225],[-21.493,83.50352],[-16.88835,83.15095],[-16.88835,81.91484],[-79.05175,81.91484]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Latest images north of the regular Landsat limit (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-larsen_2018",name:"imagico.de: Larsen C ice shelf after calving",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=larsen_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-01-06T00:00:00.000Z",startDate:"2018-01-06T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[-62.7282,-68.9652],[-64.0489,-68.7318],[-64.0486,-68.5373],[-60.8845,-65.9399],[-59.9187,-65.9389],[-59.1088,-66.0775],[-59.1088,-68.8359],[-59.2544,-68.9652],[-62.7282,-68.9652]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"For updating the ice edge after the 2017 iceberg calving (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-AST_L1T_00311162013112731_20150618142416_109190",name:"imagico.de: Leskov Island ASTER",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=AST_L1T_00311162013112731_20150618142416_109190&z={zoom}&x={x}&y={-y}",endDate:"2013-11-16T00:00:00.000Z",startDate:"2013-11-16T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-28.21075,-56.72108],[-28.21075,-56.62498],[-27.96956,-56.62498],[-27.96956,-56.72108],[-28.21075,-56.72108]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81991002015286LGN00",name:"imagico.de: Leskov Island Landsat",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81991002015286LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-10-13T00:00:00.000Z",startDate:"2015-10-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-27.99293,-56.73479],[-28.22776,-56.73262],[-28.22416,-56.60075],[-27.96975,-56.60283],[-27.97319,-56.73479],[-27.99293,-56.73479]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2B_R005_S69_20180222T061749",name:"imagico.de: Lützow-Holm Bay",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2B_R005_S69_20180222T061749&z={zoom}&x={x}&y={-y}",endDate:"2018-02-22T00:00:00.000Z",startDate:"2018-02-22T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[35.124,-70.3693],[35.1241,-69.2795],[36.3864,-68.4765],[42.2208,-68.4762],[42.2208,-70.3651],[35.124,-70.3693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late season image or an area poorly mapped in OSM at the moment - lots of sea ice, be careful with distinguishing sea ice from ice shelves and floating glacier tongues. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ls_polar",name:"imagico.de: May 2013 off-nadir Landsat",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ls_polar&z={zoom}&x={x}&y={-y}",endDate:"2013-05-17T00:00:00.000Z",startDate:"2013-05-17T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-85.76109,81.39333],[-89.83016,82.14952],[-89.83153,82.24405],[-84.99342,82.73099],[-79.95207,83.13108],[-74.55641,83.46267],[-69.35851,83.70451],[-28.20784,83.70451],[-23.06624,83.46532],[-17.96584,83.15518],[-17.96721,82.72386],[-22.78197,81.4419],[-85.76109,81.39333]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"First available image north of the regular Landsat limit, mostly with seasonal snow cover so difficult to interpret (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R042_S78_20170214T202521",name:"imagico.de: McMurdo Sound and Dry Valleys",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R042_S78_20170214T202521&z={zoom}&x={x}&y={-y}",endDate:"2017-02-14T00:00:00.000Z",startDate:"2017-02-14T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[162.9125,-78.4514],[162.6595,-78.4257],[159.2712,-77.6013],[159.2712,-77.4108],[164.157,-76.477],[169.7813,-76.4764],[169.7813,-78.4514],[162.9125,-78.4514]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late season image - not ice minimum, be careful with distinguishing sea ice from ice shelves. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R092_S02_20160613T075613",name:"imagico.de: Mount Kenya 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S02_20160613T075613&z={zoom}&x={x}&y={-y}",endDate:"2016-06-13T00:00:00.000Z",startDate:"2016-06-13T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[37.20666,-0.26685],[37.20666,-0.01193],[37.56552,-0.01193],[37.56552,-0.26685],[37.20666,-0.26685]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R092_S05_20160802T075556",name:"imagico.de: Mount Kilimanjaro 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R092_S05_20160802T075556&z={zoom}&x={x}&y={-y}",endDate:"2016-08-02T00:00:00.000Z",startDate:"2016-08-02T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[37.24769,-3.22921],[37.24769,-2.96816],[37.61581,-2.96816],[37.61581,-3.22921],[37.24769,-3.22921]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80940622015159LGN00",name:"imagico.de: New Ireland",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80940622015159LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-06-08T00:00:00.000Z",startDate:"2015-06-08T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[150.38853,-2.80053],[150.38853,-2.3834],[150.83348,-2.3834],[150.83348,-2.80053],[150.38853,-2.80053]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Many missing islands in OSM (mostly mapped meanwhile) (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2016",name:"imagico.de: North Sea Coast 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2016&z={zoom}&x={x}&y={-y}",endDate:"2016-09-25T00:00:00.000Z",startDate:"2016-09-25T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.1562,52.8755],[5.1615,53.0325],[6.4155,55.7379],[9.8813,55.7459],[9.8813,53.2428],[9.6846,52.8877],[5.1562,52.8755]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2017",name:"imagico.de: North Sea Coast 2017",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2017&z={zoom}&x={x}&y={-y}",endDate:"2017-06-02T00:00:00.000Z",startDate:"2017-06-02T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.1713,53.0918],[6.477,55.8973],[9.8813,55.8973],[9.8813,53.2761],[9.7789,53.0918],[5.1713,53.0918]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2018",name:"imagico.de: North Sea Coast spring 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-08T00:00:00.000Z",startDate:"2018-05-08T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.3179,53.0918],[5.322,53.4418],[6.7023,56.3572],[9.8813,56.3578],[9.8813,53.2819],[9.7758,53.0921],[5.3179,53.0918]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-caspian_2018",name:"imagico.de: Northeast Caspian Sea 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=caspian_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-16T00:00:00.000Z",startDate:"2018-05-16T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[51.0243,45.0729],[51.0243,46.569],[52.4259,46.5687],[53.6471,46.3177],[53.6474,45.0729],[51.0243,45.0729]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastal contruction and Kashagan oil field in Kazakhstan in May 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ural_s2_2016",name:"imagico.de: Northern and Polar Ural mountains August 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ural_s2_2016&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[59.19898,64.89205],[59.19898,66.91656],[60.73329,68.44289],[67.73295,68.44327],[67.73295,67.74883],[64.21647,64.91957],[59.19898,64.89205]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late summer imagery with few clouds - caution: not all visible snow is glaciers (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ndvina",name:"imagico.de: Northern Dvina delta at low tide",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ndvina&z={zoom}&x={x}&y={-y}",endDate:"2015-09-13T00:00:00.000Z",startDate:"2015-09-13T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[37.7291,64.1971],[37.7291,65.1161],[37.8592,65.2705],[41.3223,65.2705],[41.3223,64.3142],[41.2114,64.1973],[37.7291,64.1971]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Beaches, tidal flats and other costal forms (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-nellesmere_ast",name:"imagico.de: Northern Ellesmere Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast&z={zoom}&x={x}&y={-y}",endDate:"2012-07-09T00:00:00.000Z",startDate:"2012-07-09T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-81.62923,82.4597],[-83.03136,82.47986],[-83.03136,83.05876],[-72.80309,83.09567],[-65.65786,83.03232],[-65.81167,82.4597],[-81.62923,82.4597]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from July 2012 ASTER imagery (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-nellesmere_ast_2016",name:"imagico.de: Northern Ellesmere Island July 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=nellesmere_ast_2016&z={zoom}&x={x}&y={-y}",endDate:"2012-07-15T00:00:00.000Z",startDate:"2012-07-08T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-78.89729,82.17577],[-82.64501,82.19426],[-82.64501,83.08067],[-66.58986,83.08497],[-63.78011,82.98908],[-63.78011,82.72198],[-65.0092,82.17577],[-78.89729,82.17577]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from July 2016 ASTER imagery (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81960222015233LGN00vis",name:"imagico.de: Northern German west coast tidalflats",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00vis&z={zoom}&x={x}&y={-y}",endDate:"2015-08-21T00:00:00.000Z",startDate:"2015-08-21T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[7.63568,53.28027],[7.63568,53.6677],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81960222015233LGN00ir",name:"imagico.de: Northern German west coast tidalflats (infrared)",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81960222015233LGN00ir&z={zoom}&x={x}&y={-y}",endDate:"2015-08-21T00:00:00.000Z",startDate:"2015-08-21T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[7.63568,53.28027],[7.63568,53.66811],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date low tide imagery of the coast for updating mapping of tidalflats and shoals (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-ngreenland_ast",name:"imagico.de: Northern Greenland ASTER",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=ngreenland_ast&z={zoom}&x={x}&y={-y}",endDate:"2012-08-13T00:00:00.000Z",startDate:"2005-06-21T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-52.49222,82.48972],[-52.49222,82.94295],[-49.28696,83.47312],[-44.5285,83.73214],[-29.5253,83.73214],[-25.26398,83.58271],[-21.18393,83.39776],[-21.18393,82.74312],[-23.40454,82.48972],[-52.49222,82.48972]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Assembled from mostly 2012 ASTER imagery, some 2005 images mainly in the northeast (true color with estimated blue)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A1350972013086110KF",name:"imagico.de: Northwest Heard Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A1350972013086110KF&z={zoom}&x={x}&y={-y}",endDate:"2013-03-13T00:00:00.000Z",startDate:"2013-03-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[73.2279,-53.20333],[73.2279,-53.01073],[73.25949,-52.94944],[73.78992,-52.94944],[73.78992,-53.06048],[73.71783,-53.20333],[73.2279,-53.20333]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Glaciers of Northwest Heard Island (mapped meanwhile) (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R111_N09_20160604T154554",name:"imagico.de: Panama Canal",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R111_N09_20160604T154554&z={zoom}&x={x}&y={-y}",endDate:"2016-06-07T00:00:00.000Z",startDate:"2016-06-07T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-80.01654,8.84898],[-80.01654,9.41481],[-79.46859,9.41481],[-79.46859,8.84898],[-80.01654,8.84898]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Images of the new locks (but partly cloudy) (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-EO1A0120532016364110KF",name:"imagico.de: Panama Canal - Pacific side",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=EO1A0120532016364110KF&z={zoom}&x={x}&y={-y}",endDate:"2016-12-30T00:00:00.000Z",startDate:"2016-12-30T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-79.62539,8.77083],[-79.68684,8.82197],[-79.68667,8.93705],[-79.65363,9.09294],[-79.26816,9.09294],[-79.32833,8.77083],[-79.62539,8.77083]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"New locks with less clouds than in the Sentinel-2 image - make sure to check image alignment (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R078_N68_20160930T081002",name:"imagico.de: Pechora Sea Coast",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N68_20160930T081002&z={zoom}&x={x}&y={-y}",endDate:"2016-09-30T00:00:00.000Z",startDate:"2016-09-30T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[53.1802,67.5344],[53.1821,68.414],[54.2107,69.3367],[55.3584,70.2786],[59.004,70.2786],[60.6947,69.977],[61.9837,69.7161],[61.9823,68.9395],[59.9153,67.5344],[53.1802,67.5344]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 image of the Pechora Sea coast in autumn 2016 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81511242016033LGN00",name:"imagico.de: Pensacola Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81511242016033LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-02-02T00:00:00.000Z",startDate:"2016-02-02T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[-53.20922,-84.12525],[-60.61538,-83.78609],[-60.61538,-82.29969],[-48.72405,-82.29987],[-44.52178,-82.43683],[-44.51354,-84.12525],[-53.20922,-84.12525]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R136_N41_20150831T093006",name:"imagico.de: Prokletije Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R136_N41_20150831T093006&z={zoom}&x={x}&y={-y}",endDate:"2015-08-31T00:00:00.000Z",startDate:"2015-08-31T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[19.11233,42.15316],[19.08426,43.08074],[20.63299,43.09603],[20.63788,42.16779],[19.11233,42.15316]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Late summer imagery where usual sources are severely limited by clouds and snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-DMS_1142622_03746_20110415_17533956",name:"imagico.de: Qasigiannguit",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142622_03746_20110415_17533956&z={zoom}&x={x}&y={-y}",endDate:"2011-04-15T00:00:00.000Z",startDate:"2011-04-15T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[-51.23857,68.79972],[-51.24334,68.85303],[-51.15167,68.85303],[-51.14038,68.80116],[-51.23857,68.79972]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image of the settlement - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81510432015030LGN00",name:"imagico.de: Rann of Kutch",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81510432015030LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[67.9684,22.36265],[67.86231,22.38392],[67.86231,24.88693],[71.48986,24.88693],[71.48986,22.36265],[67.9684,22.36265]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Land/water distinction difficult to properly map based on Bing/Mapbox images (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R093_N41_20150828T092005",name:"imagico.de: Rila and Pirin Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R093_N41_20150828T092005&z={zoom}&x={x}&y={-y}",endDate:"2015-08-28T00:00:00.000Z",startDate:"2015-08-28T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[23.80811,41.58488],[22.99238,41.60195],[23.01186,42.29984],[23.99402,42.28339],[23.96561,41.58488],[23.80811,41.58488]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Late summer imagery where usual sources are severely limited by clouds and snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81730602015040LGN00",name:"imagico.de: Rwenzori Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81730602015040LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-02-09T00:00:00.000Z",startDate:"2015-02-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[29.7663,0.20689],[29.7663,0.50918],[30.0346,0.50918],[30.0346,0.20689],[29.7663,0.20689]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image of most of the remaining Rwenzori Mountains glaciers (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R078_N01_20160702T082522",name:"imagico.de: Rwenzori Mountains 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R078_N01_20160702T082522&z={zoom}&x={x}&y={-y}",endDate:"2016-07-02T00:00:00.000Z",startDate:"2016-07-02T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[29.80514,0.23586],[29.80514,0.46709],[30.02503,0.46709],[30.02503,0.23586],[29.80514,0.23586]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date image for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80611072014036LGN00",name:"imagico.de: Scott Island",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80611072014036LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-02-05T00:00:00.000Z",startDate:"2014-02-05T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-180,-67.42635],[-180,-67.32544],[-179.82473,-67.32538],[-179.82473,-67.42635],[-180,-67.42635]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82100972015347LGN00",name:"imagico.de: Shag Rocks",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82100972015347LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-12-13T00:00:00.000Z",startDate:"2015-12-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-42.12875,-53.7205],[-42.14626,-53.45782],[-41.67573,-53.44586],[-41.65582,-53.70872],[-42.12875,-53.7205]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81130622013270LGN00",name:"imagico.de: Southeastern Sulawesi",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81130622013270LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-09-27T00:00:00.000Z",startDate:"2013-09-27T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[120.84382,-3.59545],[120.84382,-3.15985],[120.98184,-2.51468],[122.62618,-2.51468],[122.62618,-3.00215],[122.5007,-3.59545],[120.84382,-3.59545]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing islands and coarse coastline due to cloud cover in Bing, lakes could also use additional detail (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80281222016035LGN00",name:"imagico.de: Southern Transantarctic Mountains",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80281222016035LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-02-04T00:00:00.000Z",startDate:"2016-02-04T00:00:00.000Z",zoomExtent:[0,10],polygon:[[[156.96951,-84.50098],[154.50858,-84.46255],[154.50858,-82.60681],[175.46774,-82.58505],[177.00583,-83.52807],[177.00583,-84.19262],[171.93839,-84.34633],[166.83798,-84.4437],[161.67029,-84.50045],[156.96951,-84.50098]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Outside regular Landsat coverage and therefore not in LIMA and Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81030632015286LGN00",name:"imagico.de: Sudirman Range 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81030632015286LGN00&z={zoom}&x={x}&y={-y}",endDate:"2015-10-13T00:00:00.000Z",startDate:"2015-10-13T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[136.4226,-4.2853],[136.4226,-3.6447],[137.7971,-3.6447],[137.7971,-4.2853],[136.4226,-4.2853]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Older image of the Sudirman Range with no fresh snow showing glacier extent (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R088_S05_20160812T011732",name:"imagico.de: Sudirman Range 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R088_S05_20160812T011732&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[136.8044,-4.2585],[136.8044,-3.7836],[137.7701,-3.7836],[137.7701,-4.2585],[136.8044,-4.2585]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Cloud free image of the Sudirman Range but with fresh snow (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-s2sval",name:"imagico.de: Svalbard mosaic",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=s2sval&z={zoom}&x={x}&y={-y}",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[16.6108,76.4137],[16.4731,76.4268],[16.3788,76.4589],[14.4124,77.1324],[14.0784,77.2536],[10.9875,78.4054],[10.631,78.5605],[10.2314,78.8392],[10.3952,79.6074],[10.516,79.7731],[10.9632,79.8707],[20.2294,80.849],[20.4702,80.8493],[25.1752,80.6817],[33.4391,80.3438],[33.7809,80.3016],[34.0395,80.239],[33.977,80.1527],[25.5722,76.5917],[25.2739,76.481],[25.1416,76.4327],[24.937,76.4176],[16.6108,76.4137]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Sentinel-2 mosaic of Svalbard (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-DMS_1142636_160xx_20110507_1822xxxx",name:"imagico.de: Thule Air Base",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=DMS_1142636_160xx_20110507_1822xxxx&z={zoom}&x={x}&y={-y}",endDate:"2011-05-07T00:00:00.000Z",startDate:"2011-05-07T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[-68.93977,76.51133],[-68.93977,76.5499],[-68.76635,76.55176],[-68.50993,76.55176],[-68.50744,76.51612],[-68.67897,76.51194],[-68.93977,76.51133]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule2_2015.09.25",name:"imagico.de: Thule Airbase DMS low altitude overflight September 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule2_2015.09.25&z={zoom}&x={x}&y={-y}",endDate:"2015-09-25T00:00:00.000Z",startDate:"2015-09-25T00:00:00.000Z",zoomExtent:[0,17],polygon:[[[-68.74292,76.52636],[-68.74446,76.5284],[-68.74807,76.54939],[-68.74615,76.56017],[-68.72276,76.56022],[-68.72017,76.55775],[-68.71853,76.52921],[-68.71978,76.52637],[-68.74292,76.52636]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule_2015.10.06",name:"imagico.de: Thule Airbase DMS overflight October 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.10.06&z={zoom}&x={x}&y={-y}",endDate:"2015-10-06T00:00:00.000Z",startDate:"2015-10-06T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[-68.81924,76.5251],[-68.82651,76.54177],[-68.77345,76.5439],[-68.7021,76.54545],[-68.59177,76.5456],[-68.59183,76.52793],[-68.6597,76.5251],[-68.81924,76.5251]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-dms_thule_2015.09.25",name:"imagico.de: Thule Airbase DMS overflight September 2015",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=dms_thule_2015.09.25&z={zoom}&x={x}&y={-y}",endDate:"2015-09-25T00:00:00.000Z",startDate:"2015-09-25T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[-68.77771,76.50688],[-68.77662,76.57064],[-68.68115,76.57065],[-68.6763,76.55384],[-68.6762,76.53074],[-68.68523,76.50688],[-68.77771,76.50688]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS aerial images from Thule Airbase - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R094_N79_20160812T105622",name:"imagico.de: Ushakov Island August 2016",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R094_N79_20160812T105622&z={zoom}&x={x}&y={-y}",endDate:"2016-08-12T00:00:00.000Z",startDate:"2016-08-12T00:00:00.000Z",zoomExtent:[0,12],polygon:[[[78.45886,80.72643],[78.45886,80.9099],[80.48892,80.9099],[80.48892,80.72643],[78.45886,80.72643]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late summer imagery with few clouds (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC80910682014358LGN00",name:"imagico.de: Vanatinai",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC80910682014358LGN00&z={zoom}&x={x}&y={-y}",endDate:"2014-12-24T00:00:00.000Z",startDate:"2014-12-24T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[153.06138,-11.78923],[153.06138,-11.28869],[153.10927,-11.07229],[154.41201,-11.07229],[154.41201,-11.78923],[153.06138,-11.78923]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coarse coastline due to cloud cover in Bing/Mapbox (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC82330892016031LGN00",name:"imagico.de: Volcán Calbuco",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC82330892016031LGN00&z={zoom}&x={x}&y={-y}",endDate:"2016-01-31T00:00:00.000Z",startDate:"2016-01-31T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-72.86696,-41.51741],[-72.86696,-41.04527],[-72.23181,-41.04527],[-71.8751,-41.10829],[-72.00007,-41.51741],[-72.86696,-41.51741]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Image from after the 2015 eruption (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R089_N52_20160623T024048",name:"imagico.de: Vostochny Cosmodrome",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R089_N52_20160623T024048&z={zoom}&x={x}&y={-y}",endDate:"2016-06-23T00:00:00.000Z",startDate:"2016-06-23T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[126.36143,51.37553],[126.34804,52.33932],[128.60762,52.3409],[128.61174,51.37553],[126.36143,51.37553]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image showing newest features (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-walps_autumn_2017",name:"imagico.de: Western Alps autumn colors 2017",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=walps_autumn_2017&z={zoom}&x={x}&y={-y}",endDate:"2017-10-17T00:00:00.000Z",startDate:"2017-10-17T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[4.6412,43.2493],[4.3118,43.2653],[4.3118,44.2167],[5.2562,46.965],[5.9151,48.7177],[7.3866,48.7467],[10.088,48.7467],[10.088,48.7032],[7.7819,43.2813],[7.76,43.2653],[7.3646,43.2493],[4.6412,43.2493]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Autumn colors in the Alps, Jura and southwestern Germany (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-LC81490352013282LGN00",name:"imagico.de: Western Karakoram",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=LC81490352013282LGN00&z={zoom}&x={x}&y={-y}",endDate:"2013-10-09T00:00:00.000Z",startDate:"2013-10-09T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[75.98364,34.97851],[73.96164,35.36957],[74.44281,37.09391],[76.50601,36.70267],[75.98364,34.97851]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Represents approximately minimum snow cover so can be well used for glacier mapping (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R039_S15_20160510T145731",name:"imagico.de: Willkanuta Mountains and Quelccaya Ice Cap",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R039_S15_20160510T145731&z={zoom}&x={x}&y={-y}",endDate:"2016-05-10T00:00:00.000Z",startDate:"2016-05-10T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[-71.18071,-14.49785],[-71.17976,-13.71029],[-70.55637,-13.71263],[-70.55637,-14.49785],[-71.18071,-14.49785]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Poor and outdated imagery in other sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"IPR-orotofoto-last-tms",name:"IPR ortofoto LAST (tmsproxy)",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_last.php/{zoom}/{x}/{y}.jpg",zoomExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{id:"IPR-orotofoto-vege-tms",name:"IPR ortofoto Low-Vegetation (tmsproxy)",type:"tms",template:"https://osm-{switch:a,b,c}.zby.cz/tiles_ipr_vege.php/{zoom}/{x}/{y}.jpg",zoomExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"GSGS3906",name:"Ireland British War Office 1:25k GSGS 3906",type:"tms",template:"https://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[-9.31139,51.43828],[-7.36131,51.99302],[-7.33934,52.13149],[-6.9658,52.06231],[-6.23796,52.1534],[-6.21049,52.52928],[-5.98253,52.80079],[-5.96056,53.67037],[-6.20775,53.67851],[-6.22423,53.95255],[-5.86442,54.12513],[-5.85893,54.20392],[-5.53483,54.23122],[-5.39476,54.44739],[-5.50188,54.70052],[-6.21873,55.38194],[-6.86418,55.2162],[-7.25145,55.46455],[-7.53435,55.30853],[-8.25395,55.26787],[-8.61101,54.97259],[-8.49016,54.89369],[-8.83897,54.68306],[-8.42699,54.52397],[-8.75108,54.31302],[-9.29765,54.38985],[-10.05296,54.37866],[-10.30015,54.05747],[-10.02275,53.79386],[-10.30565,53.55142],[-9.99803,53.24354],[-9.09166,53.19256],[-9.81676,53.1102],[-9.48167,52.96984],[-9.70415,52.68107],[-10.00627,52.63608],[-9.78929,52.52426],[-9.99803,52.32663],[-10.64348,52.1753],[-10.39629,51.9761],[-10.16832,51.64668],[-10.28642,51.57334],[-9.88542,51.57163],[-9.79204,51.44684],[-9.31139,51.43828]]],terms_url:"https://wiki.openstreetmap.org/wiki/Ireland/Background_Imagery#Trinity_College_Dublin",terms_text:"Glucksman Map Library, Trinity College Dublin",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ie/IrelandBritishWarOffice-GSGS3906.png"},{id:"Israel_Hiking",name:"Israel Hiking",type:"tms",template:"https://israelhiking.osm.org.il/Tiles/{zoom}/{x}/{y}.png",zoomExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel Hiking map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{id:"Israel_MTB",name:"Israel MTB",type:"tms",template:"https://israelhiking.osm.org.il/MTBTiles/{zoom}/{x}/{y}.png",zoomExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel MTB map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{id:"ITACyL-Castile-and-Leon",name:"ITACyL - Castile and León",type:"wms",template:"http://orto.wms.itacyl.es/WMS?REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1&LAYERS=Ortofoto_CyL&SRS={proj}&FORMAT=image/jpeg&STYLES=Default&TRANSPARENT=TRUE&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-1.9358,41.43834],[-1.89601,41.43869],[-1.89536,41.39687],[-1.9767,41.39616],[-1.97639,41.37623],[-2.06201,41.37548],[-2.06262,41.41471],[-2.10458,41.41434],[-2.10363,41.35367],[-2.14448,41.35331],[-2.1419,41.18683],[-2.06204,41.18753],[-2.06171,41.16624],[-2.02046,41.16661],[-2.01887,41.06334],[-2.10083,41.06262],[-2.10114,41.08296],[-2.22733,41.08185],[-2.22704,41.0635],[-2.26912,41.06313],[-2.2688,41.04257],[-2.35325,41.04182],[-2.35356,41.06148],[-2.39487,41.06112],[-2.39457,41.04206],[-2.43722,41.04168],[-2.43756,41.06315],[-2.47928,41.06278],[-2.47991,41.10369],[-2.52078,41.10333],[-2.5211,41.12429],[-2.60415,41.12357],[-2.60481,41.16628],[-2.6471,41.16591],[-2.64808,41.22931],[-2.72874,41.2286],[-2.72907,41.24974],[-2.89552,41.24828],[-2.89649,41.31063],[-2.9363,41.31028],[-2.93571,41.27231],[-3.14692,41.27046],[-3.14723,41.29045],[-3.22828,41.28974],[-3.22767,41.25008],[-3.39581,41.2486],[-3.39518,41.20808],[-3.43492,41.20773],[-3.43429,41.16696],[-3.47877,41.16657],[-3.47844,41.14556],[-3.60336,41.14446],[-3.6027,41.10169],[-3.64539,41.10131],[-3.64508,41.08159],[-3.68735,41.08122],[-3.68673,41.04104],[-3.72866,41.04067],[-3.72803,40.9998],[-3.76896,40.99944],[-3.76864,40.97886],[-3.85473,40.97811],[-3.8544,40.95653],[-3.89857,40.95615],[-3.89764,40.89575],[-3.93906,40.89539],[-3.93716,40.77204],[-4.06198,40.77093],[-4.06133,40.72926],[-4.10372,40.72888],[-4.10311,40.68918],[-4.14628,40.6888],[-4.14498,40.60421],[-4.19025,40.60381],[-4.18994,40.58362],[-4.22946,40.58327],[-4.22979,40.60487],[-4.27054,40.60451],[-4.26958,40.54211],[-4.31384,40.54171],[-4.31163,40.39758],[-4.39376,40.39685],[-4.39345,40.37677],[-4.43723,40.37638],[-4.43623,40.31123],[-4.52192,40.31046],[-4.52037,40.20897],[-4.56131,40.2086],[-4.56099,40.18763],[-4.68895,40.18649],[-4.68933,40.21101],[-4.73192,40.21063],[-4.73252,40.24966],[-4.76838,40.24934],[-4.76809,40.23035],[-4.81104,40.22996],[-4.81147,40.20726],[-4.8542,40.18414],[-4.85264,40.12563],[-4.93699,40.12488],[-4.93638,40.08529],[-5.35538,40.08155],[-5.35606,40.12562],[-5.44027,40.12487],[-5.44091,40.16673],[-5.60382,40.16527],[-5.60448,40.20881],[-5.68646,40.20808],[-5.68712,40.25131],[-6.02166,40.24834],[-6.02295,40.33257],[-6.10433,40.33184],[-6.1056,40.41451],[-6.18951,40.41376],[-6.19018,40.45745],[-6.26971,40.45675],[-6.26909,40.41653],[-6.35192,40.41579],[-6.35128,40.37422],[-6.43325,40.37349],[-6.43264,40.33361],[-6.52245,40.33281],[-6.52116,40.24849],[-6.59942,40.24779],[-6.59886,40.21128],[-6.85568,40.20899],[-6.85634,40.25257],[-6.93622,40.25186],[-6.93751,40.33657],[-6.85111,40.33734],[-6.86001,40.91672],[-6.93544,40.91605],[-6.93741,41.0435],[-6.85482,41.04423],[-6.85548,41.08706],[-6.77015,41.08781],[-6.77245,41.23623],[-6.68379,41.23701],[-6.60436,41.2377],[-6.60524,41.29474],[-6.5193,41.29549],[-6.51991,41.33479],[-6.43673,41.33552],[-6.43801,41.41814],[-6.35318,41.41888],[-6.35447,41.50141],[-6.26889,41.50216],[-6.2708,41.6245],[-6.35661,41.62375],[-6.35724,41.66401],[-6.43548,41.66333],[-6.4349,41.62651],[-6.52279,41.62575],[-6.52343,41.66635],[-6.6034,41.66565],[-6.60733,41.9166],[-7.02209,41.913],[-7.02406,42.03872],[-7.1054,42.03801],[-7.10613,42.08421],[-7.0208,42.08495],[-7.02276,42.2094],[-6.93699,42.21014],[-6.93763,42.25087],[-6.8548,42.25159],[-6.85545,42.29329],[-6.77342,42.294],[-6.77403,42.33244],[-6.85325,42.33176],[-6.85523,42.4569],[-7.10341,42.45477],[-7.10811,42.75115],[-7.02199,42.75189],[-7.02241,42.77825],[-6.93976,42.77896],[-6.94199,42.91962],[-6.77302,42.92106],[-6.77363,42.95958],[-6.52329,42.96172],[-6.52391,43.00095],[-6.43893,43.00167],[-6.44024,43.08361],[-5.93782,43.08789],[-5.93708,43.04189],[-5.85421,43.0426],[-5.85357,43.00258],[-5.77236,43.00327],[-5.77363,43.08308],[-5.6027,43.08453],[-5.60202,43.04222],[-5.52161,43.04291],[-5.52226,43.08409],[-5.4376,43.08481],[-5.43827,43.12651],[-5.10444,43.12935],[-5.10573,43.2099],[-5.02386,43.2106],[-5.02451,43.25117],[-4.90017,43.25222],[-4.89941,43.20501],[-4.81126,43.20576],[-4.80966,43.10538],[-4.76975,43.10571],[-4.76937,43.08168],[-4.72945,43.08202],[-4.72881,43.04219],[-4.56322,43.0436],[-4.56353,43.06296],[-4.39599,43.06438],[-4.39566,43.04336],[-4.3537,43.04371],[-4.35266,42.97836],[-4.23013,42.9794],[-4.22913,42.91625],[-4.18774,42.9166],[-4.18706,42.87407],[-4.10552,42.87476],[-4.10486,42.83348],[-3.97801,42.83457],[-3.97733,42.79214],[-3.9375,42.79248],[-3.93781,42.81183],[-3.85397,42.81254],[-3.85427,42.83193],[-3.89573,42.83158],[-3.89607,42.85343],[-3.93821,42.85307],[-3.93889,42.89577],[-3.9806,42.89542],[-3.98093,42.91627],[-4.0222,42.91591],[-4.0229,42.96014],[-3.97851,42.96052],[-3.97946,43.01999],[-3.93883,43.02034],[-3.93918,43.04239],[-3.89704,43.04275],[-3.89738,43.06414],[-3.85424,43.06451],[-3.8549,43.10583],[-3.77086,43.10654],[-3.77116,43.12515],[-3.72819,43.12551],[-3.72853,43.14656],[-3.68713,43.14691],[-3.68778,43.18786],[-3.60365,43.18858],[-3.60331,43.16747],[-3.52278,43.16815],[-3.52243,43.14619],[-3.39669,43.14726],[-3.39699,43.16601],[-3.35444,43.16637],[-3.35479,43.18837],[-3.31268,43.18873],[-3.31299,43.20828],[-3.22993,43.20899],[-3.22959,43.18768],[-3.10343,43.18875],[-3.10274,43.14562],[-3.14546,43.14526],[-3.14516,43.1271],[-3.10617,43.12743],[-3.10445,43.01915],[-3.02075,43.01987],[-3.0201,42.97903],[-2.9811,42.97936],[-2.97977,42.8958],[-3.10476,42.89473],[-3.10276,42.76928],[-3.02199,42.76997],[-3.02168,42.74983],[-2.98024,42.75019],[-2.97988,42.7275],[-2.89613,42.72822],[-2.89679,42.76967],[-2.8534,42.77004],[-2.85405,42.81087],[-2.68577,42.81231],[-2.68544,42.79159],[-2.64523,42.79194],[-2.64489,42.77024],[-2.52005,42.7713],[-2.51936,42.72827],[-2.5607,42.72791],[-2.56038,42.7076],[-2.51944,42.70795],[-2.5181,42.62357],[-2.60404,42.62283],[-2.60439,42.64497],[-2.77154,42.64353],[-2.77188,42.66544],[-2.81176,42.6651],[-2.8121,42.68624],[-2.85469,42.68588],[-2.85337,42.60302],[-2.89413,42.60267],[-2.89379,42.58159],[-3.0619,42.58015],[-3.06031,42.47952],[-3.02191,42.47985],[-3.0199,42.3525],[-3.06255,42.35213],[-3.06029,42.20906],[-3.1012,42.20871],[-3.10086,42.18682],[-3.06175,42.18716],[-3.0611,42.14559],[-3.02029,42.14594],[-3.01963,42.10375],[-2.89602,42.10482],[-2.89501,42.04071],[-2.81222,42.04143],[-2.81353,42.1246],[-2.76871,42.12499],[-2.76905,42.14674],[-2.72695,42.14711],[-2.7266,42.12485],[-2.68706,42.12519],[-2.68605,42.06109],[-2.72804,42.06073],[-2.72739,42.0193],[-2.60343,42.02037],[-2.60376,42.04135],[-2.561,42.04173],[-2.56198,42.10411],[-2.52266,42.10445],[-2.52299,42.12577],[-2.47933,42.12615],[-2.47963,42.145],[-2.35517,42.14608],[-2.3555,42.16747],[-2.31184,42.16785],[-2.3115,42.14605],[-2.2699,42.14641],[-2.26924,42.1048],[-2.2295,42.10515],[-2.22981,42.12514],[-2.14467,42.12587],[-2.14432,42.10386],[-2.10385,42.10421],[-2.10156,41.95811],[-1.97689,41.95919],[-1.97655,41.93765],[-1.93473,41.93801],[-1.93504,41.95776],[-1.89453,41.95811],[-1.89483,41.97715],[-1.854,41.97751],[-1.85304,41.91638],[-1.81381,41.91672],[-1.81151,41.76984],[-1.7706,41.77019],[-1.76866,41.64582],[-1.85335,41.64508],[-1.85305,41.62567],[-1.89471,41.6253],[-1.89403,41.58215],[-1.97716,41.58142],[-1.97683,41.56021],[-1.9377,41.56055],[-1.9358,41.43834]]],terms_text:"ITACyL"},{id:"gsi.go.jp",name:"Japan GSI ortho Imagery",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg",zoomExtent:[5,19],polygon:[[[130.35021,31.45741],[130.26851,31.45817],[130.20875,31.44939],[130.1002,31.44996],[130.09237,31.3919],[130.13355,31.37528],[130.35043,31.37528],[130.35021,31.45741]],[[130.4193,31.41715],[130.417,31.41672],[130.41677,31.47525],[130.34179,31.47506],[130.34179,31.48374],[130.33362,31.48374],[130.33329,31.50044],[130.36675,31.49997],[130.36664,31.52458],[130.35019,31.52544],[130.35041,31.54986],[130.32523,31.55024],[130.32501,31.60029],[130.31661,31.63336],[130.31634,31.65084],[130.3752,31.65084],[130.31164,31.67599],[130.29194,31.69179],[130.29105,31.73235],[130.2521,31.73387],[130.24986,31.71693],[130.24427,31.71712],[130.21629,31.75804],[130.17533,31.75919],[130.17422,31.78259],[130.18384,31.79096],[130.23644,31.79096],[130.26911,31.77003],[130.36334,31.75785],[130.42668,31.70893],[130.62409,31.7076],[130.62588,31.68627],[130.61088,31.62245],[130.55582,31.50249],[130.54239,31.41715],[130.42158,31.41715],[130.4193,31.41715]],[[130.52516,31.24184],[130.54441,31.24107],[130.56858,31.21715],[130.59924,31.21657],[130.59924,31.26633],[130.57641,31.26633],[130.57351,31.31625],[130.6308,31.28393],[130.68989,31.27666],[130.66706,31.26059],[130.66594,31.21925],[130.64401,31.18135],[130.59007,31.14688],[130.54239,31.17503],[130.54239,31.1913],[130.50009,31.19207],[130.50009,31.21581],[130.52494,31.21715],[130.52516,31.24184]],[[130.74987,31.16622],[130.74965,31.24107],[130.77449,31.25887],[130.77718,31.33307],[130.75122,31.37455],[130.74898,31.41658],[130.67557,31.46852],[130.67489,31.50077],[131.40006,31.5002],[131.40834,31.45916],[131.36694,31.40932],[131.3656,31.35142],[131.31703,31.34206],[131.29957,31.36595],[131.24317,31.36633],[131.19952,31.43358],[131.14782,31.45019],[131.13394,31.45],[131.1326,31.42899],[131.10059,31.42536],[131.05091,31.41639],[131.04912,31.39155],[131.08403,31.35085],[131.11626,31.35085],[131.11783,31.33422],[130.99943,31.33365],[130.99965,31.25102],[130.87521,31.25064],[130.87454,31.16679],[130.74987,31.16622]],[[130.86625,30.47468],[130.86602,30.49937],[130.93362,30.57493],[130.93227,30.61597],[131.00636,30.61655],[131.04933,30.59112],[131.04933,30.54275],[130.99203,30.50843],[130.99114,30.47526],[130.86625,30.47468]],[[137.87486,36.37519],[138.00005,36.37494],[138.00005,36.30839],[138.04159,36.30827],[138.04191,36.29175],[138.08306,36.29162],[138.08353,36.2499],[138.13307,36.24996],[138.13354,36.16677],[138.16654,36.1667],[138.16694,36.12485],[138.04167,36.12491],[138.04144,36.04158],[137.87479,36.04152],[137.87486,36.37519]],[[138.37446,35.83393],[138.4998,35.83285],[138.4998,35.75042],[138.74936,35.7506],[138.7507,35.58332],[138.62447,35.58386],[138.62536,35.49991],[138.37491,35.49972],[138.37446,35.83393]],[[135.79179,35.64165],[135.8006,35.64923],[135.834,35.65052],[135.8916,35.62003],[135.89271,35.6091],[135.95776,35.60858],[135.9834,35.6172],[135.98435,35.641],[135.95095,35.6419],[135.95048,35.68305],[135.94225,35.69204],[135.94178,35.73239],[136.00809,35.77516],[136.03167,35.77503],[136.05018,35.75012],[136.05003,35.66646],[136.0084,35.65836],[136.00856,35.61694],[136.03404,35.60022],[136.06664,35.59996],[136.06617,35.61656],[136.1002,35.62492],[136.1002,35.69127],[136.07598,35.69166],[136.07503,35.74922],[136.08342,35.76694],[136.12441,35.76605],[136.15021,35.7004],[136.15875,35.64216],[136.17442,35.62492],[136.17553,35.58342],[136.1749,35.55813],[136.15859,35.55832],[136.15875,35.56701],[136.1165,35.56675],[136.11626,35.52555],[136.04045,35.5247],[136.01684,35.50311],[136.01661,35.48334],[135.97543,35.48334],[135.94141,35.50885],[135.94186,35.56641],[135.93358,35.57487],[135.90873,35.57514],[135.90851,35.59953],[135.83185,35.59972],[135.7928,35.62519],[135.79179,35.64165]],[[135.80916,35.47505],[135.77044,35.53345],[135.7579,35.53326],[135.74168,35.51641],[135.70072,35.51705],[135.67464,35.53363],[135.67543,35.56659],[135.6996,35.58333],[135.81654,35.58343],[135.81654,35.56804],[135.85817,35.54956],[135.85851,35.52543],[135.8509,35.5247],[135.85012,35.47514],[135.80916,35.47505]],[[135.58333,35.44132],[135.61656,35.44989],[135.64163,35.47496],[135.71639,35.47478],[135.71728,35.46703],[135.81442,35.46539],[135.86668,35.44187],[135.86679,35.40868],[135.81722,35.40822],[135.81677,35.38496],[135.77548,35.3835],[135.75835,35.40804],[135.59183,35.4084],[135.58322,35.42536],[135.58333,35.44132]],[[135.40011,35.43312],[135.42496,35.44189],[135.45803,35.45008],[135.45899,35.49164],[135.46642,35.49184],[135.46619,35.50807],[135.44181,35.51709],[135.43968,35.53293],[135.45843,35.55804],[135.52324,35.55811],[135.52498,35.5091],[135.54152,35.50008],[135.54152,35.4834],[135.57515,35.48366],[135.57491,35.49164],[135.60878,35.49171],[135.60894,35.46684],[135.59208,35.45826],[135.53305,35.45826],[135.50029,35.45008],[135.50045,35.4415],[135.50789,35.42506],[135.53337,35.42513],[135.53297,35.38346],[135.5416,35.38333],[135.54176,35.36688],[135.5086,35.35836],[135.50892,35.34216],[135.50013,35.34164],[135.50013,35.41662],[135.39987,35.41655],[135.40011,35.43312]],[[133.70822,35.45816],[133.70822,35.33319],[133.12484,35.33328],[133.12495,35.3749],[132.95877,35.37508],[132.95821,35.4578],[132.87506,35.45853],[132.87461,35.52504],[132.95015,35.52522],[132.9497,35.55819],[133.01674,35.55855],[133.01685,35.56675],[133.03352,35.56693],[133.03308,35.59205],[133.06687,35.59187],[133.06654,35.6168],[133.14135,35.61671],[133.14151,35.59181],[133.36667,35.59186],[133.36689,35.57484],[133.34216,35.57447],[133.34194,35.558],[133.33321,35.55026],[133.28363,35.55017],[133.28341,35.49178],[133.33354,35.4916],[133.33354,35.47529],[133.41714,35.47492],[133.41714,35.37516],[133.49995,35.37534],[133.49973,35.45806],[133.45854,35.45806],[133.45854,35.51629],[133.49212,35.5335],[133.54136,35.54161],[133.58343,35.54197],[133.58355,35.45843],[133.70822,35.45816]],[[133.84174,35.46646],[133.84158,35.58367],[133.975,35.58329],[133.97532,35.5086],[134.00823,35.50834],[134.0334,35.49971],[134.0421,35.47497],[134.04432,35.45834],[134.08357,35.4586],[134.08309,35.53359],[134.13326,35.54969],[134.23328,35.55999],[134.27491,35.58342],[134.33299,35.58367],[134.33521,35.49172],[134.36654,35.49224],[134.36654,35.49997],[134.41718,35.49971],[134.41592,35.5417],[134.6253,35.54157],[134.62514,35.37554],[134.70839,35.37463],[134.70823,35.33398],[134.41655,35.33359],[134.41592,35.37528],[134.39218,35.37541],[134.39155,35.35011],[134.37477,35.33346],[134.20005,35.33359],[134.19939,35.35874],[134.24997,35.39971],[134.27515,35.39962],[134.27504,35.39205],[134.35819,35.39314],[134.35852,35.3999],[134.3752,35.39999],[134.37441,35.42489],[134.33256,35.42507],[134.33278,35.41659],[134.04954,35.41659],[134.05077,35.39178],[134.0661,35.39187],[134.06711,35.39999],[134.14187,35.40017],[134.14164,35.36678],[134.18339,35.35847],[134.18372,35.33337],[133.78309,35.33364],[133.78331,35.34159],[133.82472,35.3592],[133.82505,35.38311],[133.84173,35.40838],[133.89981,35.40893],[133.89981,35.41677],[133.85829,35.41659],[133.8574,35.46646],[133.84174,35.46646]],[[133.24987,33.66667],[133.41786,33.66674],[133.52485,33.66674],[133.52493,33.79178],[133.64157,33.79185],[133.64188,33.66681],[133.75006,33.66687],[133.75029,33.62517],[133.79152,33.62498],[133.79168,33.5084],[133.73336,33.5084],[133.73328,33.51658],[133.64196,33.51671],[133.60833,33.48346],[133.52493,33.46682],[133.47492,33.41935],[133.43313,33.38321],[133.37497,33.38334],[133.37497,33.49157],[133.20817,33.49191],[133.20824,33.55827],[133.24947,33.55833],[133.24987,33.66667]],[[134.3501,33.73355],[134.4832,33.73368],[134.48336,33.66732],[134.43366,33.65033],[134.43287,33.63412],[134.35279,33.63347],[134.3501,33.73355]],[[140.31656,36.21656],[140.31671,36.44984],[140.34973,36.44994],[140.35012,36.51668],[140.47467,36.51671],[140.47483,36.59159],[140.62489,36.59204],[140.62467,36.63354],[140.64974,36.6348],[140.65041,36.71684],[140.69912,36.81554],[140.71006,36.91306],[140.70838,36.95687],[140.74956,36.95866],[140.75323,37.06176],[140.75001,37.16671],[141.00832,37.16666],[141.00837,37.0917],[140.98331,37.05828],[140.98333,36.95834],[140.90834,36.90002],[140.81672,36.89999],[140.80828,36.87498],[140.80833,36.85],[140.81655,36.85004],[140.81669,36.8415],[140.81669,36.81816],[140.79988,36.80832],[140.7834,36.79992],[140.775,36.79523],[140.77498,36.78339],[140.75836,36.775],[140.75825,36.75837],[140.75002,36.75831],[140.74689,36.71939],[140.73336,36.65048],[140.69167,36.58337],[140.65003,36.51336],[140.64998,36.38351],[140.59986,36.27483],[140.57499,36.24796],[140.57463,36.21729],[140.31656,36.21656]],[[141.2166,41.24992],[141.41662,41.24971],[141.39858,41.17052],[141.40426,41.0968],[141.39503,41.04046],[141.39858,40.97185],[141.40625,40.91003],[141.41136,40.83011],[141.41307,40.80204],[141.42245,40.74987],[141.34161,40.75084],[141.3149,40.74556],[141.29203,40.74169],[141.23322,40.7419],[141.23307,40.85837],[141.25026,40.85858],[141.24941,40.91647],[141.17412,40.9169],[141.22498,40.9948],[141.23819,41.0696],[141.2497,41.1258],[141.27143,41.15875],[141.23336,41.22995],[141.2166,41.24992]],[[141.25854,41.3166],[141.15015,41.31672],[141.1499,41.39163],[141.18877,41.39205],[141.21625,41.37916],[141.25849,41.36012],[141.25854,41.3166]],[[141.05841,45.2584],[141.03453,45.25833],[141.00874,45.25815],[141.0083,45.27495],[140.99994,45.27495],[141.00002,45.30371],[140.99999,45.30828],[140.99196,45.30846],[140.99171,45.34162],[140.98351,45.34172],[140.98336,45.34998],[140.97477,45.35008],[140.97502,45.3667],[140.96664,45.36675],[140.96685,45.39818],[140.9665,45.42499],[140.9584,45.42484],[140.95816,45.43314],[140.95012,45.4335],[140.94967,45.51651],[140.97443,45.51672],[140.97448,45.50014],[140.98307,45.50042],[140.98332,45.46697],[140.99045,45.46704],[140.99135,45.45876],[141.00019,45.45813],[141.00035,45.45002],[141.01627,45.4502],[141.01637,45.47496],[141.04992,45.47532],[141.04992,45.46676],[141.06614,45.46679],[141.0665,45.4502],[141.07463,45.44999],[141.07498,45.34178],[141.0666,45.34168],[141.06418,45.30611],[141.06644,45.30565],[141.06629,45.28484],[141.05906,45.28357],[141.05841,45.2584]],[[144.27488,42.96671],[144.27502,42.99155],[144.25861,42.99145],[144.25805,42.98314],[144.20818,42.98319],[144.20854,42.97472],[144.16684,42.97503],[144.16684,43.00496],[144.16642,43.04178],[144.07486,43.04188],[144.07493,43.10025],[144.24988,43.1],[144.24988,43.1168],[144.29179,43.11675],[144.292,43.0919],[144.4168,43.09185],[144.4168,43.1168],[144.56654,43.1168],[144.56675,42.99171],[144.50005,42.9915],[144.5002,42.92481],[144.46653,42.92501],[144.31739,42.96675],[144.27488,42.96671]],[[140.69973,42.57513],[140.70015,42.61647],[140.84451,42.61673],[140.99961,42.61669],[141.00006,42.54168],[141.24984,42.54168],[141.24994,42.58336],[141.29163,42.58332],[141.29158,42.6251],[141.37501,42.62498],[141.37501,42.66662],[141.49992,42.66666],[141.49992,42.8165],[141.47496,42.8165],[141.47511,42.83341],[141.81236,42.83357],[141.95752,42.83328],[141.94355,42.77977],[141.95762,42.77896],[141.95832,42.7502],[141.99991,42.75086],[141.9992,42.71493],[142.00031,42.67632],[142.01799,42.65076],[142.09082,42.65002],[142.09122,42.5251],[142.02472,42.5251],[141.96033,42.52495],[141.8665,42.52518],[141.8656,42.57713],[141.83577,42.58519],[141.80482,42.57417],[141.74646,42.57705],[141.73069,42.61477],[141.61707,42.61055],[141.52134,42.60331],[141.45615,42.57587],[141.3562,42.52866],[141.27523,42.48822],[141.19507,42.43791],[141.10476,42.3914],[141.05393,42.33165],[141.0254,42.29161],[140.95187,42.29146],[140.9147,42.32682],[140.89451,42.37174],[140.88426,42.42723],[140.85041,42.46096],[140.76643,42.49978],[140.76663,42.52821],[140.69973,42.57513]],[[140.75005,43.23374],[140.82762,43.2135],[140.88245,43.22531],[140.97338,43.24601],[141.02139,43.24311],[141.04213,43.20211],[141.08346,43.18205],[141.17267,43.16382],[141.25678,43.19366],[141.37528,43.33327],[141.62491,43.33335],[141.62451,43.4168],[141.79146,43.4168],[141.79197,43.83339],[142.12487,43.83332],[142.12487,43.75022],[142.16656,43.74993],[142.16656,43.83317],[142.24954,43.83325],[142.24984,43.8581],[142.27465,43.8581],[142.27465,43.87425],[142.26671,43.8749],[142.26651,43.91688],[142.24994,43.9171],[142.25001,44.5],[142.49997,44.50013],[142.49977,43.88366],[142.51674,43.88344],[142.51644,43.83346],[142.62473,43.83346],[142.62473,43.58331],[142.54176,43.58403],[142.54196,43.50008],[142.50057,43.50022],[142.50037,43.25006],[142.25054,43.25014],[142.25004,43.45838],[142.00031,43.45816],[142.00001,43.41724],[141.91703,43.41688],[141.91703,43.33342],[141.87494,43.33327],[141.87454,43.17487],[141.93351,43.17473],[141.93391,43.15868],[141.99137,43.15802],[141.99207,43.1334],[141.87524,43.13332],[141.87484,43.00012],[141.49984,43.00027],[141.50015,42.91683],[141.25021,42.91631],[141.25001,42.9999],[141.12505,43.00005],[141.12525,43.08323],[140.99988,43.0836],[141.00008,43.16638],[140.75086,43.1666],[140.75005,43.23374]],[[140.59121,41.78353],[140.58382,41.8334],[140.58453,41.87732],[140.59092,41.91613],[140.60797,41.94403],[140.57544,41.95914],[140.58439,41.99979],[140.7104,42.00011],[140.86894,42.00011],[140.91724,42.00053],[140.99041,41.91909],[141.04737,41.90693],[141.12722,41.88398],[141.17552,41.83732],[141.20194,41.81488],[141.18418,41.78321],[141.11301,41.76711],[141.05689,41.71559],[140.99382,41.69968],[140.94267,41.70414],[140.89238,41.73563],[140.84806,41.74326],[140.80018,41.75672],[140.73299,41.74634],[140.69705,41.73234],[140.6881,41.76986],[140.59121,41.78353]],[[140.2418,42.2338],[140.24159,42.25827],[140.21005,42.25797],[140.20804,42.27485],[140.26611,42.27514],[140.2651,42.29179],[140.29001,42.2912],[140.29182,42.26779],[140.33914,42.24139],[140.34145,42.21662],[140.29323,42.21662],[140.2418,42.2338]],[[140.55007,42.08447],[140.54977,42.11387],[140.58066,42.11193],[140.62636,42.12069],[140.63365,42.12136],[140.6336,42.10061],[140.60853,42.09964],[140.60848,42.08327],[140.54972,42.08312],[140.55007,42.08447]],[[140.6583,41.06668],[140.67117,40.91974],[140.84492,40.91652],[140.91726,40.91688],[140.91712,40.87597],[140.9846,40.87533],[140.98503,40.79278],[141.13391,40.79192],[141.13972,40.68034],[141.17424,40.68174],[141.18504,40.60057],[141.43351,40.60078],[141.43308,40.51757],[141.18305,40.51649],[141.18362,40.58223],[141.16714,40.59172],[141.04397,40.59237],[141.04283,40.65825],[140.98402,40.65836],[140.72646,40.65857],[140.72589,40.57521],[140.66849,40.57467],[140.60883,40.57489],[140.60925,40.48311],[140.55058,40.483],[140.54888,40.51757],[140.40028,40.51692],[140.40013,40.5832],[140.25665,40.58233],[140.24898,40.63292],[140.33251,40.63292],[140.33251,40.66687],[140.41676,40.66698],[140.41704,40.73311],[140.33194,40.73375],[140.33351,40.75851],[140.28421,40.75818],[140.28037,40.85679],[140.30254,40.98507],[140.31845,41.00019],[140.42443,41.0004],[140.42443,40.90029],[140.55044,40.89975],[140.54994,41.06668],[140.6583,41.06668]],[[140.01669,40.33381],[140.25252,40.33381],[140.25006,39.33298],[139.98341,39.3332],[140.05622,39.72433],[140.00614,39.77043],[139.94073,39.88023],[139.94158,40.01081],[139.94055,40.08509],[139.94116,40.10876],[140.01669,40.33381]],[[139.85814,39.04176],[139.87552,39.04137],[139.87703,39.00009],[139.91671,39.00001],[139.9167,38.79173],[139.75493,38.79165],[139.7502,38.79386],[139.79376,38.89687],[139.79014,38.9254],[139.83615,38.99102],[139.85814,39.04176]],[[139.37551,38.1174],[139.38053,37.95893],[139.417,37.95845],[139.417,37.87413],[139.37571,37.8746],[139.37611,37.83296],[139.29234,37.83145],[139.30007,37.78074],[139.29173,37.68357],[139.29193,37.66473],[139.22935,37.6594],[139.18113,37.61024],[139.14537,37.60769],[139.12367,37.62671],[139.09816,37.65018],[139.08831,37.6664],[138.99951,37.66656],[138.99942,37.79171],[138.81261,37.79199],[138.86834,37.84689],[138.9915,37.91333],[139.08231,37.9775],[139.27679,38.03417],[139.37551,38.1174]],[[139.96008,38.49993],[140.50033,38.50009],[140.50023,38.16654],[140.37496,38.16654],[140.37536,38.08348],[140.2504,38.08293],[140.21705,38.07407],[140.22136,38.0422],[140.2512,38.04196],[140.2504,38.00017],[140.23372,37.99962],[140.23352,37.94197],[140.20861,37.9411],[140.20841,37.90013],[140.19253,37.89965],[140.19123,37.88372],[140.15838,37.883],[140.15828,37.85811],[140.0753,37.85945],[140.0741,37.87476],[140.05019,37.87571],[140.05019,37.89252],[140.05762,37.89355],[140.05813,37.92541],[140.0741,37.92573],[140.0742,37.94197],[140.09871,37.95369],[140.09821,37.99234],[140.10182,38.00041],[140.12282,38.00081],[140.11549,38.01806],[140.08977,38.02795],[140.0747,38.04133],[140.06727,38.03492],[140.06707,37.99186],[140.01634,37.9917],[140.01584,38.066],[139.99805,38.06656],[139.99966,38.13739],[139.99956,38.17514],[139.99795,38.3337],[139.95787,38.33378],[139.95837,38.50028],[139.96008,38.49993]],[[140.70822,38.7833],[140.70837,39.15023],[141.04194,39.14957],[141.04167,39.50008],[141.00147,39.49986],[140.99893,39.91638],[141.25077,39.91692],[141.25037,39.5007],[141.16709,39.50008],[141.16699,39.45627],[141.16669,39.40273],[141.16689,39.25073],[141.20798,39.24996],[141.20898,38.87471],[141.03399,38.8751],[141.03339,38.78354],[140.86794,38.78315],[140.70822,38.7833]],[[141.3759,38.36972],[141.37476,38.49992],[141.24904,38.50025],[141.25134,38.66886],[141.52524,38.66653],[141.54981,38.63369],[141.55052,38.55563],[141.55549,38.47938],[141.56558,38.39559],[141.54626,38.37398],[141.55919,38.32429],[141.59854,38.31226],[141.59527,38.26063],[141.50762,38.23664],[141.46983,38.24479],[141.39226,38.27725],[141.41158,38.34781],[141.3759,38.36972]],[[131.04175,33.7381],[131.0413,33.70887],[130.99956,33.70858],[131.00035,33.68392],[131.04959,33.68392],[131.05014,33.64171],[131.0751,33.64201],[131.07588,33.61683],[131.10039,33.61666],[131.10084,33.60082],[131.17448,33.60007],[131.19999,33.58422],[131.20066,33.55868],[131.2405,33.55868],[131.28258,33.54207],[131.33137,33.52528],[131.41821,33.55065],[131.51625,33.55084],[131.51692,33.5667],[131.63353,33.56688],[131.63308,33.47545],[131.7423,33.47452],[131.74946,33.45939],[131.75014,33.33289],[131.60756,33.33401],[131.60801,33.37421],[131.52565,33.37458],[131.52467,33.26691],[131.5769,33.25843],[131.64942,33.28332],[131.71634,33.28388],[131.77497,33.26687],[131.78385,33.25028],[131.83291,33.25015],[131.88403,33.2745],[131.90825,33.2749],[131.90809,33.25849],[131.87517,33.20607],[131.84985,33.18276],[131.85032,33.14964],[131.87525,33.15038],[131.90777,33.14129],[131.9171,33.13332],[131.91733,33.10858],[131.9505,33.09967],[131.95019,33.08349],[131.98279,33.08336],[131.98279,33.10007],[132.00036,33.1169],[132.0252,33.1169],[132.02473,33.0998],[132.00843,33.09172],[132.00843,33.06718],[132.01745,33.06705],[132.01715,33.04988],[131.99181,33.04211],[131.92518,33.04092],[131.9255,33.025],[131.95003,33.025],[131.95045,33.01347],[131.95034,32.97482],[131.98326,32.97536],[131.98492,32.95941],[132.0261,32.95922],[132.05828,32.95862],[132.05844,32.99142],[132.07198,32.9917],[132.08297,32.98332],[132.09168,32.92635],[132.02473,32.92542],[132.02473,32.90058],[132.03349,32.88294],[132.00795,32.88357],[131.98326,32.85871],[131.99988,32.8498],[132.01715,32.8429],[132.01603,32.82654],[131.97551,32.78396],[131.93411,32.76746],[131.8992,32.76614],[131.89179,32.71661],[131.83317,32.6507],[131.78369,32.64894],[131.78415,32.58396],[131.74185,32.58283],[131.7082,32.56669],[131.70773,32.54294],[131.74159,32.50852],[131.74141,32.45129],[131.70804,32.44216],[131.70112,32.40878],[131.65787,32.39219],[131.64226,32.33355],[131.59948,32.27572],[131.57492,32.18338],[131.54184,32.08474],[131.542,32.00009],[131.49975,32.00023],[131.50038,31.74971],[131.4586,31.75011],[131.45876,31.79182],[131.24969,31.79169],[131.24969,32.16704],[131.37488,32.16717],[131.37504,32.25046],[131.49991,32.25019],[131.49991,32.33341],[131.54137,32.33341],[131.54167,32.62506],[131.66645,32.62515],[131.66633,32.66662],[131.74993,32.66652],[131.75006,32.91664],[131.5977,32.91688],[131.25044,32.91663],[131.24902,33.00042],[131.49971,33.00002],[131.49987,33.06345],[131.50018,33.13915],[131.4804,33.16631],[131.284,33.16618],[131.26706,33.20035],[131.26627,33.25039],[131.29966,33.26985],[131.29951,33.31999],[131.24427,33.34114],[131.17511,33.34154],[131.17527,33.35806],[131.07525,33.35806],[131.07572,33.33347],[131.00055,33.33321],[131.00007,33.2496],[130.91445,33.2496],[130.7497,33.25013],[130.7497,33.08374],[130.62546,33.08321],[130.62546,33.00002],[130.72796,33.00171],[130.87492,33.00018],[130.8753,32.79131],[130.96677,32.79185],[130.96709,32.85808],[130.92531,32.85781],[130.92531,32.95029],[130.96679,32.95831],[131.00012,32.91683],[131.00017,32.50007],[130.66647,32.50046],[130.66669,32.33306],[130.62506,32.33306],[130.62461,32.24943],[130.49972,32.25037],[130.50039,32.12517],[130.33275,32.12498],[130.3437,32.16133],[130.34954,32.20815],[130.42748,32.29423],[130.46637,32.40054],[130.4939,32.40073],[130.523,32.43304],[130.54941,32.44456],[130.54986,32.4659],[130.48383,32.46647],[130.47421,32.47535],[130.4751,32.50064],[130.5089,32.54197],[130.62439,32.62571],[130.62484,32.6666],[130.52569,32.66679],[130.52524,32.68337],[130.55859,32.71671],[130.55903,32.7745],[130.57493,32.78372],[130.57493,32.82172],[130.50935,32.84185],[130.50778,32.86986],[130.44155,32.89158],[130.41624,32.94258],[130.41579,32.97488],[130.37438,33.00098],[130.37528,33.08315],[130.24927,33.08372],[130.24905,33.16076],[130.15863,33.09741],[130.17775,33.07174],[130.18369,33.06684],[130.18369,33.03401],[130.19958,33.025],[130.19977,33.00001],[130.12479,33.00001],[130.12457,32.96678],[130.0409,32.9407],[130.02501,32.94164],[130.02456,32.91647],[130.12457,32.9172],[130.12457,32.86739],[130.15031,32.86683],[130.19578,32.8661],[130.23334,32.89183],[130.29198,32.89183],[130.29243,32.84991],[130.29153,32.7916],[130.2922,32.71725],[130.18343,32.65791],[130.15034,32.65002],[130.11539,32.64962],[130.11744,32.70014],[130.15903,32.71706],[130.24856,32.75867],[130.24968,32.79085],[130.1333,32.79235],[130.12569,32.76751],[130.00147,32.74963],[129.9294,32.67317],[129.80048,32.57459],[129.80003,32.54704],[129.77425,32.54749],[129.71767,32.54987],[129.71632,32.59043],[129.7499,32.67487],[129.75012,32.72459],[129.80025,32.72553],[129.74161,32.77523],[129.62411,32.8501],[129.62646,32.91787],[129.83159,32.91738],[129.87121,32.91644],[129.89269,32.94105],[129.93343,33.00827],[129.967,33.07469],[130.05809,33.12025],[130.05876,33.21693],[130.24946,33.21674],[130.2499,33.33331],[130.21566,33.3335],[130.0422,33.33331],[129.92559,33.33294],[129.90836,33.35837],[129.90791,33.38304],[129.86695,33.38285],[129.86697,33.36012],[129.83338,33.34079],[129.80093,33.34098],[129.80003,33.31592],[129.75057,33.31686],[129.75034,33.27533],[129.72572,33.27477],[129.6917,33.30807],[129.69237,33.25025],[129.87479,33.25025],[129.8759,33.21299],[129.87521,33.11856],[129.87523,33.03323],[129.80831,33.03305],[129.7499,33.05031],[129.734,33.058],[129.72658,33.08172],[129.69842,33.09982],[129.62413,33.09928],[129.62374,33.12377],[129.62501,33.24201],[129.59255,33.24108],[129.59255,33.29928],[129.54197,33.3004],[129.50012,33.31761],[129.49989,33.41686],[129.59949,33.41593],[129.66753,33.40864],[129.66775,33.43274],[129.8336,33.56656],[129.93208,33.56787],[129.93522,33.40827],[130.04131,33.3836],[130.04108,33.48428],[130.24901,33.48465],[130.25057,33.61681],[130.28504,33.63405],[130.28303,33.69151],[130.30888,33.69151],[130.32365,33.66712],[130.39225,33.69179],[130.41777,33.72484],[130.43388,33.77546],[130.39024,33.87047],[130.39113,33.92509],[130.50774,33.92621],[130.60555,33.89166],[130.66665,33.9496],[130.74991,34.00844],[130.84973,34.00825],[130.8504,34.14155],[130.88308,34.19192],[130.85801,34.27519],[130.83228,34.36706],[130.97127,34.45052],[131.08608,34.43336],[131.19307,34.44166],[131.29356,34.44092],[131.36518,34.44591],[131.37548,34.5328],[131.44934,34.55013],[131.57445,34.69176],[131.62526,34.69158],[131.78596,34.70078],[131.86989,34.77435],[131.99545,34.88146],[132.37594,35.16739],[132.74972,35.16684],[132.75084,35.08318],[132.6255,35.08337],[132.62505,34.91671],[132.3755,34.91689],[132.37527,34.83426],[132.12482,34.83298],[132.12482,34.75008],[132.00038,34.7499],[132.00038,34.5833],[131.74989,34.58326],[131.75139,34.37954],[131.75147,34.1671],[132.12497,34.16683],[132.12481,34.2914],[132.25016,34.29193],[132.24929,34.40917],[132.25016,34.49983],[132.37249,34.49996],[132.37503,34.58339],[132.49167,34.58339],[132.49182,34.70831],[132.59177,34.70824],[132.58365,34.5417],[132.84148,34.54133],[132.84193,34.66623],[133.08343,34.66678],[133.08365,34.76631],[133.20743,34.76687],[133.20787,34.66678],[133.49973,34.66642],[133.50026,34.83314],[133.7012,34.83357],[133.69941,34.87526],[133.74984,34.87535],[133.74984,34.9999],[133.8751,35.00003],[133.87518,35.12504],[133.97425,35.12517],[133.97546,35.00097],[134.0585,34.99997],[134.05816,35.07464],[134.16654,35.0748],[134.1667,35.00016],[134.75338,35.00016],[134.83324,34.99997],[134.8333,35.04176],[135.24494,35.04176],[135.37472,35.04153],[135.37535,35.0836],[135.74948,35.08335],[135.75066,35.25004],[135.87474,35.2503],[135.87529,35.33388],[136.00001,35.33356],[136.00024,35.2587],[135.98331,35.24255],[135.93361,35.20027],[135.93306,35.1667],[135.97539,35.16664],[135.97523,35.15597],[136.04993,35.15829],[136.04993,35.21663],[136.05895,35.22484],[136.12455,35.23344],[136.12536,35.25011],[136.16667,35.24997],[136.16651,35.36441],[136.16664,35.45873],[136.33347,35.45857],[136.37478,35.33382],[136.49981,35.33356],[136.49965,35.49981],[136.74991,35.58365],[137.00003,35.58344],[136.99984,35.41254],[136.99999,35.33351],[137.24995,35.33357],[137.24998,34.91665],[137.6249,34.91658],[137.62516,35.00034],[137.69186,35.00052],[137.69182,35.06711],[137.74199,35.06668],[137.74222,35.10789],[137.77489,35.10844],[137.77474,35.15015],[138.16671,35.15021],[138.16666,35.2918],[138.38224,35.29138],[138.50029,35.29187],[138.50119,35.33333],[138.38256,35.33369],[138.38319,35.44169],[138.49985,35.44208],[138.49988,35.4584],[138.66644,35.45855],[138.66704,35.37476],[138.70818,35.37519],[138.70818,35.33348],[138.8334,35.33357],[138.83329,35.40832],[139.0082,35.40836],[139.00858,35.39192],[139.1243,35.39228],[139.12498,35.41668],[139.25001,35.41667],[139.24995,35.49996],[139.12487,35.50005],[139.12492,35.5833],[138.99999,35.58333],[138.99999,35.6667],[139.1249,35.66678],[139.12504,35.8092],[139.12474,35.91713],[139.00053,35.91713],[139.00006,36.00001],[139.12492,36.00012],[139.12547,36.11894],[139.12495,36.16664],[139,36.16668],[138.99941,36.25031],[138.95831,36.25002],[138.95822,36.29127],[138.91663,36.29166],[138.91678,36.37496],[138.95845,36.37565],[138.95836,36.45832],[139.08379,36.45868],[139.08334,36.5],[139.25009,36.50012],[139.2496,36.54136],[139.37464,36.54189],[139.37505,36.62499],[139.45022,36.62528],[139.44999,36.66667],[139.66374,36.66671],[139.75002,36.66665],[139.75005,36.75003],[140,36.75001],[139.99998,36.62209],[140.00001,36.41668],[140.25001,36.41666],[140.24999,36.04158],[140.50004,36.04158],[140.49989,35.83349],[140.41632,35.83374],[140.4168,35.7919],[140.45874,35.79113],[140.45874,35.72461],[140.51666,35.72486],[140.51691,35.7417],[140.59144,35.74174],[140.5915,35.94177],[140.65002,35.94164],[140.64994,36.00837],[140.67503,36.00834],[140.71403,35.92326],[140.77327,35.83877],[140.81532,35.78508],[140.89133,35.7501],[140.89211,35.71717],[140.86632,35.67853],[140.80694,35.70622],[140.72767,35.6761],[140.68235,35.68891],[140.60194,35.63074],[140.48545,35.54409],[140.4095,35.42897],[140.40816,35.33353],[140.30722,35.33371],[140.30767,35.41748],[140.30946,35.45851],[140.20762,35.45905],[140.20829,35.37478],[140.12503,35.37478],[140.12436,35.33408],[140.29155,35.33316],[140.29245,35.20909],[140.31707,35.20836],[140.31662,35.18422],[140.35042,35.18257],[140.3431,35.13152],[140.23201,35.10096],[140.13697,35.09271],[140.05542,35.03643],[139.98865,34.98849],[139.96379,34.91688],[139.91222,34.88262],[139.82272,34.89218],[139.78337,34.93633],[139.73961,34.95322],[139.7443,34.99303],[139.81476,35.00932],[139.7963,35.05283],[139.80169,35.09108],[139.80766,35.1529],[139.80866,35.19667],[139.85153,35.24127],[139.8325,35.29189],[139.74927,35.2961],[139.76149,35.33517],[139.79232,35.35267],[139.81035,35.49933],[140.0035,35.49988],[140.03349,35.53668],[140.06639,35.58384],[139.79714,35.58311],[139.80005,35.50079],[139.77087,35.47343],[139.70992,35.44207],[139.6987,35.40282],[139.66887,35.36715],[139.68478,35.30781],[139.73549,35.2728],[139.75069,35.25934],[139.73734,35.23092],[139.74388,35.20852],[139.69714,35.18971],[139.67426,35.1702],[139.68932,35.15394],[139.68151,35.13477],[139.62355,35.12199],[139.59783,35.1285],[139.60224,35.17253],[139.58363,35.18959],[139.59033,35.24164],[139.5496,35.28403],[139.49879,35.30084],[139.42314,35.30942],[139.29131,35.30066],[139.23074,35.27778],[139.15546,35.23542],[139.15031,35.17507],[139.16665,35.13316],[139.12502,35.13298],[139.09436,35.13335],[139.05832,35.13316],[139.05671,35.00443],[139.03348,34.98385],[138.99968,34.98367],[139.00057,34.88274],[139.14136,34.88348],[139.11002,34.84602],[139.08129,34.79529],[139.01691,34.74107],[138.9999,34.64151],[138.90044,34.6097],[138.87367,34.59159],[138.80026,34.59988],[138.75773,34.65881],[138.72528,34.67575],[138.72528,34.72506],[138.83316,34.72598],[138.83383,34.74952],[138.7419,34.75106],[138.7338,34.8136],[138.74985,34.90057],[138.76065,34.93773],[138.75028,34.98313],[138.77855,35.04352],[138.87546,35.03316],[138.87703,35.04929],[138.85845,35.04984],[138.76804,35.12107],[138.68294,35.12223],[138.61873,35.09015],[138.55409,35.05201],[138.54926,34.99442],[138.49996,34.95392],[138.39142,34.91129],[138.35562,34.86759],[138.33929,34.80042],[138.27635,34.72246],[138.24467,34.66616],[138.24396,34.58503],[138.12662,34.58573],[138.01467,34.62561],[137.88184,34.65541],[137.79532,34.63718],[137.68991,34.65307],[137.57654,34.66441],[137.38135,34.64618],[137.18402,34.58409],[137.03187,34.5662],[137.00794,34.57573],[137.0254,34.61792],[137.0599,34.66613],[137.17517,34.66686],[137.30767,34.75996],[137.29894,34.77595],[137.29088,34.79231],[137.25037,34.79213],[137.21635,34.76768],[137.15816,34.74911],[137.08318,34.75076],[137.03215,34.76345],[136.94061,34.80848],[136.93456,34.77522],[136.98335,34.72575],[137.06751,34.74212],[137.06773,34.70183],[137.02454,34.70809],[137.01581,34.64937],[136.98179,34.65029],[136.82601,34.74911],[136.84884,34.82319],[136.79266,34.82521],[136.79132,35.00048],[136.75081,35.00012],[136.74991,34.95849],[136.68277,34.96069],[136.6624,34.89701],[136.59078,34.80003],[136.53863,34.72704],[136.58294,34.62506],[136.75682,34.54181],[136.85798,34.54126],[136.93945,34.54347],[136.91675,34.49231],[136.94081,34.46687],[136.94113,34.40866],[136.92404,34.35876],[136.90742,34.30209],[136.90045,34.2666],[136.84981,34.23416],[136.81693,34.1923],[136.79948,34.19254],[136.79996,34.22906],[136.74203,34.25863],[136.73325,34.28285],[136.70896,34.28334],[136.64264,34.25902],[136.5594,34.22605],[136.53564,34.22167],[136.50068,34.20864],[136.44007,34.20053],[136.38325,34.16675],[136.3334,34.14802],[136.31583,34.08487],[136.2674,34.08316],[136.12497,34.08343],[136.12449,34.16688],[136.24968,34.16688],[136.24984,34.25012],[136.37486,34.25025],[136.37468,34.33331],[136.50021,34.33302],[136.49973,34.49192],[136.45843,34.49127],[136.45811,34.5416],[136.4168,34.54186],[136.41664,34.62516],[136.37494,34.62464],[136.37469,34.68106],[136.37485,34.74974],[136.33402,34.75026],[136.33354,34.79109],[136.37485,34.79213],[136.37533,34.95858],[136.33323,34.95858],[136.33323,34.83345],[136.29239,34.83371],[136.29208,34.792],[136.24966,34.79213],[136.24998,34.70838],[136.29192,34.70851],[136.2916,34.62475],[136.12487,34.62512],[136.12498,34.66674],[136.04161,34.66655],[136.04094,34.7499],[136.00023,34.75009],[135.99991,34.65993],[135.99975,34.58387],[136.04153,34.58374],[136.04185,34.50017],[136.04989,34.49997],[136.05005,34.42503],[135.91674,34.425],[135.91667,34.35836],[135.81665,34.35837],[135.81661,34.31668],[135.74991,34.31672],[135.75007,34.29167],[135.64152,34.29176],[135.64186,34.27512],[135.53325,34.27489],[135.53348,34.25834],[135.475,34.25834],[135.47511,34.22498],[135.37507,34.22512],[135.3749,34.20814],[135.50001,34.20837],[135.50001,33.66652],[135.87502,33.66661],[135.87558,33.74983],[136.03371,33.75021],[136.01272,33.71062],[135.99681,33.67327],[135.97948,33.63389],[135.97195,33.61271],[135.95831,33.56798],[135.85332,33.50522],[135.85353,33.48302],[135.87591,33.4814],[135.86057,33.44051],[135.77718,33.42558],[135.7418,33.42534],[135.74163,33.4665],[135.68498,33.47915],[135.59008,33.49633],[135.47373,33.52819],[135.3902,33.5752],[135.37485,33.61633],[135.37533,33.64967],[135.33371,33.6498],[135.32468,33.66653],[135.45794,33.66666],[135.45842,33.74987],[135.41727,33.75],[135.41663,33.78802],[135.41743,33.83273],[135.37517,33.83326],[135.37517,33.79171],[135.3284,33.78999],[135.28777,33.75622],[135.21503,33.7698],[135.14371,33.85113],[135.12013,33.87826],[135.05776,33.87991],[135.05947,33.96479],[135.07709,34.00837],[135.11345,34.05029],[135.06515,34.06759],[135.07041,34.121],[135.15522,34.16286],[135.1163,34.18742],[135.06316,34.25849],[135.04915,34.27082],[134.99554,34.27152],[134.9955,34.29122],[134.99945,34.29894],[135.00904,34.30357],[135.1457,34.34721],[135.20804,34.35108],[135.24174,34.39165],[135.19145,34.42482],[135.25012,34.46056],[135.29487,34.42658],[135.30902,34.44119],[135.36647,34.53277],[135.39147,34.53394],[135.38308,34.63128],[135.36409,34.66669],[135.29161,34.66695],[135.29061,34.6245],[135.08349,34.62463],[135.04725,34.61643],[134.92905,34.64799],[134.826,34.69662],[134.75874,34.74267],[134.71632,34.74982],[134.52561,34.74969],[134.41657,34.70885],[134.31671,34.66669],[134.25055,34.66656],[134.24992,34.68309],[134.15797,34.68348],[134.15781,34.70013],[134.12505,34.7],[134.12474,34.58386],[134.11666,34.55845],[134.02519,34.55024],[134.02535,34.44785],[134.02788,34.41639],[134.19168,34.41678],[134.19152,34.38401],[134.28347,34.38296],[134.28347,34.33371],[134.38082,34.29415],[134.40952,34.26539],[134.43268,34.24648],[134.56265,34.25055],[134.66663,34.24963],[134.64146,34.04963],[134.70809,33.96554],[134.74006,33.92825],[134.71221,33.86773],[134.76918,33.86691],[134.76712,33.82524],[134.66742,33.7754],[134.63102,33.77487],[134.50018,33.77493],[134.49978,33.95855],[134.4582,33.95874],[134.45816,34.00006],[134.34679,33.99889],[134.06047,33.99988],[133.74955,34.00047],[133.74998,34.33337],[133.875,34.33342],[133.87494,34.41668],[133.95888,34.41683],[133.95843,34.44157],[133.85055,34.44157],[133.84966,34.46621],[133.82537,34.46704],[133.81642,34.44222],[133.84205,34.43326],[133.84194,34.41656],[133.75822,34.41715],[133.74122,34.44175],[133.6913,34.44152],[133.69085,34.45739],[133.69097,34.46639],[133.70004,34.48346],[133.61655,34.48355],[133.61689,34.45827],[133.53351,34.45887],[133.53329,34.41752],[133.4897,34.41743],[133.46642,34.43313],[133.46631,34.44992],[133.4503,34.45002],[133.45008,34.4166],[133.41713,34.41696],[133.41668,34.35786],[133.34174,34.3583],[133.30304,34.37515],[133.2748,34.35876],[133.21655,34.35],[133.16694,34.35007],[133.16662,34.36659],[133.09184,34.36659],[133.09176,34.3417],[133.05837,34.34164],[133.05829,34.32491],[132.90003,34.32517],[132.89148,34.29164],[132.7917,34.29164],[132.79133,34.28281],[132.792,34.24212],[132.77492,34.22513],[132.71629,34.22499],[132.71652,34.21655],[132.75854,34.21636],[132.775,34.20877],[132.79218,34.20095],[132.79223,34.14177],[132.74138,34.14173],[132.70838,34.16655],[132.63354,34.16665],[132.61664,34.1917],[132.59185,34.1916],[132.5749,34.1666],[132.54155,34.16674],[132.54178,34.14196],[132.42515,34.14165],[132.42503,34.16657],[132.3749,34.16663],[132.37515,34.18348],[132.40833,34.18343],[132.3752,34.2168],[132.34991,34.23331],[132.35014,34.25834],[132.35814,34.25843],[132.35819,34.27503],[132.33922,34.25834],[132.29166,34.22494],[132.24992,34.22494],[132.25003,34.2043],[132.25809,34.18324],[132.28327,34.18352],[132.28321,34.19995],[132.29183,34.20837],[132.32501,34.20847],[132.31684,34.1753],[132.25843,34.17533],[132.25843,34.14171],[132.2502,34.11675],[132.21669,34.11684],[132.21685,34.0585],[132.22491,34.05827],[132.22502,33.99163],[132.21669,33.99177],[132.21652,33.97516],[132.25037,33.97526],[132.25014,33.91622],[131.95761,33.91733],[131.95783,33.92512],[131.91755,33.92495],[131.91586,33.95863],[131.88699,33.96671],[131.87569,33.95891],[131.84973,33.92502],[131.80049,33.92439],[131.79948,33.95046],[131.7752,33.95057],[131.75058,33.9668],[131.70828,33.97508],[131.70918,33.92551],[131.68366,33.92513],[131.68321,33.95056],[131.6916,33.96717],[131.69988,33.98323],[131.68332,33.99937],[131.68354,34.01681],[131.69999,34.017],[131.70011,34.03314],[131.68209,34.03352],[131.67515,34.02581],[131.62513,34.02488],[131.59122,33.97515],[131.38721,33.97497],[131.29981,33.91685],[131.16675,33.91667],[131.1172,33.97473],[131.06078,34.02462],[131.03349,34.02557],[131.04198,34.00848],[131.04175,33.7381]],[[135.98583,35.86595],[135.93905,35.95517],[135.95723,36.1316],[136.15271,36.29666],[136.6596,36.75695],[136.65846,37.00603],[136.66642,37.33477],[136.85167,37.42328],[137.11307,37.5288],[137.31877,37.54953],[137.39151,37.50356],[137.34765,37.35791],[137.20218,37.24762],[137.09307,37.06828],[137.0223,36.83795],[137.09532,36.80133],[137.22971,36.77368],[137.35387,36.80451],[137.39706,36.90966],[137.50588,36.95883],[137.72267,37.01579],[137.95199,37.10656],[138.053,37.16975],[138.18626,37.18254],[138.28854,37.24861],[138.43501,37.34512],[138.54909,37.41229],[138.61842,37.49225],[138.73903,37.51536],[138.78378,37.5674],[138.82185,37.62796],[138.91491,37.63009],[138.924,37.6032],[139.01321,37.59757],[139.01421,37.53507],[139.03452,37.52325],[139.03793,37.45798],[139.04887,37.42358],[139.13027,37.42312],[139.23881,37.4326],[139.26282,37.33326],[139.12289,37.32784],[139.11408,37.26354],[139.11422,37.16748],[139.05555,37.16658],[138.82825,37.17133],[138.87072,37.2338],[138.89104,37.31316],[138.72965,37.33259],[138.71403,37.29474],[138.71715,37.1642],[138.53517,37.16533],[138.39907,37.16692],[138.37478,37.13261],[138.3725,36.99907],[138.08823,36.99839],[138.08596,36.91586],[137.89233,36.91768],[137.87798,36.83517],[137.66517,36.8321],[137.52111,36.83142],[137.51216,36.74222],[137.39482,36.74427],[137.37138,36.58325],[137.29367,36.58371],[137.18016,36.55028],[137.21383,36.53133],[137.26384,36.33176],[136.63321,36.33496],[136.50436,36.29227],[136.39412,36.29444],[136.38034,36.25493],[136.37778,36.17665],[136.38218,36.09507],[136.38758,36.00065],[136.2593,35.99399],[136.25532,35.90923],[136.24992,35.83337],[136.12207,35.82876],[136.11184,35.88725],[136.05984,35.91165],[136.01793,35.86676],[135.98583,35.86595]],[[140.03281,37.29986],[140.03344,37.34643],[140.03344,37.47427],[140.03407,37.48281],[139.99973,37.48356],[140.00036,37.44198],[139.94212,37.44173],[139.94197,37.35007],[139.89116,37.35007],[139.89116,37.41698],[139.81725,37.41647],[139.81266,37.57468],[139.74192,37.57556],[139.74224,37.79174],[139.81789,37.79162],[139.98296,37.79112],[139.98359,37.58334],[140.0412,37.58334],[140.04151,37.47502],[140.1591,37.47528],[140.15815,37.63311],[140.3745,37.63399],[140.37481,37.83338],[140.5,37.83525],[140.49989,37.91662],[140.53144,37.9168],[140.62489,37.9167],[140.62489,37.84641],[140.62534,37.33359],[140.57502,37.33284],[140.57486,37.25881],[140.4579,37.25855],[140.45774,37.2084],[140.2501,37.20866],[140.24994,37.29998],[140.03281,37.29986]],[[141.00075,38.16707],[140.84264,38.16752],[140.68779,38.16405],[140.70788,38.09499],[140.70868,38.03346],[140.61627,38.03362],[140.53369,38.11364],[140.5359,38.14478],[140.61948,38.14478],[140.62471,38.2048],[140.6231,38.27376],[140.63073,38.33902],[140.81255,38.33698],[141.00362,38.33398],[141.00075,38.16707]],[[129.44454,34.73675],[129.52524,34.65452],[129.35703,34.19046],[129.23088,34.06063],[129.15132,34.11616],[129.27179,34.63488],[129.44454,34.73675]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan"},{id:"gsi.go.jp_std_map",name:"Japan GSI Standard Map",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/std/{zoom}/{x}/{y}.png",zoomExtent:[5,18],polygon:[[[141.85547,44.64912],[140.22949,43.9691],[138.95508,41.80408],[139.48242,40.17887],[138.86719,38.30718],[136.31836,37.19533],[132.14355,35.13788],[128.93555,33.35806],[129.50684,32.4727],[129.77051,31.69078],[130.20996,30.90223],[131.2207,30.78904],[131.66016,32.32428],[132.71484,32.87959],[133.76953,33.17434],[136.75781,33.87042],[139.30664,35.06597],[140.88867,35.17381],[141.15234,36.5626],[142.11914,39.94344],[141.76758,42.68243],[141.85547,44.64912]]],terms_url:"https://maps.gsi.go.jp/help/use.html",terms_text:"GSI Japan"},{id:"Aargau-AGIS-2014",name:"Kanton Aargau 25cm (AGIS 2014)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[8.09602,47.57882],[8.10323,47.57879],[8.10323,47.58583],[8.10591,47.58732],[8.11019,47.58878],[8.11589,47.5893],[8.12168,47.58916],[8.12546,47.58873],[8.12959,47.58888],[8.13023,47.59122],[8.132,47.59358],[8.13506,47.59546],[8.13831,47.59698],[8.14161,47.59939],[8.14534,47.60076],[8.14961,47.60144],[8.15438,47.60127],[8.15751,47.60063],[8.16119,47.59914],[8.16255,47.59976],[8.16438,47.60148],[8.16653,47.60399],[8.17087,47.60673],[8.17608,47.60838],[8.17912,47.60868],[8.18153,47.6118],[8.18304,47.61489],[8.18498,47.6176],[8.18953,47.62151],[8.19212,47.62321],[8.22261,47.623],[8.22561,47.6212],[8.22849,47.61842],[8.22959,47.61621],[8.23008,47.61501],[8.23261,47.61686],[8.23657,47.61803],[8.24,47.61835],[8.24351,47.61783],[8.24749,47.61877],[8.25066,47.61988],[8.25708,47.6208],[8.26104,47.62069],[8.26491,47.61935],[8.26732,47.61769],[8.26902,47.61531],[8.27579,47.61702],[8.28106,47.61707],[8.28772,47.61626],[8.29421,47.61442],[8.29947,47.61221],[8.30311,47.60977],[8.30287,47.59447],[8.30438,47.59227],[8.30591,47.59109],[8.30791,47.59019],[8.31236,47.58917],[8.31655,47.58713],[8.32049,47.58436],[8.32598,47.57888],[8.32864,47.57716],[8.33219,47.57604],[8.33902,47.57577],[8.34702,47.57628],[8.35962,47.57552],[8.36475,47.57436],[8.37207,47.57377],[8.38002,47.57233],[8.38194,47.57496],[8.38387,47.57686],[8.38879,47.58027],[8.39232,47.58174],[8.39611,47.58247],[8.40013,47.58255],[8.40432,47.58158],[8.41158,47.57928],[8.418,47.57602],[8.42381,47.57452],[8.43039,47.57228],[8.43275,47.57035],[8.4336,47.56849],[8.43353,47.56669],[8.4319,47.56444],[8.4286,47.56217],[8.42575,47.56121],[8.4259,47.55854],[8.42498,47.55624],[8.42353,47.55469],[8.42296,47.5537],[8.4246,47.5517],[8.42492,47.54981],[8.42434,47.54836],[8.42539,47.54679],[8.425,47.54418],[8.4233,47.5422],[8.421,47.54106],[8.41832,47.54049],[8.41551,47.54062],[8.4139,47.53924],[8.41283,47.5372],[8.41194,47.53626],[8.41241,47.53415],[8.41185,47.53237],[8.41117,47.53158],[8.40143,47.53169],[8.40124,47.52443],[8.39936,47.5222],[8.39666,47.52082],[8.39385,47.51988],[8.39085,47.51973],[8.38877,47.52014],[8.38809,47.5146],[8.38551,47.51075],[8.38366,47.50944],[8.36776,47.50953],[8.36739,47.48709],[8.3751,47.48689],[8.37889,47.4853],[8.38196,47.48188],[8.38184,47.47521],[8.38328,47.47192],[8.38244,47.46879],[8.37943,47.46643],[8.37751,47.4659],[8.37787,47.46496],[8.38238,47.46423],[8.38671,47.46097],[8.39171,47.45743],[8.39315,47.45349],[8.39514,47.45031],[8.39418,47.44722],[8.39171,47.44535],[8.3896,47.44449],[8.38996,47.44339],[8.39111,47.4416],[8.39213,47.43924],[8.39339,47.4359],[8.39249,47.43411],[8.39369,47.43143],[8.39568,47.42854],[8.39959,47.42463],[8.39953,47.41954],[8.449,47.41897],[8.45369,47.41233],[8.45369,47.40451],[8.44858,47.39649],[8.40362,47.39685],[8.40483,47.39392],[8.4029,47.38903],[8.4035,47.38553],[8.40314,47.38304],[8.40483,47.37905],[8.40844,47.37575],[8.41379,47.37338],[8.4159,47.37016],[8.41584,47.36539],[8.4144,47.36327],[8.41494,47.35912],[8.41722,47.35573],[8.41632,47.35231],[8.41355,47.34913],[8.41367,47.34688],[8.41476,47.3448],[8.41885,47.34244],[8.42264,47.34052],[8.42469,47.33718],[8.42421,47.33163],[8.42914,47.33286],[8.4351,47.33192],[8.43763,47.33281],[8.44328,47.33506],[8.44527,47.33746],[8.45213,47.3402],[8.45761,47.33975],[8.46212,47.33649],[8.46278,47.33322],[8.46043,47.32829],[8.45797,47.32457],[8.45556,47.32005],[8.44918,47.31495],[8.44713,47.31217],[8.44021,47.30948],[8.43624,47.29817],[8.43311,47.29593],[8.42806,47.29397],[8.42318,47.29001],[8.41656,47.28789],[8.41024,47.28728],[8.4035,47.28409],[8.40188,47.2805],[8.40862,47.27593],[8.41066,47.2716],[8.40892,47.26613],[8.41235,47.2618],[8.41235,47.25873],[8.41109,47.25608],[8.41698,47.25142],[8.41885,47.2475],[8.41801,47.24305],[8.4144,47.23904],[8.41373,47.23565],[8.4106,47.23226],[8.40435,47.22797],[8.40296,47.2256],[8.40398,47.22127],[8.40856,47.21718],[8.40928,47.21326],[8.40844,47.20945],[8.41012,47.20258],[8.41319,47.19678],[8.41271,47.1924],[8.4088,47.18799],[8.40814,47.18475],[8.4091,47.1812],[8.41518,47.17915],[8.41915,47.17563],[8.42294,47.16553],[8.42294,47.15747],[8.42011,47.15325],[8.42246,47.14838],[8.42276,47.14392],[8.42053,47.13954],[8.41584,47.13524],[8.40898,47.13274],[8.40386,47.13201],[8.40116,47.13258],[8.39532,47.1327],[8.38437,47.1345],[8.37895,47.13385],[8.37245,47.13442],[8.36908,47.13659],[8.368,47.13876],[8.35656,47.14228],[8.35409,47.14564],[8.35331,47.14916],[8.3506,47.15161],[8.3503,47.15419],[8.34772,47.15669],[8.34561,47.15923],[8.34086,47.16164],[8.33935,47.16512],[8.3373,47.16896],[8.33315,47.17154],[8.33261,47.17351],[8.33062,47.17792],[8.33002,47.18717],[8.32924,47.18786],[8.32936,47.19494],[8.32292,47.19514],[8.32148,47.19854],[8.32196,47.20115],[8.31835,47.21043],[8.31413,47.21178],[8.31089,47.2153],[8.31107,47.21857],[8.31221,47.2198],[8.30884,47.22433],[8.30932,47.22646],[8.30715,47.23042],[8.30727,47.2321],[8.30595,47.23582],[8.30607,47.23949],[8.30378,47.24366],[8.30144,47.24677],[8.29554,47.24836],[8.29187,47.25293],[8.28814,47.25869],[8.28766,47.26143],[8.28627,47.26519],[8.28723,47.26805],[8.28838,47.26964],[8.2823,47.27478],[8.27718,47.27576],[8.27273,47.27531],[8.26749,47.27593],[8.26533,47.27719],[8.2616,47.27695],[8.25793,47.27781],[8.25576,47.27887],[8.25317,47.27678],[8.25034,47.27548],[8.2501,47.27348],[8.24956,47.27017],[8.24559,47.26715],[8.24095,47.26678],[8.23452,47.26727],[8.23145,47.26278],[8.2309,47.25931],[8.22663,47.24942],[8.222,47.24713],[8.21526,47.24431],[8.21363,47.24203],[8.21309,47.23602],[8.21123,47.23246],[8.21285,47.22548],[8.21117,47.22266],[8.20689,47.22053],[8.19762,47.22065],[8.19149,47.21861],[8.16976,47.21865],[8.16543,47.22315],[8.16085,47.22405],[8.15351,47.2294],[8.15171,47.2332],[8.14822,47.23647],[8.14798,47.241],[8.14635,47.24203],[8.13823,47.24166],[8.13558,47.23941],[8.12673,47.23606],[8.1218,47.23631],[8.11614,47.23872],[8.10675,47.23945],[8.10266,47.24113],[8.09983,47.24436],[8.09766,47.2493],[8.09797,47.25069],[8.09339,47.25567],[8.08852,47.2569],[8.08485,47.25583],[8.08323,47.25405],[8.07995,47.25246],[8.0769,47.25054],[8.06854,47.24284],[8.06325,47.24098],[8.05134,47.23865],[8.04857,47.23886],[8.03575,47.23747],[8.0322,47.23555],[8.02714,47.23534],[8.01139,47.23967],[8.00927,47.24116],[8.00791,47.24312],[8.00783,47.24821],[8.00857,47.25042],[8.0084,47.25769],[8.00712,47.25922],[8.00299,47.26162],[8.00052,47.26486],[7.99759,47.26789],[7.99627,47.27271],[7.99474,47.27369],[7.98993,47.27121],[7.97278,47.26907],[7.96857,47.27008],[7.96737,47.27098],[7.95861,47.27112],[7.9601,47.26748],[7.96274,47.26396],[7.96576,47.26171],[7.96699,47.25879],[7.96695,47.25001],[7.95963,47.24582],[7.95112,47.23918],[7.94469,47.236],[7.93733,47.23106],[7.93405,47.23051],[7.9298,47.23077],[7.9178,47.23305],[7.90784,47.23837],[7.89793,47.2377],[7.8695,47.23207],[7.85478,47.22719],[7.85137,47.22713],[7.83958,47.22947],[7.83584,47.22976],[7.83082,47.23259],[7.82707,47.23505],[7.82431,47.23831],[7.82129,47.24042],[7.82014,47.24264],[7.81822,47.24562],[7.81771,47.24917],[7.81822,47.25082],[7.81835,47.25371],[7.81988,47.25587],[7.82116,47.2568],[7.82112,47.25778],[7.8192,47.26058],[7.81912,47.26154],[7.81686,47.26486],[7.8175,47.26731],[7.81958,47.26982],[7.82439,47.27158],[7.82805,47.2721],[7.83592,47.27837],[7.83707,47.28342],[7.84005,47.2872],[7.84201,47.29067],[7.84588,47.29427],[7.84763,47.2982],[7.85137,47.30299],[7.8529,47.30741],[7.85571,47.31032],[7.86065,47.31254],[7.86422,47.31349],[7.87018,47.31672],[7.87631,47.31736],[7.88082,47.31716],[7.88337,47.31667],[7.88588,47.31941],[7.88886,47.32131],[7.88805,47.32443],[7.88907,47.3287],[7.8915,47.33262],[7.8978,47.34014],[7.9001,47.34156],[7.90005,47.3432],[7.90222,47.34557],[7.90635,47.34704],[7.90963,47.34735],[7.91359,47.34626],[7.91618,47.34456],[7.91699,47.34303],[7.92401,47.33899],[7.93839,47.33792],[7.94929,47.33784],[7.95431,47.33596],[7.95593,47.33317],[7.95691,47.32968],[7.95571,47.32535],[7.96993,47.32797],[7.97308,47.33017],[7.98333,47.33432],[7.98563,47.33692],[7.98954,47.33818],[7.99248,47.33827],[7.99784,47.34017],[7.99635,47.34257],[7.99601,47.34588],[7.99733,47.34859],[8.00116,47.35081],[8.00137,47.3569],[8.00261,47.3577],[8.00418,47.36044],[8.00976,47.36419],[8.01125,47.36598],[8.01746,47.36926],[8.01912,47.37157],[8.0198,47.37376],[8.02023,47.37598],[8.02172,47.37837],[8.02193,47.38093],[8.02282,47.38286],[8.02078,47.38857],[8.01606,47.38929],[8.01265,47.38897],[8.00772,47.39012],[8.00367,47.39205],[8.00163,47.39479],[8.00155,47.39998],[8.00023,47.40306],[7.99801,47.40453],[7.99261,47.40551],[7.98776,47.40637],[7.98418,47.40839],[7.98027,47.4081],[7.9732,47.41127],[7.96963,47.41383],[7.95695,47.41893],[7.95529,47.4218],[7.95593,47.42402],[7.95746,47.42621],[7.96274,47.42828],[7.97746,47.43254],[7.97567,47.43732],[7.97614,47.44138],[7.97431,47.44368],[7.95129,47.45111],[7.94861,47.4539],[7.94818,47.4566],[7.94678,47.45755],[7.94039,47.45669],[7.93588,47.45738],[7.93631,47.47625],[7.9318,47.47605],[7.92469,47.47717],[7.91571,47.47743],[7.90903,47.47947],[7.90316,47.47967],[7.90295,47.48965],[7.8969,47.4898],[7.8918,47.49405],[7.89086,47.49765],[7.8878,47.49931],[7.88631,47.5023],[7.87999,47.50397],[7.87403,47.50787],[7.86994,47.50944],[7.87006,47.51239],[7.86435,47.51245],[7.85851,47.51543],[7.8558,47.51854],[7.85625,47.52147],[7.8549,47.52474],[7.85183,47.5285],[7.84647,47.52714],[7.84148,47.52777],[7.8413,47.52406],[7.84015,47.51587],[7.83943,47.51259],[7.83688,47.51256],[7.83679,47.51049],[7.83352,47.50949],[7.83156,47.50765],[7.82981,47.50552],[7.82522,47.50354],[7.82049,47.5004],[7.81475,47.49491],[7.81181,47.49261],[7.80645,47.4914],[7.80403,47.49146],[7.80049,47.49014],[7.77977,47.49028],[7.77871,47.49304],[7.7796,47.496],[7.78386,47.5004],[7.78203,47.50368],[7.78088,47.5073],[7.78109,47.51018],[7.77977,47.51265],[7.77969,47.51529],[7.77045,47.51802],[7.75905,47.52003],[7.75266,47.52009],[7.74781,47.51957],[7.73368,47.52291],[7.72781,47.52719],[7.71985,47.52978],[7.71262,47.53095],[7.70764,47.5344],[7.70551,47.53917],[7.70696,47.54279],[7.71415,47.54627],[7.72245,47.54756],[7.749,47.54977],[7.75428,47.55339],[7.76654,47.55615],[7.77168,47.55761],[7.78007,47.55836],[7.78577,47.55982],[7.7902,47.5616],[7.79398,47.56634],[7.80492,47.57237],[7.80611,47.57989],[7.81173,47.58954],[7.81577,47.59218],[7.82211,47.59352],[7.83645,47.59163],[7.83952,47.59045],[7.84305,47.58778],[7.84875,47.58899],[7.85624,47.59189],[7.86488,47.59393],[7.87126,47.5943],[7.87726,47.59367],[7.88535,47.59424],[7.89343,47.59301],[7.90109,47.58976],[7.90833,47.58514],[7.91386,47.57923],[7.91867,47.57194],[7.91956,47.56772],[7.91875,47.56433],[7.9156,47.56008],[7.91577,47.55715],[7.91841,47.55405],[7.92126,47.55261],[7.92552,47.55227],[7.93471,47.55221],[7.9405,47.55078],[7.94326,47.54968],[7.94356,47.55052],[7.94458,47.55589],[7.94841,47.55979],[7.95394,47.56229],[7.96003,47.56333],[7.96577,47.56272],[7.97203,47.5612],[7.97833,47.56057],[7.98624,47.56094],[7.99718,47.56212],[8.0045,47.56137],[8.01114,47.55974],[8.01641,47.55701],[8.02046,47.55574],[8.0262,47.55741],[8.03799,47.55876],[8.04254,47.56028],[8.0485,47.56333],[8.05454,47.56798],[8.05931,47.56921],[8.0622,47.56895],[8.06693,47.57002],[8.07242,47.56973],[8.07739,47.56795],[8.08182,47.56436],[8.08522,47.56281],[8.08791,47.56298],[8.09259,47.56559],[8.09395,47.56809],[8.09484,47.57587],[8.09602,47.57882]]],terms_text:"AGIS OF2014"},{id:"Aargau-AGIS-2016",name:"Kanton Aargau 25cm (AGIS 2016)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[8,19],polygon:[[[7.70438,47.55794],[7.77076,47.55772],[7.77103,47.58025],[7.80408,47.58017],[7.80433,47.60248],[7.93713,47.60217],[7.93703,47.57962],[8.00374,47.57917],[8.00338,47.55687],[8.0364,47.55665],[8.03681,47.57928],[8.10313,47.57881],[8.10387,47.60112],[8.17011,47.60086],[8.17036,47.6235],[8.30311,47.62235],[8.30305,47.59988],[8.3362,47.59927],[8.33585,47.5771],[8.36913,47.57694],[8.36943,47.59931],[8.43564,47.59877],[8.43454,47.53133],[8.40144,47.53162],[8.40096,47.50926],[8.3678,47.50959],[8.3675,47.48698],[8.40042,47.48666],[8.39939,47.41929],[8.46558,47.4187],[8.46515,47.39647],[8.43206,47.39654],[8.43125,47.3516],[8.46434,47.35128],[8.46327,47.28387],[8.42997,47.28421],[8.42714,47.12676],[8.3293,47.12753],[8.32937,47.13007],[8.32833,47.13007],[8.3285,47.14529],[8.3294,47.19502],[8.2964,47.19526],[8.29714,47.24022],[8.2641,47.24046],[8.26446,47.26297],[8.23141,47.26316],[8.23075,47.21822],[8.09886,47.21912],[8.09874,47.24135],[8.066,47.24176],[8.06552,47.2192],[7.99993,47.21952],[8.00003,47.26433],[7.96735,47.26462],[7.96675,47.21961],[7.80153,47.22029],[7.80244,47.28791],[7.83518,47.28772],[7.83543,47.31017],[7.86837,47.31017],[7.86885,47.35542],[8.00097,47.3543],[8.00156,47.39928],[7.9353,47.39976],[7.93607,47.46716],[7.90278,47.46729],[7.90303,47.48981],[7.86987,47.48998],[7.86993,47.5125],[7.83689,47.51258],[7.83665,47.4901],[7.77027,47.49026],[7.77045,47.51274],[7.70452,47.51307],[7.70438,47.55794]]],terms_text:"AGIS OF2016",best:true},{id:"Basel-Landschaft-2015",name:"Kanton Basel-Landschaft 10cm (2015)",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELLANDSCHAFT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[18,21],polygon:[[[7.37028,47.41368],[7.35758,47.41508],[7.35792,47.41827],[7.35354,47.41961],[7.34488,47.42402],[7.33973,47.42971],[7.33269,47.43024],[7.32685,47.43192],[7.32528,47.43489],[7.3305,47.44176],[7.33899,47.44109],[7.34496,47.43608],[7.35266,47.43436],[7.3812,47.43208],[7.37599,47.41431],[7.37815,47.414],[7.38204,47.41331],[7.38839,47.41398],[7.41371,47.41093],[7.42074,47.4111],[7.42748,47.41448],[7.43811,47.41274],[7.4484,47.41507],[7.45558,47.42792],[7.45062,47.43534],[7.43784,47.44632],[7.42542,47.44328],[7.4209,47.44594],[7.42242,47.45072],[7.4288,47.45388],[7.43003,47.45949],[7.44577,47.46197],[7.44717,47.45696],[7.45651,47.44926],[7.49236,47.45897],[7.53068,47.46119],[7.52745,47.47391],[7.53633,47.48383],[7.53623,47.49105],[7.5326,47.49097],[7.53179,47.4974],[7.52004,47.49678],[7.51223,47.49892],[7.50935,47.50888],[7.49908,47.51628],[7.49787,47.52125],[7.50228,47.51491],[7.51746,47.51728],[7.5222,47.51409],[7.53096,47.52905],[7.51935,47.53472],[7.51075,47.52899],[7.5023,47.5284],[7.49804,47.53615],[7.50545,47.54438],[7.51676,47.54541],[7.52732,47.55278],[7.55466,47.56437],[7.56458,47.55704],[7.56124,47.55172],[7.55875,47.55235],[7.55588,47.54434],[7.56479,47.54569],[7.58726,47.5419],[7.58269,47.53247],[7.58948,47.52792],[7.59025,47.51979],[7.59478,47.51929],[7.61378,47.53925],[7.6223,47.53977],[7.62285,47.55004],[7.61774,47.55437],[7.61762,47.55865],[7.63273,47.56149],[7.63997,47.55816],[7.649,47.5483],[7.66131,47.54483],[7.66586,47.53746],[7.67467,47.53375],[7.69494,47.5325],[7.71347,47.53978],[7.71596,47.53582],[7.72362,47.53675],[7.72716,47.53293],[7.73322,47.53275],[7.73797,47.52732],[7.74902,47.52498],[7.75786,47.52605],[7.78763,47.52012],[7.79014,47.51864],[7.78887,47.50683],[7.7928,47.50068],[7.78663,47.49312],[7.79889,47.49565],[7.79816,47.4994],[7.7994,47.49748],[7.80742,47.49714],[7.81471,47.5048],[7.83198,47.51474],[7.83321,47.53382],[7.84653,47.53266],[7.85233,47.53524],[7.86257,47.52692],[7.86396,47.51931],[7.87666,47.52269],[7.87567,47.51319],[7.89399,47.50606],[7.90477,47.49218],[7.90482,47.48491],[7.93329,47.48141],[7.94702,47.48489],[7.94003,47.46202],[7.94885,47.46378],[7.95761,47.45881],[7.95785,47.45128],[7.94678,47.44319],[7.95003,47.43172],[7.96183,47.42183],[7.95657,47.41968],[7.95504,47.41561],[7.94839,47.41627],[7.93493,47.41177],[7.93672,47.40806],[7.93266,47.40527],[7.90974,47.39852],[7.89022,47.40714],[7.88333,47.4061],[7.88344,47.4012],[7.8777,47.40126],[7.86914,47.39551],[7.87943,47.38799],[7.87881,47.38351],[7.86265,47.38198],[7.84012,47.37476],[7.83055,47.36512],[7.80217,47.3611],[7.79637,47.35347],[7.79356,47.33905],[7.78529,47.33788],[7.76896,47.33891],[7.76642,47.34273],[7.75152,47.34433],[7.73415,47.35776],[7.72791,47.36886],[7.70195,47.37245],[7.6442,47.36721],[7.64176,47.38047],[7.63558,47.38059],[7.63332,47.38291],[7.63331,47.38534],[7.63725,47.38607],[7.63272,47.41003],[7.66405,47.41002],[7.6798,47.41751],[7.68658,47.43366],[7.68297,47.43872],[7.68485,47.44784],[7.69227,47.45421],[7.69883,47.45586],[7.69993,47.46191],[7.70988,47.46938],[7.69976,47.48063],[7.66833,47.48635],[7.66612,47.49687],[7.65217,47.49581],[7.64865,47.49183],[7.65539,47.49021],[7.65051,47.48826],[7.65593,47.48739],[7.64442,47.48564],[7.64097,47.48273],[7.6073,47.4894],[7.60885,47.48353],[7.60563,47.47936],[7.60815,47.47521],[7.60449,47.47045],[7.61887,47.46745],[7.62607,47.46291],[7.62217,47.46195],[7.61646,47.44523],[7.6158,47.43275],[7.59207,47.43271],[7.58121,47.42878],[7.57842,47.43491],[7.5689,47.4369],[7.5683,47.42233],[7.58074,47.4147],[7.52524,47.41163],[7.53117,47.40353],[7.51862,47.38822],[7.5113,47.38974],[7.50226,47.38481],[7.49233,47.38523],[7.47841,47.39056],[7.47747,47.40128],[7.46448,47.40251],[7.46092,47.40068],[7.45002,47.40393],[7.44951,47.39976],[7.4434,47.40231],[7.44131,47.40018],[7.44357,47.3889],[7.43732,47.38089],[7.41169,47.38057],[7.41628,47.38479],[7.41449,47.3943],[7.39894,47.39684],[7.39592,47.40338],[7.38869,47.40302],[7.38405,47.41236],[7.37968,47.41281],[7.37584,47.41401],[7.37028,47.41368]]],terms_url:"https://www.geo.bl.ch/fileadmin/user_upload/Geodaten/Nutzungsbedingungen_GBD_BL_V3p2.pdf",terms_text:"Geodaten des Kantons Basel-Landschaft 2015",best:true},{id:"KTBASELSTADT2015",name:"Kanton Basel-Stadt 2015",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELSTADT2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.492,47.4817],[7.492,47.6342],[7.784,47.6342],[7.784,47.4817],[7.492,47.4817]]],terms_text:"Kanton Basel-Stadt OF 2015"},{id:"KTBASELSTADT2017",name:"Kanton Basel-Stadt 2017",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTBASELSTADT2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.67138,47.59522],[7.67996,47.60078],[7.68451,47.60182],[7.69438,47.60171],[7.69395,47.59667],[7.68708,47.59355],[7.67884,47.58712],[7.68571,47.58538],[7.68906,47.57612],[7.69412,47.5734],[7.6924,47.56691],[7.6847,47.5617],[7.66425,47.56164],[7.64872,47.55689],[7.63035,47.55869],[7.62357,47.55666],[7.62786,47.55145],[7.62738,47.53658],[7.61833,47.53662],[7.61335,47.53262],[7.59962,47.51911],[7.58503,47.51917],[7.58409,47.52636],[7.57713,47.53163],[7.58125,47.53986],[7.5719,47.54148],[7.55387,47.54148],[7.55379,47.55122],[7.55653,47.55828],[7.5537,47.56031],[7.55379,47.57473],[7.56434,47.58122],[7.57936,47.57988],[7.58331,47.59019],[7.58563,47.59233],[7.59207,47.59239],[7.59851,47.59071],[7.60915,47.58643],[7.60923,47.5811],[7.6191,47.58046],[7.63687,47.59314],[7.63782,47.59557],[7.64168,47.59887],[7.64528,47.60026],[7.66494,47.59618],[7.67138,47.59522]]],terms_text:"Kanton Basel-Stadt OF 2017",best:true},{id:"Solothurn-sogis2014-tms",name:"Kanton Solothurn (SOGIS)",type:"tms",template:"https://mapproxy.osm.ch/tiles/sogis2014/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[15,19],polygon:[[[7.95595,47.47162],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39022],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.94122,47.30978],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84832,47.27416],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24777],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.6499,47.22083],[7.66308,47.22073],[7.6631,47.21178],[7.66297,47.20273],[7.67617,47.2027],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53095,47.13097],[7.51767,47.13097],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47813,47.07705],[7.46493,47.07708],[7.46498,47.06807],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.3727,47.15796],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.20287],[7.33307,47.2029],[7.33307,47.22096],[7.34614,47.22096],[7.34614,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.5046,47.29288],[7.50473,47.30183],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.3988,47.36484],[7.39889,47.39182],[7.38564,47.39181],[7.38564,47.4008],[7.37234,47.4008],[7.37234,47.40978],[7.34584,47.40978],[7.34584,47.41878],[7.31925,47.41878],[7.31925,47.44578],[7.4121,47.44578],[7.4121,47.49078],[7.42535,47.49078],[7.42535,47.49981],[7.43856,47.49981],[7.43856,47.50876],[7.49177,47.50876],[7.49178,47.63468],[7.7845,47.63428],[7.78415,47.57123],[7.81074,47.57114],[7.81074,47.56216],[7.82395,47.56206],[7.82387,47.54414],[7.86368,47.54397],[7.86363,47.53498],[7.87679,47.53495],[7.87675,47.52599],[7.8901,47.52596],[7.89006,47.51695],[7.90319,47.51692],[7.9031,47.49886],[7.91649,47.49883],[7.91645,47.48976],[7.95612,47.48967],[7.95595,47.47162]]],terms_text:"Orthofoto WMS Solothurn",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{id:"Solothurn-infrared-SOGIS",name:"Kanton Solothurn Infrarot (SOGIS)",type:"wms",template:"https://geoweb.so.ch/wms/sogis_orthofoto.wms?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Orthofoto_CIR_SO&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[15,19],polygon:[[[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53093,47.12196],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47816,47.09496],[7.49144,47.09499],[7.4914,47.07702],[7.47816,47.07705],[7.4782,47.06804],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.39913,47.15804],[7.39913,47.14901],[7.3727,47.14898],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.19391],[7.33307,47.19394],[7.33307,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.49149,47.29289],[7.49162,47.30184],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.43862,47.36492],[7.43867,47.37389],[7.42538,47.37395],[7.42543,47.40081],[7.38558,47.4009],[7.38567,47.4098],[7.35915,47.4098],[7.35915,47.41878],[7.37239,47.41884],[7.37247,47.43682],[7.38571,47.43682],[7.38571,47.44104],[7.39563,47.44016],[7.3963,47.44258],[7.40761,47.4411],[7.40793,47.44225],[7.40313,47.44246],[7.39738,47.44331],[7.39832,47.44583],[7.41214,47.44583],[7.41228,47.45478],[7.43867,47.45488],[7.4388,47.47053],[7.45007,47.46941],[7.45007,47.47223],[7.44647,47.47223],[7.44647,47.47381],[7.44293,47.4739],[7.44288,47.47553],[7.43921,47.4756],[7.43921,47.4772],[7.43557,47.47729],[7.43548,47.47899],[7.4174,47.47896],[7.41744,47.48573],[7.42099,47.48573],[7.42108,47.49082],[7.42763,47.49073],[7.42852,47.49349],[7.43099,47.49643],[7.43485,47.49889],[7.4419,47.49552],[7.44665,47.49455],[7.45011,47.49176],[7.45087,47.4907],[7.46451,47.49073],[7.46456,47.48903],[7.46819,47.489],[7.46819,47.48566],[7.47187,47.48573],[7.47192,47.48233],[7.48269,47.48239],[7.48264,47.48388],[7.48623,47.48397],[7.48637,47.48566],[7.48991,47.48566],[7.49,47.4907],[7.4997,47.49073],[7.49965,47.4914],[7.49175,47.49194],[7.49175,47.49513],[7.49822,47.49479],[7.49889,47.49585],[7.49566,47.49628],[7.49171,47.49625],[7.4918,47.49973],[7.50504,47.4997],[7.50504,47.50874],[7.5448,47.50871],[7.54474,47.45482],[7.49169,47.45469],[7.49175,47.44581],[7.46529,47.44577],[7.46522,47.40983],[7.49156,47.40979],[7.49175,47.39192],[7.50489,47.39183],[7.50489,47.40068],[7.51821,47.40077],[7.51834,47.41876],[7.55794,47.41872],[7.55813,47.44581],[7.58453,47.44572],[7.58441,47.43667],[7.61094,47.43662],[7.611,47.4637],[7.59767,47.4637],[7.59793,47.49964],[7.62433,47.49969],[7.62445,47.4906],[7.63778,47.49055],[7.63784,47.4996],[7.67757,47.49947],[7.67745,47.49047],[7.70385,47.49043],[7.70391,47.48146],[7.71711,47.48129],[7.71711,47.45452],[7.70397,47.45452],[7.70385,47.44559],[7.69046,47.44551],[7.69033,47.40957],[7.67713,47.40949],[7.67713,47.40068],[7.65066,47.40068],[7.65047,47.37365],[7.67706,47.37357],[7.67706,47.38251],[7.71667,47.38251],[7.71679,47.37344],[7.74307,47.3734],[7.74307,47.35538],[7.7562,47.35534],[7.75633,47.3464],[7.78261,47.34627],[7.78292,47.36433],[7.79612,47.36428],[7.79619,47.37327],[7.82265,47.37314],[7.82271,47.38229],[7.84912,47.38212],[7.84924,47.39106],[7.86251,47.39097],[7.86263,47.40906],[7.8759,47.40897],[7.87602,47.41803],[7.90242,47.41795],[7.90242,47.40897],[7.92889,47.4088],[7.92914,47.41782],[7.94215,47.41769],[7.94266,47.46276],[7.95592,47.46259],[7.95612,47.47164],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39015],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.9412,47.30992],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84843,47.27415],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24765],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.66305,47.22971],[7.6631,47.21178],[7.67621,47.21169],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70248,47.16663],[7.71567,47.16663],[7.71558,47.15769],[7.70239,47.15766],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792]]],terms_text:"Orthofoto WMS Solothurn",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{id:"KTTHURGAU2017",name:"Kanton Thurgau OF 2017",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTTHURGAU2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[8,21],polygon:[[[8.63768,47.70041],[8.78328,47.6988],[8.78304,47.68533],[8.87027,47.68427],[8.86997,47.6709],[8.89901,47.67047],[8.89867,47.65698],[8.9277,47.65661],[8.92828,47.67015],[8.95726,47.66973],[8.95774,47.68327],[9.19061,47.67994],[9.19027,47.66645],[9.21922,47.66603],[9.21899,47.65256],[9.24784,47.6521],[9.24747,47.63864],[9.3057,47.63765],[9.30526,47.6242],[9.33417,47.62371],[9.33348,47.59674],[9.39151,47.59577],[9.39114,47.58235],[9.42007,47.58176],[9.4186,47.54139],[9.44754,47.54084],[9.44717,47.5273],[9.47605,47.52681],[9.47519,47.49986],[9.50414,47.49935],[9.5031,47.47242],[9.41596,47.47392],[9.41554,47.46045],[9.3576,47.46141],[9.35818,47.47498],[9.32896,47.47534],[9.32864,47.46188],[9.18361,47.4642],[9.18411,47.47769],[9.15492,47.4781],[9.15466,47.46463],[9.06736,47.46583],[9.06718,47.45234],[9.09609,47.45193],[9.09582,47.43853],[9.06663,47.43883],[9.06642,47.42537],[9.00829,47.4262],[9.00714,47.38573],[8.97811,47.38616],[8.9774,47.35913],[8.9194,47.35989],[8.92032,47.38697],[8.89136,47.38725],[8.89286,47.44117],[8.86398,47.44149],[8.86604,47.52251],[8.80784,47.52317],[8.80894,47.56373],[8.77985,47.56403],[8.78024,47.57751],[8.72209,47.57814],[8.72337,47.63213],[8.6652,47.63273],[8.6658,47.6598],[8.63674,47.66],[8.63768,47.70041]]],terms_text:"Kanton Thurgau OF 2017",best:true},{id:"KTZUERICH2015",name:"Kanton Zürich 2015 10cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTZUERICH2015/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Kanton Zürich Orthophotos 2014/2015",best:true},{id:"Kanton-Zuerich-2015",name:"Kanton Zürich Orthophotos 2014/2015 10cm",type:"wms",template:"https://wms.zh.ch/OrthoZHWMS?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orthophotos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Kanton Zürich Orthophotos 2014/2015",best:true},{id:"kartverket-abas",name:"Kartverket Administrative Boundaries overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.adm_enheter?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=avtaltavgrensningslinje,territorialgrense,riksgrense,fylker,kommuner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/data/Kartdata/Grenser/",terms_text:"© Kartverket",description:"Official administrative boundaries at the national, county and municipality levels",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-luftfartshindre",name:"Kartverket Aviation Obstructions overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.nrl?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nrl3_wms&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[7,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartverket.no/kart/Nasjonalt-register-over-luftfartshindre/",terms_text:"© Kartverket",description:"Vertical obstructions to aircrafts, above 15m in rural areas and 30m in urban areas (e.g. masts, towers, high buildings, power lines)",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-matrikkel",name:"Kartverket Cadastral overlay",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.matrikkel?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=matrikkel_WMS&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[14,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.seeiendom.no/",terms_text:"© Kartverket",description:"Real estate boundaries from the official land register (`matrikkelen´). Monthly update.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-hoydekurver",name:"Kartverket Contour Lines overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.topo4?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=hoydetall5linje,hoydetall5punkt,hoydepunkt,vannpunkt,hoydekurver_1m,hoydekurver_5m,N50Hoydekurver,N250Hoydekurver,N500Hoydekurver,N1000Hoydekurver,N2000Hoydekurver&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[9,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/Prosjekter/Nasjonal-detaljert-hoydemodell/",terms_text:"© Kartverket",description:"Contours for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-dom-skygge",name:"Kartverket DOM Digital Surface Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dom_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dom_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital surface model (DOM), i.e. earth surface including trees, buildings and other objects on top of it.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-dtm-skygge",name:"Kartverket DTM Digital Terrain Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dtm_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dtm_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital terrain model (DTM), i.e. earth surface without trees, buildings and other objects.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-ok-1st",name:"Kartverket Economic Maps (historic)",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.n5raster2?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n5raster_foerstegang_metadata,n5raster_foerstegang&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[11,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kunnskap/historie/kartverkets-historiske-arkiv/",terms_text:"© Kartverket",description:"1st edition of historic Economic maps for Norway 1960-90s (`Økonomisk kartverk´). Available from zoom 16. Please correct local imagery offset.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-friluft",name:"Kartverket Hiking Trails",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.friluftsruter2?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Fotrute&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://kartverket.no/geodataarbeid/temadata/nasjonal-database-for-tur--og-friluftsruter/",terms_text:"© Kartverket",description:"Hiking trails from the Norwegian database `Tur- og Friluftsruter´, including DNT routes.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-fjellskygge",name:"Kartverket Hillshade overlay",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=fjellskygge&zoom={zoom}&x={x}&y={y}",zoomExtent:[9,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartkatalog.geonorge.no/metadata/kartverket/fjellskygge-cache/cca7c129-fe66-4c96-9091-40d92290dd81",terms_text:"© Kartverket",description:"Hillshade for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-historic",name:"Kartverket Historic maps",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.historiskekart?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=amt1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kart/historiske-kart/",terms_text:"© Kartverket",description:"Historic maps - for the time being `Amtskartserien´ 1826-1917.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-topo4",name:"Kartverket N50 topo",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo4&zoom={zoom}&x={x}&y={y}",zoomExtent:[3,15],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://wiki.openstreetmap.org/wiki/No:Kartverket_import",terms_text:"© Kartverket",description:"Topographic map N50, equivalent to Norway 1:50.000 paper map series.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-sjokart",name:"Kartverket Nautical Charts",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=sjokartraster&zoom={zoom}&x={x}&y={y}",zoomExtent:[3,20],polygon:[[[-15.01273,-60.16205],[33.3326,-60.17016],[33.32144,-73.0009],[-15.0239,-72.99613],[-15.01273,-60.16205]],[[-173.00076,-70.54952],[-125.00321,-70.54878],[-125.00167,-78.99977],[-172.99922,-79.0002],[-173.00076,-70.54952]],[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"https://www.kartverket.no/Kart/Sjokart/",terms_text:"© Kartverket",description:"Norwegian nautical charts (includes Spitsbergen/Svalbard and Antarctica). Raster representation of paper charts. Updated biweekly.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-vegnett",name:"Kartverket Road Network",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.vegnett?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=all&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.kartverket.no/data/kartdata/vegdata/",terms_text:"© Kartverket",description:"Norwegian road network from the National Road database (NVDB). Colours represent national, county, municipal, private and forest roads + footways/cycleways.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"Katowice-buildings",name:"Katowice: Buildings",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=4,5,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{id:"Katowice-aerial_image",name:"Katowice: Orthophotomap (aerial image)",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{id:"kelowna_2012",name:"Kelowna 2012",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna2012/{zoom}/{x}/{y}.png",endDate:"2012-05-14T00:00:00.000Z",startDate:"2012-05-13T00:00:00.000Z",zoomExtent:[9,20],polygon:[[[-119.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],description:"High quality aerial imagery taken for the City of Kelowna"},{id:"kelowna_roads",name:"Kelowna Roads overlay",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/kelowna_overlay/{zoom}/{x}/{y}.png",zoomExtent:[9,20],polygon:[[[-119.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],overlay:true},{id:"kystverket-navigasjon",name:"Kystverket Navigational Aid overlay",type:"wms",template:"https://nfs.kystverket.no/arcgis/services/nfs/NFSSistOperativ/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=17,16,15,14,12,10,9,8,7,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[12,19],polygon:[[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"http://kystverket.no/Maritim-infrastruktur/Fyr-og-merker-/",terms_text:"© Kystverket",description:"Beacons, buoys, lights and fairways maintained by the Norwegian Coastal Administration",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg/143px-Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg.png",overlay:true},{id:"landsat_233055",name:"Landsat 233055",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_233055/{zoom}/{x}/{y}.png",endDate:"2013-09-03T00:00:00.000Z",startDate:"2013-09-03T00:00:00.000Z",zoomExtent:[5,14],polygon:[[[-60.855,6.1765],[-60.47626,7.91883],[-62.16169,8.27787],[-62.53225,6.53755],[-60.855,6.1765]]],description:"Recent Landsat imagery"},{id:"osmse-ekonomiska",name:"Lantmäteriet Economic Map 1950–1980",type:"tms",template:"https://mapproxy.openstreetmap.se/tms/1.0.0/ek_EPSG3857/{zoom}/{x}/{-y}.jpeg",zoomExtent:[3,17],polygon:[[[12.71117,55.2666],[14.38109,55.29163],[19.65453,57.24934],[19.85228,59.75087],[17.77587,61.13794],[18.06151,62.27815],[20.97289,63.5779],[24.35668,65.60842],[23.96117,66.79191],[20.61034,66.45189],[17.13866,63.96632],[11.99706,61.03702],[12.29369,60.31607],[10.70067,58.81375],[12.71117,55.2666]]],terms_url:"https://www.lantmateriet.se",terms_text:"© Lantmäteriet",description:"Scan of \"Economic maps\" ca. 1950–1980",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/se/LantmterietHistoricOrthophoto1960.png"},{id:"lantmateriet-orto1960",name:"Lantmäteriet Historic Orthophoto 1960",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_60&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/se/LantmterietHistoricOrthophoto1960.png"},{id:"lantmateriet-orto1975",name:"Lantmäteriet Historic Orthophoto 1975",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_75&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[17.85131,60.87407],[14.74558,60.53889],[11.60239,59.56416],[10.51799,58.66559],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/se/LantmterietHistoricOrthophoto1960.png"},{id:"lu.geoportail.opendata.ortholatest",name:"Latest available ortho geoportail.lu",type:"tms",template:"https://{switch:wmts1,wmts2}.geoportail.lu/opendata/wmts/ortho_latest/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-06-22T00:00:00.000Z",startDate:"2017-06-14T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",best:true,icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"landsat_047026",name:"Latest southwest British Columbia Landsat",type:"tms",template:"http://{switch:a,b,c,d}.tile.paulnorman.ca/landsat_047026/{zoom}/{x}/{y}.png",endDate:"2013-09-12T00:00:00.000Z",startDate:"2013-09-12T00:00:00.000Z",zoomExtent:[5,13],polygon:[[[-121.93555,47.78206],[-121.57206,48.64101],[-121.20155,49.48462],[-121.83755,49.60232],[-122.4767,49.71617],[-123.11891,49.82688],[-123.76023,49.93358],[-124.08877,49.08705],[-124.41289,48.22526],[-123.79277,48.11973],[-123.17279,48.01096],[-122.55355,47.89823],[-121.93555,47.78206]]],description:"Recent lower-resolution landsat imagery for southwest British Columbia"},{id:"Lausanne-2012",name:"Lausanne - Orthophoto technique 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/lausanne2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.66668,46.49441],[6.61637,46.49406],[6.61636,46.49836],[6.60135,46.49825],[6.60131,46.50227],[6.55923,46.50194],[6.55773,46.59687],[6.72895,46.59805],[6.7304,46.49004],[6.67702,46.48978],[6.67703,46.49011],[6.67345,46.49006],[6.67347,46.49041],[6.66672,46.49036],[6.66668,46.49441]]],terms_url:"http://carto.lausanne.ch/lausanne-gc/",terms_text:"Ville de Lausanne - Orthophoto technique 2012"},{id:"LINZ_NZ_Aerial_Imagery",name:"LINZ NZ Aerial Imagery",type:"tms",template:"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/set=2/EPSG:3857/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[167.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],terms_url:"https://www.linz.govt.nz/data/licensing-and-using-data/attributing-elevation-or-aerial-imagery-data",terms_text:"Sourced from LINZ CC-BY 4.0",best:true},{id:"LINZ_NZ_Topo50_Gridless_Maps",name:"LINZ NZ Topo50 Gridless Maps",type:"tms",template:"https://tiles-a.data-cdn.linz.govt.nz/services;key=3197c6d0e5cb494a95d58dc2de3216c2/tiles/v4/layer=2343/EPSG:3857/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[167.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],terms_url:"https://data.linz.govt.nz/layer/2343-nz-mainland-topo50-gridless-maps",terms_text:"CC BY 4.0 Land Information New Zealand"},{id:"ORT10LT",name:"Lithuania - NŽT ORT10LT",type:"tms",template:"https://ort10lt.openmap.lt/g16/{zoom}/{x}/{y}.jpeg",endDate:"2016-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[4,18],polygon:[[[26.21384,55.85075],[26.38583,55.70453],[26.63036,55.68067],[26.62053,55.56892],[26.52422,55.50992],[26.55415,55.38883],[26.43993,55.34794],[26.79197,55.3212],[26.82913,55.27635],[26.74346,55.25399],[26.67648,55.15883],[26.46112,55.12856],[26.35774,55.15054],[26.22963,55.10732],[26.27138,55.07759],[26.20851,54.99741],[26.06191,54.94161],[25.85782,54.9276],[25.74298,54.81506],[25.76261,54.5769],[25.53194,54.34182],[25.67716,54.32381],[25.78573,54.23362],[25.78588,54.15506],[25.55508,54.14619],[25.51095,54.17503],[25.58967,54.22858],[25.51362,54.30785],[25.26893,54.27447],[25.0706,54.13363],[24.95737,54.17206],[24.81338,54.14486],[24.77902,54.09991],[24.87128,54.0349],[24.81957,53.99772],[24.68459,53.96211],[24.69787,54.01714],[24.62591,54.0105],[24.43426,53.90144],[24.35206,53.89679],[24.20161,53.97001],[23.96833,53.9267],[23.91302,53.96968],[23.77812,53.89892],[23.70977,53.93945],[23.53704,53.94307],[23.48224,53.98938],[23.52734,54.04735],[23.48586,54.15323],[23.38679,54.22484],[23.04212,54.31597],[23.01021,54.3828],[22.85469,54.4104],[22.792,54.36332],[22.70234,54.4529],[22.68386,54.58597],[22.74897,54.63198],[22.74297,54.72682],[22.88668,54.8135],[22.8204,54.91198],[22.6424,54.97134],[22.58924,55.07024],[22.0806,55.02448],[22.03241,55.0841],[21.91307,55.08168],[21.64919,55.18081],[21.50151,55.18682],[21.38437,55.2937],[21.27098,55.24501],[21.09836,55.25639],[20.94217,55.28245],[21.08635,55.56183],[21.03995,55.83636],[21.06403,56.06995],[21.20478,56.08117],[21.2308,56.16233],[21.5021,56.2955],[21.72359,56.31382],[21.83566,56.37162],[21.96954,56.37665],[22.0153,56.42428],[22.43727,56.4064],[22.68,56.35159],[22.91917,56.37902],[22.94668,56.41465],[23.09325,56.30464],[23.17034,56.36677],[23.30645,56.38305],[23.55717,56.33382],[23.7648,56.37332],[23.76669,56.32381],[24.019,56.32976],[24.12146,56.2489],[24.28574,56.30064],[24.45415,56.25816],[24.57947,56.28824],[24.62841,56.37533],[24.90238,56.48053],[25.12774,56.20591],[25.57714,56.18241],[25.67312,56.14937],[26.21384,55.85075]]],terms_url:"https://www.geoportal.lt",terms_text:"NŽT ORT10LT",best:true},{id:"mapbox_locator_overlay",name:"Locator Overlay",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmap.map-inh76ba2/{zoom}/{x}/{y}.png?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[0,16],overzoom:false,terms_url:"https://www.mapbox.com/about/maps",terms_text:"Terms & Feedback","default":true,description:"Shows major features to help orient you.",overlay:true},{id:"Lodz-buildings",name:"Łódź: Buildings",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/WMS_publikowane/LODZ/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Budynki,Ulice,Adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2015",name:"Łódź: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/Ortofotomapa/Ortofotomapa/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2017",name:"Łódź: Orthophotomap 2017 (aerial image)",type:"wms",template:"https://mapa.lodz.pl/3/services/OGC/Ortofotomapa/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Loire_Atlantique-Orthophotos-2012",name:"Loire-Atlantique - Orthophotos 2012 - 20 cm",type:"tms",template:"http://{switch:a,b,c,d,e,f,g,h}.tiles.cg44.makina-corpus.net/ortho-2012/{zoom}/{x}/{-y}.jpg",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-1.48638,46.87691],[-1.54437,46.84873],[-1.73468,46.87246],[-1.89276,46.94234],[-1.95475,46.98084],[-2.07067,47.08521],[-2.2678,47.12656],[-2.22627,47.17124],[-2.19217,47.16914],[-2.19341,47.25546],[-2.29694,47.22769],[-2.41658,47.25336],[-2.54862,47.28575],[-2.63913,47.41678],[-2.50573,47.50812],[-2.31063,47.53021],[-2.24836,47.52384],[-2.23223,47.51499],[-2.12109,47.54674],[-2.11783,47.60126],[-2.1001,47.61123],[-2.09981,47.62005],[-2.11141,47.62873],[-2.10055,47.65141],[-2.08121,47.66578],[-1.98016,47.70751],[-1.83077,47.72419],[-1.67455,47.72544],[-1.63735,47.77463],[-1.49601,47.81752],[-1.49911,47.84166],[-1.38133,47.84415],[-1.346,47.81086],[-1.23007,47.78587],[-1.21643,47.75838],[-1.22635,47.73628],[-1.21086,47.7317],[-1.18668,47.73462],[-1.15196,47.69332],[-1.13151,47.63654],[-1.09121,47.6332],[-0.99265,47.6027],[-0.98459,47.58598],[-1.0317,47.55001],[-1.13585,47.55628],[-1.13275,47.5161],[-1.0317,47.51778],[-0.94863,47.50103],[-0.93686,47.47715],[-0.93376,47.43859],[-0.9009,47.39874],[-0.92694,47.37482],[-0.97157,47.35845],[-1.28339,47.32736],[-1.23379,47.26093],[-1.20032,47.26935],[-1.16498,47.24957],[-1.14143,47.1763],[-1.1563,47.15818],[-1.20652,47.12402],[-1.20838,47.10968],[-1.15568,47.10504],[-1.14081,47.08056],[-1.09431,47.0717],[-1.09989,47.03199],[-1.14453,47.01636],[-1.21582,47.02904],[-1.26727,47.06325],[-1.28524,47.02185],[-1.34972,47.02397],[-1.33918,46.969],[-1.3491,46.94446],[-1.45014,46.91186],[-1.47504,46.9176],[-1.48775,46.93063],[-1.49235,46.98433],[-1.48644,46.99943],[-1.49213,47.02722],[-1.52764,47.00541],[-1.52961,46.97252],[-1.50507,46.94439],[-1.50222,46.92973],[-1.51142,46.91371],[-1.48622,46.89724],[-1.48638,46.87691]]],terms_url:"http://data2.loire-atlantique.fr/licences/",terms_text:"Département de Loire-Atlantique"},{id:"Loire_Atlantique-Orthophotos-2016",name:"Loire-Atlantique - Orthophotos 2016 - 10 cm",type:"wms",template:"https://wms-vuduciel2.makina-corpus.net/geoserver/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=cg44:ortho44-2016&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-1.48638,46.87691],[-1.54437,46.84873],[-1.73468,46.87246],[-1.89276,46.94234],[-1.95475,46.98084],[-2.07067,47.08521],[-2.2678,47.12656],[-2.22627,47.17124],[-2.19217,47.16914],[-2.19341,47.25546],[-2.29694,47.22769],[-2.41658,47.25336],[-2.54862,47.28575],[-2.63913,47.41678],[-2.50573,47.50812],[-2.31063,47.53021],[-2.24836,47.52384],[-2.23223,47.51499],[-2.12109,47.54674],[-2.11783,47.60126],[-2.1001,47.61123],[-2.09981,47.62005],[-2.11141,47.62873],[-2.10055,47.65141],[-2.08121,47.66578],[-1.98016,47.70751],[-1.83077,47.72419],[-1.67455,47.72544],[-1.63735,47.77463],[-1.49601,47.81752],[-1.49911,47.84166],[-1.38133,47.84415],[-1.346,47.81086],[-1.23007,47.78587],[-1.21643,47.75838],[-1.22635,47.73628],[-1.21086,47.7317],[-1.18668,47.73462],[-1.15196,47.69332],[-1.13151,47.63654],[-1.09121,47.6332],[-0.99265,47.6027],[-0.98459,47.58598],[-1.0317,47.55001],[-1.13585,47.55628],[-1.13275,47.5161],[-1.0317,47.51778],[-0.94863,47.50103],[-0.93686,47.47715],[-0.93376,47.43859],[-0.9009,47.39874],[-0.92694,47.37482],[-0.97157,47.35845],[-1.28339,47.32736],[-1.23379,47.26093],[-1.20032,47.26935],[-1.16498,47.24957],[-1.14143,47.1763],[-1.1563,47.15818],[-1.20652,47.12402],[-1.20838,47.10968],[-1.15568,47.10504],[-1.14081,47.08056],[-1.09431,47.0717],[-1.09989,47.03199],[-1.14453,47.01636],[-1.21582,47.02904],[-1.26727,47.06325],[-1.28524,47.02185],[-1.34972,47.02397],[-1.33918,46.969],[-1.3491,46.94446],[-1.45014,46.91186],[-1.47504,46.9176],[-1.48775,46.93063],[-1.49235,46.98433],[-1.48644,46.99943],[-1.49213,47.02722],[-1.52764,47.00541],[-1.52961,46.97252],[-1.50507,46.94439],[-1.50222,46.92973],[-1.51142,46.91371],[-1.48622,46.89724],[-1.48638,46.87691]]],terms_url:"http://data2.loire-atlantique.fr/licences/",terms_text:"© Loire-Atlantique ouverture des données publiques"},{id:"Lombardia-Italy-CTR-DBT",name:"Lombardia - Italy (CTR DBT)",type:"wms",template:"https://www.cartografia.servizirl.it/arcgis/services/wms/ctr_wms/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sfondo%20C.T.R.%2010000&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],terms_url:"https://www.dati.gov.it/content/italian-open-data-license-v20",terms_text:"CTR DBT 10000 Regione Lombardia"},{id:"Lombardia-Italy-CTR",name:"Lombardia - Italy (CTR)",type:"wms",template:"https://www.cartografia.regione.lombardia.it/ArcGIS10/services/wms/ctr_wms/MapServer/WMSServer?STYLES=&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],terms_url:"https://www.dati.gov.it/content/italian-open-data-license-v20",terms_text:"Regione Lombardia - Infrastruttura per l'informazione territoriale"},{id:"londrina2011",name:"Londrina Ortofoto 2011",type:"tms",template:"https://siglon.londrina.pr.gov.br/arcgis/rest/services/Imagens/Ortofotos_2011_Paranacidade/MapServer/WMTS/tile/1.0.0/Imagens_Ortofotos_2011_Paranacidade/default/GoogleMapsCompatible/{zoom}/{y}/{x}",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-51.10903,-23.39275],[-51.11015,-23.39112],[-51.11198,-23.3896],[-51.11358,-23.38977],[-51.121,-23.38593],[-51.12225,-23.38511],[-51.12483,-23.3835],[-51.12538,-23.38187],[-51.12482,-23.3777],[-51.12446,-23.37505],[-51.12437,-23.3723],[-51.12244,-23.37033],[-51.12302,-23.36643],[-51.12856,-23.36548],[-51.12832,-23.35884],[-51.12477,-23.35476],[-51.12703,-23.35091],[-51.12412,-23.3468],[-51.12025,-23.34781],[-51.11765,-23.33969],[-51.11265,-23.34129],[-51.1094,-23.33489],[-51.10756,-23.33409],[-51.10486,-23.33398],[-51.10253,-23.33419],[-51.09987,-23.33102],[-51.09801,-23.32936],[-51.09999,-23.32831],[-51.10323,-23.32532],[-51.10473,-23.32319],[-51.10466,-23.32129],[-51.10515,-23.31844],[-51.10636,-23.31575],[-51.10661,-23.31467],[-51.1105,-23.31167],[-51.11158,-23.30842],[-51.0995,-23.30947],[-51.0974,-23.30863],[-51.09512,-23.30745],[-51.09202,-23.30494],[-51.09036,-23.30371],[-51.09205,-23.29875],[-51.09269,-23.2975],[-51.09408,-23.29295],[-51.10074,-23.29332],[-51.10102,-23.28871],[-51.10068,-23.28837],[-51.10085,-23.28778],[-51.09938,-23.28664],[-51.09632,-23.27791],[-51.10285,-23.27302],[-51.10836,-23.27034],[-51.1131,-23.2684],[-51.1316,-23.26534],[-51.13188,-23.26201],[-51.13173,-23.25506],[-51.1329,-23.25468],[-51.13296,-23.25075],[-51.13474,-23.25127],[-51.13534,-23.25133],[-51.13517,-23.24359],[-51.13535,-23.24118],[-51.13752,-23.24219],[-51.13885,-23.2435],[-51.14109,-23.24521],[-51.14717,-23.24318],[-51.14761,-23.23828],[-51.14908,-23.23588],[-51.14977,-23.23681],[-51.15139,-23.23854],[-51.15289,-23.23884],[-51.15384,-23.23895],[-51.1582,-23.23814],[-51.16045,-23.23816],[-51.16035,-23.24658],[-51.15912,-23.24783],[-51.16131,-23.24777],[-51.16659,-23.24594],[-51.17193,-23.24582],[-51.17205,-23.24956],[-51.17424,-23.2484],[-51.17514,-23.24932],[-51.17686,-23.24816],[-51.17947,-23.25169],[-51.18135,-23.25381],[-51.18274,-23.25363],[-51.18379,-23.25326],[-51.18496,-23.2533],[-51.18627,-23.25215],[-51.18665,-23.24748],[-51.19118,-23.24914],[-51.19142,-23.25286],[-51.19369,-23.25278],[-51.19384,-23.26074],[-51.20097,-23.26055],[-51.20127,-23.2426],[-51.20994,-23.24278],[-51.2109,-23.26988],[-51.21969,-23.27222],[-51.22597,-23.27453],[-51.22934,-23.2786],[-51.23452,-23.2816],[-51.23498,-23.28325],[-51.23507,-23.28544],[-51.23371,-23.2859],[-51.23216,-23.28802],[-51.2287,-23.29229],[-51.2274,-23.2946],[-51.22679,-23.29548],[-51.2256,-23.29657],[-51.22393,-23.29721],[-51.22048,-23.30073],[-51.21864,-23.3013],[-51.21668,-23.30212],[-51.21424,-23.30441],[-51.21097,-23.30697],[-51.22328,-23.3183],[-51.22439,-23.31459],[-51.22521,-23.31289],[-51.22512,-23.31258],[-51.22521,-23.31251],[-51.22553,-23.31253],[-51.22595,-23.31239],[-51.22617,-23.31183],[-51.22936,-23.31489],[-51.22802,-23.31661],[-51.22789,-23.31902],[-51.22767,-23.32023],[-51.22723,-23.32151],[-51.22739,-23.32223],[-51.22725,-23.32285],[-51.23033,-23.32558],[-51.23046,-23.32671],[-51.22954,-23.32789],[-51.22916,-23.3305],[-51.22929,-23.33178],[-51.22681,-23.33447],[-51.22602,-23.33657],[-51.22473,-23.33839],[-51.2221,-23.34023],[-51.22257,-23.34196],[-51.22381,-23.34339],[-51.22384,-23.34531],[-51.22441,-23.347],[-51.22454,-23.34829],[-51.22404,-23.34968],[-51.22351,-23.35011],[-51.22382,-23.35077],[-51.22305,-23.35174],[-51.2226,-23.35296],[-51.22587,-23.35481],[-51.2265,-23.36706],[-51.22354,-23.36915],[-51.22367,-23.37968],[-51.22038,-23.38163],[-51.21647,-23.3817],[-51.21416,-23.37995],[-51.20928,-23.37395],[-51.20738,-23.36814],[-51.20629,-23.36723],[-51.20472,-23.36627],[-51.19823,-23.36668],[-51.19297,-23.36651],[-51.18986,-23.36544],[-51.18806,-23.36464],[-51.18718,-23.36453],[-51.1858,-23.36374],[-51.18304,-23.36359],[-51.18071,-23.36376],[-51.17907,-23.36158],[-51.17764,-23.35836],[-51.16684,-23.35626],[-51.16614,-23.35854],[-51.16476,-23.36039],[-51.16077,-23.35922],[-51.15983,-23.3666],[-51.16204,-23.36861],[-51.16276,-23.37416],[-51.15845,-23.3758],[-51.15505,-23.37631],[-51.15396,-23.37903],[-51.15299,-23.38105],[-51.15119,-23.38208],[-51.14917,-23.38251],[-51.14722,-23.38216],[-51.14518,-23.38259],[-51.1441,-23.38376],[-51.14512,-23.38808],[-51.1418,-23.3894],[-51.14031,-23.3888],[-51.14068,-23.39161],[-51.14127,-23.39354],[-51.14094,-23.39443],[-51.14046,-23.39536],[-51.13939,-23.3951],[-51.13739,-23.39315],[-51.13609,-23.3898],[-51.13429,-23.38976],[-51.13216,-23.39007],[-51.13172,-23.39286],[-51.12259,-23.38864],[-51.12228,-23.39166],[-51.11883,-23.39317],[-51.11568,-23.39335],[-51.10903,-23.39275]],[[-51.13829,-23.41601],[-51.13331,-23.41867],[-51.13209,-23.41644],[-51.13002,-23.41829],[-51.12869,-23.41901],[-51.12824,-23.42103],[-51.12696,-23.42186],[-51.12533,-23.42269],[-51.12445,-23.42097],[-51.12151,-23.42411],[-51.12063,-23.42327],[-51.11971,-23.42312],[-51.11977,-23.42157],[-51.1188,-23.42155],[-51.11643,-23.42084],[-51.11943,-23.41917],[-51.11787,-23.41678],[-51.11655,-23.41731],[-51.1157,-23.4157],[-51.11512,-23.41309],[-51.11908,-23.41111],[-51.1196,-23.4117],[-51.12052,-23.41489],[-51.12148,-23.41714],[-51.12309,-23.41863],[-51.12755,-23.41654],[-51.12803,-23.4174],[-51.1312,-23.41557],[-51.1308,-23.41477],[-51.13279,-23.41264],[-51.13522,-23.41106],[-51.13586,-23.41096],[-51.13682,-23.41119],[-51.13721,-23.41158],[-51.1373,-23.41324],[-51.13743,-23.41471],[-51.13829,-23.41601]],[[-51.18929,-23.61469],[-51.18869,-23.61385],[-51.18818,-23.61339],[-51.18731,-23.61302],[-51.18629,-23.61314],[-51.18402,-23.61396],[-51.18349,-23.61397],[-51.18183,-23.61284],[-51.1814,-23.61344],[-51.18063,-23.61314],[-51.18001,-23.61409],[-51.17866,-23.61329],[-51.18065,-23.6106],[-51.17972,-23.61018],[-51.18062,-23.60849],[-51.18212,-23.6085],[-51.18261,-23.60775],[-51.1832,-23.60804],[-51.18415,-23.60628],[-51.18511,-23.60666],[-51.18649,-23.6047],[-51.18902,-23.6061],[-51.18821,-23.60742],[-51.18919,-23.60802],[-51.1889,-23.60953],[-51.18962,-23.60993],[-51.19119,-23.61119],[-51.19015,-23.61245],[-51.19054,-23.61276],[-51.19029,-23.61378],[-51.18929,-23.61469]],[[-51.08006,-23.52984],[-51.07962,-23.52205],[-51.08468,-23.52194],[-51.08582,-23.52404],[-51.08589,-23.52704],[-51.08579,-23.52777],[-51.0853,-23.52806],[-51.08514,-23.52857],[-51.08512,-23.52982],[-51.08471,-23.53024],[-51.08343,-23.53024],[-51.0833,-23.52978],[-51.08006,-23.52984]]],terms_url:"http://siglon.londrina.pr.gov.br",terms_text:"Prefeitura do Londrinas, PR"},{id:"LPI_NSW_Administrative_Boundaries_County",name:"LPI NSW Administrative Boundaries County",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=4&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_LGA",name:"LPI NSW Administrative Boundaries LGA",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=6&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_NPWS_Reserve",name:"LPI NSW Administrative Boundaries NPWS Reserve",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=1&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_Parish",name:"LPI NSW Administrative Boundaries Parish",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=3&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_StateForest",name:"LPI NSW Administrative Boundaries State Forest",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=2&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"LPI_NSW_Administrative_Boundaries_Suburb",name:"LPI NSW Administrative Boundaries Suburb",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Administrative_Boundaries/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=7&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"NSW_LPI_BaseMap",name:"LPI NSW Base Map",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Base_Map/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,19],polygon:[[[140.99486,-28.95297],[148.96114,-28.89977],[148.98701,-28.48623],[151.01361,-28.47865],[151.10847,-28.70329],[151.87599,-28.68312],[151.93348,-28.40788],[152.25544,-28.23327],[153.06608,-28.21047],[153.14082,-28.1091],[153.47351,-28.11648],[153.35765,-27.69361],[159.49383,-27.69925],[159.4857,-37.84741],[149.52569,-37.82815],[149.91596,-37.487],[148.04859,-36.81317],[147.9681,-36.15679],[146.71477,-36.28666],[145.30046,-36.15679],[144.53007,-36.14751],[142.8398,-35.02543],[142.35686,-34.78025],[141.97741,-34.40162],[140.99503,-34.13718],[140.99486,-28.95297]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017"},{id:"NSW_LPI_Imagery",name:"LPI NSW Imagery",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Imagery/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,21],polygon:[[[140.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",best:true},{id:"NSW_LPI_Imagery_Dates",name:"LPI NSW Imagery Dates",type:"wms",template:"https://maps.six.nsw.gov.au/arcgis/services/public/NSW_Imagery_Dates/MapServer/WMSServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&LAYERS=0&STYLES=&FORMAT=image/png32&DPI=96&MAP_RESOLUTION=96&FORMAT_OPTIONS=dpi:96&TRANSPARENT=TRUE",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[140.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017",overlay:true},{id:"NSW_LPI_TopographicMap",name:"LPI NSW Topographic Map",type:"tms",template:"https://maps.six.nsw.gov.au/arcgis/rest/services/public/NSW_Topo_Map/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,16],polygon:[[[140.99884,-28.99924],[148.95024,-28.99937],[148.94988,-28.96653],[148.99983,-28.96653],[149.00009,-28.81658],[149.10007,-28.81658],[149.0997,-28.74885],[148.99985,-28.74974],[148.99982,-28.50003],[151.00005,-28.50052],[151.00059,-28.73258],[151.02395,-28.73274],[151.02413,-28.74188],[151.03293,-28.74188],[151.03383,-28.75054],[151.99998,-28.74953],[151.99998,-28.71645],[152.0334,-28.71661],[152.03322,-28.6832],[152.00007,-28.68335],[151.99988,-28.64163],[151.98299,-28.64139],[151.98317,-28.62491],[151.93313,-28.62475],[151.93341,-28.50007],[151.99989,-28.50023],[151.99986,-28.37496],[152.24997,-28.37507],[152.24994,-28.25001],[152.99972,-28.24986],[152.9999,-28.28324],[153.1165,-28.2834],[153.11659,-28.24986],[153.16663,-28.25001],[153.16672,-28.23316],[153.24999,-28.23324],[153.25003,-28.12497],[153.62496,-28.12508],[153.62484,-28.49991],[153.7498,-28.49999],[153.74959,-28.7498],[153.62481,-28.75011],[153.62497,-28.99993],[153.49977,-29.00006],[153.49984,-29.49951],[153.3748,-29.50005],[153.37541,-29.87503],[153.49991,-29.87514],[153.49991,-30.00009],[153.24989,-29.99976],[153.25002,-30.19177],[153.27482,-30.19162],[153.27482,-30.21685],[153.21661,-30.21661],[153.21661,-30.25006],[153.25002,-30.25006],[153.24975,-30.37519],[153.12436,-30.37497],[153.12465,-30.62504],[153.03317,-30.62505],[153.03339,-30.87508],[153.12492,-30.87503],[153.12493,-31.12505],[153.00824,-31.12497],[153.00829,-31.24998],[153,-31.25],[152.99994,-31.62499],[152.87494,-31.62505],[152.87496,-31.74995],[152.78329,-31.75],[152.7832,-31.87486],[152.74991,-31.87501],[152.75004,-32.00002],[152.6249,-31.99994],[152.62491,-32.5],[152.49998,-32.49996],[152.50003,-32.56664],[152.41667,-32.56634],[152.41676,-32.625],[152.34985,-32.62499],[152.34985,-32.63323],[152.28308,-32.63322],[152.28326,-32.62498],[152.24948,-32.62498],[152.24981,-32.87491],[151.87457,-32.87504],[151.87485,-33.00001],[151.74977,-33.00015],[151.75047,-33.25004],[151.62524,-33.24974],[151.62508,-33.37516],[151.49958,-33.37514],[151.50031,-33.62494],[151.37415,-33.62437],[151.37279,-34.00196],[151.24778,-34.00112],[151.24778,-34.24931],[150.99573,-34.25015],[151.00081,-34.62483],[150.87174,-34.6265],[150.87276,-35.12427],[150.76706,-35.12344],[150.76909,-35.24638],[150.62579,-35.2497],[150.62803,-35.37515],[150.49997,-35.37515],[150.49591,-35.6275],[150.37192,-35.62503],[150.37497,-35.7538],[150.26724,-35.75132],[150.2652,-35.87412],[150.24792,-35.87083],[150.24589,-36.37488],[150.12292,-36.37488],[150.12597,-36.62243],[150.02535,-36.62407],[150.0284,-36.74713],[149.99283,-36.74958],[150.00401,-37.12245],[150.05889,-37.12731],[150.05686,-37.37809],[149.99791,-37.37324],[149.99994,-37.48301],[149.98774,-37.48462],[149.98571,-37.508],[148.06846,-36.80624],[147.99306,-36.138],[147.81483,-36.00556],[147.38939,-36.01137],[147.38221,-36.13103],[146.99725,-36.12755],[146.98863,-36.25283],[146.49564,-36.24471],[146.50426,-36.12639],[145.00118,-36.00795],[145.01541,-36.25421],[144.50725,-36.24765],[144.49912,-36.0211],[143.99654,-35.98105],[143.33826,-35.23318],[142.40976,-34.76694],[142.03614,-34.37588],[140.99652,-34.13858],[140.99884,-28.99924]]],terms_url:"http://spatialservices.finance.nsw.gov.au/mapping_and_imagery/lpi_web_services",terms_text:"© Land and Property Information 2017"},{id:"orthophoto_lyon_2012",name:"Lyon Orthophoto 2012-03 10cm",type:"wms",template:"https://download.data.grandlyon.com/wms/grandlyon?language=fre&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1830_5150_10cm_CC46,1830_5155_10cm_CC46,1830_5160_10cm_CC46,1830_5165_10cm_CC46,1830_5170_10cm_CC46,1830_5175_10cm_CC46,1830_5180_10cm_CC46,1830_5185_10cm_CC46,1830_5190_10cm_CC46,1835_5150_10cm_CC46,1835_5155_10cm_CC46,1835_5160_10cm_CC46,1835_5165_10cm_CC46,1835_5170_10cm_CC46,1835_5175_10cm_CC46,1835_5180_10cm_CC46,1835_5185_10cm_CC46,1835_5190_10cm_CC46,1840_5150_10cm_CC46,1840_5155_10cm_CC46,1840_5160_10cm_CC46,1840_5165_10cm_CC46,1840_5170_10cm_CC46,1840_5175_10cm_CC46,1840_5180_10cm_CC46,1840_5185_10cm_CC46,1840_5190_10cm_CC46,1845_5150_10cm_CC46,1845_5155_10cm_CC46,1845_5160_10cm_CC46,1845_5165_10cm_CC46,1845_5170_10cm_CC46,1845_5175_10cm_CC46,1845_5180_10cm_CC46,1845_5185_10cm_CC46,1845_5190_10cm_CC46,1850_5155_10cm_CC46,1850_5160_10cm_CC46,1850_5165_10cm_CC46,1850_5170_10cm_CC46,1850_5175_10cm_CC46,1850_5180_10cm_CC46,1850_5185_10cm_CC46,1855_5155_10cm_CC46,1855_5165_10cm_CC46,1855_5170_10cm_CC46,1855_5175_10cm_CC46,1855_5180_10cm_CC46,1855_5185_10cm_CC46,1860_5155_10cm_CC46,1860_5160_10cm_CC46,1860_5165_10cm_CC46,1860_5170_10cm_CC46,1860_5175_10cm_CC46,1860_5180_10cm_CC46,1860_5185_10cm_CC46,1865_5155_10cm_CC46,1865_5160_10cm_CC46,1865_5165_10cm_CC46,1865_5170_10cm_CC46&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-03-01T00:00:00.000Z",startDate:"2012-03-01T00:00:00.000Z",polygon:[[[4.69049,45.54652],[4.83131,45.54652],[4.83131,45.57131],[4.88344,45.57131],[4.88344,45.59745],[5.16622,45.59745],[5.16622,45.74533],[5.10793,45.74533],[5.10793,45.88145],[4.90698,45.88145],[4.90698,45.92107],[4.84377,45.92107],[4.84377,45.94011],[4.71543,45.94011],[4.71543,45.87018],[4.67458,45.87018],[4.67458,45.7178],[4.69567,45.7178],[4.69049,45.54652]]],terms_url:"https://data.grandlyon.com/imagerie/orthophotographie-2012-du-grand-lyon",terms_text:"Grand Lyon Smart Data DSIT"},{id:"orthophoto_lyon_2015_8cm",name:"Lyon Orthophoto 2015-05 8cm",type:"wms",template:"https://download.data.grandlyon.com/wms/grandlyon?language=fre&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1835_5155_8cm_CC46,1835_5160_8cm_CC46,1835_5165_8cm_CC46,1835_5170_8cm_CC46,1835_5180_8cm_CC46,1835_5175_8cm_CC46,1845_5175_8cm_CC46,1845_5180_8cm_CC46,1845_5185_8cm_CC46,1845_5190_8cm_CC46,1850_5165_8cm_CC46,1850_5160_8cm_CC46,1850_5155_8cm_CC46,1850_5170_8cm_CC46,1850_5175_8cm_CC46,1850_5180_8cm_CC46,1850_5185_8cm_CC46,1855_5155_8cm_CC46,1855_5160_8cm_CC46,1855_5185_8cm_CC46,1855_5180_8cm_CC46,1855_5175_8cm_CC46,1855_5170_8cm_CC46,1855_5165_8cm_CC46,1860_5160_8cm_CC46,1860_5155_8cm_CC46,1860_5165_8cm_CC46,1835_5185_8cm_CC46,1835_5190_8cm_CC46,1835_5195_8cm_CC46,1840_5160_8cm_CC46,1840_5155_8cm_CC46,1840_5150_8cm_CC46,1830_5195_8cm_CC46,1830_5190_8cm_CC46,1830_5175_8cm_CC46,1830_5170_8cm_CC46,1830_5165_8cm_CC46,1830_5160_8cm_CC46,1830_5155_8cm_CC46,1830_5180_8cm_CC46,1830_5185_8cm_CC46,1835_5150_8cm_CC46,1860_5170_8cm_CC46,1860_5175_8cm_CC46,1840_5180_8cm_CC46,1840_5175_8cm_CC46,1840_5185_8cm_CC46,1840_5190_8cm_CC46,1840_5195_8cm_CC46,1845_5150_8cm_CC46,1845_5155_8cm_CC46,1845_5160_8cm_CC46,1845_5170_8cm_CC46,1845_5165_8cm_CC46,1840_5170_8cm_CC46,1840_5165_8cm_CC46,1860_5180_8cm_CC46,1860_5185_8cm_CC46,1865_5155_8cm_CC46,1865_5160_8cm_CC46,1865_5165_8cm_CC46,1865_5170_8cm_CC46,1830_5150_8cm_CC46&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-05-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",polygon:[[[4.66489,45.54688],[4.88253,45.54348],[4.88435,45.59745],[5.16623,45.59242],[5.17217,45.74532],[5.10793,45.74653],[5.11305,45.88145],[4.90698,45.88508],[4.90822,45.92106],[4.84377,45.92212],[4.84497,45.9581],[4.67729,45.96069],[4.66489,45.54688]]],terms_url:"https://data.grandlyon.com/imagerie/orthophotographie-2015-du-grand-lyon",terms_text:"Métropole de Lyon DINSI",best:true},{id:"MainRoadsWA_Road_Hierarchy",name:"Main Roads WA Road Hierarchy",type:"wms",template:"https://services.slip.wa.gov.au/public/services/SLIP_Public_Services/Transport/MapServer/WMSServer?LAYERS=8&TRANSPARENT=TRUE&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fpng&SRS={proj}&BBOX={bbox}&WIDTH={width}&HEIGHT={height}",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[129.00009,-31.68764],[128.99872,-14.58225],[127.08984,-12.29707],[124.76074,-12.98315],[121.24512,-15.70766],[119.0918,-17.60214],[115.53223,-18.85431],[112.41211,-20.46819],[111.24756,-22.83695],[111.00586,-25.62172],[111.64307,-29.66896],[111.68701,-32.3614],[112.14844,-34.47034],[113.35693,-36.10238],[116.98242,-36.70366],[119.44336,-36.94989],[122.27783,-36.61553],[125.99121,-35.40696],[127.59521,-34.57895],[128.86963,-33.59632],[129.00009,-31.68764]]],terms_url:"https://catalogue.data.wa.gov.au/dataset/clss-road-hierarchy",terms_text:"Main Roads Western Australia",overlay:true},{id:"mainzlatestaerialimagery",name:"Mainz latest aerial imagery",type:"wms",template:"https://gint.mainz.de/gint1-cgi/mapserv?map=/data/mapbender-int/umn-www/client/a62/luftbild.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_f_mz_2018&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[17,22],polygon:[[[8.10355,49.865],[8.38356,49.865],[8.38356,50.0466],[8.10355,50.0466],[8.10355,49.865]]],terms_url:"https://www.mainz.de/vv/oe/100140100000035141.php#tab-infos",terms_text:"Vermessung und Geoinformation Mainz",icon:"https://www.mainz.de/configuration.inc.php.media/27432/Logo-72px.png"},{id:"major_isidoro",name:"Major Isidoro AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Major%20Isidoro&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.94048,-9.57588],[-36.94106,-9.48536],[-37.03215,-9.48606],[-37.03164,-9.57639],[-36.94048,-9.57588]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"Mapbox",name:"Mapbox Satellite",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/mapbox.satellite/{zoom}/{x}/{y}@2x.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",tileSize:512,zoomExtent:[0,22],terms_url:"https://www.mapbox.com/about/maps",terms_text:"Terms & Feedback","default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/MapBoxSatellite.png"},{id:"Maps4BW-LGL_BW",name:"Maps4BW (LGL-BW, www.lgl-bw.de)",type:"wms",template:"http://www.webatlasde.de/arcgis/services/Maps4BW/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Halbtonvariante&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.06954,49.57679],[9.10577,49.57952],[9.16079,49.58263],[9.24212,49.58402],[9.27192,49.63515],[9.30454,49.65561],[9.36753,49.65893],[9.38253,49.64341],[9.41191,49.66033],[9.39602,49.67143],[9.41828,49.69706],[9.40378,49.71957],[9.37769,49.70357],[9.35828,49.70334],[9.29438,49.73958],[9.31467,49.76859],[9.42435,49.79099],[9.50417,49.78962],[9.51808,49.78214],[9.65623,49.79286],[9.65317,49.73944],[9.63435,49.70076],[9.67054,49.69515],[9.67721,49.71846],[9.71079,49.72918],[9.8014,49.73429],[9.83728,49.70237],[9.87656,49.61362],[9.83362,49.55607],[9.84954,49.54793],[9.87463,49.5836],[9.91419,49.58955],[9.93066,49.56097],[9.92482,49.48951],[10.01787,49.48673],[10.03352,49.52978],[10.06372,49.55129],[10.09052,49.54218],[10.12792,49.51192],[10.11027,49.49272],[10.16753,49.38589],[10.12627,49.3809],[10.14385,49.32772],[10.16061,49.27043],[10.13569,49.26189],[10.14311,49.20387],[10.25161,49.15031],[10.26279,49.12959],[10.26869,49.05202],[10.36527,49.02557],[10.45894,48.93581],[10.46208,48.83947],[10.42886,48.74973],[10.46648,48.73627],[10.49761,48.68581],[10.45007,48.66277],[10.3553,48.65068],[10.32297,48.68241],[10.26028,48.67842],[10.32542,48.60763],[10.31448,48.52323],[10.17973,48.45977],[10.12892,48.45301],[10.10938,48.47445],[10.06355,48.45381],[10.03918,48.45125],[10.04492,48.43158],[10.0152,48.40323],[9.98709,48.38565],[9.97328,48.37944],[9.97549,48.36558],[9.99071,48.3734],[10.00265,48.3632],[9.99992,48.35572],[10.06698,48.28172],[10.08111,48.2253],[10.11306,48.12632],[10.13966,48.11307],[10.14695,48.07455],[10.13763,48.01938],[10.11725,47.9755],[10.11359,47.93422],[10.10709,47.86711],[10.14174,47.80956],[10.0732,47.78686],[10.11825,47.76126],[10.14213,47.70165],[10.13262,47.67678],[10.07445,47.63472],[10.06303,47.66923],[10.00359,47.67526],[9.95808,47.64376],[9.84481,47.67533],[9.83488,47.66042],[9.74926,47.60206],[9.70817,47.60007],[9.65788,47.60599],[9.64742,47.58931],[9.61389,47.57809],[9.56602,47.53274],[9.51199,47.53246],[9.25717,47.65752],[9.18684,47.65697],[9.17591,47.65379],[9.17028,47.65474],[9.15555,47.666],[9.1494,47.66713],[9.13947,47.66367],[9.02005,47.68616],[8.94127,47.65569],[8.89825,47.64821],[8.88263,47.65327],[8.87474,47.6545],[8.87235,47.66971],[8.84949,47.68089],[8.84993,47.70233],[8.81816,47.71242],[8.80108,47.72811],[8.77231,47.71606],[8.81295,47.6959],[8.79373,47.67216],[8.7533,47.68997],[8.72575,47.6917],[8.71002,47.68829],[8.68937,47.69318],[8.67046,47.68235],[8.65783,47.68883],[8.66161,47.71454],[8.70596,47.71584],[8.70932,47.73275],[8.73033,47.75527],[8.72003,47.76273],[8.68871,47.75314],[8.67898,47.78306],[8.64981,47.79435],[8.65592,47.76948],[8.63132,47.75749],[8.61918,47.76216],[8.61351,47.78451],[8.61686,47.79705],[8.568,47.79977],[8.57611,47.79015],[8.57847,47.78102],[8.56315,47.77654],[8.48889,47.76458],[8.45742,47.74126],[8.4623,47.72909],[8.44929,47.71663],[8.41471,47.69991],[8.4273,47.68562],[8.41061,47.6743],[8.46839,47.6568],[8.52474,47.64677],[8.5269,47.66373],[8.56441,47.67261],[8.57853,47.66373],[8.60454,47.6751],[8.63333,47.65212],[8.62386,47.63922],[8.60395,47.63193],[8.61281,47.61327],[8.57951,47.59306],[8.5602,47.59867],[8.56765,47.61442],[8.53394,47.62984],[8.51208,47.61641],[8.46581,47.60137],[8.46631,47.58666],[8.48985,47.59139],[8.5,47.58062],[8.43414,47.5629],[8.39882,47.57559],[8.38525,47.56408],[8.32701,47.56893],[8.29483,47.59077],[8.2948,47.60497],[8.26293,47.60823],[8.22435,47.60446],[8.18644,47.60508],[8.16904,47.59394],[8.13615,47.58246],[8.10503,47.56795],[8.09873,47.55933],[8.08261,47.55624],[8.07095,47.56299],[8.0274,47.54931],[7.94632,47.54209],[7.90966,47.54825],[7.90676,47.5603],[7.88681,47.58765],[7.83987,47.58122],[7.79648,47.55517],[7.69208,47.53137],[7.66583,47.53403],[7.63159,47.56044],[7.63879,47.56619],[7.68607,47.57205],[7.65278,47.59418],[7.62247,47.57767],[7.60473,47.57822],[7.58771,47.59015],[7.52156,47.65161],[7.50399,47.70235],[7.52096,47.77685],[7.55712,47.84839],[7.54946,47.8792],[7.57461,47.93028],[7.61318,47.96804],[7.6119,47.9871],[7.56124,48.03836],[7.57491,48.1258],[7.59534,48.15977],[7.63305,48.19717],[7.66275,48.22473],[7.68466,48.30305],[7.76346,48.49158],[7.80046,48.5126],[7.79958,48.5878],[7.83409,48.64439],[7.91211,48.68899],[7.96723,48.75716],[8.02069,48.78879],[8.04302,48.7956],[8.08647,48.81306],[8.13644,48.89782],[8.19706,48.96021],[8.28161,48.9949],[8.29967,49.02597],[8.31243,49.05996],[8.38654,49.23497],[8.46083,49.28407],[8.48783,49.29326],[8.47577,49.3079],[8.44839,49.31693],[8.45152,49.33135],[8.46288,49.3869],[8.49407,49.40186],[8.49762,49.41583],[8.50721,49.43414],[8.49834,49.44187],[8.47977,49.44391],[8.46414,49.44151],[8.44696,49.44516],[8.43947,49.45214],[8.44407,49.46085],[8.45992,49.46498],[8.46312,49.47135],[8.4554,49.48107],[8.44184,49.49297],[8.41194,49.55852],[8.42193,49.5843],[8.44117,49.59081],[8.45482,49.59157],[8.47738,49.5874],[8.56161,49.52237],[8.61486,49.54175],[8.59165,49.59179],[8.58706,49.61156],[8.65189,49.6209],[8.69494,49.62762],[8.70105,49.59869],[8.68726,49.57096],[8.72597,49.53085],[8.78493,49.51775],[8.81467,49.53187],[8.88863,49.51091],[8.90168,49.50363],[8.90315,49.486],[8.87995,49.46561],[8.83117,49.42147],[8.80845,49.40981],[8.82075,49.39647],[8.83009,49.41316],[8.85107,49.39663],[8.90247,49.44632],[8.93863,49.48179],[8.95154,49.50562],[8.98498,49.51153],[9.03553,49.50079],[9.05731,49.532],[9.10023,49.52728],[9.11009,49.51213],[9.12424,49.51722],[9.11286,49.53337],[9.08284,49.54211],[9.06694,49.56433],[9.06954,49.57679]]],terms_url:"https://www.lgl-bw.de/",terms_text:"Datengrundlage: LGL, www.lgl-bw.de"},{id:"mar_vermelho_al",name:"Mar Vermelho AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Mar%20Vermelho&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.34201,-9.49289],[-36.3422,-9.47533],[-36.34275,-9.4029],[-36.34473,-9.4029],[-36.34537,-9.40279],[-36.34702,-9.40293],[-36.3508,-9.40291],[-36.359,-9.40307],[-36.36109,-9.403],[-36.36289,-9.40307],[-36.3659,-9.40305],[-36.36713,-9.40301],[-36.37571,-9.40307],[-36.38049,-9.40308],[-36.38663,-9.4032],[-36.38852,-9.40312],[-36.39286,-9.40325],[-36.39656,-9.40322],[-36.40309,-9.40327],[-36.41973,-9.40338],[-36.43368,-9.4034],[-36.43355,-9.41685],[-36.43344,-9.42386],[-36.43338,-9.43753],[-36.43329,-9.45012],[-36.433,-9.49359],[-36.40839,-9.4935],[-36.40442,-9.49354],[-36.40008,-9.49351],[-36.39787,-9.49342],[-36.39168,-9.49328],[-36.38757,-9.49331],[-36.38536,-9.49341],[-36.37673,-9.49331],[-36.37427,-9.49319],[-36.36707,-9.49299],[-36.36502,-9.493],[-36.36043,-9.49299],[-36.35955,-9.49295],[-36.35895,-9.49304],[-36.35703,-9.49294],[-36.35665,-9.493],[-36.3526,-9.493],[-36.34767,-9.49297],[-36.34201,-9.49289]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"MassGIS-L3-Parcels",name:"MassGIS L3 Parcels",type:"tms",template:"http://tile.osm.osuosl.org/tiles/massgis_parcels/{zoom}/{x}/{y}.png",polygon:[[[-72.13569,42.03025],[-72.53156,42.03458],[-72.57278,42.03022],[-72.58216,42.02474],[-72.60717,42.02515],[-72.60797,42.03108],[-72.64019,42.03205],[-72.69933,42.03696],[-72.75714,42.03635],[-72.75868,42.02439],[-72.76572,42.02276],[-72.76673,42.00327],[-72.81705,41.99769],[-72.81378,42.03674],[-73.03678,42.03929],[-73.43281,42.05059],[-73.49688,42.04968],[-73.50814,42.08626],[-73.26496,42.74594],[-72.6872,42.73348],[-71.97286,42.71307],[-71.69663,42.70572],[-71.29464,42.69704],[-71.27894,42.71136],[-71.26787,42.72603],[-71.25526,42.73659],[-71.24598,42.74231],[-71.23732,42.74491],[-71.22391,42.74643],[-71.18181,42.73732],[-71.18617,42.79088],[-71.16667,42.80891],[-71.13277,42.82145],[-71.06442,42.80626],[-71.05395,42.83337],[-71.04483,42.84869],[-71.03128,42.85924],[-70.96702,42.86887],[-70.94967,42.87588],[-70.92973,42.88504],[-70.91465,42.88661],[-70.90348,42.88671],[-70.88566,42.88288],[-70.84776,42.86088],[-70.82963,42.86875],[-70.81567,42.87204],[-70.45842,42.67694],[-70.8759,42.35302],[-69.88713,42.0519],[-69.89537,41.21643],[-70.81959,41.23192],[-71.09996,41.43386],[-71.12047,41.49717],[-71.13131,41.59231],[-71.14059,41.6051],[-71.14047,41.62389],[-71.13569,41.6284],[-71.13291,41.6601],[-71.17605,41.6681],[-71.17588,41.67154],[-71.1954,41.67514],[-71.26139,41.7523],[-71.32885,41.7811],[-71.33407,41.79455],[-71.34156,41.79817],[-71.33914,41.80842],[-71.3472,41.8231],[-71.3449,41.828],[-71.3352,41.8355],[-71.3422,41.8448],[-71.33392,41.86229],[-71.34086,41.87872],[-71.33865,41.89865],[-71.38174,41.8932],[-71.38127,42.01885],[-71.49744,42.01725],[-71.52888,42.01499],[-71.79925,42.00807],[-71.80067,42.02351],[-72.0635,42.02735],[-72.13569,42.03025]]]},{id:"geodata.md.gov-MD_SixInchImagery",name:"MD Latest 6 Inch Aerial Imagery",type:"wms",template:"https://geodata.md.gov/imap/services/Imagery/MD_SixInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_SixInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-76.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Six Inch resolution aerial imagery for the State of Maryland"},{id:"geodata.md.gov-MD_ThreeInchImagery",name:"MD Three Inch Aerial Imagery",type:"wms",template:"https://geodata.md.gov/imap/services/Imagery/MD_ThreeInchImagery/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=MD_ThreeInchImagery&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[-76.46299,38.9808],[-76.46326,38.94779],[-76.49499,38.9369],[-76.51617,38.93697],[-76.54763,38.9591],[-76.54745,38.98667],[-76.51559,39.00306],[-76.4839,39.00292],[-76.46299,38.9808]],[[-76.09548,38.84133],[-76.0428,38.8409],[-76.04289,38.8298],[-76.03229,38.8297],[-76.03277,38.79667],[-76.02545,38.79664],[-76.02541,38.77462],[-76.03308,38.77472],[-76.03366,38.73073],[-76.05462,38.73094],[-76.0548,38.72005],[-76.10753,38.72043],[-76.10714,38.75338],[-76.11754,38.75346],[-76.11701,38.79731],[-76.09601,38.79715],[-76.09548,38.84133]],[[-77.23397,39.16838],[-77.25516,39.14647],[-77.25496,39.11343],[-77.18093,39.05337],[-77.14907,39.0477],[-77.12798,39.04779],[-77.10683,39.05325],[-77.10688,39.0917],[-77.11775,39.10827],[-77.16011,39.12485],[-77.15975,39.15214],[-77.17048,39.16302],[-77.21284,39.17272],[-77.23397,39.16838]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Three Inch Resolution Imagery for the cities of Rockville, Gaithersburg and Annapolis"},{id:"geodata.md.gov-MD_ColorBasemap",name:"MD Transportation Basemap",type:"wms",template:"https://geodata.md.gov/imap/services/Transportation/MD_ColorBasemap/MapServer/WmsServer?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=MD_ColorBasemap&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-76.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],terms_url:"http://imap.maryland.gov/Pages/imagery-products.aspx",terms_text:"DoIT, MD iMap, MDP",description:"Maryland State Highway Administration road features and additional Maryland focused landmarks"},{id:"MCGIS-County-NAIP-Imagery-2015",name:"Mesa County GIS NAIP 2015",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/MesaCounty_2015/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-NAIP-Imagery-2017",name:"Mesa County GIS NAIP 2017",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/NAIP_2017/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2017-10-24T00:00:00.000Z",startDate:"2017-08-26T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-Valleywide-Imagery-2018",name:"Mesa County GIS Valleywide 2018",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/City_Color_2018/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-108.93915,39.23931],[-108.86841,39.23846],[-108.86843,39.23734],[-108.81245,39.23666],[-108.81274,39.22256],[-108.79405,39.22234],[-108.79432,39.20857],[-108.70096,39.20745],[-108.70123,39.1939],[-108.60764,39.19277],[-108.60791,39.17906],[-108.58915,39.17884],[-108.58943,39.1649],[-108.53332,39.16422],[-108.53361,39.14993],[-108.51461,39.14971],[-108.51489,39.13611],[-108.44076,39.13522],[-108.44104,39.12109],[-108.42192,39.12086],[-108.42201,39.1163],[-108.3984,39.11602],[-108.39798,39.13708],[-108.32446,39.13619],[-108.32416,39.15107],[-108.30718,39.15087],[-108.3066,39.18],[-108.28866,39.17979],[-108.28807,39.20939],[-108.26868,39.20916],[-108.26957,39.16484],[-108.2864,39.16505],[-108.28699,39.13571],[-108.30312,39.13591],[-108.3038,39.10194],[-108.32335,39.10218],[-108.32328,39.10574],[-108.32914,39.10581],[-108.32943,39.09121],[-108.34736,39.09142],[-108.34764,39.07715],[-108.36637,39.07738],[-108.36666,39.06268],[-108.38569,39.06291],[-108.38599,39.04799],[-108.42216,39.04843],[-108.42245,39.03377],[-108.44051,39.03399],[-108.44137,38.99101],[-108.42193,38.99077],[-108.42252,38.96127],[-108.44162,38.9615],[-108.44133,38.97595],[-108.46034,38.97618],[-108.46006,38.99024],[-108.47877,38.99047],[-108.47848,39.00485],[-108.51515,39.0053],[-108.51519,39.00287],[-108.51825,39.00291],[-108.51821,39.00517],[-108.53414,39.00536],[-108.53397,39.0139],[-108.54342,39.01401],[-108.54336,39.01733],[-108.5455,39.01735],[-108.54548,39.01855],[-108.65864,39.01991],[-108.65778,39.06287],[-108.67867,39.06313],[-108.67837,39.07793],[-108.69699,39.07816],[-108.69671,39.09203],[-108.71557,39.09225],[-108.71529,39.10619],[-108.7388,39.10648],[-108.73853,39.12033],[-108.75744,39.12056],[-108.75686,39.14927],[-108.79422,39.14972],[-108.79393,39.16386],[-108.83224,39.16432],[-108.83196,39.17845],[-108.85061,39.17868],[-108.85033,39.19302],[-108.86938,39.19325],[-108.86906,39.20925],[-108.90237,39.20965],[-108.90208,39.22384],[-108.93946,39.22429],[-108.93915,39.23931]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"Metropole_Ruhr_RVR-DOP10",name:"Metropole Ruhr: Luftbilder (10 cm)",type:"wms",template:"https://geodaten.metropoleruhr.de/dop/dop?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DOP&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[6.51691,51.81714],[6.52258,51.81469],[6.52281,51.81041],[6.52834,51.81053],[6.53991,51.80134],[6.5511,51.799],[6.56818,51.78992],[6.57476,51.79606],[6.58457,51.79369],[6.59102,51.8024],[6.60911,51.80019],[6.61081,51.79423],[6.63264,51.79981],[6.65946,51.7892],[6.66837,51.77738],[6.7138,51.78084],[6.70876,51.77131],[6.72131,51.76899],[6.7475,51.77035],[6.74862,51.77551],[6.75824,51.77656],[6.7698,51.76649],[6.77219,51.74596],[6.78862,51.74884],[6.79861,51.74217],[6.81927,51.74341],[6.81956,51.73741],[6.82683,51.72983],[6.8403,51.73694],[6.84995,51.73712],[6.85551,51.73636],[6.8586,51.72956],[6.9103,51.74592],[6.90861,51.75275],[6.91511,51.76144],[6.9157,51.7786],[6.93527,51.7738],[6.95606,51.77245],[6.97559,51.79936],[6.98794,51.80129],[6.99485,51.80141],[6.99497,51.79884],[7.02118,51.80014],[7.0244,51.7899],[7.03141,51.78745],[7.0316,51.78317],[7.03847,51.78414],[7.05392,51.77839],[7.06079,51.77936],[7.0609,51.77679],[7.07333,51.777],[7.07867,51.78137],[7.11433,51.78795],[7.13435,51.80542],[7.1616,51.81528],[7.16419,51.8196],[7.19177,51.82174],[7.2141,51.81694],[7.22121,51.81191],[7.23658,51.80785],[7.23668,51.80528],[7.24916,51.80461],[7.2535,51.79953],[7.26179,51.79966],[7.26485,51.79198],[7.26245,51.78252],[7.27229,51.77838],[7.26002,51.77391],[7.26012,51.77134],[7.2688,51.76118],[7.27577,51.75957],[7.27889,51.75019],[7.31079,51.74636],[7.3151,51.74214],[7.31519,51.73957],[7.31102,51.74036],[7.3125,51.73781],[7.32081,51.73707],[7.31169,51.72237],[7.29963,51.71277],[7.2985,51.70589],[7.31069,51.71207],[7.30825,51.70346],[7.32762,51.70202],[7.33057,51.69692],[7.34427,51.69969],[7.34599,51.69028],[7.33919,51.68761],[7.35589,51.68356],[7.35877,51.68017],[7.3781,51.67959],[7.39086,51.66947],[7.40617,51.6654],[7.41031,51.66545],[7.4101,51.67145],[7.43089,51.6683],[7.43892,51.67527],[7.44854,51.67625],[7.44933,51.69341],[7.44094,51.69673],[7.43792,51.7044],[7.42406,51.70593],[7.42245,51.71277],[7.43451,51.72321],[7.44825,51.72511],[7.46718,51.7365],[7.47273,51.73572],[7.4771,51.72892],[7.4826,51.72985],[7.47877,51.72037],[7.48435,51.71872],[7.48449,51.71444],[7.49119,51.72053],[7.49947,51.72063],[7.50214,51.72324],[7.51738,51.72172],[7.51788,51.70629],[7.53035,51.70473],[7.52922,51.69701],[7.53349,51.69277],[7.54458,51.6912],[7.5378,51.68768],[7.54477,51.6852],[7.5528,51.69301],[7.56651,51.69575],[7.56642,51.69832],[7.58706,51.70029],[7.59379,51.70551],[7.6048,51.7065],[7.60743,51.71082],[7.6143,51.71176],[7.61419,51.71518],[7.62663,51.71447],[7.62814,51.7102],[7.64321,51.71381],[7.6531,51.70621],[7.65428,51.71308],[7.668,51.71581],[7.66915,51.72353],[7.68832,51.72889],[7.69283,51.71608],[7.7012,51.71275],[7.71352,51.71631],[7.71481,51.71976],[7.71899,51.71809],[7.71749,51.72236],[7.72163,51.7224],[7.72555,51.73016],[7.73659,51.73028],[7.73638,51.73799],[7.75154,51.73901],[7.7699,51.72378],[7.77119,51.72722],[7.78908,51.72912],[7.79037,51.73256],[7.80282,51.73183],[7.80137,51.73439],[7.80825,51.73531],[7.81228,51.73964],[7.82058,51.73887],[7.82457,51.74491],[7.83287,51.74413],[7.83314,51.73385],[7.83739,51.72961],[7.85815,51.72724],[7.85822,51.72467],[7.86374,51.72472],[7.87187,51.7308],[7.87745,51.72828],[7.88038,51.72145],[7.88875,51.7181],[7.88912,51.70267],[7.90148,51.70536],[7.90568,51.70283],[7.91249,51.70632],[7.92768,51.7056],[7.92912,51.70305],[7.94014,51.704],[7.93746,51.70055],[7.94296,51.70146],[7.96108,51.69305],[7.97631,51.69061],[7.97779,51.68633],[7.9875,51.68385],[7.98761,51.67871],[7.99732,51.67622],[7.9974,51.67279],[7.98365,51.67096],[7.96286,51.67592],[7.95466,51.67242],[7.95366,51.65612],[7.94689,51.65092],[7.94984,51.64237],[7.94443,51.63804],[7.93477,51.6388],[7.93224,51.62935],[7.92406,51.62585],[7.92414,51.62242],[7.91195,51.61374],[7.91632,51.60349],[7.91378,51.59489],[7.87529,51.59282],[7.86837,51.59446],[7.85742,51.59179],[7.85889,51.58837],[7.82749,51.57863],[7.84327,51.55307],[7.83262,51.53925],[7.83277,51.53325],[7.84115,51.52819],[7.8345,51.51955],[7.83755,51.50758],[7.83212,51.50496],[7.83912,51.49988],[7.83923,51.4956],[7.84474,51.49479],[7.8506,51.48028],[7.83418,51.4784],[7.82198,51.47228],[7.80819,51.47471],[7.79876,51.46776],[7.78906,51.47109],[7.76169,51.46823],[7.74785,51.47237],[7.7425,51.46717],[7.73567,51.46623],[7.72864,51.47216],[7.69838,51.4744],[7.67525,51.46728],[7.65606,51.46621],[7.65347,51.46103],[7.63843,51.45914],[7.63589,51.45226],[7.62083,51.45122],[7.61407,51.44772],[7.61977,51.44092],[7.62525,51.44099],[7.62127,51.43666],[7.62825,51.43245],[7.62561,51.42899],[7.63125,51.42391],[7.61633,51.41859],[7.62183,51.4178],[7.62196,51.41352],[7.63313,51.40679],[7.61322,51.38512],[7.60485,51.39017],[7.60609,51.39447],[7.59647,51.39521],[7.58704,51.38995],[7.59,51.38313],[7.58465,51.37878],[7.58644,51.36509],[7.59234,51.35144],[7.59934,51.34638],[7.59257,51.34373],[7.59407,51.33946],[7.58186,51.33588],[7.58334,51.33247],[7.57655,51.33067],[7.57816,51.32298],[7.58373,51.31962],[7.57837,51.31612],[7.58134,51.30844],[7.58547,51.30763],[7.58305,51.29732],[7.56826,51.28942],[7.56582,51.27996],[7.55089,51.27635],[7.54977,51.26862],[7.52923,51.27008],[7.52797,51.26663],[7.51302,51.26387],[7.51049,51.25784],[7.50371,51.25604],[7.50385,51.25175],[7.49563,51.2525],[7.49438,51.24906],[7.49708,51.24995],[7.50271,51.24488],[7.50143,51.24229],[7.48262,51.23262],[7.469,51.23158],[7.46505,51.22724],[7.45129,51.23049],[7.44191,51.22522],[7.44478,51.22098],[7.43534,51.21742],[7.43816,51.21489],[7.43413,51.21312],[7.42995,51.21563],[7.42962,51.22506],[7.42408,51.22756],[7.41182,51.22653],[7.41342,51.2197],[7.39824,51.22463],[7.39521,51.23317],[7.40319,51.23928],[7.3934,51.246],[7.38793,51.24593],[7.38672,51.24162],[7.37853,51.24151],[7.37289,51.24657],[7.35526,51.2429],[7.35405,51.23859],[7.34849,51.24109],[7.339,51.23924],[7.33872,51.24695],[7.32904,51.25024],[7.3238,51.24417],[7.31284,51.24487],[7.31027,51.24054],[7.30481,51.24046],[7.29643,51.24549],[7.29764,51.24979],[7.28262,51.24957],[7.27541,51.25975],[7.2715,51.25455],[7.26734,51.25621],[7.26578,51.26133],[7.27623,51.27434],[7.26764,51.2845],[7.25531,51.28518],[7.26537,51.30847],[7.26521,51.31276],[7.25974,51.31268],[7.26511,51.31533],[7.26365,51.31788],[7.23393,51.308],[7.22973,51.31051],[7.2271,51.3079],[7.22296,51.3087],[7.22309,51.30527],[7.20682,51.30159],[7.20026,51.29463],[7.18792,51.2953],[7.18232,51.29864],[7.16869,51.29757],[7.18065,51.30633],[7.16674,51.31211],[7.16924,51.31815],[7.16503,51.32066],[7.1662,51.32582],[7.15645,51.32996],[7.15351,51.33505],[7.14807,51.33411],[7.14927,51.33842],[7.14513,51.33921],[7.15292,51.34962],[7.14882,51.34956],[7.14731,51.35296],[7.15665,51.35911],[7.15911,51.36601],[7.15189,51.37532],[7.14634,51.37695],[7.13957,51.37513],[7.13802,51.37939],[7.13262,51.37759],[7.127,51.38093],[7.12163,51.37827],[7.12153,51.38084],[7.11742,51.38078],[7.11626,51.37561],[7.11215,51.37555],[7.11205,51.37812],[7.1039,51.37627],[7.09853,51.37361],[7.10004,51.37021],[7.0919,51.36836],[7.08765,51.37172],[7.08088,51.3699],[7.07796,51.37414],[7.0552,51.36176],[7.04973,51.36167],[7.04404,51.36671],[7.03604,51.36144],[7.01944,51.36544],[7.01,51.36185],[7.00745,51.35752],[6.98689,51.35803],[6.98301,51.35282],[6.97743,51.35529],[6.97621,51.35184],[6.96545,51.34737],[6.95033,51.34882],[6.94748,51.35134],[6.9257,51.34839],[6.92422,51.35093],[6.92825,51.35272],[6.92137,51.35346],[6.92391,51.35779],[6.90565,51.36775],[6.90022,51.3668],[6.8904,51.37176],[6.87848,51.36297],[6.86745,51.36449],[6.85115,51.36162],[6.84552,51.36495],[6.84991,51.35903],[6.83385,51.35101],[6.82295,51.34995],[6.81731,51.35328],[6.81615,51.34897],[6.80939,51.34713],[6.80649,51.3505],[6.7941,51.35198],[6.79314,51.34339],[6.77673,51.34308],[6.7475,51.35281],[6.73831,51.34492],[6.72749,51.34214],[6.71287,51.33328],[6.69193,51.34144],[6.66428,51.3469],[6.65435,51.35356],[6.65789,51.36477],[6.67409,51.36938],[6.67794,51.3746],[6.67511,51.37626],[6.6684,51.37356],[6.67309,51.38908],[6.66081,51.38798],[6.65693,51.38362],[6.64602,51.38254],[6.64443,51.3868],[6.63626,51.38577],[6.63586,51.39348],[6.611,51.39726],[6.59479,51.39265],[6.57148,51.39302],[6.56618,51.38948],[6.55797,51.38931],[6.55496,51.39439],[6.54679,51.39337],[6.54505,51.40019],[6.53816,51.4009],[6.52939,51.41101],[6.52596,51.42379],[6.5149,51.42527],[6.51453,51.43213],[6.51987,51.43481],[6.52092,51.44084],[6.51119,51.4432],[6.50821,51.44743],[6.50273,51.44731],[6.50198,51.46101],[6.50709,51.46798],[6.49868,51.47123],[6.49698,51.4772],[6.49012,51.47705],[6.48714,51.48127],[6.4818,51.47859],[6.47608,51.48275],[6.47404,51.49471],[6.46699,51.49799],[6.46245,51.50561],[6.45407,51.508],[6.45497,51.51659],[6.44796,51.51901],[6.45326,51.52255],[6.44876,51.52931],[6.45562,51.52946],[6.47816,51.51966],[6.47499,51.52731],[6.48673,51.53871],[6.46262,51.55191],[6.49612,51.56806],[6.46176,51.56732],[6.42276,51.5759],[6.41912,51.56725],[6.40847,51.56101],[6.38918,51.56144],[6.37657,51.56545],[6.36951,51.56872],[6.36916,51.57471],[6.37726,51.57747],[6.37284,51.58251],[6.37372,51.59111],[6.35235,51.60349],[6.33482,51.59709],[6.32362,51.60026],[6.32067,51.60363],[6.33275,51.60905],[6.33392,51.6125],[6.30035,51.62117],[6.30143,51.62633],[6.29113,51.63725],[6.29225,51.64156],[6.29903,51.64343],[6.32563,51.63632],[6.32819,51.63981],[6.35403,51.64554],[6.35313,51.66095],[6.36553,51.66123],[6.36262,51.66374],[6.37069,51.66735],[6.38091,51.6813],[6.38062,51.68643],[6.37195,51.6931],[6.35808,51.6945],[6.35482,51.703],[6.3682,51.71016],[6.37642,51.7112],[6.38041,51.71387],[6.37731,51.7198],[6.38829,51.7209],[6.38789,51.72775],[6.40932,51.73937],[6.41055,51.74197],[6.40346,51.74524],[6.40597,51.74959],[6.40178,51.75035],[6.40287,51.75552],[6.41405,51.75319],[6.42134,51.7465],[6.42188,51.73708],[6.40877,51.72478],[6.40921,51.71708],[6.4164,51.71209],[6.44839,51.70765],[6.46246,51.70281],[6.47677,51.71855],[6.48908,51.72053],[6.48418,51.73414],[6.48942,51.7394],[6.48908,51.74539],[6.48171,51.75381],[6.53363,51.76434],[6.52478,51.77444],[6.50784,51.78094],[6.4898,51.80714],[6.48961,51.81056],[6.51162,51.81274],[6.51691,51.81714]]],terms_url:"https://www.metropoleruhr.de/regionalverband-ruhr.html",terms_text:"Datengrundlage: Regionalverband Ruhr"},{id:"miljodirektoratet-vern",name:"Miljødirektoratet Protected Areas overlay",type:"wms",template:"https://arcgisproxy.miljodirektoratet.no/arcgis/services/vern/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=naturvern_klasser_omrade,naturvern_punkt&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kart.naturbase.no",terms_text:"© Miljødirektoratet",description:"Norwegian national parks, nature reserves and other protected areas and objects from Naturbase, including Svalbard/Spitsbergen",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{id:"miljodirektoratet-friluftsomrader",name:"Miljødirektoratet Public Recreation Areas overlay",type:"wms",template:"https://arcgisproxy.miljodirektoratet.no/arcgis/services/friluftsliv_statlig_sikra/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=friluftsliv_statlig_sikra&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.miljostatus.no/tema/friluftsliv/statlig-sikra-friluftlivsomrader/",terms_text:"© Miljødirektoratet",description:"Public recreation areas with State ownership (\"friluftsområder\").",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{id:"minador_do_negrao",name:"Minador do Negrão",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Minador%20do%20Negrao&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.8196,-9.35174],[-36.82017,-9.26142],[-36.82465,-9.26133],[-36.83064,-9.26147],[-36.83673,-9.2615],[-36.84228,-9.26148],[-36.84562,-9.2616],[-36.85564,-9.2616],[-36.86214,-9.26159],[-36.8659,-9.26147],[-36.86724,-9.2615],[-36.86952,-9.26149],[-36.87127,-9.26157],[-36.87476,-9.26153],[-36.87816,-9.26163],[-36.88321,-9.2617],[-36.88565,-9.26167],[-36.88857,-9.26148],[-36.89217,-9.26151],[-36.89383,-9.26163],[-36.8974,-9.26175],[-36.91122,-9.26183],[-36.9111,-9.26651],[-36.91112,-9.28542],[-36.91121,-9.29066],[-36.91118,-9.29368],[-36.91099,-9.29929],[-36.91091,-9.30729],[-36.9109,-9.3123],[-36.91083,-9.31597],[-36.91084,-9.32013],[-36.91098,-9.32395],[-36.91099,-9.32587],[-36.91079,-9.32964],[-36.91079,-9.33523],[-36.91074,-9.33944],[-36.91092,-9.34311],[-36.91084,-9.34471],[-36.91066,-9.35229],[-36.89277,-9.35225],[-36.87735,-9.35212],[-36.86463,-9.35203],[-36.85761,-9.35194],[-36.84344,-9.35191],[-36.83115,-9.3518],[-36.8196,-9.35174]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"mml-tausta",name:"MML Background Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/taustakartta/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Background map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-orto",name:"MML Orthophoto",type:"tms",template:"http://tiles.kartat.kapsi.fi/ortokuva/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",best:true,description:"Ortophotos from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-topo",name:"MML Topographic Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/peruskartta/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Topographic map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mtbmap-no",name:"MTBmap.no",type:"tms",template:"https://mtbmap.no/tiles/osm/mtbmap/{zoom}/{x}/{y}.jpg",tileSize:512,zoomExtent:[3,14],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.mtbmap.no/",terms_text:"© MTBmap.no",description:"Norwegian mountain biking map from OSM (max zoom 14-16, varies per region)",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/no/MTBmapno.png"},{id:"MunichLatestAerialImagery",name:"Munich latest aerial imagery 60cm",type:"wms",template:"https://ogc.muenchen.de/wms/opendata_luftbild?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=bgl0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[11,22],polygon:[[[11.48878,48.053],[11.55589,48.05323],[11.55583,48.06224],[11.56915,48.06229],[11.56908,48.07128],[11.64986,48.07155],[11.64993,48.06256],[11.70326,48.06274],[11.70313,48.08074],[11.71673,48.08079],[11.71667,48.08968],[11.7299,48.08972],[11.72963,48.12566],[11.74313,48.1257],[11.74292,48.15276],[11.72943,48.15271],[11.72936,48.16152],[11.71612,48.16147],[11.71592,48.18859],[11.7027,48.18855],[11.70263,48.19752],[11.67558,48.19743],[11.67537,48.22446],[11.66176,48.22441],[11.66169,48.23355],[11.64863,48.2335],[11.64857,48.24246],[11.54064,48.2421],[11.54058,48.25093],[11.52735,48.25088],[11.52728,48.26001],[11.47335,48.25983],[11.47356,48.23291],[11.46014,48.23287],[11.46021,48.22373],[11.43336,48.22364],[11.43343,48.21439],[11.3798,48.21421],[11.37987,48.20518],[11.36607,48.20514],[11.36621,48.18741],[11.35259,48.18737],[11.35266,48.17817],[11.33946,48.17813],[11.33973,48.14216],[11.36684,48.14225],[11.36697,48.12443],[11.38083,48.12448],[11.3809,48.11558],[11.44769,48.1158],[11.44804,48.07087],[11.46186,48.07091],[11.46193,48.06193],[11.48872,48.06202],[11.48878,48.053]]],terms_url:"http://www.geodatenservice-muenchen.de/",terms_text:"Datenquelle: dl-de/by-2-0: Landeshauptstadt München – Kommunalreferat – GeodatenService – www.geodatenservice-muenchen.de",icon:"https://www.muenchen.de/media/css/images/favicon_114x114.png"},{id:"openlabs-geoportal-public-transport",name:"Municipality of Tirana - Public Transport (Open Labs GeoPortal) (overlay)",type:"tms",template:"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/public-transport@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[19.73762,41.30154],[19.88628,41.27213],[19.86877,41.38582],[19.68338,41.3732],[19.73762,41.30154]]],terms_url:"https://geoportal.openlabs.cc/",terms_text:"Data provided by the Muncipality of Tirana hosted by Open Labs",description:"Bus stops & lines provided by the Muncipality of Tirana hosted by Open Labs",overlay:true},{id:"openlabs-geoportal-tirana",name:"Municipality of Tirana (Open Labs GeoPortal)",type:"tms",template:"https://geoportal.openlabs.cc/mapcache/tms/1.0.0/tirana@GoogleMapsCompatibleExtended/{zoom}/{x}/{-y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[19.70226,41.1404],[19.77573,41.11868],[19.86431,41.12126],[20.24986,41.3495],[20.03082,41.41184],[19.92577,41.5204],[19.88869,41.50755],[19.88937,41.42265],[19.81659,41.46177],[19.7335,41.43037],[19.74174,41.37887],[19.65797,41.37475],[19.57214,41.24322],[19.61815,41.22567],[19.67171,41.22722],[19.70226,41.1404]]],terms_url:"https://geoportal.openlabs.cc",terms_text:"Data provided by the Muncipality of Tirana hosted by Open Labs",description:"Streets & Builings provided by the Muncipality of Tirana hosted by Open Labs"},{id:"NC-US",name:"NC Latest Orthoimagery",type:"wms",template:"https://services.nconemap.gov/secure/services/Imagery/Orthoimagery_Latest/ImageServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",polygon:[[[-81.6792,36.5974],[-80.25359,36.54793],[-75.8409,36.5671],[-75.4323,35.6441],[-75.50475,35.18806],[-75.70525,35.17684],[-76.14745,34.94077],[-76.53472,34.55487],[-76.69676,34.66789],[-77.27904,34.53224],[-77.68828,34.26482],[-77.9435,33.8269],[-78.21288,33.89402],[-78.5301,33.8304],[-79.6693,34.7916],[-80.8122,34.8085],[-80.84685,34.96329],[-80.95122,35.05552],[-81.06383,35.01729],[-81.07482,35.13417],[-82.3632,35.1805],[-82.9989,34.9919],[-84.3333,34.9767],[-84.27184,35.28229],[-84.09056,35.27332],[-83.91478,35.53301],[-83.55498,35.5911],[-83.2556,35.73392],[-82.98644,35.81414],[-82.92327,35.96767],[-82.67882,36.0854],[-82.60192,36.08984],[-82.536,35.96989],[-82.35472,36.14752],[-82.04436,36.14309],[-81.90428,36.33803],[-81.74224,36.37342],[-81.6792,36.5974]]],description:"Most recent true color imagery for the state of North Carolina. The imagery has a pixel resolution of 6 inches and is comprised of imagery flown in 2010, 2012, 2013, and 2014"},{id:"landsat-niger-2012_10",name:"Niger Delta Oct 2012 Landsat",type:"tms",template:"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/niger_oct_2012_321/{zoom}/{x}/{y}.png",endDate:"2012-10-01T00:00:00.000Z",startDate:"2012-10-01T00:00:00.000Z",zoomExtent:[1,13],polygon:[[[-6.92922,13.78574],[-5.13295,13.51884],[-5.07802,13.74039],[-3.60036,13.52418],[-3.54543,13.74039],[-2.06227,13.52685],[-1.3564,16.58454],[-3.17464,16.85285],[-3.22408,16.62665],[-4.72371,16.85022],[-4.76766,16.63455],[-6.27553,16.84759],[-6.92922,13.78574]]]},{id:"geodata.state.nj.us-Infrared2015",name:"NJ 2015 Aerial Imagery (Infrared)",type:"wms",template:"https://geodata.state.nj.us/imagerywms/Infrared2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Infrared2015&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-05-03T00:00:00.000Z",startDate:"2015-03-29T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-74.86599,40.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],terms_url:"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={E30775F2-6370-4525-8E68-C371ED29BBB3}",terms_text:"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)",description:"Digital orthophotography of New Jersey, Near Infrared, 1 foot resolution"},{id:"geodata.state.nj.us-Natural2015",name:"NJ 2015 Aerial Imagery (Natural Color)",type:"wms",template:"https://geodata.state.nj.us/imagerywms/Natural2015?FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&SRS={proj}&WIDTH={width}&HEIGHT={height}&LAYERS=Natural2015&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-05-03T00:00:00.000Z",startDate:"2015-03-29T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-74.86599,40.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],terms_url:"https://njgin.state.nj.us/NJ_NJGINExplorer/ShowMetadata.jsp?docId={CDC67AB8-ADA1-4B4B-9087-67A82CB9151C}",terms_text:"NJ Office of Information Technology (NJOIT), Office of Geographic Information Systems (OGIS)",description:"Digital orthophotography of New Jersey, Natural Color, 1 foot resolution"},{id:"NLSC-EMAP5",name:"NLSC General Map with Contour line",type:"tms",template:"https://wmts.nlsc.gov.tw/wmts/EMAP5_OPENDATA/default/EPSG:3857/{zoom}/{y}/{x}",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",description:"The emap from Taiwan National Land Surveying and Mapping Center",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"IBGE_Salvador_Streets",name:"Nomes de Ruas IBGE Salvador-BA",type:"tms",template:"https://api.mapbox.com/styles/v1/wille/cj8lp78dn62wl2rquim47qo0g/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoid2lsbGUiLCJhIjoicFNVWk5VWSJ9.hluCd0YGvYHNlFi_utWe2g",zoomExtent:[0,20],polygon:[[[-38.48974,-12.81113],[-38.54485,-13.01392],[-38.47755,-13.03466],[-38.33473,-12.94685],[-38.30006,-12.90669],[-38.33954,-12.90435],[-38.35482,-12.83021],[-38.38091,-12.82184],[-38.40717,-12.86754],[-38.46537,-12.81599],[-38.48974,-12.81113]]],description:"Streets geometry and names of Salvador, Bahia. Source: Faces de Logradouro - IBGE.",overlay:true},{id:"kelkkareitit",name:"Nordic snowmobile overlay",type:"tms",template:"https://tiles.kelkkareitit.fi/kelkkareitit/{zoom}/{x}/{y}.png",zoomExtent:[3,18],polygon:[[[27.53173,60.21799],[31.35496,62.51233],[31.63513,62.90773],[30.09154,64.91889],[30.21239,65.87473],[29.13573,66.90422],[30.19041,67.67609],[28.70726,68.42748],[29.02587,68.9505],[31.04735,69.53452],[31.78344,70.44784],[28.32274,71.32192],[23.76342,71.29023],[17.1826,69.99806],[12.10691,68.01581],[9.97556,64.85828],[4.13084,61.95963],[4.57029,59.00664],[6.21826,57.95859],[8.14086,57.8506],[10.41502,58.75682],[12.63702,56.0383],[12.7716,55.25095],[14.2932,55.19769],[18.58886,56.84297],[20.69823,59.3444],[27.53173,60.21799]]],terms_url:"https://kelkkareitit.fi/",terms_text:"© Kelkkareitit.fi",description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",icon:"https://kelkkareitit.fi/img/favicon.png",overlay:true},{id:"geovekst-nib",name:"Norway Orthophoto",type:"tms",template:"https://waapi.webatlas.no/maptiles/tiles/webatlas-orto-newup/wa_grid/{zoom}/{x}/{y}.jpeg?api_key=b8e36d51-119a-423b-b156-d744d54123d5",zoomExtent:[0,21],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.norgeibilder.no",terms_text:"© Geovekst",best:true,description:"Most recent Norwegian orthophotos, courtesy of Geovekst and Norkart.",icon:"https://register.geonorge.no/data/organizations/_L_norgeibilder96x96.png"},{id:"npd-offshore",name:"NPD Offshore Installations overlay",type:"wms",template:"http://npdwms.npd.no/NPD_FactMap.asp?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Surface_labels,Surface,Pipelines,Pipelines_labels,Fields_labels,Fields&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,20],polygon:[[[8.51989,57.6454],[3.25195,56.08737],[2.61185,56.59434],[1.96321,57.90482],[1.48178,58.42936],[1.98303,60.31063],[1.78802,61.35659],[-0.49061,63.88725],[1.36226,67.01603],[14.99771,74.50082],[36.99371,74.50155],[36.99989,73.68633],[32.06909,70.27429],[23.97215,70.47356],[16.25974,68.58447],[12.12888,64.81157],[5.38328,61.92862],[5.7678,58.85355],[8.51989,57.6454]]],terms_url:"http://www.npd.no/no/Kart/Faktakart/",terms_text:"© Oljedirektoratet",description:"Production platforms and oil/natural gas fields on the Norwegian continental shelf",icon:"https://register.geonorge.no/data/organizations/870917732_od_liten.png",overlay:true},{id:"nve-snoskred",name:"NVE Avalanche Danger Areas overlay",type:"wms",template:"https://gis3.nve.no/map/services/SkredSnoAktR/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Snoskred-Aktsomhetsomrader&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,13],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/flaum-og-skred/kartlegging/aktsemdkart/aktsomhetskart-for-snoskred/",terms_text:"© NVE",description:"Potential snowslide areas, computed from theoretical height model. Valid for drops higher than 20-50 meters. Dark red=trigger area.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-nettanlegg",name:"NVE Electricity Network overlay",type:"wms",template:"https://gis3.nve.no/map/services/Nettanlegg1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sentralnett,Regionalnett,Distribusjonsnett,Sjokabler,Master og stolper,Transformatorstasjoner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Power lines (high voltage network) including transformers, submarine cables and pylons. Local distribution network is not included.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vannkraft",name:"NVE Hydropower Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vannkraft1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vannkraftverk,Vannvei,Dam&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Hydropower plants including waterways (tunnel, canal, pipeline) and dams",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vindkraft",name:"NVE Wind Power Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vindkraft/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vindkraft_utbygd,Vindkraft_under_bygging,Vindkraftomrade_konsesjonsbehandling,Vindturbin_konsesjonsbehandling&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Wind power turbines, farms and concession areas. Red colour = concession denied.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"orthos.dhses.ny.gov_latest",name:"NYS Orthos Online",type:"wms",template:"https://orthos.dhses.ny.gov/arcgis/services/Latest/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0,1,2,3,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[-74.91231,45.03606],[-73.47788,45.02996],[-73.33846,45.03098],[-73.31978,45.00558],[-73.32265,44.98525],[-73.34852,44.9283],[-73.36721,44.8397],[-73.34277,44.81727],[-73.34565,44.77647],[-73.37296,44.73463],[-73.37008,44.67946],[-73.39739,44.64471],[-73.39308,44.60276],[-73.39739,44.54543],[-73.34996,44.51264],[-73.34565,44.49521],[-73.37871,44.4706],[-73.30828,44.43572],[-73.30397,44.41827],[-73.33271,44.33917],[-73.30828,44.27128],[-73.30828,44.25172],[-73.38014,44.14868],[-73.40458,44.04133],[-73.3399,43.79596],[-73.28097,43.64222],[-73.2091,43.54957],[-73.21342,43.51206],[-73.24647,42.67557],[-73.45919,42.14284],[-73.47069,42.03938],[-73.48794,41.73764],[-73.49944,41.64319],[-73.47788,41.62708],[-73.43189,41.57979],[-73.42614,41.56366],[-73.42685,41.45926],[-73.43979,41.40322],[-73.44985,41.38328],[-73.43835,41.37033],[-73.42757,41.35901],[-73.41751,41.3439],[-73.41895,41.27642],[-73.43045,41.24455],[-73.46566,41.19752],[-73.52962,41.14505],[-73.55477,41.13368],[-73.61586,41.13531],[-73.62664,41.10878],[-73.62736,41.05407],[-73.63958,40.99118],[-73.61873,40.98195],[-73.59933,40.96568],[-73.59933,40.93474],[-73.63455,40.91682],[-73.68054,40.89183],[-73.69851,40.87988],[-73.68629,40.87064],[-73.66257,40.87934],[-73.63814,40.90541],[-73.59789,40.91193],[-73.57562,40.9179],[-73.52675,40.92388],[-73.50159,40.94288],[-73.4901,40.95374],[-73.41751,40.96079],[-73.38374,40.96133],[-73.33702,40.95591],[-73.30828,40.93637],[-73.27091,40.92659],[-73.2091,40.91953],[-73.18682,40.92714],[-73.16814,40.93148],[-73.16598,40.95971],[-73.16886,40.97002],[-73.12933,40.98195],[-73.10777,40.98195],[-73.06681,40.9749],[-72.8584,40.97436],[-72.71826,40.98195],[-72.65574,41.00528],[-72.64424,41.00473],[-72.62628,40.99226],[-72.54148,41.03889],[-72.4768,41.06328],[-72.45811,41.08928],[-72.41859,41.09308],[-72.36612,41.13856],[-72.36037,41.1418],[-72.32229,41.15479],[-72.29067,41.16399],[-72.21449,41.18238],[-72.20083,41.19157],[-72.04848,41.25914],[-72.02548,41.2937],[-71.93924,41.30774],[-71.92343,41.30666],[-71.90259,41.2991],[-71.90187,41.28939],[-71.99458,41.24509],[-72.10453,41.19806],[-72.18287,41.16723],[-72.18934,41.16237],[-72.25186,41.12232],[-72.30432,41.10445],[-72.31582,41.09524],[-72.27917,41.08441],[-72.2727,41.08062],[-72.26839,41.04973],[-72.21736,41.04811],[-72.19652,41.04215],[-72.18646,41.05298],[-72.17137,41.0584],[-72.14981,41.05895],[-72.15628,41.09633],[-72.15268,41.1077],[-72.14909,41.14667],[-72.134,41.14505],[-72.07076,41.10553],[-72.07435,41.05678],[-72.08657,41.03185],[-72.10957,41.0069],[-72.08729,41.01287],[-72.06213,41.02534],[-72.04561,41.03239],[-72.01902,41.03293],[-72.00895,41.04215],[-72.00177,41.05136],[-71.96368,41.07737],[-71.922,41.08874],[-71.88966,41.08766],[-71.85588,41.08062],[-71.84582,41.07466],[-71.85588,41.05298],[-71.89038,41.03727],[-71.91625,41.03022],[-71.99099,41.00365],[-72.07938,40.97273],[-72.31941,40.88205],[-72.4423,40.8402],[-72.62771,40.7869],[-72.76569,40.75043],[-72.88499,40.71286],[-72.95973,40.68671],[-73.03735,40.66],[-73.08118,40.64855],[-73.22994,40.61637],[-73.32193,40.6131],[-73.35211,40.61855],[-73.55477,40.56944],[-73.75959,40.57708],[-73.88248,40.54815],[-73.9335,40.53449],[-73.945,40.53395],[-73.94572,40.56289],[-74.08227,40.56234],[-74.08011,40.54924],[-74.12251,40.52084],[-74.15772,40.51373],[-74.18719,40.50117],[-74.22887,40.48696],[-74.26121,40.48532],[-74.2763,40.4957],[-74.27918,40.54378],[-74.26983,40.56671],[-74.25834,40.57217],[-74.22528,40.57217],[-74.226,40.58309],[-74.25115,40.59564],[-74.25259,40.62237],[-74.24324,40.64091],[-74.2339,40.64909],[-74.20228,40.654],[-74.12538,40.65673],[-74.11532,40.69107],[-74.09951,40.68998],[-74.07795,40.71068],[-74.06286,40.7183],[-74.05208,40.7439],[-74.02549,40.79288],[-73.98094,40.86901],[-73.96225,40.92551],[-73.94931,40.96459],[-73.94644,40.99877],[-73.98165,41.01612],[-74.04561,41.04323],[-74.18072,41.09524],[-74.30792,41.14938],[-74.44087,41.21537],[-74.52783,41.25914],[-74.61335,41.30234],[-74.65791,41.31098],[-74.70246,41.33581],[-74.76714,41.38975],[-74.79661,41.41023],[-74.85338,41.42263],[-74.90728,41.43179],[-74.99783,41.47111],[-75.04167,41.52708],[-75.08479,41.59323],[-75.08407,41.61848],[-75.07329,41.66467],[-75.08766,41.70278],[-75.08766,41.71351],[-75.12144,41.76177],[-75.11928,41.79232],[-75.13078,41.81696],[-75.18755,41.83838],[-75.25295,41.84962],[-75.28745,41.85497],[-75.29823,41.88227],[-75.30613,41.9304],[-75.34063,41.94003],[-75.3665,41.9566],[-75.37225,41.97744],[-75.58066,41.97957],[-75.58137,41.92399],[-75.78906,41.92666],[-75.78691,41.98278],[-79.77687,41.98118],[-79.7819,42.20994],[-79.77184,42.28017],[-79.72153,42.29824],[-79.57349,42.36731],[-79.42976,42.46599],[-79.3737,42.49991],[-79.25728,42.54546],[-79.18973,42.5624],[-79.16529,42.56981],[-79.12074,42.62483],[-79.0963,42.64598],[-79.06899,42.6967],[-79.03162,42.71043],[-78.98851,42.72311],[-78.88358,42.77693],[-78.88646,42.8149],[-78.93964,42.88655],[-78.93964,42.93603],[-79.04887,42.96969],[-79.04743,43.05167],[-79.09343,43.05272],[-79.09199,43.09262],[-79.08624,43.26556],[-79.06468,43.27602],[-78.84909,43.33041],[-78.72979,43.35237],[-78.63924,43.37013],[-78.54869,43.37953],[-78.47826,43.38789],[-77.95508,43.38476],[-77.73158,43.34714],[-77.71146,43.34034],[-77.66259,43.31159],[-77.61516,43.28387],[-77.55336,43.253],[-77.5282,43.25509],[-77.45634,43.27864],[-77.42256,43.28492],[-77.16385,43.29433],[-77.0503,43.29381],[-76.94178,43.29329],[-76.91447,43.30793],[-76.85051,43.3163],[-76.80236,43.32832],[-76.75996,43.35184],[-76.64785,43.42809],[-76.54509,43.48026],[-76.51993,43.49486],[-76.44304,43.52717],[-76.4222,43.53811],[-76.28206,43.53863],[-76.23822,43.55686],[-76.24038,43.74147],[-76.30649,43.82915],[-76.31152,43.8675],[-76.34602,43.8618],[-76.40064,43.86128],[-76.47178,43.88408],[-76.46675,43.90893],[-76.4186,43.93119],[-76.37189,43.93223],[-76.36974,43.90272],[-76.33308,43.92964],[-76.27847,43.92964],[-76.27847,43.90427],[-76.26697,43.89599],[-76.23607,43.91204],[-76.19295,43.93326],[-76.19007,43.95086],[-76.21523,43.96017],[-76.25044,43.94982],[-76.31224,43.94775],[-76.30578,43.9762],[-76.33093,44.00464],[-76.39561,44.0248],[-76.39848,44.06251],[-76.37548,44.06457],[-76.3762,44.0909],[-76.47107,44.09297],[-76.46604,44.10948],[-76.44232,44.1296],[-76.39848,44.13218],[-76.39776,44.20435],[-76.3762,44.21671],[-76.23966,44.21929],[-76.23966,44.22804],[-76.21738,44.22856],[-76.21523,44.3479],[-76.11893,44.37103],[-76.04634,44.39157],[-75.93423,44.43418],[-75.83721,44.50341],[-75.76822,44.55823],[-75.69923,44.60379],[-75.63168,44.64829],[-75.56772,44.70501],[-75.50448,44.74586],[-75.45274,44.78157],[-75.31763,44.8723],[-75.15378,44.93745],[-75.09054,44.97305],[-74.97411,45.02793],[-74.91985,45.03682],[-74.91231,45.03606]]],terms_url:"https://gis.ny.gov/gateway/orthoprogram/index.cfm",terms_text:"New York State Statewide Digital Orthoimagery Program",description:"New York State High Resolution Digital Orthoimagery, 1 foot resolution",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/ny/NYS_Orthos_Online.png"},{id:"olho_dagua_do_casado",name:"Olho d'Agua do Casado AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Olho%20Dagua%20do%20Casado&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.7822,-9.54444],[-37.7826,-9.45388],[-37.81147,-9.45412],[-37.81735,-9.45451],[-37.82057,-9.45416],[-37.87394,-9.45428],[-37.87358,-9.54475],[-37.7822,-9.54444]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"osmbe-nl",name:"OpenStreetMap (Belgian Style - Dutch)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-nl/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"osmbe-fr",name:"OpenStreetMap (Belgian Style - French)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-fr/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"MAPNIK",name:"OpenStreetMap (Standard)",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png",zoomExtent:[0,19],terms_url:"https://www.openstreetmap.org",terms_text:"© OpenStreetMap contributors, CC-BY-SA","default":true,description:"The default OpenStreetMap layer.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"osm-gps",name:"OpenStreetMap GPS traces",type:"tms",template:"https://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png",zoomExtent:[0,20],terms_url:"https://www.openstreetmap.org/copyright",terms_text:"© OpenStreetMap contributors",terms_html:"<span style='display: inline-block; padding: 0 8px; background-color: rgba(0,0,0,0.5);'><span style='color: #eee;'>GPS Direction:</span> <span style='font-size: 15px; padding-left: 2px; font-weight: bold;'> <span style='color: #0ee;'>←</span> <span style='color: #96f;'>↓</span> <span style='color: #6e0;'>↑</span> <span style='color: #f63;'>→</span> </span></span> © <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap contributors</a>.",description:"Public GPS traces uploaded to OpenStreetMap.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png",overlay:true},{id:"osm-hu-ortho",name:"openstreetmap.hu orthophotos",type:"tms",template:"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/openstreetmap.hu.orthophotos/mercator/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[18.8577,47.44553],[18.86169,47.44883],[18.86491,47.44704],[18.8609,47.44373],[18.8577,47.44553]],[[18.80614,47.59304],[18.81376,47.5974],[18.82295,47.59011],[18.81533,47.58574],[18.80614,47.59304]],[[17.66691,46.92167],[17.66369,46.93033],[17.67207,46.93178],[17.67529,46.92312],[17.66691,46.92167]],[[17.6725,46.93546],[17.67529,46.92708],[17.68409,46.92845],[17.68129,46.93683],[17.6725,46.93546]],[[17.82155,46.96075],[17.82507,46.9547],[17.83347,46.95701],[17.82995,46.96304],[17.82155,46.96075]],[[18.62796,47.19818],[18.63943,47.20324],[18.64953,47.1926],[18.63806,47.18753],[18.62796,47.19818]],[[17.51223,46.8789],[17.51406,46.88166],[17.5214,46.87939],[17.51957,46.87662],[17.51223,46.8789]],[[17.67724,46.91844],[17.68718,46.92344],[17.70594,46.90603],[17.69249,46.89926],[17.68144,46.90951],[17.68275,46.90595],[17.68198,46.90582],[17.68667,46.89926],[17.67947,46.89686],[17.67405,46.90445],[17.67131,46.90398],[17.66666,46.91662],[17.67724,46.91844]],[[18.80776,47.55615],[18.81638,47.55969],[18.81351,47.56305],[18.80473,47.55949],[18.80776,47.55615]],[[18.98706,47.46989],[18.97962,47.47042],[18.98056,47.47648],[18.988,47.47595],[18.98706,47.46989]],[[18.98356,47.41149],[19.00839,47.42511],[19.01568,47.41932],[18.9907,47.40518],[18.98356,47.41149]],[[19.02652,47.87563],[19.03163,47.87613],[19.03305,47.86957],[19.02793,47.86907],[19.02652,47.87563]],[[18.00803,46.86674],[18.01095,46.86028],[18.01323,46.86064],[18.01626,46.8536],[18.01682,46.85371],[18.01852,46.84948],[18.02021,46.84631],[18.02961,46.84829],[18.02742,46.85392],[18.03388,46.85534],[18.03056,46.86395],[18.03367,46.86456],[18.03058,46.87154],[18.00803,46.86674]],[[17.99509,46.87632],[17.98585,46.87595],[17.98535,46.88397],[17.98599,46.88412],[17.98531,46.88537],[17.95829,46.87876],[17.96077,46.87351],[17.92868,46.86631],[17.92467,46.87372],[17.93136,46.87535],[17.92995,46.87822],[17.9553,46.88415],[17.9946,46.89341],[17.99786,46.88671],[17.98771,46.88443],[17.98774,46.88411],[17.99415,46.88442],[17.99509,46.87632]],[[18.86533,47.42808],[18.87291,47.42455],[18.87701,47.42871],[18.86799,47.43238],[18.86774,47.43208],[18.86517,47.43317],[18.86477,47.4327],[18.86441,47.43285],[18.86288,47.43108],[18.86328,47.43092],[18.86288,47.43046],[18.86516,47.42947],[18.86448,47.42875],[18.86553,47.42829],[18.86533,47.42808]],[[19.16232,47.59776],[19.16893,47.59033],[19.17815,47.59512],[19.17291,47.60068],[19.16232,47.59776]],[[18.13162,47.02619],[18.14103,47.02111],[18.13923,47.01957],[18.15704,47.01044],[18.16271,47.00242],[18.16463,46.99571],[18.16639,46.9959],[18.16702,46.99363],[18.17101,46.99454],[18.1722,46.99571],[18.16977,47.00416],[18.17656,47.00709],[18.1761,47.00771],[18.17639,47.00781],[18.17057,47.01414],[18.1748,47.01815],[18.17782,47.01428],[18.18518,47.01746],[18.17933,47.0239],[18.17589,47.02268],[18.17277,47.02434],[18.17219,47.02377],[18.17159,47.02407],[18.16938,47.0221],[18.16216,47.02596],[18.16485,47.02832],[18.16245,47.02947],[18.16323,47.03025],[18.1521,47.03554],[18.15156,47.03498],[18.1503,47.03563],[18.14513,47.03112],[18.14337,47.0322],[18.1454,47.03419],[18.14441,47.03467],[18.14522,47.03539],[18.14168,47.03697],[18.13111,47.02745],[18.13226,47.0269],[18.13162,47.02619]]],terms_text:"openstreetmap.hu"},{id:"lu.geoportail.opendata.ortho2010",name:"Ortho 2010 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2010/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2010-07-02T00:00:00.000Z",startDate:"2010-06-24T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2013",name:"Ortho 2013 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2013/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2013-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2016",name:"Ortho 2016 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2016/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2016-08-16T00:00:00.000Z",startDate:"2013-08-30T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"lu.geoportail.opendata.ortho2017",name:"Ortho 2017 geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/ortho_2017/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.jpeg",endDate:"2017-06-22T00:00:00.000Z",startDate:"2017-06-14T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/bd-l-ortho-webservices-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"ORTOFOTO_V1",name:"Orthophoto 1st cycle (1994-1999) - Latvia",type:"wms",template:"https://services.lgia.gov.lv/arcfree/services/Ortofoto_v1/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[27.66415,55.75354],[27.68475,55.93319],[28.26703,56.1908],[28.23682,56.49827],[27.82757,56.94886],[27.90997,57.37037],[27.58313,57.56387],[26.93219,57.63598],[26.5202,57.58596],[26.0368,57.87192],[25.1991,58.10487],[24.31744,57.90258],[24.31744,57.19669],[23.93567,56.9788],[23.55115,56.98479],[23.23804,57.10283],[23.14465,57.37333],[22.60632,57.60215],[22.60083,57.76953],[21.66699,57.56681],[21.40057,57.29625],[21.38409,57.0177],[21.04626,56.80026],[20.99133,56.36615],[21.0545,56.0392],[21.28796,56.05608],[21.29895,56.1908],[22.11743,56.41936],[24.44379,56.24425],[24.81183,56.3996],[25.15515,56.1694],[25.58087,56.12962],[26.53668,55.66146],[26.91296,55.66766],[27.0805,55.80991],[27.66415,55.75354]]],terms_text:"Latvijas Ģeotelpiskās informācijas aģentūras brīvais WMS serviss 1994 - 1999.gada Latvijas ortofotokarte"},{id:"ORTOS_DGRF_2004_06",name:"Ortofotos DGRF 2004-2006 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt:8888/wms/produtos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2006-01-01T00:00:00.000Z",startDate:"2004-01-01T00:00:00.000Z",zoomExtent:[14,19],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/ortofotos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"ORTOS_DGT_2014_15",name:"Ortofotos Litoral DGT 2014-2015 (WMS)",type:"wms",template:"http://ows.dgterritorio.pt/wss/service/ortos2014-2015-wms/guest?language=por&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortoimagens_2014-2015_Litoral&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[1,20],polygon:[[[-7.38968,37.19205],[-7.52426,37.18002],[-7.89505,36.98171],[-8.15186,37.10886],[-8.65036,37.14062],[-8.95111,37.03545],[-8.78632,37.34833],[-8.76434,37.55111],[-8.7561,38.38258],[-8.47664,38.33466],[-8.47183,38.40141],[-8.66066,38.46596],[-8.66959,38.60882],[-9.142,38.53689],[-8.81104,38.67372],[-8.79318,38.85468],[-8.95935,38.9829],[-9.18732,38.84934],[-9.2395,38.72838],[-9.37821,38.74659],[-9.38233,39.07891],[-9.29169,39.2514],[-9.31915,39.33642],[-9.17084,39.38526],[-9.06372,39.48815],[-9.02252,39.69662],[-8.78632,40.14529],[-8.86322,40.2093],[-8.72589,40.53155],[-8.64075,40.50858],[-8.62427,40.63063],[-8.53089,40.6004],[-8.535,40.71292],[-8.61466,40.89275],[-8.61878,41.10419],[-8.53089,41.16728],[-8.66959,41.21689],[-8.72315,41.41081],[-8.76984,41.65958],[-8.66547,41.73955],[-8.81104,41.72316],[-8.81104,41.85217],[-8.74649,41.9125],[-8.83576,41.93089],[-8.91815,41.84501],[-8.89343,41.70778],[-8.82065,41.50755],[-8.73139,41.16315],[-8.67508,41.069],[-8.68469,40.90729],[-8.93326,40.17573],[-8.88107,40.12219],[-9.11453,39.64694],[-9.11865,39.5623],[-9.3013,39.40543],[-9.43039,39.37571],[-9.34799,39.23864],[-9.45099,39.04799],[-9.45786,38.89317],[-9.53201,38.78835],[-9.50043,38.68551],[-9.28894,38.663],[-9.19418,38.54172],[-9.25324,38.38473],[-9.03488,38.42347],[-8.92502,38.46757],[-8.81241,38.35997],[-8.7973,38.14968],[-8.91953,37.95286],[-8.84262,37.8651],[-8.83988,37.40617],[-9.02664,37.01023],[-8.92914,36.97513],[-8.61466,37.099],[-8.15048,37.05956],[-7.8923,36.93672],[-7.48993,37.15156],[-7.39105,37.15813],[-7.38968,37.19205]]],terms_url:"http://www.dgterritorio.pt/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"OS-historic-25k-OSM_Limited",name:"OS 1:25k historic (OSM)",type:"tms",template:"https://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg",zoomExtent:[6,17],polygon:[[[-6.45854,49.90441],[-6.3872,49.98411],[-6.22968,49.98962],[-6.21713,49.86801],[-6.45512,49.85918],[-6.45854,49.90441]],[[-1.44951,60.86341],[-0.71671,60.85451],[-0.73497,60.43598],[-0.69388,60.41682],[-0.72584,60.39427],[-0.73954,60.04847],[-0.92674,60.04619],[-0.93815,59.82662],[-1.45865,59.8312],[-1.44552,60.0536],[-1.46321,60.0536],[-1.46435,60.063],[-1.57165,60.06385],[-1.56936,60.179],[-1.64356,60.1807],[-1.64356,60.18922],[-1.82162,60.1895],[-1.82048,60.36155],[-1.8416,60.36973],[-1.82162,60.38328],[-1.81799,60.59343],[-1.45317,60.59343],[-1.44951,60.86341]],[[-4.90892,54.42421],[-4.2826,54.44299],[-4.25354,54.02977],[-4.87664,54.02218],[-4.90892,54.42421]],[[-5.86674,59.14446],[-5.776,59.14709],[-5.772,59.10141],[-5.86218,59.09906],[-5.86674,59.14446]],[[-1.70659,59.57036],[-1.55792,59.56935],[-1.55649,59.49657],[-1.70545,59.49758],[-1.70659,59.57036]],[[-7.68658,58.2941],[-7.53306,58.3007],[-7.52564,58.26469],[-7.67973,58.25779],[-7.68658,58.2941]],[[-4.53383,59.03599],[-4.48132,59.03716],[-4.47961,59.01866],[-4.53326,59.01807],[-4.53383,59.03599]],[[-8.67107,57.87699],[-8.46732,57.88973],[-8.44678,57.7907],[-8.65109,57.77792],[-8.67107,57.87699]],[[-5.23955,50.35306],[-5.79201,50.33849],[-5.76005,49.9317],[-4.65514,49.95815],[-4.67797,50.28601],[-4.24422,50.28017],[-4.24878,50.20425],[-3.38129,50.20425],[-3.42238,50.51882],[-3.11648,50.52463],[-3.12105,50.65796],[-2.67364,50.66195],[-2.59535,50.63943],[-2.5905,50.57284],[-2.47912,50.57335],[-2.47589,50.50667],[-2.39679,50.50564],[-2.40164,50.57233],[-1.04003,50.57182],[-1.03357,50.70593],[-0.5493,50.70388],[-0.54607,50.78866],[-0.09247,50.7856],[-0.08763,50.71819],[0.47897,50.71206],[0.48704,50.81825],[0.97615,50.80499],[0.99229,51.01263],[1.44912,51.00044],[1.47818,51.40904],[1.02296,51.42716],[1.03588,51.76409],[1.61054,51.7501],[1.64606,52.156],[1.72677,52.15402],[1.74937,52.44818],[1.78707,52.48116],[1.7591,52.52251],[1.79335,52.96027],[0.37981,52.99585],[0.38952,53.25112],[0.34786,53.25112],[0.32389,53.28219],[0.34615,53.65385],[0.12849,53.65755],[0.11658,53.66747],[0.13506,54.06557],[-0.06098,54.06591],[-0.04142,54.47094],[-0.56627,54.47718],[-0.55921,54.65651],[-1.16656,54.66235],[-1.16374,54.84261],[-1.33162,54.84391],[-1.32571,55.24708],[-1.52945,55.24871],[-1.52418,55.65401],[-1.76388,55.65401],[-1.77337,55.97191],[-2.16079,55.9683],[-2.15433,56.06214],[-2.45781,56.05853],[-2.41906,56.64172],[-2.09622,56.64172],[-2.0833,57.00213],[-1.92834,57.01268],[-1.9181,57.35909],[-1.75022,57.36257],[-1.76959,57.76086],[-3.69376,57.75742],[-3.70667,57.98064],[-3.5969,57.97721],[-3.60336,58.12073],[-3.02223,58.13096],[-3.02869,58.54108],[-2.8479,58.53097],[-2.86081,58.84305],[-2.67962,58.8415],[-2.68419,58.88517],[-2.63397,58.90522],[-2.67962,58.93351],[-2.68876,59.02292],[-2.36687,59.02292],[-2.37029,59.26529],[-2.3429,59.2822],[-2.37144,59.29969],[-2.37372,59.37071],[-2.3429,59.38582],[-2.37258,59.40035],[-2.37144,59.42591],[-3.07342,59.42301],[-3.07114,59.34336],[-3.1031,59.33114],[-3.07456,59.31367],[-3.07228,59.2326],[-3.38503,59.14842],[-3.37476,58.93528],[-3.56538,58.93233],[-3.55483,58.69759],[-5.28086,58.66677],[-5.25342,58.35141],[-5.50685,58.34379],[-5.47618,58.03236],[-5.8975,58.02124],[-5.8523,57.61718],[-6.13963,57.61372],[-6.15416,57.74232],[-6.29137,57.73801],[-6.33657,58.13988],[-6.11219,58.14669],[-6.14738,58.51063],[-6.29348,58.54162],[-6.84137,58.29773],[-7.00574,58.29293],[-7.10162,58.20644],[-7.25731,58.17931],[-7.25311,58.10049],[-7.40707,58.09056],[-7.39135,57.79114],[-7.79099,57.77332],[-7.76242,57.54442],[-7.6985,57.14532],[-7.79438,57.13045],[-7.71676,56.73686],[-7.01221,56.76544],[-6.97992,56.54539],[-7.06386,56.54539],[-7.04449,56.35626],[-6.50068,56.38129],[-6.44914,55.97936],[-6.56329,55.96915],[-6.53937,55.70301],[-6.55955,55.69073],[-6.53453,55.67617],[-6.52162,55.57044],[-5.89126,55.59234],[-5.85601,55.23207],[-5.22936,55.2516],[-5.18371,54.62541],[-3.6656,54.65184],[-3.64962,54.432],[-3.54004,54.43067],[-3.53091,54.02902],[-3.06977,54.03036],[-3.06757,53.82214],[-3.08049,53.77399],[-3.06192,53.74775],[-3.06112,53.6737],[-3.21447,53.67084],[-3.20577,53.42262],[-3.27996,53.35522],[-3.28967,53.36084],[-3.33275,53.36493],[-3.37613,53.35403],[-4.0889,53.34331],[-4.09455,53.4612],[-4.69741,53.44486],[-4.68828,53.33186],[-4.72024,53.28958],[-4.68371,53.24862],[-4.67687,53.15426],[-4.84808,53.14468],[-4.81783,52.74403],[-4.25458,52.75589],[-4.22888,52.25488],[-4.26076,52.25364],[-4.27246,52.24326],[-4.81363,52.23009],[-4.80792,52.11389],[-5.38891,52.09917],[-5.37179,51.91297],[-5.42087,51.91015],[-5.41402,51.84532],[-5.36836,51.84744],[-5.34668,51.55953],[-4.77368,51.57585],[-4.76569,51.48851],[-4.19154,51.49704],[-4.18698,51.43447],[-3.61512,51.44443],[-3.61055,51.37465],[-3.14941,51.37893],[-3.14941,51.29193],[-4.30387,51.27459],[-4.28612,51.05087],[-4.85433,51.03666],[-4.83722,50.72128],[-5.26183,50.70827],[-5.23955,50.35306]],[[-2.15027,60.17132],[-2.00302,60.16961],[-2.00131,60.0997],[-2.14855,60.10112],[-2.15027,60.17132]],[[-6.2086,59.11635],[-6.12299,59.11664],[-6.12185,59.0715],[-6.20974,59.0715],[-6.2086,59.11635]],[[-4.41596,59.0889],[-4.4212,59.07708],[-4.39719,59.07791],[-4.39134,59.08973],[-4.41596,59.0889]]]},{id:"OS-New_Popular_Edition-historic",name:"OS New Popular Edition historic",type:"tms",template:"https://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png",zoomExtent:[6,15],polygon:[[[-3.68466,55.23744],[-3.65106,54.42892],[-3.54463,54.43072],[-3.52815,54.02593],[-3.07016,54.03137],[-3.06123,53.6717],[-3.21298,53.67048],[-3.20371,53.35568],[-4.10424,53.34297],[-4.11042,53.46005],[-4.71124,53.44799],[-4.69339,53.15171],[-4.84307,53.1476],[-4.81595,52.74378],[-4.25342,52.75541],[-4.22733,52.24378],[-4.81303,52.23117],[-4.80754,52.11452],[-5.38913,52.09892],[-5.3493,51.56085],[-4.77252,51.57622],[-4.76772,51.48652],[-4.19299,51.49806],[-4.18956,51.43518],[-3.61278,51.44502],[-3.61072,51.37307],[-3.15067,51.37864],[-3.14723,51.28984],[-4.29462,51.2718],[-4.28363,51.04744],[-4.85423,51.03406],[-4.83707,50.76556],[-5.2621,50.75427],[-5.23395,50.34984],[-5.79562,50.33319],[-5.76228,49.92913],[-4.64717,49.96094],[-4.66914,50.2753],[-4.25166,50.2832],[-4.24617,50.19361],[-3.40159,50.20679],[-3.41395,50.52041],[-3.13105,50.52391],[-3.1338,50.66078],[-2.66963,50.66252],[-2.66688,50.5719],[-1.04228,50.56929],[-1.04502,50.70429],[-0.54652,50.69994],[-0.54103,50.79031],[-0.08784,50.78424],[-0.08887,50.72211],[0.47693,50.70907],[0.48242,50.81939],[0.98024,50.8068],[0.99328,51.01333],[1.44784,51.00036],[1.47805,51.40478],[1.018,51.41634],[1.04272,51.76742],[1.6195,51.75084],[1.65246,52.15456],[1.72662,52.15245],[1.79529,52.9594],[0.60396,52.99123],[0.60327,52.97222],[0.38148,52.97883],[0.39625,53.24796],[0.31934,53.24961],[0.34269,53.65319],[0.11609,53.65726],[0.13738,54.06181],[-0.06243,54.06584],[-0.04183,54.46924],[-0.56781,54.47722],[-0.56163,54.65715],[-1.18098,54.66271],[-1.17755,54.84183],[-1.33342,54.84381],[-1.32655,55.24743],[-1.53117,55.24821],[-1.52636,55.6528],[-1.76394,55.6528],[-1.76257,55.96765],[-2.40321,55.96727],[-2.39772,55.56243],[-2.16151,55.56282],[-2.15808,55.2486],[-2.92158,55.24571],[-3.68466,55.23744]]]},{id:"OS-OpenData_Locator",name:"OS OpenData Locator",type:"tms",template:"http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png",zoomExtent:[0,22],polygon:[[[-0.88639,61.11666],[-9.24009,57.92465],[-6.61235,55.46835],[-6.1039,55.40191],[-5.61358,55.06607],[-5.40088,54.90562],[-5.29371,54.77201],[-5.11832,54.5911],[-4.92368,54.38599],[-4.94067,53.59884],[-5.44172,52.27725],[-6.03376,51.6012],[-7.54473,49.33762],[-2.59721,50.2588],[0.65674,50.64047],[1.32419,50.83256],[1.87586,51.19234],[2.05883,52.88863],[-1.61452,56.47933],[-1.21085,57.64972],[-1.69525,59.08903],[0.21543,60.43058],[-0.88639,61.11666]]],overlay:true},{id:"OS-OpenData_StreetView",name:"OS OpenData StreetView",type:"tms",template:"https://{switch:a,b,c}.os.openstreetmap.org/sv/{zoom}/{x}/{y}.png",zoomExtent:[1,18],polygon:[[[-5.82929,50.02297],[-5.82929,50.25482],[-5.37336,50.25482],[-5.37336,50.35306],[-5.1756,50.35306],[-5.1756,50.59254],[-4.99707,50.59254],[-4.99707,50.69356],[-4.79657,50.69356],[-4.79657,50.78221],[-4.69495,50.78221],[-4.69495,50.96074],[-4.60431,50.96074],[-4.60431,51.06921],[-4.37922,51.06921],[-4.37922,51.25218],[-3.90393,51.25218],[-3.90393,51.2917],[-3.71717,51.2917],[-3.71717,51.2453],[-3.14862,51.2453],[-3.14862,51.36207],[-3.74463,51.36207],[-3.74463,51.43404],[-3.82978,51.43404],[-3.82978,51.52982],[-4.08521,51.52982],[-4.08521,51.49393],[-4.37922,51.49393],[-4.37922,51.54272],[-5.14442,51.54272],[-5.14442,51.6296],[-5.73871,51.6296],[-5.73871,51.77404],[-5.50954,51.77404],[-5.50954,51.98026],[-5.1988,51.98026],[-5.1988,52.09734],[-4.88806,52.09734],[-4.88806,52.18316],[-4.49575,52.18316],[-4.49575,52.29257],[-4.30154,52.29257],[-4.30154,52.36853],[-4.18112,52.36853],[-4.18112,52.79337],[-4.44137,52.79337],[-4.44137,52.73696],[-4.85698,52.73696],[-4.85698,52.93173],[-4.7288,52.93173],[-4.7288,53.50386],[-4.15782,53.50386],[-4.15782,53.41135],[-3.31105,53.41135],[-3.31105,53.50386],[-3.23337,53.50386],[-3.23337,54.01592],[-3.39262,54.01592],[-3.39262,54.1981],[-3.55964,54.1981],[-3.55964,54.43373],[-3.7189,54.43373],[-3.7189,54.7219],[-4.30154,54.7219],[-4.30154,54.61407],[-5.04731,54.61407],[-5.04731,54.75329],[-5.22987,54.75329],[-5.22987,55.21908],[-5.65326,55.21908],[-5.65326,55.25009],[-5.89796,55.25009],[-5.89796,55.48225],[-6.59332,55.48225],[-6.59332,56.30134],[-7.17277,56.30134],[-7.17277,56.56018],[-6.81717,56.56018],[-6.81717,56.69917],[-6.53153,56.69917],[-6.53153,56.9067],[-6.81168,56.9067],[-6.81168,57.37166],[-6.8721,57.37166],[-6.8721,57.55189],[-7.09732,57.55189],[-7.09732,57.24111],[-7.17423,57.24111],[-7.17423,56.9067],[-7.37198,56.9067],[-7.37198,56.80759],[-7.5203,56.80759],[-7.5203,56.71425],[-7.83068,56.71425],[-7.83068,56.89946],[-7.64941,56.89946],[-7.64941,57.47396],[-7.83068,57.47396],[-7.83068,57.79156],[-7.47362,57.79156],[-7.47362,58.08606],[-7.18798,58.08606],[-7.18798,58.3672],[-6.80346,58.3672],[-6.80346,58.41558],[-6.63866,58.41558],[-6.63866,58.46733],[-6.51781,58.46733],[-6.51781,58.56256],[-6.05362,58.56256],[-6.05362,58.15688],[-6.14701,58.15688],[-6.14701,58.11059],[-6.27998,58.11059],[-6.27998,57.71227],[-6.15913,57.71227],[-6.15913,57.66676],[-5.93391,57.66676],[-5.93391,57.88925],[-5.80643,57.88925],[-5.80643,57.96218],[-5.61417,57.96218],[-5.61417,58.09112],[-5.49082,58.09112],[-5.49082,58.37333],[-5.31991,58.37333],[-5.31991,58.75015],[-3.572,58.75015],[-3.572,59.20918],[-3.19445,59.20918],[-3.19445,59.47592],[-2.24358,59.47592],[-2.24358,59.13887],[-2.4611,59.13887],[-2.4611,58.81859],[-2.74077,58.81859],[-2.74077,58.58047],[-2.91167,58.58047],[-2.91167,58.11575],[-3.48654,58.11575],[-3.48654,57.74039],[-1.71532,57.74039],[-1.71532,57.22256],[-1.97945,57.22256],[-1.97945,56.87607],[-2.1659,56.87607],[-2.1659,56.63332],[-2.36011,56.63332],[-2.36011,56.04775],[-1.97945,56.04775],[-1.97945,55.86509],[-1.4745,55.86509],[-1.4745,55.24999],[-1.3222,55.24999],[-1.3222,54.82217],[-1.055,54.82217],[-1.055,54.67466],[-0.66188,54.67466],[-0.66188,54.55275],[-0.32476,54.55275],[-0.32476,54.28652],[0.00928,54.28652],[0.00928,53.79385],[0.2082,53.79385],[0.2082,53.52177],[0.41635,53.52177],[0.41635,53.02989],[1.42734,53.02989],[1.42734,52.92021],[1.83339,52.92021],[1.83339,52.04249],[1.52355,52.04249],[1.52355,51.82613],[1.2697,51.82613],[1.2697,51.69675],[1.11665,51.69675],[1.11665,51.44035],[1.52355,51.44035],[1.52355,51.33318],[1.45076,51.33318],[1.45076,51.02076],[1.06999,51.02076],[1.06999,50.90084],[0.77881,50.90084],[0.77881,50.72984],[-0.7256,50.72984],[-0.7256,50.70384],[-1.00744,50.70384],[-1.00744,50.57363],[-2.36253,50.57363],[-2.36253,50.48464],[-2.49878,50.48464],[-2.49878,50.57363],[-3.40964,50.57363],[-3.40964,50.20578],[-3.69224,50.20578],[-3.69224,50.13477],[-5.00547,50.13477],[-5.00547,49.94745],[-5.28395,49.94745],[-5.28395,50.02297],[-5.82929,50.02297]],[[-6.45807,49.86736],[-6.45807,49.94999],[-6.39788,49.94999],[-6.39788,50.00538],[-6.17996,50.00538],[-6.17996,49.91686],[-6.25402,49.91686],[-6.25402,49.86736],[-6.45807,49.86736]],[[-5.83432,49.93216],[-5.83432,49.97546],[-5.76833,49.97546],[-5.76833,49.93216],[-5.83432,49.93216]],[[-1.94838,60.68857],[-1.94838,60.30588],[-1.75431,60.30588],[-1.75431,60.12844],[-1.57549,60.12844],[-1.57549,59.79792],[-1.0317,59.79792],[-1.0317,60.03545],[-0.66269,60.03545],[-0.66269,60.91039],[-1.10344,60.91039],[-1.10344,60.804],[-1.35063,60.804],[-1.35063,60.68857],[-1.94838,60.68857]],[[-2.20338,60.19686],[-2.20338,60.09294],[-1.9864,60.09294],[-1.9864,60.19686],[-2.20338,60.19686]],[[-1.75431,59.56983],[-1.75431,59.46394],[-1.53733,59.46394],[-1.53733,59.56983],[-1.75431,59.56983]],[[-4.5586,59.13705],[-4.5586,58.95691],[-4.2867,58.95691],[-4.2867,59.13705],[-4.5586,59.13705]],[[-6.27877,59.20257],[-6.27877,59.02278],[-5.66506,59.02278],[-5.66506,59.20257],[-6.27877,59.20257]],[[-8.71635,57.94406],[-8.71635,57.73059],[-8.35929,57.73059],[-8.35929,57.94406],[-8.71635,57.94406]],[[-7.6077,50.4021],[-7.6077,50.26887],[-7.39072,50.26887],[-7.39072,50.4021],[-7.6077,50.4021]],[[-7.73043,58.35799],[-7.73043,58.24831],[-7.51345,58.24831],[-7.51345,58.35799],[-7.73043,58.35799]]]},{id:"OS-Scottish_Popular-historic",name:"OS Scottish Popular historic",type:"tms",template:"https://ooc.openstreetmap.org/npescotland/{zoom}/{x}/{y}.jpg",zoomExtent:[6,15],polygon:[[[-6.37546,57.1045],[-6.12998,57.11183],[-6.12586,56.94143],[-6.26045,56.93892],[-6.26045,56.83765],[-6.24259,56.65806],[-6.3552,56.65655],[-6.37649,56.79029],[-7.02812,56.76396],[-6.99636,56.54246],[-7.04391,56.53937],[-7.03206,56.44201],[-6.98331,56.44353],[-6.97593,56.36063],[-6.45271,56.37964],[-6.44035,56.2013],[-6.19315,56.21199],[-6.18354,56.12483],[-6.36379,56.11641],[-6.36173,55.98258],[-6.48944,55.97912],[-6.47777,55.84134],[-6.55467,55.8371],[-6.53545,55.66049],[-6.45442,55.66087],[-6.44412,55.57285],[-6.19985,55.57266],[-5.96845,55.58857],[-5.98562,55.7686],[-5.90665,55.77169],[-5.88949,55.59284],[-5.80983,55.594],[-5.79335,55.41395],[-5.827,55.41395],[-5.80915,55.24247],[-5.61826,55.24873],[-5.62101,55.26713],[-5.46239,55.27026],[-5.48642,55.514],[-5.43836,55.51516],[-5.42943,55.42681],[-5.24129,55.43071],[-5.19464,54.80351],[-5.07105,54.80668],[-5.05221,54.62471],[-4.3223,54.65173],[-4.33123,54.7319],[-4.06786,54.73697],[-4.06786,54.76471],[-3.55699,54.77342],[-3.55837,54.83754],[-2.42098,54.84671],[-2.42647,55.25265],[-2.03097,55.25265],[-2.01449,55.56606],[-1.76455,55.56606],[-1.76455,55.9724],[-2.35026,55.96548],[-2.5796,56.06527],[-2.58234,56.37071],[-2.65032,56.36919],[-2.65581,56.50585],[-2.48965,56.50509],[-2.42785,56.55356],[-2.42373,56.73026],[-2.1628,56.73177],[-2.17104,56.99301],[-2.00075,56.99301],[-1.98479,57.3159],[-1.83476,57.31553],[-1.83441,57.36074],[-1.75167,57.36111],[-1.74893,57.63046],[-1.83613,57.63009],[-1.83544,57.70171],[-2.00436,57.70207],[-2.00367,57.71968],[-3.22281,57.71418],[-3.22629,57.76157],[-3.51331,57.77622],[-3.50914,57.71051],[-3.84766,57.70611],[-3.85182,57.76853],[-3.79925,57.76989],[-3.80474,57.88578],[-3.85556,57.88651],[-3.85937,57.97558],[-3.79513,57.97656],[-3.79483,58.03052],[-3.69733,58.03161],[-3.69458,58.06722],[-3.52391,58.07437],[-3.52978,58.16007],[-3.35774,58.16286],[-3.3483,58.28742],[-3.07638,58.29121],[-3.03004,58.43744],[-3.01768,58.65814],[-2.85837,58.66028],[-2.86524,58.7943],[-2.75812,58.79715],[-2.76636,58.87461],[-2.6208,58.88668],[-2.62766,58.97527],[-2.54114,58.97668],[-2.54217,59.0841],[-2.52363,59.08375],[-2.52913,59.1574],[-2.43849,59.15705],[-2.4378,59.246],[-2.36914,59.24705],[-2.3688,59.40748],[-2.52947,59.40748],[-2.52741,59.33436],[-2.70319,59.33576],[-2.70525,59.40608],[-3.12891,59.40433],[-3.12411,59.15951],[-3.40288,59.1574],[-3.39464,58.9689],[-3.4276,58.96961],[-3.42572,58.88526],[-3.45215,58.87071],[-3.51017,58.86911],[-3.50708,58.78826],[-3.38555,58.79004],[-3.3828,58.6999],[-3.4494,58.69847],[-3.45078,58.65385],[-3.50159,58.65421],[-3.5009,58.62705],[-3.72612,58.62383],[-3.72475,58.60595],[-4.6476,58.5895],[-4.65996,58.67171],[-5.10697,58.66135],[-5.09804,58.58091],[-5.23743,58.57769],[-5.22455,58.26305],[-5.4127,58.25818],[-5.39965,58.12245],[-5.53286,58.11991],[-5.52393,57.99494],[-5.55346,57.99422],[-5.54728,57.93995],[-5.85696,57.93157],[-5.83181,57.73361],[-5.86374,57.73224],[-5.85773,57.66096],[-6.19624,57.64975],[-6.20242,57.72353],[-6.41666,57.7162],[-6.42421,57.75945],[-6.4764,57.75725],[-6.46884,57.71326],[-6.53339,57.71216],[-6.52721,57.6391],[-6.692,57.63395],[-6.68102,57.54341],[-6.78195,57.53826],[-6.75311,57.31608],[-6.50592,57.32498],[-6.49768,57.28084],[-6.4812,57.27824],[-6.47159,57.19203],[-6.38644,57.19352],[-6.37546,57.1045]],[[-7.65043,56.77461],[-7.40667,56.79304],[-7.41972,56.88281],[-7.38676,56.90268],[-7.25836,56.91056],[-7.24806,57.07141],[-7.11485,57.077],[-7.16772,57.43466],[-7.0352,57.44094],[-7.05236,57.69026],[-6.86834,57.6976],[-6.87315,57.71631],[-6.70286,57.72217],[-6.71591,57.81117],[-6.53188,57.81958],[-6.53875,57.88133],[-6.22015,57.89265],[-6.24143,58.09935],[-6.12676,58.10152],[-6.17758,58.53105],[-6.46734,58.52029],[-6.4591,58.45102],[-6.63145,58.44455],[-6.6239,58.39169],[-6.79212,58.38485],[-6.78869,58.34956],[-6.90885,58.34415],[-6.89718,58.25503],[-7.20136,58.24166],[-7.14094,57.83201],[-7.37509,57.82104],[-7.36822,57.69503],[-7.6573,57.68292],[-7.67652,57.80715],[-7.79257,57.80202],[-7.77327,57.67734],[-7.70756,57.68024],[-7.69376,57.59088],[-7.75947,57.58797],[-7.74587,57.49965],[-7.51241,57.5085],[-7.47911,57.29468],[-7.52855,57.2932],[-7.51276,57.05871],[-7.61163,57.05386],[-7.59859,56.87493],[-7.66725,56.87268],[-7.65043,56.77461]],[[-1.46238,59.82831],[-1.21519,59.83107],[-1.21519,59.96194],[-1.10533,59.96056],[-1.0986,60.09498],[-0.97632,60.09346],[-0.96352,60.3476],[-0.74028,60.34484],[-0.7147,60.84722],[-1.08215,60.85901],[-1.08455,60.76944],[-1.21296,60.77011],[-1.21579,60.68079],[-1.23364,60.68113],[-1.23467,60.5909],[-1.27132,60.59191],[-1.27338,60.64581],[-1.45466,60.64648],[-1.45397,60.59224],[-1.6373,60.59292],[-1.63954,60.3507],[-1.73172,60.35095],[-1.73172,60.18067],[-1.64177,60.17931],[-1.64177,60.1448],[-1.46393,60.14344],[-1.46238,59.82831]],[[-6.21496,56.97437],[-6.22525,57.06445],[-6.29117,57.06184],[-6.29237,57.08062],[-6.62162,57.06943],[-6.61338,57.00629],[-6.46163,57.01302],[-6.4582,56.96776],[-6.21496,56.97437]],[[-2.12774,60.10855],[-2.12803,60.16207],[-2.00203,60.16224],[-2.00174,60.10872],[-2.12774,60.10855]],[[-6.68977,56.95804],[-6.69228,56.9759],[-6.65984,56.97726],[-6.65733,56.9594],[-6.68977,56.95804]],[[-7.66365,58.25846],[-7.66844,58.28502],[-7.54896,58.29098],[-7.54417,58.26442],[-7.66365,58.25846]],[[-8.65104,57.78885],[-8.66674,57.875],[-8.48272,57.88449],[-8.46702,57.79836],[-8.65104,57.78885]]]},{id:"osmie_barony",name:"OSMIE Baronies",type:"tms",template:"https://tile.openstreetmap.ie/barony/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_cps",name:"OSMIE Civil Parishes",type:"tms",template:"https://tile.openstreetmap.ie/civilparish/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_dail_ea",name:"OSMIE Dail Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/dail_ea/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_eds",name:"OSMIE EDs",type:"tms",template:"https://tile.openstreetmap.ie/ed/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_local_ea",name:"OSMIE Local Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/local_ea/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tie_not_counties",name:"OSMIE T.ie Land not in Counties",type:"tms",template:"https://www.townlands.ie/tiles/not_counties/{zoom}/{x}/{y}.png",zoomExtent:[2,19],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tds",name:"OSMIE Townlands",type:"tms",template:"https://tile.openstreetmap.ie/townland/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"al_palestina",name:"Palestina AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Palestina&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.28907,-9.71916],[-37.28904,-9.71114],[-37.28911,-9.7022],[-37.28915,-9.69175],[-37.28919,-9.68886],[-37.28927,-9.68069],[-37.28926,-9.67732],[-37.28936,-9.66999],[-37.28936,-9.66599],[-37.28931,-9.66133],[-37.28941,-9.65526],[-37.28946,-9.64556],[-37.2895,-9.63489],[-37.28954,-9.62926],[-37.2964,-9.62885],[-37.31188,-9.62897],[-37.32762,-9.62914],[-37.33181,-9.62919],[-37.34338,-9.62917],[-37.35876,-9.62923],[-37.37175,-9.6293],[-37.37839,-9.62913],[-37.38051,-9.62922],[-37.38061,-9.63143],[-37.38054,-9.63785],[-37.38043,-9.63895],[-37.38053,-9.64147],[-37.38051,-9.64876],[-37.3805,-9.6543],[-37.38043,-9.656],[-37.38024,-9.66028],[-37.38022,-9.66551],[-37.38019,-9.67054],[-37.38016,-9.67896],[-37.38013,-9.68781],[-37.38009,-9.70116],[-37.38003,-9.71053],[-37.3801,-9.71743],[-37.38005,-9.71959],[-37.37932,-9.71954],[-37.37392,-9.71956],[-37.36582,-9.71945],[-37.35849,-9.71946],[-37.35334,-9.71938],[-37.34414,-9.71937],[-37.33423,-9.71923],[-37.32933,-9.71927],[-37.3218,-9.71924],[-37.31983,-9.71927],[-37.31094,-9.7192],[-37.29589,-9.71921],[-37.28907,-9.71916]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"palmeira_dos_indios",name:"Palmeira dos Indios AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Palmeira%20dos%20Indios&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.58664,-9.46124],[-36.58665,-9.45851],[-36.58619,-9.41968],[-36.58604,-9.41452],[-36.58596,-9.40593],[-36.58585,-9.39509],[-36.58579,-9.39163],[-36.58565,-9.38983],[-36.58549,-9.38249],[-36.58529,-9.37965],[-36.58511,-9.37744],[-36.58503,-9.37059],[-36.5889,-9.37058],[-36.59064,-9.37065],[-36.59389,-9.3706],[-36.60037,-9.37073],[-36.61046,-9.37049],[-36.62288,-9.37021],[-36.63377,-9.37002],[-36.63835,-9.36986],[-36.64743,-9.36997],[-36.65141,-9.36994],[-36.65534,-9.36972],[-36.65647,-9.36974],[-36.66111,-9.37024],[-36.66276,-9.37026],[-36.66704,-9.36973],[-36.67052,-9.36966],[-36.67325,-9.36966],[-36.67602,-9.36987],[-36.67593,-9.3726],[-36.67597,-9.37679],[-36.67639,-9.38138],[-36.67654,-9.38464],[-36.67663,-9.39265],[-36.67675,-9.39829],[-36.67689,-9.40875],[-36.67707,-9.41887],[-36.67717,-9.43179],[-36.67724,-9.43395],[-36.67718,-9.43753],[-36.67728,-9.44311],[-36.6773,-9.44933],[-36.67741,-9.45528],[-36.6774,-9.45938],[-36.67735,-9.46017],[-36.67568,-9.46021],[-36.66625,-9.4603],[-36.66224,-9.4603],[-36.65736,-9.46042],[-36.6504,-9.46047],[-36.63543,-9.46065],[-36.61979,-9.46083],[-36.61433,-9.46083],[-36.61029,-9.46097],[-36.60647,-9.46097],[-36.60186,-9.46099],[-36.59426,-9.46112],[-36.58664,-9.46124]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"Pangasinan_Bulacan_HiRes",name:"Pangasinán/Bulacan (Philippines HiRes)",type:"tms",template:"https://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png",zoomExtent:[12,19],polygon:[[[120.33659,15.98577],[120.44599,15.984],[120.44613,15.97446],[120.47646,15.97459],[120.59425,15.94683],[120.59806,16.09079],[120.59654,16.198],[120.36854,16.21853],[120.34758,16.04231],[120.33659,15.98577]],[[120.8268,15.3658],[121.2684,15.2602],[121.2699,14.7025],[120.695,14.8423],[120.8268,15.3658]]]},{id:"pao_de_acucar",name:"Pão de Açucar AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Pao%20de%20Acucar&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.39003,-9.78589],[-37.39019,-9.7762],[-37.38993,-9.76575],[-37.38991,-9.75256],[-37.39015,-9.74102],[-37.39003,-9.73201],[-37.39012,-9.72254],[-37.39015,-9.71289],[-37.39019,-9.70341],[-37.3902,-9.69548],[-37.40377,-9.6955],[-37.41728,-9.6956],[-37.43224,-9.69569],[-37.44319,-9.69573],[-37.44723,-9.69582],[-37.45682,-9.69585],[-37.47062,-9.69591],[-37.47373,-9.69591],[-37.47586,-9.69604],[-37.48128,-9.69605],[-37.48131,-9.6989],[-37.48122,-9.70087],[-37.48121,-9.70239],[-37.48135,-9.70545],[-37.48138,-9.71046],[-37.48134,-9.71617],[-37.4812,-9.71875],[-37.48125,-9.72035],[-37.48136,-9.72134],[-37.48134,-9.7241],[-37.4813,-9.72506],[-37.48103,-9.72732],[-37.48102,-9.73088],[-37.48127,-9.73462],[-37.48131,-9.73638],[-37.48131,-9.73893],[-37.48131,-9.74388],[-37.4813,-9.74989],[-37.48122,-9.75315],[-37.48102,-9.75855],[-37.48084,-9.7642],[-37.48085,-9.76526],[-37.48094,-9.76675],[-37.48093,-9.76881],[-37.48084,-9.7721],[-37.48087,-9.77486],[-37.48076,-9.77993],[-37.48081,-9.7863],[-37.46382,-9.78623],[-37.45353,-9.7862],[-37.43979,-9.78611],[-37.42998,-9.78607],[-37.4208,-9.786],[-37.40853,-9.78596],[-37.39545,-9.78593],[-37.39003,-9.78589]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"PCN-Italy-2006",name:"PCN 2006 - Italy",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_06.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2006.33,OI.ORTOIMMAGINI.2006.32&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2006-01-01T00:00:00.000Z",startDate:"2006-01-01T00:00:00.000Z",polygon:[[[7.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{id:"PCN-Lazio_Umbria-2008",name:"PCN 2008 - IT Lazio+Umbria",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_08.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=OI.ORTOIMMAGINI.2008.33&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",polygon:[[[12.33149,41.64637],[12.41178,41.64791],[12.41499,41.54635],[12.49574,41.54789],[12.4985,41.49619],[12.57948,41.49843],[12.58062,41.42932],[12.60632,41.4288],[12.60746,41.39663],[12.8293,41.39818],[12.83159,41.34688],[12.9128,41.34843],[12.9151,41.29726],[12.99585,41.2983],[12.99791,41.19636],[13.1679,41.19808],[13.16721,41.24692],[13.41337,41.24829],[13.4152,41.19705],[13.8341,41.19808],[13.83341,41.2476],[13.91737,41.24847],[13.91668,41.39749],[14.0011,41.39784],[13.99996,41.49774],[14.08415,41.49826],[14.08346,41.65014],[14.00087,41.6498],[13.99973,41.75051],[13.83433,41.74965],[13.83364,41.80047],[13.75151,41.79978],[13.7499,41.84987],[13.41841,41.8497],[13.41681,41.95027],[13.33445,41.94959],[13.3333,42.00041],[13.25141,41.99973],[13.25003,42.05051],[13.08509,42.04966],[13.08394,42.097],[13.33399,42.09819],[13.33376,42.1472],[13.41772,42.14822],[13.41635,42.25052],[13.33399,42.24984],[13.33353,42.30094],[13.25141,42.29992],[13.25003,42.54699],[13.41795,42.54817],[13.41589,42.75065],[13.33468,42.74947],[13.33307,42.90056],[13.16836,42.89938],[13.16721,42.95079],[12.96419,42.95012],[12.96258,43.0003],[12.91877,42.9998],[12.91601,43.25078],[12.83526,43.24994],[12.83228,43.50107],[12.66321,43.4994],[12.66482,43.45112],[12.58567,43.44996],[12.58246,43.5508],[12.50171,43.5498],[12.49987,43.65131],[12.16242,43.64915],[12.16494,43.60132],[12.07891,43.5995],[12.0819,43.45196],[11.99541,43.44913],[11.99862,43.34661],[12.07891,43.34795],[12.08075,43.30189],[11.9961,43.29955],[11.99862,43.20214],[11.91237,43.19929],[11.91466,43.15212],[11.83207,43.14944],[11.8323,43.09653],[11.91099,43.09837],[11.91466,42.90191],[11.82909,42.89922],[11.83139,42.85231],[11.74582,42.84945],[11.74811,42.65236],[11.6731,42.64966],[11.67493,42.6105],[11.49485,42.59936],[11.49852,42.49593],[11.57812,42.49796],[11.58156,42.45244],[11.41226,42.44872],[11.41524,42.34656],[11.49599,42.34792],[11.49921,42.29636],[11.57835,42.29822],[11.58225,42.24628],[11.66185,42.24832],[11.66621,42.09649],[11.74536,42.09819],[11.74903,41.99666],[11.91443,41.99922],[11.91535,41.98626],[11.99403,41.98745],[11.99862,41.89685],[12.07868,41.89907],[12.08144,41.84594],[12.16311,41.84799],[12.16563,41.6964],[12.3292,41.69863],[12.33149,41.64637]]]},{id:"PCN-Italy-2012",name:"PCN 2012 - Italy",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_12.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.ORTOIMMAGINI.2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[7.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{id:"Actueel_ortho25_WMS",name:"PDOK aerial imagery Beeldmateriaal.nl 25cm latest",type:"tms",template:"https://geodata.nationaalgeoregister.nl/luchtfoto/rgb/wmts?FORMAT=image/jpeg&SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=Actueel_ortho25&STYLE=&FORMAT=image/jpeg&tileMatrixSet=OGC:1.0:GoogleMapsCompatible&tileMatrix={zoom}&tileRow={y}&tileCol={x}",zoomExtent:[0,19],polygon:[[[3.14377,51.35984],[3.1575,51.24113],[3.33878,51.11544],[3.91281,51.05851],[4.65714,51.28067],[4.89334,51.26348],[5.17899,51.12579],[5.38498,51.13096],[5.54428,51.05678],[5.42069,50.85956],[5.46738,50.70326],[5.65689,50.61926],[6.14853,50.62143],[6.30234,50.85782],[6.29959,50.95438],[6.26389,51.01835],[6.37238,51.09259],[6.40122,51.20114],[6.37375,51.25102],[6.44516,51.31587],[6.42044,51.5496],[6.34354,51.67922],[6.79672,51.76429],[7.04666,51.91024],[7.07138,52.04559],[7.27188,52.17041],[7.30759,52.38551],[7.20596,52.53195],[7.28287,52.61458],[7.29935,52.77853],[7.44217,52.97827],[7.43393,53.28314],[7.04392,53.55159],[6.78299,53.63635],[6.23917,53.54016],[5.6871,53.51241],[5.17349,53.43885],[4.81644,53.23384],[4.65164,53.06583],[4.54178,52.48598],[4.32205,52.19568],[4.08104,52.01369],[4.02199,52.01623],[3.93684,51.96379],[3.95195,51.88079],[3.84483,51.84942],[3.62373,51.70752],[3.65532,51.66069],[3.63335,51.62746],[3.54683,51.62234],[3.39577,51.56091],[3.38203,51.51735],[3.49876,51.43267],[3.32985,51.38556],[3.14377,51.35984]]],terms_url:"https://www.nationaalgeoregister.nl/geonetwork/srv/dut/catalog.search#/search?facet.q=license%2FCC-BY&isChild=%27false%27&resultType=details&any_OR_title_OR_keyword=luchtfoto&fast=index&_content_type=json&from=1&to=20&sortBy=relevance",terms_text:"Kadaster / Beeldmateriaal.nl, CC BY 4.0",best:true,description:"Nationwide data set 25cm resolution color aerial imagery of the most recent year.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/nl/PDOK-Luchtfoto-Beeldmateriaal-25cm-latest.png"},{id:"al_piranhas",name:"Piranhas AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Piranhas&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.71918,-9.65236],[-37.71918,-9.63874],[-37.71914,-9.6321],[-37.71924,-9.62114],[-37.71929,-9.61023],[-37.71934,-9.59988],[-37.7194,-9.58891],[-37.71945,-9.57802],[-37.71944,-9.57173],[-37.71952,-9.56684],[-37.71956,-9.56225],[-37.71998,-9.56218],[-37.72258,-9.56195],[-37.72818,-9.56203],[-37.73254,-9.562],[-37.74107,-9.56206],[-37.74845,-9.56202],[-37.75926,-9.56216],[-37.76972,-9.56227],[-37.78036,-9.56244],[-37.78537,-9.56236],[-37.78907,-9.56233],[-37.79562,-9.56245],[-37.79771,-9.56237],[-37.81006,-9.56243],[-37.81061,-9.56241],[-37.81053,-9.56531],[-37.81049,-9.57629],[-37.81046,-9.58742],[-37.81038,-9.59757],[-37.81031,-9.61798],[-37.81018,-9.65197],[-37.81018,-9.6523],[-37.81024,-9.65259],[-37.80664,-9.65245],[-37.80206,-9.65253],[-37.79597,-9.65237],[-37.79179,-9.65252],[-37.78815,-9.65246],[-37.78723,-9.65242],[-37.78035,-9.65241],[-37.77865,-9.65223],[-37.77625,-9.6523],[-37.77475,-9.65219],[-37.77234,-9.65223],[-37.7696,-9.65245],[-37.76623,-9.65251],[-37.76345,-9.65246],[-37.7604,-9.6525],[-37.75102,-9.65237],[-37.75012,-9.65249],[-37.74155,-9.65248],[-37.7403,-9.65239],[-37.73785,-9.65246],[-37.73443,-9.65238],[-37.73106,-9.65243],[-37.72651,-9.65237],[-37.72195,-9.65225],[-37.71992,-9.65228],[-37.71918,-9.65236]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"PNOA-Spain-TMS",name:"PNOA Spain",type:"tms",template:"https://www.ign.es/wmts/pnoa-ma?request=GetTile&service=WMTS&VERSION=1.0.0&Layer=OI.OrthoimageCoverage&Style=default&Format=image/png&TileMatrixSet=GoogleMapsCompatible&TileMatrix={zoom}&TileRow={y}&TileCol={x}",zoomExtent:[0,20],polygon:[[[-17.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-1.77005,43.37605],[-1.71005,43.37569],[-1.71135,43.33125],[-1.72259,43.31318],[-1.68904,43.31291],[-1.68811,43.33413],[-1.64467,43.33372],[-1.64498,43.31332],[-1.60299,43.31295],[-1.60344,43.29266],[-1.56359,43.29212],[-1.56305,43.31338],[-1.47799,43.31284],[-1.36677,43.27614],[-1.35688,43.23815],[-1.37037,43.1713],[-1.44231,43.08336],[-1.41983,43.06036],[-1.37307,43.05117],[-1.36407,43.11159],[-1.30203,43.13522],[-1.23549,43.13325],[-1.27955,43.07744],[-1.19232,43.06496],[-1.00619,43.00778],[-0.94234,42.9749],[-0.7562,42.98213],[-0.71484,42.96108],[-0.69685,42.90314],[-0.55118,42.82207],[-0.50442,42.84845],[-0.42889,42.82009],[-0.31648,42.86558],[-0.14563,42.81086],[-0.03143,42.71249],[0.18618,42.7541],[0.30218,42.71777],[0.36422,42.74287],[0.44875,42.71447],[0.62769,42.7224],[0.64118,42.85767],[0.71492,42.88272],[0.9676,42.81811],[1.10878,42.79898],[1.17532,42.73429],[1.36326,42.74155],[1.41137,42.70939],[1.48061,42.71034],[1.4813,42.50107],[1.64436,42.50203],[1.64328,42.54245],[1.73041,42.54342],[1.73164,42.50118],[2.06386,42.50164],[2.06456,42.45902],[2.39693,42.45994],[2.39768,42.41784],[2.48048,42.41797],[2.48098,42.37594],[2.64479,42.37626],[2.64448,42.45924],[2.81133,42.45961],[2.81126,42.50104],[3.06388,42.50085],[3.06388,42.45915],[3.23078,42.45934],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-7.4481,37.39094],[-7.46963,37.40758],[-7.4647,37.45305],[-7.50197,37.51641],[-7.51916,37.52292],[-7.52196,37.57237],[-7.45013,37.66958],[-7.4249,37.75992],[-7.31666,37.83997],[-7.26833,37.98895],[-7.15368,38.01552],[-7.11771,38.05536],[-7.0143,38.02438],[-6.99632,38.10756],[-6.96147,38.20125],[-7.08062,38.15708],[-7.34027,38.44024],[-7.26383,38.73807],[-7.04352,38.87297],[-7.06151,38.90796],[-6.96934,39.01983],[-7.00081,39.08879],[-7.15368,39.09577],[-7.15255,39.16029],[-7.24472,39.19689],[-7.25596,39.28133],[-7.33689,39.35351],[-7.3279,39.45599],[-7.51449,39.58865],[-7.55271,39.67954],[-7.05027,39.67522],[-6.99519,39.81954],[-6.92213,39.87909],[-6.88616,40.02299],[-7.04128,40.13479],[-7.01767,40.26615],[-6.8086,40.34501],[-6.86818,40.44516],[-6.85356,40.60664],[-6.83783,40.87576],[-6.9536,41.03704],[-6.80186,41.03959],[-6.76814,41.13871],[-6.64112,41.26556],[-6.56244,41.26303],[-6.21737,41.5791],[-6.31628,41.64465],[-6.51523,41.64129],[-6.58717,41.68832],[-6.54783,41.85597],[-6.62988,41.91121],[-7.13345,41.94048],[-7.16829,41.87188],[-7.42569,41.78477],[-7.95398,41.84593],[-8.13045,41.78058],[-8.25185,41.90786],[-8.12933,42.03488],[-8.24848,42.1008],[-8.36762,42.05575],[-8.60704,42.03405],[-8.89106,41.82289]]],terms_text:"PNOA",best:true},{id:"poco_das_trincheiras",name:"Poço das Trincheiras AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Poco%20das%20Trincheiras&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.23942,-9.35157],[-37.23947,-9.34387],[-37.23942,-9.33792],[-37.23954,-9.33022],[-37.23973,-9.32791],[-37.23974,-9.3228],[-37.23964,-9.32085],[-37.23971,-9.31864],[-37.2398,-9.31706],[-37.23982,-9.31561],[-37.24053,-9.30933],[-37.24051,-9.30004],[-37.24008,-9.29687],[-37.23998,-9.29546],[-37.23992,-9.29319],[-37.23989,-9.28978],[-37.23995,-9.28818],[-37.24008,-9.28641],[-37.24036,-9.28212],[-37.24038,-9.27897],[-37.24051,-9.27557],[-37.24004,-9.26979],[-37.24018,-9.26721],[-37.24018,-9.26612],[-37.23995,-9.26455],[-37.23983,-9.26151],[-37.24333,-9.26136],[-37.24936,-9.26146],[-37.26445,-9.26161],[-37.28016,-9.26172],[-37.28294,-9.26171],[-37.29581,-9.26178],[-37.30685,-9.26178],[-37.31419,-9.26189],[-37.32437,-9.26192],[-37.33078,-9.26175],[-37.33057,-9.27275],[-37.33048,-9.28007],[-37.33054,-9.28117],[-37.33069,-9.28427],[-37.3307,-9.28535],[-37.33064,-9.28617],[-37.33071,-9.28717],[-37.33064,-9.28769],[-37.33062,-9.29027],[-37.33043,-9.29308],[-37.33038,-9.29655],[-37.33034,-9.30591],[-37.3304,-9.31203],[-37.33038,-9.32194],[-37.33041,-9.3342],[-37.33035,-9.34185],[-37.3303,-9.34783],[-37.33035,-9.35202],[-37.31509,-9.35194],[-37.30011,-9.3519],[-37.29531,-9.35183],[-37.28899,-9.35171],[-37.28497,-9.35182],[-37.27851,-9.35173],[-37.27431,-9.35181],[-37.27115,-9.3517],[-37.26351,-9.35168],[-37.26046,-9.35164],[-37.25402,-9.35177],[-37.24705,-9.35163],[-37.23942,-9.35157]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"e-mapa.net-buildings",name:"polska.e-mapa.net: Buildings",type:"wms",template:"http://wms02.epodgik.pl/cgi-bin/KrajowaIntegracjaEwidencjiGruntow?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"https://polska.e-mapa.net/",terms_text:"polska.e-mapa.net - Geoportal otwartych danych przestrzennych",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/polskae-mapanetBuildings.png"},{id:"debicki-buildings",name:"Powiat dębicki: Buildings",type:"wms",template:"https://debica.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,adresy,EBU,EBT,S&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[21.53768,50.01085],[21.51944,50.05423],[21.58099,50.1233],[21.48804,50.18059],[21.13725,50.14835],[21.13939,50.12721],[21.18058,50.12101],[21.14315,50.05965],[21.15356,49.92854],[21.27892,49.92554],[21.22448,49.8861],[21.22362,49.84258],[21.35177,49.8349],[21.36368,49.86838],[21.41585,49.82003],[21.47943,49.8398],[21.52679,49.88911],[21.47689,50.00135],[21.53768,50.01085]]],terms_text:"Powiat dębicki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lancucki-buildings",name:"Powiat łańcucki: Buildings",type:"wms",template:"https://lancut.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.17224,50.10121],[22.12574,50.1079],[22.0823,50.17206],[22.13591,50.1867],[22.173,50.18117],[22.18418,50.22914],[22.235,50.24718],[22.3856,50.16031],[22.40346,50.13331],[22.45275,50.12745],[22.45275,50.10676],[22.41768,50.08997],[22.38364,50.08915],[22.38542,50.05393],[22.35315,50.05067],[22.3562,50.00627],[22.31478,49.99451],[22.32139,49.94614],[22.29979,49.92455],[22.24161,49.92847],[22.20901,49.93728],[22.22382,49.96085],[22.16683,50.00412],[22.1387,50.00251],[22.12015,50.04626],[22.17224,50.10121]]],terms_text:"Powiat łańcucki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lubaczowski-buildings",name:"Powiat lubaczowski: Buildings",type:"wms",template:"https://lubaczow.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=S,EBT,adresy,budynki_ewid&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[23.29224,50.09693],[23.55763,50.25704],[23.51394,50.26643],[23.522,50.29892],[23.40991,50.3083],[23.44482,50.35653],[23.38072,50.3699],[23.38829,50.4058],[23.35821,50.41105],[23.2527,50.36601],[23.19379,50.40529],[23.01962,50.2928],[22.84161,50.30574],[22.83572,50.27037],[22.82426,50.26923],[22.79651,50.20933],[22.86603,50.18949],[22.87414,50.13786],[22.93233,50.1678],[22.88954,50.11501],[22.95351,50.07178],[23.05556,50.04967],[22.99884,49.99028],[23.14951,49.97563],[23.29224,50.09693]]],terms_text:"Powiat lubaczowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznanski-buildings",name:"Powiat poznański: Buildings",type:"wms",template:"http://wms.podgik.poznan.pl/cgi-bin/poznan?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[16.9585,52.46312],[17.03946,52.33605],[16.84291,52.36501],[16.78596,52.46566],[16.70022,52.53819],[16.6415,52.5288],[16.44898,52.36793],[16.47775,52.2696],[16.5659,52.26813],[16.58375,52.17007],[17.08099,52.14981],[17.37124,52.34522],[17.39853,52.44037],[17.35338,52.53949],[17.13689,52.57783],[17.13126,52.6419],[17.01608,52.68366],[16.9158,52.65079],[16.85814,52.58191],[16.7367,52.57459],[16.70022,52.53824],[16.78598,52.46567],[16.9585,52.46312]]],terms_text:"PODGIK Poznań",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatpoznaskiOrthophotomap(aerialimage).png"},{id:"sropczyce-buildings",name:"Powiat ropczycko-sędziszowski: Buildings",type:"wms",template:"https://spropczyce.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[21.60041,50.21025],[21.74199,50.16538],[21.792,50.17829],[21.81459,50.15264],[21.78741,50.10859],[21.82597,50.09149],[21.82552,50.02925],[21.78666,49.97585],[21.70632,49.96022],[21.683,49.92431],[21.60062,49.91793],[21.54249,49.8862],[21.5188,49.89119],[21.45315,49.99268],[21.50364,50.0198],[21.49298,50.07161],[21.55535,50.11909],[21.50429,50.16559],[21.59816,50.17866],[21.60041,50.21025]]],terms_text:"Powiat ropczycko-sędziszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-buildings",name:"Powiat rzeszowski: Buildings",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,EBT,EBU&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-aerial",name:"Powiat rzeszowski: Orthophotomap (aerial image)",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"stalowowolski-buildings",name:"Powiat stalowowolski: Buildings",type:"wms",template:"https://stalowawola.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,adresy,budynki,centroidy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.017,50.35811],[22.09292,50.44916],[22.06785,50.51434],[22.09722,50.54302],[22.16347,50.52686],[22.23795,50.5503],[22.26768,50.60465],[22.22757,50.6653],[22.16235,50.66969],[22.20843,50.75403],[22.16239,50.80039],[22.0546,50.82234],[21.94394,50.77639],[21.86228,50.80439],[21.83413,50.75035],[21.87465,50.70066],[21.84046,50.65749],[21.97582,50.53164],[21.84797,50.47196],[21.88045,50.3913],[22.017,50.35811]]],terms_text:"Powiat stalowowolski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznan-buildings",name:"Poznań: Buildings",type:"wms",template:"http://wms2.geopoz.poznan.pl:8080/geoserver/sip/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki_ewidencyjne_sql&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2014",name:"Poznań: Orthophotomap 2014 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapa_2014/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2014_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2016",name:"Poznań: Orthophotomap 2016 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapy/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2016_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"PrahaIPRlatestorthophoto",name:"Praha IPR latest orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/letecke_snimky_posledni_snimkovani_cache/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{id:"PrahaIPRlow-vegetationorthophoto",name:"Praha IPR low-vegetation orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/mimovegetacni_snimkovani_cache/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"przemysl-buildings",name:"Przemyśl: Buildings",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=adresy,budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"przemysl-aerial",name:"Przemyśl: Ortophotomap (aerial image)",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"RABA-KGZ-3000",name:"RABA-KGZ: Slovenia built-up areas",type:"tms",template:"http://wms.openstreetmap.de/tms/RABA3000/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2015 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"RABA-KGZ",name:"RABA-KGZ: Slovenia farmland use",type:"tms",template:"http://wms.openstreetmap.de/tms/RABA/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2015 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"riksantikvaren-kulturminner",name:"Riksantikvaren Heritage Sites overlay",type:"wms",template:"https://kart.ra.no/arcgis/services/Distribusjon/Kulturminner/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.riksantikvaren.no/Veiledning/Data-og-tjenester/Karttjenester",terms_text:"© Riksantikvaren",description:"Archeological and architectural monuments/sites and cultural environments protected by law (''enkeltminner'') from the Norwegian Directorate for Cultural Heritage",icon:"https://www.riksantikvaren.no/extension/riksantikvaren/design/internetsite/images/logo_na.png",overlay:true},{id:"rio2013",name:"Rio Mosaic 2013",type:"wms",template:"http://geo.rio.rj.gov.br/ArcGIS/services/Imagens/Mosaico_2013/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[-43.17709,-22.96971],[-43.14586,-22.96959],[-43.14605,-22.92719],[-43.15625,-22.92731],[-43.15647,-22.87557],[-43.17739,-22.87494],[-43.17742,-22.88553],[-43.19804,-22.88571],[-43.19804,-22.85429],[-43.21875,-22.85444],[-43.21901,-22.83365],[-43.22937,-22.83365],[-43.22934,-22.82371],[-43.19869,-22.82353],[-43.19856,-22.83413],[-43.18826,-22.83398],[-43.18804,-22.84448],[-43.16667,-22.84442],[-43.16683,-22.83404],[-43.15638,-22.83407],[-43.15654,-22.81336],[-43.10436,-22.81306],[-43.10446,-22.80288],[-43.09387,-22.80276],[-43.0941,-22.73998],[-43.13599,-22.73992],[-43.13569,-22.75067],[-43.12573,-22.75055],[-43.12556,-22.77118],[-43.14595,-22.77109],[-43.14612,-22.76055],[-43.17771,-22.76088],[-43.17758,-22.77115],[-43.18807,-22.7713],[-43.18807,-22.78166],[-43.25067,-22.78163],[-43.25057,-22.79198],[-43.28054,-22.79282],[-43.30343,-22.79312],[-43.33353,-22.79297],[-43.33347,-22.80258],[-43.38574,-22.8024],[-43.38542,-22.81255],[-43.41691,-22.81285],[-43.41675,-22.82341],[-43.42717,-22.82335],[-43.4274,-22.83374],[-43.45844,-22.83362],[-43.45864,-22.81276],[-43.48984,-22.813],[-43.48994,-22.7965],[-43.50208,-22.79746],[-43.51543,-22.79737],[-43.52078,-22.79591],[-43.54169,-22.79603],[-43.54179,-22.80234],[-43.54653,-22.80246],[-43.54666,-22.81189],[-43.55251,-22.81279],[-43.56991,-22.81294],[-43.56998,-22.8197],[-43.57361,-22.82326],[-43.58348,-22.82329],[-43.58352,-22.83347],[-43.59391,-22.83374],[-43.59394,-22.85468],[-43.66099,-22.85459],[-43.66099,-22.85983],[-43.70852,-22.86019],[-43.70836,-22.86503],[-43.72206,-22.86488],[-43.72213,-22.86847],[-43.75015,-22.86859],[-43.75009,-22.8753],[-43.76038,-22.87527],[-43.75992,-22.8785],[-43.75976,-22.88457],[-43.76132,-22.88586],[-43.78129,-22.8858],[-43.78126,-22.89591],[-43.80213,-22.89621],[-43.80135,-22.91137],[-43.80119,-22.92758],[-43.79213,-22.92776],[-43.7922,-22.93822],[-43.78191,-22.93799],[-43.78184,-22.94869],[-43.75067,-22.94845],[-43.7506,-22.95909],[-43.72986,-22.95886],[-43.72966,-22.97984],[-43.70904,-22.97966],[-43.70891,-22.99033],[-43.69846,-22.99006],[-43.69836,-23.00065],[-43.66735,-23.00044],[-43.66726,-23.01117],[-43.63125,-23.00937],[-43.63131,-23.02079],[-43.63586,-23.02091],[-43.63602,-23.03164],[-43.67771,-23.03164],[-43.67765,-23.04233],[-43.67086,-23.0423],[-43.67109,-23.0631],[-43.64599,-23.06304],[-43.64605,-23.05276],[-43.60475,-23.05255],[-43.60452,-23.06307],[-43.58381,-23.06289],[-43.58368,-23.08404],[-43.54186,-23.08383],[-43.54195,-23.06319],[-43.52147,-23.06301],[-43.5213,-23.07352],[-43.50043,-23.07337],[-43.50043,-23.04218],[-43.45877,-23.04221],[-43.4587,-23.03194],[-43.43782,-23.03182],[-43.43776,-23.02154],[-43.3235,-23.02121],[-43.3233,-23.04212],[-43.31291,-23.04195],[-43.31275,-23.05267],[-43.30239,-23.05258],[-43.30236,-23.04227],[-43.29194,-23.04215],[-43.29197,-23.03194],[-43.27109,-23.03182],[-43.27119,-23.01093],[-43.26061,-23.01087],[-43.26067,-23.00059],[-43.25057,-23.00047],[-43.25054,-23.01126],[-43.23989,-23.01102],[-43.23986,-23.00062],[-43.21908,-23.0005],[-43.21904,-22.99021],[-43.20901,-22.99009],[-43.20862,-23.08389],[-43.18768,-23.08377],[-43.18761,-23.07334],[-43.13582,-23.07337],[-43.13589,-23.05249],[-43.17732,-23.05255],[-43.17709,-22.96971]]],terms_url:"https://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2013_UTM/MapServer",terms_text:"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{id:"rio2015",name:"Rio Mosaic 2015",type:"wms",template:"https://pgeo3.rio.rj.gov.br/arcgis/services/Imagens/Mosaico_2015_UTM/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-42.30363,-22.43698],[-44.10842,-22.06579],[-44.5313,-23.7863],[-42.70469,-24.16178],[-42.30363,-22.43698]]],terms_url:"https://pgeo3.rio.rj.gov.br/arcgis/rest/services/Imagens/Mosaico_2015_UTM/MapServer",terms_text:"Instituto Pereira Passos - Prefeitura da Cidade do Rio de Janeiro."},{id:"route500",name:"Route 500",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.fr/route500/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]]],terms_url:"https://wiki.openstreetmap.org/wiki/FR:Servers/tile.openstreetmap.fr#Route500.E2.84.A2.C2.A9.C2.AE",terms_text:"Tiles © cquest@Openstreetmap France, data © IGN, LO/OL",description:"Routes du réseau classé (autoroutes, nationales, départementales)",overlay:true},{id:"Ruda_Slaska-aerial_image",name:"Ruda Śląska: Orthophotomap (aerial image)",type:"wms",template:"https://rudaslaska.geoportal2.pl/map/wmsorto/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[18.84294,50.32508],[18.84008,50.33091],[18.85132,50.33437],[18.86262,50.3305],[18.88693,50.333],[18.89493,50.3319],[18.90045,50.32562],[18.89713,50.31146],[18.89312,50.31149],[18.89114,50.30778],[18.8972,50.2999],[18.89073,50.29586],[18.90211,50.29204],[18.90706,50.28637],[18.90853,50.27823],[18.93583,50.27379],[18.94106,50.25859],[18.93848,50.25317],[18.95086,50.24267],[18.96531,50.24084],[18.94611,50.22907],[18.89932,50.22516],[18.90251,50.21749],[18.89075,50.21557],[18.89292,50.20913],[18.86474,50.20512],[18.85673,50.22078],[18.85258,50.22331],[18.84619,50.21761],[18.83341,50.21715],[18.83533,50.22307],[18.83051,50.23099],[18.82411,50.23055],[18.81641,50.23709],[18.81619,50.24125],[18.80635,50.24596],[18.80344,50.24293],[18.78831,50.24456],[18.79552,50.2768],[18.81681,50.27732],[18.81919,50.28794],[18.83893,50.29795],[18.83849,50.3004],[18.82699,50.30342],[18.82691,50.32073],[18.83007,50.32371],[18.84294,50.32508]]],terms_text:"Urząd Miasta Ruda Śląska"},{id:"Rzeszow-buildings",name:"Rzeszów: Buildings",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=komunikacja,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"Rzeszow-aerial_image",name:"Rzeszów: Orthophotomap (aerial image)",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=rastry&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"SanJuanMetroAreaUSACEOrthophotos",name:"San Juan Metro Area: 2013 USACE Orthophotos",type:"tms",template:"http://imagery-pr-usace-2013.s3-website-us-east-1.amazonaws.com/tiles/{zoom}/{x}/{y}.jpg",endDate:"2013-03-15T00:00:00.000Z",startDate:"2013-03-13T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-66.15007,18.35002],[-66.03337,18.35002],[-66.03328,18.45634],[-66.05464,18.45636],[-66.05463,18.46542],[-66.08303,18.46544],[-66.08302,18.47451],[-66.13034,18.47455],[-66.13034,18.4796],[-66.13983,18.47961],[-66.13984,18.46557],[-66.14995,18.46558],[-66.15007,18.35002]]]},{id:"santana_do_ipanema",name:"Santana do Ipanema AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Santana%20do%20Ipanema&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-37.20224,-9.41356],[-37.20188,-9.37768],[-37.20208,-9.37455],[-37.20192,-9.36733],[-37.20169,-9.36045],[-37.20172,-9.35501],[-37.20195,-9.35101],[-37.20191,-9.34773],[-37.20175,-9.33835],[-37.2017,-9.33505],[-37.20171,-9.33301],[-37.20142,-9.32833],[-37.20121,-9.32469],[-37.20117,-9.32351],[-37.21425,-9.32346],[-37.21537,-9.3234],[-37.22078,-9.32328],[-37.23727,-9.32313],[-37.25181,-9.32293],[-37.2656,-9.32276],[-37.2803,-9.32259],[-37.29191,-9.32245],[-37.29205,-9.33522],[-37.29304,-9.4122],[-37.28357,-9.41235],[-37.27789,-9.4125],[-37.2716,-9.41249],[-37.26506,-9.41262],[-37.26165,-9.41274],[-37.25499,-9.41276],[-37.24991,-9.41296],[-37.24616,-9.41297],[-37.24108,-9.41303],[-37.23461,-9.41321],[-37.2284,-9.41325],[-37.22165,-9.41335],[-37.21686,-9.41346],[-37.21292,-9.41343],[-37.20224,-9.41356]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"Sao_miguel_dos_campos",name:"São Miguel dos Campos AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Sao_miguel_dos_campos&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.1415,-9.83171],[-36.05047,-9.83246],[-36.04959,-9.74246],[-36.14059,-9.74166],[-36.1415,-9.83171]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"GEOSN-DOP-2005",name:"Saxony historical aerial imagery 2005",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-2005/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2005&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2005-01-01T00:00:00.000Z",startDate:"2005-01-01T00:00:00.000Z",polygon:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=3f38c3f3-03db-4a2a-b6da-2704b9a1d5f0",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-2012_2014",name:"Saxony historical aerial imagery 2012-2014",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop_2012_2014/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2012_2014_rgb&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=8c276e3c-88af-462f-8128-6900bc7dd4f8",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-RGB",name:"Saxony latest aerial imagery",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-rgb/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=cd01c334-7e32-482f-bd43-af286707178a",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-CIR",name:"Saxony latest aerial imagery infrared",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-cir/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020_cir&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=ba87bbed-4cb5-4539-a9f5-f863de752f52",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DTK",name:"Saxony topographic map",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dtk-pg-color/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dtk_pg_color&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=d6d24c6d-94ea-447d-8a0c-40afdedeb5c6",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-WebAtlas",name:"Saxony WebAtlasSN",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_webatlas-sn/guest?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vegetation,Siedlung,Gewaesser,Verkehr,Administrative_Einheiten,Beschriftung&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=475a9197-620f-4dcb-b8aa-7f71b626443f",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"Geodatastyrelsen_Denmark",name:"SDFE aerial imagery",type:"tms",template:"https://osmtools.septima.dk/mapproxy/tiles/1.0.0/kortforsyningen_ortoforaar/EPSG3857/{zoom}/{x}/{y}.jpeg",zoomExtent:[0,21],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_url:"https://download.kortforsyningen.dk/content/vilkaar-og-betingelser",terms_text:"Geodatastyrelsen og Danske Kommuner",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Cadastral_Parcels_INSPIRE_View",name:"SDFE Cadastral Parcels INSPIRE View",type:"wms",template:"https://kortforsyningen.kms.dk/cp_inspire?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=CP.CadastralParcel&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_DTK_Kort25",name:"SDFE DTK Kort25",type:"wms",template:"https://kortforsyningen.kms.dk/topo25?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=topo25_klassisk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Skaermkort",name:"SDFE Skærmkort",type:"wms",template:"https://kortforsyningen.kms.dk/topo_skaermkort?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=dtk_skaermkort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Overflade_Skyggekort_40cm",name:"SDFE Surface Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_overflade_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Terraen_Skyggekort_40cm",name:"SDFE Terrain Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_terraen_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Sicily-ATA2007",name:"Sicily - Italy",type:"wms",template:"http://map.sitr.regione.sicilia.it/ArcGIS/services/WGS84_F33/Ortofoto_ATA20072008_f33/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=0&STYLES=default&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[15.71165,38.25894],[15.23718,38.81938],[14.27124,38.55246],[13.15063,38.75408],[11.96411,37.97451],[12.52441,37.54022],[11.87897,36.79609],[12.49695,35.47409],[12.68921,35.46962],[14.57336,36.66401],[15.29709,36.62875],[15.39854,37.42171],[15.71165,38.25894]]]},{id:"Siemianowice_Slaskie-buildings",name:"Siemianowice Śląskie: Buildings",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,drogi,adresy,ulice&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"Siemianowice_Slaskie-aerial_image",name:"Siemianowice Śląskie: Orthophotomap (aerial image)",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"sc2012",name:"SIG Santa Catarina OrtoRGB 2012",type:"wms",template:"http://sigsc.sc.gov.br/sigserver/SIGSC/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OrtoRGB-Landsat-2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[-48.62488,-26.91624],[-48.62416,-26.83409],[-48.56163,-26.83412],[-48.56165,-26.74919],[-48.62675,-26.74918],[-48.62715,-26.73276],[-48.64126,-26.733],[-48.64174,-26.70912],[-48.62414,-26.70913],[-48.62418,-26.50079],[-48.57099,-26.50077],[-48.57155,-26.47415],[-48.55418,-26.47381],[-48.5545,-26.45736],[-48.56155,-26.45747],[-48.56161,-26.41746],[-48.4991,-26.41747],[-48.49909,-26.25081],[-48.43664,-26.25079],[-48.43661,-26.20752],[-48.4601,-26.20751],[-48.46195,-26.1242],[-48.56161,-26.12419],[-48.56163,-25.95753],[-48.62411,-25.95753],[-48.62411,-25.94507],[-48.68838,-25.94607],[-48.6884,-25.95752],[-49.25089,-25.95752],[-49.2509,-25.9992],[-49.31339,-25.9992],[-49.31338,-26.0825],[-49.37591,-26.0825],[-49.37591,-26.12419],[-49.50093,-26.12418],[-49.50092,-26.16586],[-49.68661,-26.16585],[-49.68661,-26.12417],[-49.74907,-26.08246],[-49.74908,-26.04084],[-49.8116,-26.04085],[-49.81159,-25.99918],[-49.93657,-25.99915],[-49.93661,-25.98244],[-50.00091,-25.98288],[-50.00094,-25.99915],[-50.31338,-25.99916],[-50.31342,-26.04083],[-50.37411,-26.04084],[-50.3741,-25.9992],[-50.49914,-25.99918],[-50.49911,-25.98414],[-50.62593,-25.98452],[-50.62595,-26.04084],[-50.6884,-26.04161],[-50.68845,-26.12416],[-50.75094,-26.12414],[-50.75095,-26.20752],[-51.12595,-26.20747],[-51.12595,-26.24913],[-51.18848,-26.24918],[-51.31344,-26.33245],[-51.31347,-26.62414],[-51.4366,-26.62415],[-51.43659,-26.56476],[-51.62409,-26.5641],[-51.62411,-26.5408],[-51.99907,-26.5408],[-52.06158,-26.49911],[-52.06158,-26.45747],[-52.12408,-26.45749],[-52.12406,-26.41579],[-52.37407,-26.4158],[-52.37409,-26.39133],[-52.56156,-26.3894],[-52.56158,-26.37415],[-52.62408,-26.37417],[-52.62409,-26.33247],[-53.12408,-26.33247],[-53.1241,-26.31707],[-53.1618,-26.3165],[-53.16136,-26.29082],[-53.18656,-26.29083],[-53.24907,-26.24911],[-53.24906,-26.23919],[-53.31159,-26.23824],[-53.3741,-26.22882],[-53.43845,-26.22777],[-53.43843,-26.24914],[-53.5616,-26.24916],[-53.56159,-26.23983],[-53.65501,-26.23814],[-53.65623,-26.29263],[-53.67011,-26.31684],[-53.68846,-26.33242],[-53.70322,-26.3741],[-53.70929,-26.38449],[-53.7098,-26.39568],[-53.70619,-26.40722],[-53.70721,-26.45927],[-53.71438,-26.46168],[-53.71476,-26.48118],[-53.73047,-26.49913],[-53.73146,-26.54081],[-53.75096,-26.5408],[-53.75095,-26.62417],[-53.7602,-26.62414],[-53.76125,-26.6675],[-53.75098,-26.66751],[-53.75096,-26.74298],[-53.72737,-26.7434],[-53.72133,-26.74905],[-53.72141,-26.75093],[-53.74571,-26.75943],[-53.74612,-26.77704],[-53.71948,-26.77755],[-53.72084,-26.83416],[-53.70047,-26.83414],[-53.70277,-26.93108],[-53.71168,-26.93091],[-53.71224,-26.95557],[-53.751,-26.95479],[-53.75092,-26.99915],[-53.76467,-26.99915],[-53.8037,-27.03751],[-53.80454,-27.07258],[-53.80809,-27.07249],[-53.80862,-27.09613],[-53.8269,-27.09577],[-53.82762,-27.12414],[-53.84644,-27.12413],[-53.84765,-27.17014],[-53.83506,-27.18932],[-53.83536,-27.20054],[-53.68847,-27.20284],[-53.68849,-27.22789],[-53.43654,-27.23246],[-53.43655,-27.16751],[-53.37598,-27.16751],[-53.37601,-27.23352],[-53.24905,-27.23564],[-53.24905,-27.20922],[-53.06344,-27.20918],[-53.06345,-27.2334],[-52.81348,-27.23685],[-52.81346,-27.27653],[-52.75096,-27.27732],[-52.75096,-27.29249],[-52.4385,-27.29252],[-52.43848,-27.32689],[-52.37603,-27.32753],[-52.37599,-27.3342],[-52.25098,-27.33418],[-52.25099,-27.34669],[-52.18655,-27.34728],[-52.18657,-27.33419],[-52.12598,-27.3342],[-52.12599,-27.36413],[-52.02979,-27.36489],[-52.03036,-27.42442],[-51.97534,-27.42479],[-51.97603,-27.50088],[-51.93845,-27.50085],[-51.93845,-27.54252],[-51.68846,-27.54247],[-51.68847,-27.55742],[-51.59903,-27.5579],[-51.59923,-27.59481],[-51.56351,-27.59498],[-51.56348,-27.62586],[-51.50088,-27.62586],[-51.50095,-27.66754],[-51.43937,-27.6675],[-51.43954,-27.70932],[-51.37597,-27.7095],[-51.37601,-27.75089],[-51.31349,-27.7509],[-51.31346,-27.79253],[-51.18847,-27.79251],[-51.18848,-27.87586],[-51.12598,-27.87586],[-51.12597,-27.91752],[-51.06348,-27.9175],[-51.06347,-27.95919],[-51.00095,-28.00086],[-50.9385,-28.00086],[-50.93849,-28.16755],[-50.81346,-28.16752],[-50.81345,-28.29253],[-50.75096,-28.29251],[-50.68845,-28.33418],[-50.68849,-28.41754],[-50.626,-28.41752],[-50.56352,-28.44094],[-50.43848,-28.44051],[-50.43847,-28.45917],[-50.37597,-28.45921],[-50.37598,-28.47554],[-50.18844,-28.47454],[-50.18849,-28.51143],[-50.12398,-28.51104],[-50.12402,-28.50086],[-49.87597,-28.50085],[-49.87601,-28.5142],[-49.81347,-28.51369],[-49.81347,-28.58255],[-49.83003,-28.58251],[-49.82951,-28.62597],[-49.8759,-28.66572],[-50.001,-28.74915],[-50.001,-29.04083],[-50.03319,-29.04081],[-50.03219,-29.14711],[-50.12602,-29.14774],[-50.12598,-29.16579],[-50.13613,-29.16581],[-50.1885,-29.19623],[-50.1885,-29.31905],[-50.1422,-29.31873],[-50.14208,-29.33422],[-50.126,-29.33418],[-50.12599,-29.36238],[-49.99906,-29.36153],[-49.99904,-29.24031],[-49.93848,-29.23986],[-49.93851,-29.25087],[-49.87601,-29.25087],[-49.876,-29.30098],[-49.82262,-29.30052],[-49.82227,-29.33419],[-49.81347,-29.33422],[-49.81354,-29.3411],[-49.68654,-29.33991],[-49.68651,-29.29255],[-49.62399,-29.29252],[-49.62398,-29.25085],[-49.56149,-29.25083],[-49.56145,-29.16749],[-49.49901,-29.16746],[-49.49902,-29.08419],[-49.4365,-29.08418],[-49.43651,-29.04251],[-49.37405,-29.04248],[-49.37402,-28.9592],[-49.31153,-28.95917],[-49.31152,-28.91749],[-49.24898,-28.9175],[-49.24897,-28.87582],[-49.18655,-28.87585],[-49.18653,-28.83414],[-49.12402,-28.83418],[-49.12401,-28.7925],[-49.06149,-28.79247],[-49.06146,-28.75084],[-48.99903,-28.75085],[-48.99903,-28.70919],[-48.93658,-28.70918],[-48.93658,-28.66752],[-48.87405,-28.66751],[-48.87404,-28.62585],[-48.74912,-28.62585],[-48.74912,-28.54254],[-48.68656,-28.54253],[-48.68658,-28.33417],[-48.62408,-28.33416],[-48.62406,-28.08418],[-48.5616,-28.08418],[-48.56159,-27.95919],[-48.49905,-27.95916],[-48.49904,-27.91581],[-48.56157,-27.9158],[-48.5616,-27.87584],[-48.49902,-27.87586],[-48.49902,-27.83422],[-48.43657,-27.83418],[-48.43661,-27.62583],[-48.37406,-27.62585],[-48.37405,-27.50086],[-48.31157,-27.50086],[-48.31153,-27.24913],[-48.43657,-27.24913],[-48.43654,-27.20916],[-48.37402,-27.2092],[-48.37405,-27.1658],[-48.43656,-27.1658],[-48.43656,-27.12415],[-48.49906,-27.12413],[-48.49907,-27.08667],[-48.50022,-27.08666],[-48.50031,-27.08247],[-48.5616,-27.08248],[-48.56159,-27.04252],[-48.49906,-27.04252],[-48.49906,-26.99913],[-48.56156,-26.99913],[-48.56157,-26.91579],[-48.62488,-26.91624]]],terms_url:"http://sigsc.sds.sc.gov.br/download/termo_sigsc.pdf",terms_text:"Sistema de Informações Geográficas - Governo de Santa Catarina"},{id:"SIGIP-2012",name:"SIGIP - Orthophoto 2012",type:"tms",template:"http://osmdata.asitvd.ch/tiles/sigip2012/{zoom}/{x}/{y}.png",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.71057,46.54396],[6.72968,46.54408],[6.72995,46.52605],[6.71085,46.52596],[6.71113,46.50796],[6.6922,46.50788],[6.6923,46.49883],[6.63531,46.49847],[6.63488,46.52547],[6.65381,46.52558],[6.65361,46.54358],[6.69163,46.54384],[6.69155,46.55284],[6.71047,46.55293],[6.71057,46.54396]]],terms_url:"https://www.sigip.ch/",terms_text:"SIGIP"},{id:"Slovakia-Historic-Maps",name:"Slovakia Historic Maps",type:"tms",template:"http://tms.freemap.sk/historicke/{zoom}/{x}/{y}.png",zoomExtent:[0,12],polygon:[[[16.81969,47.49272],[16.81969,49.50303],[22.83883,49.50303],[22.83883,47.49272],[16.81969,47.49272]]],icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"skoterleder",name:"Snowmobile map Sweden",type:"tms",template:"https://tiles.skoterleder.org/tiles/{zoom}/{x}/{y}.png",zoomExtent:[5,14],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[23.87328,65.21069],[30.14647,65.19226],[30.19042,67.62596],[29.43236,69.62651],[27.93822,70.14037],[20.73119,69.2756],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://skoterleder.org/",terms_text:"© Skoterleder.org",description:"Snowmobile trails",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Sweden_road_sign_D9.svg/200px-Sweden_road_sign_D9.svg.png"},{id:"Soskut_Pusztazamor_Tarnok_Diosd_orto_2017",name:"Sóskút, Pusztazámor, Tárnok, Diósd ortophoto 2017",type:"tms",template:"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/Soskut-Tarnok-Pusztazamor-Diosd/mercator/{zoom}/{x}/{y}.png",endDate:"2017-03-01T00:00:00.000Z",startDate:"2017-03-01T00:00:00.000Z",zoomExtent:[11,20],polygon:[[[18.79273,47.37079],[18.79194,47.37048],[18.79139,47.37063],[18.79011,47.37176],[18.78916,47.37345],[18.78722,47.37566],[18.78603,47.37765],[18.78498,47.37905],[18.7837,47.38032],[18.78267,47.38195],[18.7814,47.38368],[18.77934,47.38713],[18.77666,47.3894],[18.76472,47.3967],[18.7617,47.39966],[18.75631,47.40328],[18.75837,47.40653],[18.7588,47.40776],[18.762,47.41217],[18.76304,47.41315],[18.76593,47.41471],[18.77041,47.41766],[18.77247,47.41809],[18.77248,47.4203],[18.8086,47.44041],[18.81742,47.43539],[18.82092,47.43572],[18.82804,47.43755],[18.83021,47.43526],[18.83585,47.43754],[18.84049,47.43346],[18.84765,47.43572],[18.851,47.43281],[18.869,47.43961],[18.87361,47.43597],[18.87499,47.43342],[18.87386,47.43248],[18.87604,47.42797],[18.8605,47.423],[18.86621,47.41798],[18.87243,47.41086],[18.8663,47.40773],[18.86964,47.40471],[18.86777,47.40207],[18.86509,47.40052],[18.87081,47.39838],[18.86772,47.39699],[18.86992,47.39655],[18.87649,47.39478],[18.87749,47.39495],[18.87867,47.39462],[18.88358,47.38996],[18.88291,47.38967],[18.88539,47.3853],[18.87748,47.38339],[18.88181,47.37605],[18.87914,47.37393],[18.88638,47.36923],[18.88206,47.36773],[18.87973,47.36641],[18.8747,47.36252],[18.87282,47.36137],[18.87028,47.36063],[18.86688,47.35853],[18.86234,47.35637],[18.85567,47.35199],[18.84874,47.34728],[18.83192,47.33841],[18.82497,47.34258],[18.8162,47.34925],[18.81079,47.35357],[18.80823,47.356],[18.80645,47.35854],[18.80708,47.35902],[18.80635,47.36021],[18.80465,47.36175],[18.80381,47.36335],[18.80055,47.36545],[18.79988,47.36617],[18.79416,47.36975],[18.79273,47.37079]],[[18.91871,47.40938],[18.91826,47.40998],[18.92067,47.41156],[18.9251,47.41372],[18.93473,47.41917],[18.94063,47.42241],[18.94982,47.41938],[18.95155,47.4175],[18.9569,47.41923],[18.9577,47.41878],[18.95755,47.41435],[18.96211,47.40507],[18.96266,47.40118],[18.96316,47.39903],[18.95446,47.39673],[18.95276,47.39526],[18.95202,47.39362],[18.95119,47.39356],[18.94692,47.39799],[18.94411,47.39845],[18.94161,47.39869],[18.93735,47.39633],[18.93617,47.39683],[18.93122,47.4],[18.9312,47.40023],[18.92924,47.40205],[18.92561,47.40605],[18.92466,47.40635],[18.92293,47.40926],[18.91871,47.40938]]],terms_url:"http://fototerkep.hu",terms_text:"Fototerkep.hu",best:true,description:"5 cm resolution bald image of 4 settlement"},{id:"South_Africa-CD_NGI-Aerial",name:"South Africa CD:NGI Aerial",type:"tms",template:"http://{switch:a,b,c}.aerial.openstreetmap.org.za/ngi-aerial/{zoom}/{x}/{y}.jpg",zoomExtent:[1,22],polygon:[[[17.83968,-32.79834],[17.88935,-32.69728],[18.00364,-32.69822],[18.09917,-32.74853],[18.28987,-32.55266],[18.29302,-32.04871],[18.10545,-31.6455],[17.85293,-31.3444],[17.548,-30.90217],[17.40445,-30.63747],[17.24937,-30.39917],[16.9937,-29.65436],[16.7988,-29.19437],[16.54941,-28.84159],[16.44987,-28.69188],[16.4491,-28.55158],[16.60026,-28.48257],[16.75141,-28.4487],[16.74622,-28.2459],[16.88551,-28.04729],[16.99295,-28.0244],[17.05297,-28.02571],[17.10076,-28.03388],[17.20115,-28.09305],[17.20263,-28.23284],[17.24746,-28.23382],[17.2508,-28.19889],[17.35119,-28.19759],[17.35156,-28.24427],[17.40158,-28.24524],[17.41491,-28.34898],[17.40083,-28.548],[17.4527,-28.54897],[17.45121,-28.64951],[17.49836,-28.68721],[17.60282,-28.683],[17.64997,-28.69679],[17.65259,-28.73815],[17.80139,-28.73815],[17.99943,-28.75606],[18.00027,-28.79562],[18.15745,-28.87181],[18.50638,-28.87181],[18.61536,-28.82959],[18.90875,-28.82775],[19.1047,-28.94885],[19.19691,-28.93785],[19.24301,-28.85162],[19.23149,-28.80296],[19.25873,-28.70099],[19.44315,-28.69732],[19.55003,-28.49583],[19.69673,-28.49399],[19.69882,-28.44794],[19.85076,-28.44333],[19.84971,-28.40278],[19.99536,-28.39909],[19.98937,-24.74979],[20.29167,-24.91923],[20.47246,-25.15017],[20.65324,-25.45294],[20.73326,-25.6802],[20.8281,-25.89635],[20.84292,-26.21585],[20.65028,-26.48409],[20.65324,-26.82049],[21.08891,-26.84693],[21.67277,-26.839],[21.7765,-26.66963],[21.97211,-26.64314],[22.28034,-26.32747],[22.57078,-26.1334],[22.77528,-25.67752],[23.00052,-25.27619],[23.46583,-25.27351],[23.88372,-25.59737],[24.2364,-25.6134],[24.60391,-25.78966],[25.1107,-25.73894],[25.50784,-25.68554],[25.64418,-25.48238],[25.84193,-24.78054],[25.84664,-24.75385],[26.39285,-24.63329],[26.47391,-24.56533],[26.509,-24.48424],[26.58619,-24.40758],[26.73006,-24.30145],[26.85674,-24.24995],[26.85744,-24.10269],[26.92155,-23.8991],[26.93183,-23.84619],[26.97148,-23.69943],[27.00061,-23.63676],[27.0578,-23.60526],[27.13605,-23.52034],[27.33396,-23.39738],[27.51441,-23.35939],[27.59581,-23.20855],[27.80986,-23.0995],[27.88285,-23.06205],[27.93829,-22.94965],[28.04076,-22.82551],[28.20568,-22.65529],[28.33972,-22.56394],[28.49061,-22.5607],[28.61088,-22.54002],[28.82818,-22.45502],[28.92853,-22.42323],[28.95941,-22.30901],[29.01626,-22.20834],[29.23241,-22.16935],[29.35312,-22.18429],[29.6549,-22.11864],[29.77771,-22.1362],[29.9293,-22.18494],[30.11668,-22.28303],[30.25634,-22.29148],[30.30336,-22.33952],[30.50618,-22.30576],[30.83743,-22.28498],[31.00586,-22.30771],[31.18342,-22.32329],[31.29306,-22.36746],[31.56806,-23.19034],[31.55683,-23.44308],[31.69311,-23.61752],[31.71197,-23.74114],[31.77747,-23.88006],[31.88863,-23.94811],[31.91444,-24.17467],[31.99483,-24.30409],[32.01667,-24.4406],[32.00773,-24.65366],[32.01964,-24.91407],[32.03552,-25.08498],[32.01964,-25.38214],[31.99285,-25.44938],[31.99979,-25.51657],[32.00575,-25.6079],[32.00575,-25.66248],[31.93627,-25.84037],[31.98094,-25.95465],[31.86878,-26.00373],[31.41621,-25.72777],[31.32291,-25.74386],[31.25046,-25.82965],[31.1393,-25.91627],[31.11647,-25.99124],[30.96561,-26.26658],[30.89217,-26.32797],[30.85346,-26.40356],[30.82269,-26.44888],[30.80226,-26.52407],[30.80384,-26.80821],[30.90209,-26.78075],[30.91003,-26.84895],[30.98249,-26.90826],[30.97653,-27.00292],[31.00344,-27.04416],[31.15433,-27.19804],[31.50156,-27.31112],[31.97002,-27.31112],[31.97002,-27.12047],[31.97697,-27.05066],[32.00025,-26.79839],[32.10698,-26.79846],[32.31145,-26.84795],[32.89999,-26.85161],[32.88609,-26.9817],[32.70943,-27.47854],[32.62407,-27.77751],[32.5814,-28.07479],[32.53872,-28.2288],[32.42756,-28.50216],[32.36404,-28.59457],[32.07026,-28.84698],[31.98788,-28.90695],[31.77648,-28.96949],[31.46385,-29.28593],[31.35963,-29.38543],[31.16808,-29.63074],[31.06486,-29.78935],[31.05345,-29.84705],[31.06699,-29.86403],[31.04555,-29.9502],[30.95186,-30.00339],[30.86518,-30.10241],[30.72447,-30.3925],[30.35563,-30.93089],[30.09724,-31.24583],[29.86731,-31.43043],[29.74094,-31.50147],[29.48131,-31.69787],[28.89432,-32.28989],[28.54971,-32.58946],[28.14365,-32.83207],[28.07487,-32.94169],[27.84509,-33.08287],[27.3758,-33.38607],[26.88054,-33.6459],[26.59169,-33.74808],[26.45273,-33.79358],[26.20675,-33.75489],[26.00779,-33.7224],[25.80555,-33.75243],[25.75111,-33.80065],[25.65291,-33.85436],[25.65291,-33.94698],[25.71958,-34.00401],[25.72028,-34.05112],[25.55089,-34.06315],[25.35046,-34.05026],[25.28106,-34.00203],[25.04763,-33.99946],[24.95472,-34.00436],[24.94966,-34.10104],[24.87704,-34.15065],[24.87629,-34.20053],[24.85326,-34.21896],[24.76453,-34.20179],[24.50014,-34.20033],[24.34867,-34.11638],[24.19888,-34.1019],[23.99634,-34.05144],[23.80175,-34.05243],[23.74936,-34.01119],[23.49735,-34.00901],[23.41552,-34.04346],[23.41543,-34.11404],[22.90009,-34.0993],[22.84124,-34.05479],[22.64703,-34.05026],[22.64598,-34.00728],[22.57002,-34.00641],[22.50505,-34.06459],[22.252,-34.06459],[22.22213,-34.10147],[22.16212,-34.1057],[22.17124,-34.15218],[22.15769,-34.21809],[22.00156,-34.21722],[21.9497,-34.322],[21.86115,-34.40071],[21.56147,-34.40201],[21.5468,-34.36612],[21.50174,-34.36699],[21.5007,-34.40201],[21.41949,-34.44652],[21.19787,-34.44782],[21.09882,-34.39913],[21.00337,-34.37539],[20.89319,-34.39971],[20.89766,-34.4854],[20.74468,-34.48281],[20.5042,-34.48626],[20.25272,-34.70148],[20.08035,-34.83619],[19.99233,-34.83791],[19.89907,-34.82758],[19.89383,-34.7936],[19.5973,-34.79618],[19.39297,-34.64202],[19.28771,-34.64048],[19.28614,-34.59866],[19.34744,-34.52445],[19.32853,-34.45344],[19.098,-34.44998],[19.07256,-34.38024],[19.00235,-34.35256],[18.95206,-34.39494],[18.7975,-34.39364],[18.79842,-34.10164],[18.50175,-34.10153],[18.49995,-34.36169],[18.44773,-34.362],[18.44799,-34.35227],[18.39744,-34.3514],[18.39717,-34.3023],[18.35657,-34.30056],[18.34793,-34.20204],[18.29721,-34.19503],[18.29511,-33.99371],[18.33745,-33.99141],[18.34766,-33.84924],[18.34793,-33.78155],[18.41247,-33.74488],[18.36155,-33.65016],[18.2992,-33.58559],[18.21668,-33.44887],[18.13899,-33.39741],[17.94735,-33.16026],[17.88552,-33.05757],[17.84859,-32.96685],[17.83968,-32.85073],[17.83968,-32.79834]]],best:true},{id:"South-Tyrol-Orthofoto2011",name:"South Tyrol Orthofoto 2011",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2011_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{id:"South-Tyrol-Orthofoto2011-20cm",name:"South Tyrol Orthofoto 2011 (highres)",type:"wms",template:"https://geoservices.buergernetz.bz.it/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=P_BZ_OF_2011_EPSG3857,P_BZ_OF_2011_20cm_EPSG3857&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0",description:"Orthophoto of South Tyrol from 2011 with up to 20cm resolution (larger valleys)"},{id:"South-Tyrol-Orthofoto2014",name:"South Tyrol Orthofoto 2014",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[11.71495,46.51227],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.61936,46.43957],[11.62508,46.43957],[11.62508,46.44797],[11.63349,46.44587],[11.63769,46.45846],[11.64399,46.45846],[11.6608,46.44587],[11.66711,46.44587],[11.66711,46.47525],[11.69442,46.47735],[11.69652,46.48575],[11.70913,46.49624],[11.70913,46.50254],[11.71333,46.50254],[11.71495,46.51227]],[[11.61435,46.41535],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20644,46.4156],[11.20485,46.3997],[11.17754,46.3997],[11.17543,46.3871],[11.16703,46.38081],[11.16703,46.36821],[11.16283,46.36821],[11.16283,46.29895],[11.12501,46.29895],[11.12291,46.25488],[11.13131,46.25278],[11.12711,46.24858],[11.16283,46.24858],[11.16283,46.215],[11.24898,46.2129],[11.25108,46.2234],[11.2889,46.2234],[11.2889,46.24019],[11.3015,46.25278],[11.30991,46.25278],[11.31201,46.24858],[11.33722,46.25068],[11.34143,46.26747],[11.34563,46.26747],[11.34773,46.25698],[11.35613,46.24858],[11.41707,46.25278],[11.41917,46.32414],[11.49271,46.32204],[11.48851,46.33044],[11.49901,46.32834],[11.50111,46.34723],[11.52423,46.34723],[11.53894,46.34513],[11.53894,46.32834],[11.55995,46.32414],[11.58306,46.34932],[11.58306,46.37241],[11.60407,46.37241],[11.60617,46.38291],[11.61458,46.38291],[11.62508,46.3934],[11.62508,46.41229],[11.61435,46.41535]],[[11.20663,46.41745],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.96285,46.47718],[10.96952,46.45217],[10.98423,46.45217],[10.98843,46.44587],[10.99894,46.44587],[11.01154,46.42068],[11.04096,46.42068],[11.08088,46.43537],[11.08298,46.47525],[11.15232,46.47525],[11.18804,46.48365],[11.19014,46.47525],[11.20695,46.47315],[11.20485,46.44587],[11.19855,46.44167],[11.19435,46.42698],[11.19014,46.42698],[11.19014,46.42068],[11.20695,46.42068],[11.20663,46.41745]],[[10.47433,46.55501],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.46952,46.62628],[10.47785,46.61797],[10.47785,46.59069],[10.47365,46.59069],[10.47155,46.5676],[10.46314,46.55501],[10.47433,46.55501]],[[10.46925,46.62643],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43626,46.79843],[10.43373,46.81106],[10.42532,46.80686],[10.42532,46.79847],[10.42112,46.79847],[10.41692,46.78587],[10.41692,46.75229],[10.3938,46.7376],[10.3896,46.72081],[10.3854,46.72081],[10.3791,46.69353],[10.3791,46.66834],[10.3833,46.66414],[10.3812,46.64735],[10.3896,46.64525],[10.3938,46.63056],[10.42532,46.62846],[10.44843,46.63476],[10.46925,46.62643]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog/",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{id:"South-Tyrol-Orthofoto-2014-2015",name:"South Tyrol Orthofoto 2014/2015",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_OF_2014_2015_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2015-11-01T00:00:00.000Z",startDate:"2014-07-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 4.0",best:true},{id:"South-Tyrol-Topomap",name:"South Tyrol Topomap",type:"tms",template:"https://geoservices.buergernetz.bz.it/geoserver/gwc/service/wmts/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=P_BZ_BASEMAP_TOPO&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",zoomExtent:[0,20],polygon:[[[10.38615,46.68821],[10.39201,46.69016],[10.40215,46.70624],[10.41274,46.70821],[10.41622,46.71479],[10.4168,46.71847],[10.39934,46.73435],[10.43464,46.75356],[10.44107,46.75413],[10.44011,46.77149],[10.42123,46.78861],[10.42845,46.79755],[10.43851,46.79869],[10.44925,46.80462],[10.45602,46.81635],[10.45438,46.82221],[10.4583,46.82478],[10.45513,46.83059],[10.45906,46.83548],[10.46483,46.83624],[10.46229,46.8413],[10.46987,46.84933],[10.46819,46.8553],[10.47838,46.86013],[10.48372,46.85543],[10.49628,46.85305],[10.49931,46.84857],[10.52124,46.84653],[10.5527,46.8511],[10.55795,46.84695],[10.55264,46.8408],[10.55536,46.84087],[10.58883,46.85125],[10.59502,46.85829],[10.60936,46.8597],[10.62441,46.86558],[10.64858,46.86655],[10.66787,46.87651],[10.67297,46.87138],[10.69112,46.86861],[10.69786,46.86339],[10.69508,46.85308],[10.70594,46.84786],[10.71763,46.84795],[10.72333,46.83892],[10.75621,46.83383],[10.76481,46.82409],[10.76387,46.81971],[10.75239,46.81387],[10.74506,46.80223],[10.7276,46.79709],[10.73122,46.78925],[10.75722,46.78624],[10.77744,46.79149],[10.78678,46.79735],[10.81439,46.77662],[10.82479,46.77472],[10.83129,46.78138],[10.84112,46.78282],[10.85354,46.77506],[10.86845,46.77313],[10.86993,46.7669],[10.88294,46.76393],[10.88962,46.76529],[10.8951,46.77092],[10.90527,46.76911],[10.92299,46.7764],[10.92821,46.77408],[10.94388,46.77648],[10.97522,46.77361],[10.97932,46.77014],[10.99475,46.76804],[11.01397,46.77317],[11.02328,46.76715],[11.0346,46.79428],[11.04234,46.801],[11.03792,46.80562],[11.05633,46.80928],[11.07279,46.82092],[11.08171,46.82252],[11.0762,46.83384],[11.06887,46.83793],[11.07303,46.84345],[11.06988,46.85348],[11.08742,46.87927],[11.09961,46.88922],[11.09538,46.89178],[11.09795,46.89844],[11.0946,46.91247],[11.10792,46.91706],[11.10804,46.92632],[11.11418,46.93234],[11.13851,46.92865],[11.16322,46.94091],[11.16642,46.94479],[11.16114,46.94979],[11.1637,46.96677],[11.17598,46.96367],[11.18658,46.97062],[11.19527,46.97152],[11.20418,46.96877],[11.20688,46.96403],[11.22047,46.97025],[11.24139,46.9708],[11.24865,46.97517],[11.25582,46.97535],[11.26272,46.98169],[11.27662,46.98168],[11.28762,46.98699],[11.30709,46.98525],[11.3205,46.99345],[11.33765,46.98606],[11.34516,46.99169],[11.35932,46.99154],[11.37697,46.98025],[11.38324,46.97168],[11.40465,46.96609],[11.43929,46.97601],[11.45134,46.99294],[11.46803,46.99582],[11.46859,47.003],[11.47831,47.01201],[11.50238,47.01073],[11.50313,47.00808],[11.51366,47.00595],[11.51679,47.00091],[11.53381,46.99233],[11.53846,46.98519],[11.55297,46.99149],[11.57663,46.99657],[11.58,47.00277],[11.58879,47.00641],[11.59901,47.00657],[11.60944,47.01207],[11.62697,47.01437],[11.63629,47.00383],[11.66542,46.99304],[11.6885,46.99658],[11.71226,46.99416],[11.72897,46.97322],[11.74698,46.97013],[11.76411,46.97412],[11.78106,46.99342],[11.81526,46.991],[11.83564,46.99417],[11.84396,47.0025],[11.85192,47.0014],[11.86722,47.01252],[11.87393,47.01136],[11.8794,47.01714],[11.89137,47.01728],[11.91627,47.03422],[11.9329,47.03864],[11.94688,47.03464],[11.95457,47.04374],[11.96773,47.04158],[11.97912,47.0511],[11.98587,47.04815],[11.99534,47.05064],[12.02037,47.04821],[12.02968,47.05127],[12.03353,47.0583],[12.04276,47.06228],[12.07543,47.0605],[12.08035,47.06951],[12.09308,47.07791],[12.10329,47.07931],[12.11867,47.07445],[12.13561,47.08171],[12.15125,47.08049],[12.15997,47.08267],[12.18589,47.09322],[12.2278,47.08302],[12.24228,47.06892],[12.23786,47.0644],[12.21821,47.05795],[12.2182,47.04483],[12.20552,47.02595],[12.18048,47.02414],[12.16423,47.01782],[12.14786,47.02357],[12.12723,47.01218],[12.12285,47.00662],[12.1322,46.99339],[12.12974,46.98593],[12.13977,46.982],[12.13808,46.96514],[12.13328,46.96292],[12.13882,46.95764],[12.15927,46.95133],[12.1702,46.93758],[12.15414,46.91654],[12.14675,46.91413],[12.16205,46.908],[12.16959,46.91121],[12.19154,46.90682],[12.20106,46.8965],[12.2022,46.88806],[12.21663,46.87517],[12.22147,46.88084],[12.23125,46.88146],[12.2345,46.88919],[12.24162,46.89192],[12.27486,46.88512],[12.27979,46.87921],[12.27736,46.87319],[12.29326,46.86566],[12.2912,46.85704],[12.29733,46.84455],[12.30833,46.84137],[12.30726,46.83271],[12.285,46.81503],[12.29383,46.8027],[12.28905,46.79948],[12.28889,46.79427],[12.28232,46.79153],[12.28539,46.7839],[12.30943,46.78603],[12.35837,46.77583],[12.37036,46.74163],[12.38475,46.71745],[12.40283,46.70811],[12.41103,46.70701],[12.41522,46.70163],[12.42862,46.6997],[12.42943,46.69567],[12.44268,46.68979],[12.47501,46.68756],[12.4795,46.67969],[12.43473,46.66714],[12.40648,46.64167],[12.38115,46.64183],[12.37944,46.63733],[12.3915,46.62765],[12.38577,46.62154],[12.35939,46.61829],[12.34465,46.62376],[12.34034,46.63022],[12.33578,46.62732],[12.3172,46.62876],[12.31785,46.62355],[12.30802,46.61811],[12.28413,46.61623],[12.26982,46.62003],[12.25931,46.62809],[12.24502,46.62326],[12.24198,46.61586],[12.21241,46.60918],[12.20444,46.59836],[12.19228,46.59321],[12.19261,46.62059],[12.1818,46.6192],[12.17117,46.63275],[12.16062,46.63574],[12.1511,46.63215],[12.1436,46.6327],[12.13739,46.64122],[12.12342,46.64475],[12.10949,46.65204],[12.10609,46.65783],[12.09345,46.66123],[12.08826,46.66638],[12.07985,46.66686],[12.07038,46.67386],[12.07173,46.66064],[12.06686,46.65364],[12.07479,46.64329],[12.06837,46.63997],[12.06495,46.62121],[12.05448,46.61778],[12.05318,46.60989],[12.04613,46.60716],[12.05043,46.60016],[12.04763,46.58357],[12.03665,46.57668],[12.0266,46.55871],[12.02189,46.55791],[11.99941,46.53208],[11.99411,46.53345],[11.98704,46.54417],[11.96633,46.54363],[11.95094,46.53869],[11.94719,46.52879],[11.94147,46.52689],[11.93294,46.52631],[11.9121,46.532],[11.8904,46.52175],[11.85192,46.51682],[11.82849,46.50783],[11.82334,46.51315],[11.82391,46.52141],[11.81086,46.53146],[11.79385,46.52023],[11.79189,46.51322],[11.76157,46.50503],[11.74317,46.50391],[11.73202,46.50877],[11.71935,46.50916],[11.71524,46.51245],[11.69889,46.50218],[11.6672,46.49647],[11.64515,46.49743],[11.63849,46.50051],[11.63495,46.49486],[11.64297,46.49346],[11.65174,46.48271],[11.64536,46.47189],[11.64179,46.47439],[11.62679,46.4708],[11.62987,46.46377],[11.61882,46.44325],[11.62143,46.42539],[11.60161,46.39731],[11.60307,46.38924],[11.5932,46.38265],[11.56489,46.38018],[11.55878,46.35076],[11.55249,46.34418],[11.54423,46.34483],[11.53837,46.35015],[11.52445,46.35502],[11.47969,46.36277],[11.48052,46.3551],[11.46322,46.34922],[11.45556,46.33396],[11.42105,46.32441],[11.40517,46.32387],[11.39865,46.31426],[11.39994,46.30709],[11.39569,46.3083],[11.38188,46.30052],[11.36088,46.29906],[11.36078,46.29682],[11.38256,46.29177],[11.3871,46.28143],[11.39609,46.27423],[11.39862,46.264],[11.38756,46.26029],[11.37347,46.2629],[11.36836,46.26135],[11.35783,46.26481],[11.35495,46.27564],[11.33912,46.28306],[11.33379,46.29049],[11.33471,46.2962],[11.3129,46.28256],[11.31737,46.27303],[11.30645,46.25786],[11.29124,46.2604],[11.24743,46.22933],[11.20622,46.2187],[11.18267,46.22496],[11.17077,46.23806],[11.17994,46.24434],[11.18351,46.25269],[11.18935,46.25354],[11.19448,46.2461],[11.20029,46.25566],[11.16604,46.26129],[11.14885,46.27904],[11.13725,46.28336],[11.14293,46.28934],[11.15847,46.29059],[11.16439,46.2986],[11.1761,46.30346],[11.1847,46.32104],[11.18894,46.32151],[11.18696,46.32673],[11.1942,46.33016],[11.20204,46.34212],[11.19001,46.35984],[11.19263,46.36578],[11.20393,46.36765],[11.19792,46.37232],[11.21275,46.39804],[11.21345,46.40675],[11.20565,46.4166],[11.21026,46.4206],[11.20347,46.42682],[11.21416,46.43556],[11.21634,46.44255],[11.20903,46.45293],[11.21419,46.45807],[11.21736,46.45731],[11.21886,46.46199],[11.21626,46.47277],[11.20939,46.481],[11.20876,46.49346],[11.19608,46.50241],[11.1924,46.501],[11.18686,46.50734],[11.18002,46.49823],[11.17014,46.49635],[11.16095,46.4878],[11.12934,46.48058],[11.1103,46.49643],[11.10449,46.4948],[11.08812,46.50128],[11.08173,46.53021],[11.05915,46.51508],[11.03795,46.51357],[11.05006,46.50784],[11.05773,46.49235],[11.06278,46.4894],[11.06894,46.46619],[11.07625,46.45487],[11.0778,46.44569],[11.07301,46.44042],[11.05394,46.44849],[11.0414,46.44569],[11.02817,46.46116],[11.00952,46.46917],[11.00462,46.47607],[10.98695,46.48289],[10.96543,46.48103],[10.95791,46.46983],[10.93819,46.46578],[10.9325,46.45831],[10.93332,46.4528],[10.91305,46.44284],[10.89161,46.44366],[10.88324,46.44995],[10.88093,46.44579],[10.87162,46.4438],[10.86174,46.43509],[10.85113,46.43817],[10.80034,46.44185],[10.78906,46.45164],[10.77835,46.47112],[10.76934,46.47609],[10.76463,46.4848],[10.75906,46.48547],[10.74422,46.48333],[10.71753,46.46022],[10.69667,46.4573],[10.68293,46.44846],[10.66821,46.45122],[10.63303,46.44309],[10.61439,46.45098],[10.60128,46.46139],[10.59995,46.46766],[10.57672,46.47237],[10.55875,46.48187],[10.54986,46.49123],[10.53685,46.49062],[10.52657,46.49425],[10.49366,46.49719],[10.48141,46.49337],[10.45714,46.5096],[10.45124,46.53083],[10.45814,46.54215],[10.47056,46.54377],[10.46954,46.54856],[10.47617,46.55749],[10.47321,46.56701],[10.48305,46.5777],[10.48575,46.58921],[10.48221,46.59199],[10.48576,46.59805],[10.48291,46.60512],[10.49055,46.61394],[10.44632,46.63989],[10.40935,46.63389],[10.40011,46.63648],[10.39873,46.6455],[10.38946,46.65862],[10.39057,46.67089],[10.3803,46.68399],[10.38615,46.68821]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano",description:"Topographical basemap of South Tyrol"},{id:"SPW2009",name:"SPW(allonie) 2009-2010 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2009_2010/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2010-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2012",name:"SPW(allonie) 2012-2013 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2012_2013/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2015",name:"SPW(allonie) 2015 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2015/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2016",name:"SPW(allonie) 2016 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2016/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW_ORTHO_LAST",name:"SPW(allonie) most recent aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_LAST/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW_PICC",name:"SPW(allonie) PICC numerical imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/TOPOGRAPHIE/PICC_VDIFF/MapServer/WmsServer?SERVICE=WMS&VERSION=1.1.1&FORMAT=image/png8&TRANSPARENT=FALSE&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&LAYERS=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29",projection:"EPSG:3857",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPWrelief2014",name:"SPW(allonie) shaded relief",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/RELIEF/WALLONIE_MNT_2013_2014_HILLSHADE/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"ssb-sentrum",name:"SSB City Centres overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_193&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/arealsentrum/",terms_text:"© SSB",description:"Downtown areas with significant commercial and service activities.",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{id:"ssb-tettsteder",name:"SSB Urban Areas overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_198&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/beftett",terms_text:"© SSB",description:"Human settlements of at least 200 people with less than 200 meters between households",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{id:"Bern-bern2016-tms",name:"Stadt Bern 10cm (2016)",type:"tms",template:"https://mapproxy.osm.ch/tiles/bern2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[7.29431,46.92376],[7.29827,46.92747],[7.30616,46.93095],[7.30433,46.93623],[7.30686,46.94037],[7.32464,46.94328],[7.32845,46.94641],[7.34141,46.94608],[7.34385,46.94737],[7.34346,46.94879],[7.35136,46.94855],[7.35056,46.95021],[7.35309,46.95193],[7.3582,46.95118],[7.3685,46.95662],[7.37151,46.96073],[7.37503,46.95983],[7.37851,46.96147],[7.38062,46.96547],[7.38321,46.9663],[7.3938,46.96693],[7.40005,46.96918],[7.40829,46.96869],[7.42817,46.9738],[7.43271,46.97269],[7.43536,46.96843],[7.43785,46.96843],[7.44125,46.97679],[7.44569,46.97479],[7.44838,46.97564],[7.4477,46.97901],[7.44405,46.97807],[7.44127,46.97982],[7.45067,46.99015],[7.45221,46.98968],[7.45465,46.97782],[7.46804,46.97583],[7.47079,46.97],[7.47019,46.96741],[7.47816,46.97118],[7.48452,46.97016],[7.48613,46.9679],[7.48579,46.96468],[7.47847,46.9629],[7.48029,46.96068],[7.47893,46.95878],[7.47978,46.9566],[7.47701,46.95446],[7.48405,46.94999],[7.48339,46.9452],[7.49556,46.93962],[7.49351,46.93766],[7.4908,46.93876],[7.4895,46.93687],[7.47667,46.93695],[7.47811,46.93625],[7.4747,46.93392],[7.47535,46.93299],[7.4691,46.92924],[7.47077,46.9255],[7.45857,46.93484],[7.44764,46.93043],[7.43542,46.93497],[7.4338,46.93312],[7.43764,46.93074],[7.41469,46.93682],[7.41384,46.93157],[7.40708,46.93038],[7.40806,46.92563],[7.40213,46.9242],[7.40148,46.92119],[7.38757,46.93045],[7.38231,46.92728],[7.38002,46.92989],[7.38087,46.93241],[7.37487,46.93143],[7.37489,46.93271],[7.36807,46.93239],[7.36831,46.93043],[7.36041,46.92859],[7.36056,46.9272],[7.33878,46.92454],[7.33937,46.91967],[7.32746,46.91903],[7.32692,46.9236],[7.32437,46.92519],[7.30823,46.92229],[7.29431,46.92376]]],terms_text:"Orthophoto 2016, Vermessungsamt Stadt Bern",best:true},{id:"Bern-2012",name:"Stadt Bern 10cm/25cm (2012)",type:"tms",template:"https://mapproxy.osm.ch/tiles/bern2012/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[14,19],polygon:[[[7.3807,47.00952],[7.38073,47.02301],[7.43853,47.02303],[7.43865,47.01408],[7.45174,47.014],[7.45172,47.00503],[7.54111,47.005],[7.54111,46.99873],[7.54378,46.99871],[7.54375,46.98696],[7.55682,46.987],[7.55685,46.96003],[7.51744,46.96001],[7.51744,46.95108],[7.53051,46.95106],[7.53051,46.92407],[7.51741,46.92405],[7.51738,46.91505],[7.53042,46.91507],[7.53048,46.9061],[7.54358,46.90602],[7.54358,46.87905],[7.55659,46.87903],[7.55662,46.8611],[7.54349,46.86104],[7.5434,46.85212],[7.49095,46.85212],[7.49107,46.87907],[7.47794,46.87909],[7.47797,46.89707],[7.45168,46.89713],[7.45171,46.88808],[7.43855,46.88814],[7.43858,46.87015],[7.41233,46.87015],[7.41236,46.87907],[7.39917,46.87911],[7.3992,46.86108],[7.38613,46.86114],[7.3861,46.85218],[7.373,46.85216],[7.37303,46.86112],[7.34677,46.8611],[7.3468,46.88808],[7.25488,46.88796],[7.25485,46.90596],[7.24172,46.90592],[7.24169,46.91497],[7.22856,46.91493],[7.22833,46.96887],[7.24146,46.96891],[7.24149,46.98688],[7.26769,46.98694],[7.26777,46.99593],[7.28078,46.99595],[7.2809,47.0094],[7.3807,47.00952]]],terms_text:"Orthophoto 2012, Vermessungsamt Stadt Bern"},{id:"Uster-2008",name:"Stadt Uster Orthophoto 2008 10cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/uster/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.68,47.32],[8.74,47.32],[8.74,47.365],[8.68,47.365],[8.68,47.32]]],terms_text:"Stadt Uster Vermessung Orthophoto 2008"},{id:"Zuerich-zh_luftbild2011-tms",name:"Stadt Zürich Luftbild 2011",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_luftbild2011/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],terms_text:"Stadt Zürich Luftbild 2011"},{id:"Zuerich-city_map",name:"Stadtplan Zürich",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_stadtplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[0,21],polygon:[[[8.56681,47.34713],[8.56665,47.34706],[8.56563,47.34684],[8.56575,47.34666],[8.56509,47.34645],[8.54207,47.33502],[8.54073,47.33376],[8.5403,47.33396],[8.54019,47.33372],[8.54042,47.33358],[8.5388,47.33208],[8.53642,47.33076],[8.53622,47.33018],[8.53345,47.32992],[8.5318,47.3295],[8.53145,47.32846],[8.53102,47.32789],[8.52974,47.32777],[8.52969,47.32687],[8.52899,47.32698],[8.52813,47.32685],[8.52802,47.32635],[8.52755,47.32639],[8.52762,47.32616],[8.52579,47.32619],[8.52563,47.32575],[8.52426,47.32608],[8.5242,47.32486],[8.52372,47.32416],[8.52304,47.32433],[8.52193,47.32436],[8.52194,47.32394],[8.51932,47.32401],[8.51868,47.32386],[8.51768,47.3232],[8.51642,47.32308],[8.5156,47.32315],[8.51472,47.32272],[8.51295,47.3229],[8.51162,47.32222],[8.50957,47.32202],[8.5095,47.32165],[8.50788,47.32203],[8.50735,47.32173],[8.50529,47.32144],[8.50476,47.32121],[8.5043,47.32074],[8.50317,47.32022],[8.50241,47.32053],[8.50227,47.32082],[8.50152,47.32129],[8.50102,47.32198],[8.50095,47.32259],[8.5006,47.32278],[8.50078,47.3237],[8.50066,47.32451],[8.50098,47.32595],[8.5015,47.3265],[8.50159,47.32732],[8.50188,47.32765],[8.50132,47.32883],[8.5014,47.32903],[8.50069,47.32979],[8.50087,47.33053],[8.50063,47.3311],[8.50112,47.33183],[8.50075,47.33202],[8.50078,47.33224],[8.50106,47.3326],[8.50191,47.33303],[8.5022,47.33364],[8.50177,47.33412],[8.50152,47.33504],[8.50199,47.33666],[8.50161,47.33728],[8.49877,47.33968],[8.49808,47.34169],[8.49702,47.34247],[8.49709,47.34326],[8.49798,47.34365],[8.4981,47.34387],[8.49817,47.34453],[8.49773,47.34521],[8.49636,47.34648],[8.4951,47.34691],[8.49467,47.3476],[8.49285,47.34828],[8.49206,47.3495],[8.49145,47.34964],[8.49128,47.34983],[8.49089,47.35067],[8.49,47.35056],[8.48813,47.352],[8.48691,47.35203],[8.4868,47.3522],[8.48728,47.35311],[8.4871,47.3534],[8.48501,47.35469],[8.48463,47.35536],[8.48463,47.3567],[8.48426,47.35737],[8.48321,47.35814],[8.48272,47.35907],[8.48205,47.35954],[8.47879,47.36078],[8.47698,47.36029],[8.47365,47.36081],[8.47275,47.36079],[8.47169,47.36132],[8.47053,47.36166],[8.46951,47.36438],[8.4664,47.36574],[8.46583,47.3661],[8.46545,47.36664],[8.46485,47.36681],[8.46427,47.36728],[8.46418,47.36838],[8.4649,47.36897],[8.46482,47.36911],[8.46938,47.37136],[8.47042,47.3726],[8.47022,47.37395],[8.46868,47.37382],[8.46761,47.37357],[8.46544,47.37444],[8.46288,47.37603],[8.45995,47.3775],[8.45638,47.37801],[8.45116,47.37817],[8.45047,47.37836],[8.44847,47.37967],[8.44801,47.38025],[8.45174,47.38062],[8.45371,47.38027],[8.45614,47.38072],[8.45669,47.38094],[8.45673,47.38244],[8.45745,47.38222],[8.45843,47.38231],[8.45841,47.38263],[8.45745,47.38325],[8.45767,47.3834],[8.45756,47.38371],[8.45807,47.38388],[8.46004,47.38594],[8.46088,47.38704],[8.46121,47.38795],[8.46104,47.38803],[8.46381,47.39053],[8.46518,47.39132],[8.46556,47.39113],[8.46618,47.39113],[8.46727,47.39065],[8.46697,47.39131],[8.46739,47.3929],[8.4671,47.39334],[8.46607,47.39378],[8.4651,47.39453],[8.46484,47.39481],[8.46488,47.39508],[8.46535,47.39492],[8.46854,47.39461],[8.47018,47.39401],[8.47066,47.39439],[8.47191,47.39388],[8.47208,47.39408],[8.47152,47.3943],[8.47151,47.3949],[8.4721,47.39517],[8.47301,47.39506],[8.47349,47.396],[8.46516,47.39829],[8.46568,47.39922],[8.46759,47.39873],[8.46806,47.39957],[8.46615,47.40006],[8.4677,47.403],[8.4699,47.40298],[8.47551,47.40381],[8.47815,47.40387],[8.47819,47.40508],[8.47738,47.40517],[8.47705,47.40619],[8.47729,47.40914],[8.47703,47.40935],[8.47543,47.40971],[8.47583,47.41077],[8.47605,47.41072],[8.47628,47.41102],[8.47665,47.41097],[8.47725,47.41194],[8.47488,47.41241],[8.47394,47.41222],[8.47303,47.41146],[8.47268,47.41058],[8.47101,47.41094],[8.47113,47.41137],[8.47085,47.41167],[8.47044,47.41159],[8.47031,47.41253],[8.46876,47.41225],[8.46801,47.41334],[8.46863,47.41363],[8.46857,47.41408],[8.46955,47.41484],[8.47007,47.41557],[8.46913,47.41649],[8.46913,47.41693],[8.46962,47.41752],[8.47158,47.41763],[8.4772,47.41974],[8.47688,47.42016],[8.47783,47.42212],[8.47895,47.42172],[8.47937,47.42113],[8.47972,47.42141],[8.48131,47.42134],[8.48171,47.423],[8.48294,47.42266],[8.48292,47.42222],[8.48609,47.42155],[8.48658,47.42164],[8.48683,47.42186],[8.48796,47.42201],[8.48851,47.42271],[8.49019,47.42234],[8.491,47.4239],[8.49006,47.42435],[8.49007,47.42532],[8.49027,47.42536],[8.49017,47.42578],[8.48552,47.42712],[8.48481,47.42784],[8.48466,47.42873],[8.48437,47.42896],[8.48445,47.42979],[8.48579,47.43103],[8.49562,47.43281],[8.50027,47.43442],[8.50207,47.43467],[8.50364,47.43402],[8.50997,47.43213],[8.51155,47.43116],[8.51274,47.43085],[8.516,47.43174],[8.51628,47.43175],[8.51681,47.43133],[8.51872,47.4319],[8.51979,47.43167],[8.52463,47.43126],[8.52549,47.43316],[8.5303,47.43207],[8.53063,47.43266],[8.533,47.43228],[8.53374,47.43251],[8.53467,47.432],[8.53521,47.43188],[8.53606,47.43187],[8.5374,47.4314],[8.53964,47.43126],[8.5401,47.4311],[8.54033,47.43186],[8.54363,47.43143],[8.54284,47.43289],[8.54311,47.43288],[8.54451,47.4325],[8.54459,47.43262],[8.54607,47.43207],[8.54858,47.43142],[8.55009,47.43128],[8.55098,47.43102],[8.55199,47.43104],[8.55535,47.43066],[8.5561,47.42803],[8.55684,47.42624],[8.55783,47.42554],[8.55697,47.4249],[8.55736,47.42472],[8.5569,47.42424],[8.55723,47.4241],[8.55419,47.4208],[8.56082,47.41817],[8.56129,47.41829],[8.56235,47.41632],[8.56282,47.41643],[8.56323,47.41565],[8.56622,47.41632],[8.56692,47.41629],[8.56735,47.41649],[8.5678,47.41684],[8.56875,47.41855],[8.56903,47.41871],[8.5696,47.41868],[8.56944,47.41926],[8.57223,47.41893],[8.57367,47.42004],[8.57378,47.4178],[8.57342,47.41711],[8.57386,47.41438],[8.57384,47.41324],[8.57331,47.41257],[8.5726,47.41207],[8.573,47.41144],[8.58806,47.40797],[8.58894,47.40756],[8.59312,47.40704],[8.59728,47.40631],[8.59722,47.406],[8.59608,47.40612],[8.59378,47.40222],[8.59622,47.40154],[8.5948,47.39918],[8.59725,47.39851],[8.59644,47.39715],[8.59637,47.39663],[8.59623,47.39646],[8.59453,47.39712],[8.59392,47.39647],[8.59335,47.39614],[8.59208,47.39691],[8.59172,47.39681],[8.59148,47.397],[8.58828,47.3958],[8.58905,47.39501],[8.58995,47.39478],[8.58818,47.39351],[8.58752,47.39321],[8.58747,47.39297],[8.58619,47.3928],[8.58442,47.39195],[8.58369,47.39008],[8.58305,47.38905],[8.58316,47.38831],[8.58437,47.38834],[8.58432,47.38894],[8.58492,47.39011],[8.58528,47.3904],[8.58696,47.39017],[8.5869,47.38977],[8.58765,47.38905],[8.58698,47.38793],[8.59181,47.38638],[8.59307,47.38565],[8.59299,47.38523],[8.59354,47.38522],[8.59274,47.38417],[8.59082,47.38476],[8.59013,47.38381],[8.58966,47.384],[8.58956,47.38373],[8.59217,47.38311],[8.59151,47.38244],[8.59384,47.38081],[8.59407,47.38061],[8.59406,47.38029],[8.59556,47.3796],[8.59574,47.37927],[8.59721,47.37849],[8.59674,47.37782],[8.59702,47.37716],[8.5976,47.37661],[8.59705,47.37589],[8.59778,47.37557],[8.59828,47.3751],[8.59855,47.37473],[8.59813,47.37447],[8.6002,47.37331],[8.60053,47.3734],[8.60096,47.37312],[8.60194,47.37198],[8.60192,47.37171],[8.60324,47.37131],[8.60607,47.36871],[8.60745,47.36816],[8.60812,47.36761],[8.61067,47.3673],[8.612,47.36684],[8.61308,47.36776],[8.61344,47.36779],[8.61366,47.36802],[8.61549,47.3677],[8.61645,47.36841],[8.61665,47.36828],[8.61764,47.36681],[8.61709,47.36626],[8.61682,47.36535],[8.61565,47.36466],[8.61495,47.36458],[8.61557,47.36342],[8.61566,47.36273],[8.61482,47.36263],[8.6147,47.36151],[8.61929,47.36121],[8.61996,47.36104],[8.62174,47.36007],[8.62257,47.35983],[8.62187,47.35946],[8.62133,47.35746],[8.62351,47.35592],[8.62352,47.35561],[8.62544,47.35466],[8.62416,47.35397],[8.62245,47.35364],[8.62209,47.35334],[8.61989,47.35367],[8.61976,47.35385],[8.61844,47.35382],[8.61839,47.35425],[8.61708,47.35414],[8.61569,47.35442],[8.6152,47.3541],[8.61386,47.35402],[8.61255,47.35437],[8.61156,47.35394],[8.61107,47.35352],[8.61042,47.35337],[8.60946,47.35352],[8.60776,47.35333],[8.60607,47.35363],[8.60506,47.35359],[8.6038,47.353],[8.60305,47.35219],[8.6032,47.35207],[8.60294,47.35175],[8.603,47.35076],[8.60262,47.35073],[8.6016,47.35073],[8.60104,47.35105],[8.60026,47.35112],[8.5996,47.35145],[8.59859,47.35145],[8.59824,47.35165],[8.59689,47.3514],[8.59666,47.35161],[8.59596,47.35169],[8.59564,47.3519],[8.59494,47.35161],[8.59454,47.35175],[8.5939,47.35161],[8.5935,47.35211],[8.59229,47.3523],[8.59189,47.35278],[8.59118,47.35321],[8.59047,47.35271],[8.59014,47.35286],[8.58846,47.35289],[8.58797,47.35307],[8.58748,47.35267],[8.5863,47.35288],[8.58591,47.35231],[8.5853,47.35201],[8.58462,47.35141],[8.58417,47.35129],[8.58438,47.35116],[8.58398,47.35085],[8.58348,47.35104],[8.58335,47.35087],[8.58221,47.35101],[8.58246,47.35062],[8.57851,47.34873],[8.57827,47.34888],[8.57786,47.34865],[8.57686,47.34878],[8.57688,47.34859],[8.57625,47.34839],[8.57308,47.34751],[8.573,47.34765],[8.57214,47.34744],[8.57163,47.34728],[8.5717,47.34712],[8.57029,47.34672],[8.56968,47.3476],[8.56741,47.34674],[8.56681,47.34713]]],terms_text:"Stadt Zürich Open Government Data"},{id:"stamen-terrain-background",name:"Stamen Terrain",type:"tms",template:"https://stamen-tiles-{switch:a,b,c,d}.a.ssl.fastly.net/terrain-background/{zoom}/{x}/{y}.jpg",zoomExtent:[4,18],terms_url:"http://maps.stamen.com/#terrain",terms_text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL",icon:"https://stamen.com/wp-content/uploads/2016/07/stamen_compass_rose_small-01.png"},{id:"Surrey-Air_Survey",name:"Surrey Air Survey",type:"tms",template:"https://{switch:a,b,c}.surrey.aerial.openstreetmap.org.uk/layer/gb_surrey_aerial/{zoom}/{x}/{y}.png",endDate:"2009-01-01T00:00:00.000Z",startDate:"2007-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[-0.75248,51.08219],[-0.75952,51.08563],[-0.80143,51.14579],[-0.83989,51.14407],[-0.83577,51.18024],[-0.85295,51.20113],[-0.85227,51.20962],[-0.84952,51.2179],[-0.82669,51.24037],[-0.8121,51.24692],[-0.77365,51.24596],[-0.75442,51.23811],[-0.75408,51.23392],[-0.74464,51.23338],[-0.74307,51.28472],[-0.7515,51.30695],[-0.76644,51.3121],[-0.78206,51.32702],[-0.78154,51.33881],[-0.73743,51.37205],[-0.71923,51.37697],[-0.67958,51.3848],[-0.68078,51.39015],[-0.65314,51.39176],[-0.63014,51.39058],[-0.62911,51.39701],[-0.62344,51.39776],[-0.61314,51.42956],[-0.60025,51.44591],[-0.58671,51.44454],[-0.57624,51.4532],[-0.56268,51.45235],[-0.54774,51.447],[-0.53727,51.44486],[-0.5371,51.45267],[-0.54396,51.45459],[-0.54053,51.46989],[-0.53092,51.47609],[-0.50912,51.47448],[-0.5086,51.46957],[-0.49006,51.46828],[-0.45264,51.46069],[-0.44869,51.44293],[-0.44148,51.44186],[-0.44183,51.43694],[-0.41127,51.43801],[-0.40149,51.42795],[-0.38071,51.42624],[-0.38054,51.41617],[-0.34913,51.41382],[-0.3275,51.40375],[-0.30398,51.39904],[-0.30192,51.37547],[-0.30948,51.36969],[-0.31119,51.35297],[-0.29557,51.35415],[-0.29231,51.36733],[-0.2851,51.36808],[-0.27875,51.37719],[-0.26553,51.38372],[-0.24115,51.3848],[-0.21231,51.36283],[-0.21077,51.34986],[-0.19086,51.35029],[-0.15429,51.33388],[-0.14966,51.30577],[-0.10743,51.29665],[-0.08872,51.30996],[-0.08786,51.32208],[-0.0652,51.32154],[-0.06417,51.32648],[-0.05198,51.32637],[-0.05284,51.33463],[-0.03308,51.34309],[0.00192,51.33763],[0.01188,51.3282],[0.01393,51.29944],[0.02029,51.29944],[0.02406,51.30727],[0.03316,51.30867],[0.04552,51.30545],[0.05239,51.28774],[0.06166,51.25778],[0.06406,51.24155],[0.04621,51.21263],[0.04071,51.21091],[0.04483,51.19898],[0.04947,51.19973],[0.05582,51.19446],[0.06114,51.17907],[0.06234,51.15421],[0.05771,51.14171],[0.02046,51.13654],[-0.0446,51.13364],[-0.1567,51.13525],[-0.15721,51.129],[-0.22879,51.11834],[-0.24733,51.11834],[-0.25008,51.12114],[-0.29935,51.1137],[-0.32218,51.11198],[-0.32235,51.10584],[-0.3596,51.10196],[-0.35891,51.11133],[-0.38638,51.11176],[-0.3869,51.10625],[-0.4281,51.09472],[-0.48568,51.09516],[-0.48713,51.08723],[-0.52974,51.08654],[-0.53023,51.07899],[-0.61046,51.07655],[-0.60997,51.08067],[-0.6578,51.07922],[-0.65828,51.07434],[-0.68365,51.07075],[-0.6998,51.07083],[-0.72966,51.07449],[-0.75248,51.08219]]]},{id:"Swietochlowice-2008",name:"Świętochłowice: Orthophotomap 2008 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2008&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2009",name:"Świętochłowice: Orthophotomap 2009 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2009&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2012",name:"Świętochłowice: Orthophotomap 2012 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2012&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Szeged_2011",name:"Szeged orthophoto 2011",type:"tms",template:"http://e.tile.openstreetmap.hu/szeged-2011-10cm/{zoom}/{x}/{y}.png",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[10,22],polygon:[[[20.14599,46.22811],[20.13323,46.22904],[20.12584,46.22987],[20.12233,46.23099],[20.12085,46.23175],[20.11897,46.23351],[20.11312,46.24136],[20.11203,46.2433],[20.11157,46.245],[20.11119,46.24709],[20.11129,46.24877],[20.11159,46.25097],[20.11222,46.2528],[20.11299,46.25427],[20.11354,46.25535],[20.11477,46.2568],[20.13523,46.27685],[20.13664,46.27751],[20.13789,46.27803],[20.13939,46.27835],[20.14088,46.27846],[20.16115,46.27816],[20.16211,46.27816],[20.16359,46.2777],[20.16618,46.27615],[20.16878,46.27386],[20.16961,46.27144],[20.16959,46.27045],[20.17009,46.27044],[20.17399,46.26433],[20.17662,46.25829],[20.1948,46.25492],[20.18587,46.24481],[20.18466,46.24531],[20.17804,46.23831],[20.17818,46.23771],[20.17953,46.2371],[20.17257,46.23002],[20.16983,46.23504],[20.16877,46.23629],[20.16703,46.23785],[20.16594,46.23873],[20.16544,46.239],[20.16548,46.239],[20.16352,46.24014],[20.16021,46.2412],[20.15927,46.24153],[20.15927,46.24158],[20.15835,46.24185],[20.15495,46.24229],[20.15108,46.23515],[20.14938,46.23246],[20.14599,46.22811]]],terms_url:"http://www.geo.u-szeged.hu",terms_text:"SZTE TFGT - University of Szeged",best:true,description:"Inner part of Szeged"},{id:"TW_NLSC_WMS_EMAP6",name:"Taiwan e-Map Open Data",type:"tms",template:"https://wmts.nlsc.gov.tw/wmts/EMAP6_OPENDATA/default/GoogleMapsCompatible/{zoom}/{y}/{x}",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_LANDSECT",name:"Taiwan Land-Section Data",type:"wms",template:"https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LANDSECT&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_Village",name:"Taiwan Village Boundaries",type:"wms",template:"https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Village&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TEClines",name:"TEC bus lines",type:"wms",template:"https://geodata.tec-wl.be/arcgis/services/Lignes/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{id:"TECstops",name:"TEC bus stops",type:"wms",template:"https://geodata.tec-wl.be/arcgis/services/Poteaux/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{id:"teotonio_vilela",name:"Teotonio Vilela AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Teotonio%20Vilela&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.31164,-9.95468],[-36.31158,-9.94382],[-36.31145,-9.93197],[-36.31127,-9.92436],[-36.31123,-9.91848],[-36.31119,-9.91637],[-36.31141,-9.91324],[-36.3111,-9.90922],[-36.31108,-9.90318],[-36.31099,-9.89379],[-36.31089,-9.8842],[-36.31078,-9.87412],[-36.31068,-9.86457],[-36.3318,-9.86432],[-36.34001,-9.86437],[-36.3478,-9.86425],[-36.35917,-9.8642],[-36.37047,-9.86404],[-36.38448,-9.86386],[-36.40164,-9.86364],[-36.40221,-9.9225],[-36.40249,-9.93177],[-36.40259,-9.94183],[-36.40248,-9.94804],[-36.40266,-9.9537],[-36.3855,-9.95384],[-36.38283,-9.95392],[-36.37096,-9.95399],[-36.36232,-9.95423],[-36.34747,-9.95422],[-36.33287,-9.95446],[-36.3291,-9.95456],[-36.32089,-9.95459],[-36.31164,-9.95468]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"tnris.org",name:"Texas Orthophoto",type:"tms",template:"https://txgi.tnris.org/login/path/ecology-fiona-poem-romeo/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=texas&STYLE=&FORMAT=image/png&tileMatrixSet=0to20&tileMatrix=0to20:{zoom}&tileRow={y}&tileCol={x}",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-99.99854,34.56018],[-95.55655,33.99257],[-93.89679,33.61039],[-93.98468,32.04103],[-93.41614,31.02505],[-93.74531,29.57268],[-96.50492,28.23159],[-97.36942,26.95467],[-97.04867,25.8053],[-99.07342,26.32559],[-100.76599,29.02532],[-102.33154,29.84339],[-103.13355,28.88112],[-104.28879,29.28831],[-104.72698,29.94816],[-104.72697,30.23535],[-106.5345,31.78457],[-106.75767,31.78457],[-106.75766,32.04386],[-106.61848,32.04385],[-103.11949,32.04376],[-103.09544,36.50046],[-103.05798,36.54269],[-100.00042,36.54222],[-99.99854,34.56018]]],terms_url:"https://tnris.org/maps-and-data/online-mapping-services",terms_text:"Texas Natural Resources Information System"},{id:"US-TIGER-Roads-2017",name:"TIGER Roads 2017",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cj8dftc3q1ecn2tnx9qhwyj0c/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.1572,68.722],[-164.8554,67.0255],[-168.0022,66.0018],[-169.0087,66.0015],[-169.0075,64.9988],[-172.5143,63.8767],[-173.8197,59.7401],[-178.0001,52.2446],[-177.9993,51.2554],[-171.4689,51.8215],[-162.4025,53.9567],[-159.0076,55.0025],[-158.0191,55.0028],[-151.9963,55.9992],[-151.5003,57.9988],[-151.5013,58.992],[-138.516,58.9953],[-138.515,57.9986],[-133.9948,54.0032],[-130.0044,54.0043],[-130.0071,57.0001],[-131.9759,56.9995],[-135.123,59.7566],[-138.0072,59.9918],[-139.1716,60.4127],[-140.9874,61.0119],[-140.9684,69.9535],[-156.1769,71.5633],[-160.4136,70.7398],[-163.0218,69.9707],[-164.9717,68.9947],[-167.1572,68.722]],[[-68.2,17.8],[-64.32,17.38],[-64.64,18.36],[-65.33,18.57],[-67.9,18.67],[-68.2,17.8]],[[146.2,15.4],[145.7,15.6],[144.2,13.2],[144.8,12.9],[146.2,15.4]],[[179.99,52.2],[172,53.5],[172,52.5],[179.99,51],[179.99,52.2]]],description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/TIGER2017RoadsOverlay.png",overlay:true},{id:"tirol.gv.at-contourlines",name:"Tiris: contour lines",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Hoehenschichtlinien 20m&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[15,22],polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif",overlay:true},{id:"tirol.gv.at-DGM",name:"Tiris: DGM (Terrain model)",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image Schummerung_Gelaendemodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-DOM",name:"Tiris: DOM (Surface model)",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/terrain/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image Schummerung_Oberflaechenmodell&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-orthofoto",name:"Tiris: orthophoto",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_RGB&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"tirol.gv.at-orthofoto-cir",name:"Tiris: orthophoto infrared",type:"wms",template:"https://gis.tirol.gv.at/arcgis/services/Service_Public/orthofoto/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Image_Aktuell_CIR&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],terms_url:"https://tiris.tirol.gv.at",terms_text:"tiris.tirol.gv.at",icon:"https://static.tirol.gv.at/plainhtml/v1/tirollogo.gif"},{id:"lu.geoportail.opendata.topo",name:"Topographical Map geoportail.lu",type:"tms",template:"https://{switch:wmts3,wmts4}.geoportail.lu/opendata/wmts/topo/GLOBAL_WEBMERCATOR_4_V3/{zoom}/{x}/{y}.png",endDate:"2010-07-20T00:00:00.000Z",startDate:"2013-07-19T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,50.17631]]],terms_url:"https://data.public.lu/en/datasets/cartes-topographiques-services-wms-et-wmts",terms_text:"Administration du Cadastre et de la Topographie",icon:"https://www.geoportail.lu/static/img/lion.png"},{id:"Torokbalint-orthophoto-2013",name:"Törökbálint orthophoto 2013",type:"wms",template:"https://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ORTO_2013_5CM_2013SZEPT_TAKARASSAL_512_512&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:3857",endDate:"2013-09-01T00:00:00.000Z",startDate:"2013-09-01T00:00:00.000Z",polygon:[[[18.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],terms_url:"http://www.torokbalint.hu",terms_text:"Törökbálint",description:"5 cm resolution bald image"},{id:"Torokbalint-orthophoto-2015",name:"Törökbálint orthophoto 2015",type:"wms",template:"https://terkep.torokbalint.hu/mapproxy/service?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=TBORTO_2015_20160218&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[18.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],terms_url:"http://www.torokbalint.hu/",terms_text:"Törökbálint",best:true,description:"5 cm resolution bald image"},{id:"Toulouse-Orthophotoplan-2007",name:"Toulouse - Orthophotoplan 2007",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2007&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2007-01-01T00:00:00.000Z",startDate:"2007-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.192,43.63288],[1.20154,43.63297],[1.20111,43.65549],[1.2228,43.6557],[1.22262,43.66534],[1.22753,43.66538],[1.22754,43.66564],[1.23376,43.66569],[1.23376,43.66502],[1.23512,43.66503],[1.23509,43.66707],[1.24436,43.66716],[1.24416,43.67439],[1.2494,43.67443],[1.2494,43.67466],[1.25557,43.67472],[1.25557,43.67445],[1.25695,43.67447],[1.25688,43.67853],[1.28749,43.67883],[1.28708,43.70132],[1.30882,43.70146],[1.30865,43.71277],[1.33033,43.71295],[1.33002,43.73052],[1.33671,43.73058],[1.33673,43.73122],[1.37343,43.73105],[1.37358,43.72458],[1.46045,43.72529],[1.46078,43.7028],[1.48249,43.70295],[1.48298,43.66921],[1.50468,43.66936],[1.50484,43.65812],[1.52655,43.65827],[1.52669,43.64703],[1.54837,43.64716],[1.54854,43.63594],[1.57022,43.63608],[1.57051,43.61358],[1.54882,43.61343],[1.5491,43.59095],[1.57077,43.59107],[1.57094,43.57983],[1.57937,43.57989],[1.57948,43.57377],[1.58091,43.57378],[1.58109,43.55738],[1.57123,43.55731],[1.57165,43.52355],[1.39848,43.52226],[1.39865,43.51101],[1.3121,43.51025],[1.3119,43.52152],[1.29026,43.52131],[1.28986,43.54382],[1.31152,43.54401],[1.31133,43.55526],[1.30369,43.55519],[1.30361,43.55951],[1.29554,43.55943],[1.29554,43.55955],[1.28956,43.55945],[1.28929,43.57754],[1.26757,43.57736],[1.2674,43.58861],[1.25355,43.5885],[1.25338,43.59563],[1.2518,43.59563],[1.2518,43.59494],[1.23504,43.59478],[1.23504,43.5946],[1.22396,43.5946],[1.22394,43.59947],[1.21397,43.5993],[1.21388,43.60464],[1.20206,43.60448],[1.20195,43.61048],[1.19243,43.61037],[1.192,43.63288]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2011",name:"Toulouse - Orthophotoplan 2011",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2011&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2013",name:"Toulouse - Orthophotoplan 2013",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2013&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2015",name:"Toulouse - Orthophotoplan 2015",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2015&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Tours-Orthophoto-2008_2010",name:"Tours - Orthophotos 2008-2010",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/tours/{zoom}/{x}/{y}",endDate:"2011-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[0.54575,47.46526],[0.54585,47.46082],[0.53922,47.4607],[0.53935,47.45624],[0.5328,47.4561],[0.5329,47.45157],[0.52619,47.4514],[0.52659,47.44249],[0.50009,47.44207],[0.50024,47.43758],[0.4936,47.43743],[0.4937,47.43293],[0.46061,47.43246],[0.46072,47.42798],[0.4541,47.42781],[0.45493,47.40539],[0.46154,47.40545],[0.46191,47.39649],[0.46843,47.3966],[0.46913,47.37864],[0.47571,47.37876],[0.47621,47.3652],[0.48283,47.36535],[0.48296,47.36083],[0.47635,47.36074],[0.47665,47.35173],[0.47005,47.35162],[0.4702,47.34713],[0.46375,47.34701],[0.45714,47.34241],[0.45729,47.33791],[0.45067,47.33781],[0.45084,47.33331],[0.44422,47.3332],[0.44438,47.32871],[0.43114,47.3285],[0.43163,47.315],[0.43824,47.31511],[0.43838,47.31062],[0.47145,47.31114],[0.47131,47.31566],[0.47789,47.31575],[0.47807,47.31128],[0.48468,47.31136],[0.48486,47.30687],[0.49144,47.30698],[0.49174,47.29797],[0.48516,47.29787],[0.48543,47.28887],[0.47885,47.28877],[0.47916,47.27978],[0.48578,47.2799],[0.48591,47.27539],[0.49254,47.2755],[0.49267,47.27101],[0.4993,47.27111],[0.49943,47.26661],[0.51927,47.26692],[0.51942,47.26242],[0.52602,47.26252],[0.52587,47.26702],[0.5457,47.26734],[0.54555,47.27183],[0.55877,47.27204],[0.55863,47.27652],[0.56523,47.27663],[0.56508,47.28112],[0.57168,47.28123],[0.57152,47.28572],[0.57814,47.28583],[0.57799,47.29033],[0.5846,47.29043],[0.58431,47.29942],[0.5975,47.29961],[0.59766,47.29514],[0.65716,47.296],[0.6573,47.29151],[0.6705,47.29172],[0.67035,47.29621],[0.68362,47.29637],[0.68343,47.30089],[0.69006,47.30096],[0.68992,47.30547],[0.7362,47.30612],[0.73608,47.31061],[0.7559,47.31089],[0.75577,47.31539],[0.76238,47.31547],[0.76223,47.31999],[0.77549,47.32015],[0.77497,47.33882],[0.77458,47.35163],[0.76804,47.35159],[0.76759,47.36053],[0.77424,47.36062],[0.77335,47.39213],[0.76674,47.39202],[0.76644,47.40108],[0.77306,47.40111],[0.77289,47.41013],[0.76618,47.41002],[0.76603,47.4145],[0.75276,47.4143],[0.75298,47.40981],[0.74624,47.4097],[0.74594,47.42322],[0.73923,47.42315],[0.73887,47.43661],[0.73233,47.43652],[0.73219,47.44106],[0.7255,47.44098],[0.72542,47.44535],[0.73188,47.44548],[0.73185,47.45011],[0.73845,47.45023],[0.73831,47.45463],[0.74494,47.45474],[0.74432,47.4772],[0.73107,47.47697],[0.7309,47.48154],[0.71762,47.48126],[0.71779,47.47684],[0.69777,47.4765],[0.69805,47.47198],[0.69145,47.47189],[0.69173,47.46302],[0.6851,47.46293],[0.68494,47.46735],[0.67826,47.46733],[0.67798,47.47622],[0.67141,47.47616],[0.67104,47.4882],[0.65773,47.48797],[0.65782,47.48504],[0.65119,47.48483],[0.65147,47.47586],[0.64482,47.47572],[0.64493,47.47126],[0.6118,47.47075],[0.61188,47.46631],[0.60528,47.46612],[0.60542,47.46166],[0.59888,47.46155],[0.59902,47.45709],[0.57249,47.45669],[0.57218,47.46565],[0.54575,47.46526]]],terms_url:"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto",terms_text:"Orthophoto Tour(s) Plus 2008"},{id:"Tours-Orthophoto-2013",name:"Tours - Orthophotos 2013",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/tours_2013/{zoom}/{x}/{y}",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[0.77512,47.32983],[0.77427,47.35617],[0.77053,47.35611],[0.77024,47.36512],[0.77398,47.36517],[0.7728,47.40148],[0.7904,47.40147],[0.78988,47.4103],[0.79117,47.41047],[0.79108,47.41942],[0.79392,47.41942],[0.79319,47.43733],[0.79834,47.43742],[0.79808,47.45544],[0.80044,47.45541],[0.80138,47.46426],[0.80074,47.46899],[0.79396,47.47331],[0.78405,47.47323],[0.78387,47.47871],[0.77606,47.47859],[0.77585,47.48204],[0.77066,47.48219],[0.77044,47.4859],[0.76096,47.49092],[0.75718,47.49092],[0.73753,47.50336],[0.7259,47.50588],[0.71113,47.50576],[0.70418,47.50408],[0.69109,47.50038],[0.69045,47.49718],[0.67757,47.49683],[0.67757,47.49353],[0.66427,47.49301],[0.6635,47.48953],[0.65088,47.48958],[0.65133,47.48032],[0.64734,47.4803],[0.64747,47.47852],[0.64474,47.47846],[0.64479,47.47575],[0.64238,47.47578],[0.64225,47.47302],[0.63835,47.47294],[0.63792,47.47131],[0.60513,47.47079],[0.60513,47.46632],[0.59852,47.46603],[0.59878,47.46156],[0.592,47.46156],[0.59226,47.45976],[0.58084,47.45971],[0.58007,47.46145],[0.57234,47.46139],[0.57222,47.46512],[0.55874,47.46489],[0.5466,47.46052],[0.53269,47.45355],[0.52677,47.45315],[0.52677,47.45152],[0.52231,47.45123],[0.52256,47.44804],[0.51977,47.44776],[0.52007,47.44247],[0.4975,47.4416],[0.49716,47.44049],[0.49355,47.44015],[0.49355,47.43573],[0.47943,47.43575],[0.46171,47.42819],[0.45643,47.42088],[0.45489,47.41229],[0.45506,47.40218],[0.46149,47.40193],[0.46167,47.39641],[0.46879,47.39602],[0.47016,47.35173],[0.45677,47.3515],[0.45729,47.34254],[0.43085,47.34196],[0.43196,47.30602],[0.47154,47.3067],[0.47257,47.28004],[0.48527,47.28004],[0.48578,47.27084],[0.49935,47.27107],[0.49917,47.26245],[0.55273,47.26304],[0.55222,47.27201],[0.56561,47.27224],[0.56526,47.28156],[0.59118,47.28156],[0.59067,47.29099],[0.66912,47.29169],[0.6832,47.29564],[0.6832,47.30077],[0.69658,47.30123],[0.69641,47.3024],[0.71006,47.30245],[0.72293,47.30589],[0.72285,47.31043],[0.74165,47.31084],[0.75426,47.31392],[0.7625,47.31815],[0.76207,47.32013],[0.76619,47.32009],[0.76956,47.32207],[0.77233,47.32508],[0.77336,47.3267],[0.77512,47.32983]]],terms_url:"https://wiki.openstreetmap.org/wiki/Tours/Orthophoto",terms_text:"Orthophoto Tour(s)plus 2013"},{id:"trafikverket-baninfo",name:"Trafikverket Railway Network",type:"wms",template:"https://geo-baninfo.trafikverket.se/mapservice/wms.axd/BanInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Spar_Huvud_och_sidospar&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[7,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish railway network, including sidings",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat",name:"Trafikverket Road Network",type:"wms",template:"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagtrafiknat,Funkvagklass,Farjeled&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB road network",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat-extra",name:"Trafikverket Road Network extra",type:"wms",template:"https://geo-netinfo.trafikverket.se/mapservice/wms.axd/NetInfo?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vagnummer,Vaghinder,Rastplats,Rastficka,Hallplats,Farthinder,BroTunnel,ATK_Matplats&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"trafikverket-vagnat-navn",name:"Trafikverket Street Names",type:"tms",template:"https://mapproxy.openstreetmap.se/tiles/1.0.0/nvdb_names/EPSG3857/{zoom}/{x}/{y}.png",zoomExtent:[15,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.trafikverket.se",terms_text:"© Trafikverket, CC0",description:"Swedish NVDB street names",icon:"https://api.trafikinfo.trafikverket.se/img/apple-touch-icon-144-precomposed.png",overlay:true},{id:"US_Forest_Service_roads_overlay",name:"U.S. Forest Roads Overlay",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/glassman/cjf4qjmps0tgv2qpahj977mvz/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1IjoiZ2xhc3NtYW4iLCJhIjoiRjk3dWdwYyJ9.Tg_fMJWxygeKBgVTrZHmGA",zoomExtent:[0,20],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]],description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USForestService-overlay.png",overlay:true},{id:"US_Forest_Service_roads",name:"U.S. Forest Service roads",type:"tms",template:"https://osm.cycle.travel/forest/{zoom}/{x}/{y}.png",zoomExtent:[0,19],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]]},{id:"Zuerich-zh_uebersichtsplan-tms",name:"Übersichtsplan Zürich",type:"tms",template:"https://mapproxy.osm.ch/tiles/zh_uebersichtsplan/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[0,21],polygon:[[[8.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.60231,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33679],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data"},{id:"UkraineKyiv2014DZK",name:"Ukraine - Kyiv 2014 (DZK)",type:"tms",template:"http://map.land.gov.ua/map/ortho_kiev/{zoom}/{x}/{-y}.jpg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[30.30752,50.57184],[30.33155,50.57402],[30.37687,50.57925],[30.42288,50.58143],[30.4318,50.58579],[30.44416,50.58797],[30.45515,50.58754],[30.46545,50.58449],[30.46819,50.57751],[30.49085,50.57489],[30.51351,50.57489],[30.52519,50.57402],[30.55608,50.55221],[30.58424,50.53869],[30.5966,50.53781],[30.60896,50.5365],[30.64329,50.5352],[30.65496,50.53563],[30.65496,50.54305],[30.66045,50.54916],[30.66801,50.55439],[30.67762,50.55876],[30.68792,50.56137],[30.70783,50.55614],[30.71127,50.56356],[30.71127,50.57838],[30.72157,50.58231],[30.71882,50.58972],[30.72981,50.59103],[30.74011,50.58841],[30.76208,50.58536],[30.77306,50.58274],[30.78336,50.57795],[30.80259,50.57141],[30.81014,50.56617],[30.82182,50.55439],[30.82525,50.53956],[30.81701,50.53432],[30.79504,50.52909],[30.78474,50.52559],[30.76276,50.51992],[30.76208,50.5125],[30.75315,50.50769],[30.74354,50.50376],[30.73805,50.49721],[30.74629,50.49197],[30.75521,50.48847],[30.74835,50.48236],[30.75178,50.47537],[30.75315,50.46794],[30.74835,50.46138],[30.75178,50.45439],[30.78886,50.43646],[30.7971,50.43165],[30.80328,50.41765],[30.8225,50.40846],[30.82044,50.40102],[30.82319,50.39358],[30.81289,50.39095],[30.80122,50.39139],[30.78954,50.39314],[30.77787,50.3927],[30.77856,50.3857],[30.77169,50.38001],[30.76208,50.37519],[30.75109,50.37256],[30.73873,50.37256],[30.72775,50.37475],[30.71813,50.37957],[30.71539,50.36512],[30.71127,50.35855],[30.70577,50.35241],[30.69753,50.34716],[30.68586,50.34453],[30.65084,50.34058],[30.63848,50.34014],[30.62681,50.33795],[30.62887,50.3305],[30.64947,50.29279],[30.66663,50.28314],[30.67144,50.27656],[30.6632,50.27085],[30.65153,50.26997],[30.64535,50.27612],[30.63368,50.27787],[30.62132,50.27656],[30.61857,50.2691],[30.62956,50.25637],[30.6378,50.25154],[30.64535,50.23792],[30.64398,50.2309],[30.63917,50.22387],[30.62956,50.21992],[30.6069,50.2164],[30.59591,50.2186],[30.59042,50.23353],[30.5863,50.241],[30.57531,50.25505],[30.56501,50.25944],[30.5657,50.2669],[30.56432,50.29718],[30.56638,50.30463],[30.5657,50.31209],[30.55677,50.31691],[30.54441,50.31735],[30.52587,50.32699],[30.51489,50.3305],[30.50253,50.33182],[30.48055,50.33664],[30.47163,50.34146],[30.46957,50.34935],[30.47025,50.35679],[30.46201,50.36205],[30.4524,50.35679],[30.44004,50.35548],[30.43661,50.36512],[30.43111,50.37212],[30.43661,50.37826],[30.43455,50.3857],[30.40914,50.39883],[30.39678,50.40014],[30.3906,50.40671],[30.37069,50.41546],[30.36314,50.42159],[30.3597,50.42902],[30.3597,50.43646],[30.35696,50.44389],[30.3446,50.44477],[30.32056,50.44258],[30.29585,50.44477],[30.28349,50.44477],[30.27799,50.43864],[30.27525,50.43165],[30.26563,50.42771],[30.25396,50.42902],[30.24572,50.42377],[30.23542,50.42771],[30.2416,50.43427],[30.2416,50.44214],[30.23679,50.4487],[30.23885,50.45613],[30.24297,50.46313],[30.24915,50.46968],[30.25671,50.47493],[30.26083,50.48192],[30.26563,50.48847],[30.26907,50.49983],[30.26151,50.50595],[30.26357,50.51381],[30.26975,50.51992],[30.28898,50.52821],[30.29722,50.53345],[30.30271,50.54],[30.30203,50.54741],[30.30477,50.55483],[30.32743,50.55221],[30.33086,50.55919],[30.32262,50.56486],[30.31233,50.56835],[30.30752,50.57184]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{id:"Ukraine-orto10000-2012",name:"Ukraine - Orthophotomaps 2012",type:"tms",template:"http://212.26.144.110/tile2/orto_10000/{zoom}/{x}/{-y}.jpg",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[23.6193,51.65491],[24.09803,51.64047],[24.39723,51.89353],[25.19178,51.95913],[26.12263,51.92224],[26.49829,51.80933],[27.09005,51.77026],[27.62861,51.62603],[28.02422,51.59093],[28.28021,51.68172],[28.37662,51.5806],[28.82542,51.5682],[29.19111,51.64253],[29.41718,51.4399],[29.67316,51.51238],[29.82276,51.47512],[30.21837,51.50824],[30.54417,51.30709],[30.63726,51.38599],[30.51425,51.63634],[30.983,52.09005],[31.2822,52.07984],[31.48832,52.13497],[32.11,52.05531],[32.31279,52.11864],[32.43912,52.32434],[32.93114,52.28368],[33.29683,52.39337],[33.75561,52.35277],[34.35734,51.78055],[34.14457,51.76409],[34.05813,51.67965],[34.22103,51.47098],[34.25095,51.30085],[34.7197,51.19056],[35.11199,51.21139],[35.1818,51.08626],[35.38792,51.03402],[35.40787,50.62878],[35.62063,50.38563],[36.06944,50.4513],[36.21571,50.41106],[36.31212,50.28802],[36.4717,50.32624],[36.59138,50.2519],[37.46571,50.45977],[37.735,50.11353],[38.05747,49.9384],[38.19377,49.95765],[38.19045,50.07514],[38.35002,50.08154],[38.41651,49.98972],[38.73899,49.97476],[39.00827,49.83344],[39.14457,49.89987],[39.27755,49.78195],[39.54018,49.74544],[39.79949,49.58406],[40.18845,49.6013],[40.0588,49.50424],[40.20508,49.24666],[39.93247,49.06185],[39.71638,49.01608],[40.08872,48.85448],[39.79617,48.78443],[39.69311,48.65283],[39.86266,48.5693],[39.99231,48.31348],[39.83274,47.92287],[39.74297,47.83144],[39.57675,47.81135],[38.86532,47.85153],[38.77555,47.68618],[38.38327,47.60106],[38.30348,47.52704],[38.30016,47.23891],[38.13393,47.05577],[37.5455,47.05124],[37.31279,46.87654],[37.20973,46.92651],[36.96039,46.83107],[36.7443,46.61685],[36.72436,46.7719],[36.4451,46.72407],[36.10601,46.4728],[36.20574,46.66022],[35.92316,46.64424],[35.43114,46.39948],[35.10202,45.97138],[35.0455,45.75145],[35.47436,45.33],[35.86,45.53297],[35.9963,45.43274],[36.11598,45.51899],[36.66452,45.4514],[36.65454,45.34168],[36.50494,45.31363],[36.47502,45.24111],[36.48832,45.04884],[35.81013,44.98539],[35.5076,45.11222],[35.42782,44.93364],[35.12196,44.76394],[34.67649,44.75686],[33.985,44.37078],[33.68912,44.38504],[33.38327,44.50608],[33.35002,44.589],[33.55282,44.93128],[33.42981,45.1263],[33.19377,45.14271],[32.83141,45.33935],[32.60534,45.30896],[32.44577,45.3557],[32.50893,45.47005],[32.87795,45.68181],[33.57941,45.90665],[33.58938,46.02681],[33.25694,46.07065],[33.02422,45.97138],[31.61133,46.19506],[31.27555,46.61457],[30.87662,46.56887],[30.43446,45.98756],[29.69643,45.55159],[29.79284,45.46306],[29.73965,45.15913],[29.47369,45.41407],[29.18114,45.38373],[28.74896,45.22004],[28.56611,45.23409],[28.29018,45.33],[28.23367,45.49103],[28.31678,45.56789],[28.483,45.54228],[28.47303,45.73753],[28.95175,46.03143],[29.02489,46.18125],[28.9318,46.49569],[29.18779,46.57116],[29.59337,46.45448],[29.81944,46.46593],[29.95574,46.68759],[29.8959,46.8197],[29.56013,46.96963],[29.54683,47.29982],[29.14789,47.50234],[29.23101,47.77562],[29.17117,47.934],[28.86864,47.99411],[28.63593,48.16513],[28.44311,48.06525],[28.36332,48.17178],[28.25694,48.15404],[27.735,48.43494],[27.55547,48.45258],[26.92383,48.34884],[26.36532,48.17178],[26.1193,47.97408],[25.3846,47.91618],[24.91585,47.70408],[24.52024,47.94291],[24.18446,47.90058],[23.58274,48.00523],[23.43646,47.96963],[23.15388,48.10522],[23.07077,47.98743],[22.858,47.9585],[22.76824,48.09856],[22.58539,48.103],[22.51558,48.2161],[22.11332,48.4217],[22.49896,49.06621],[22.58872,49.11193],[22.87795,49.04006],[22.7217,49.18151],[22.71837,49.64652],[23.24364,50.105],[24.04484,50.49785],[24.05813,50.68779],[23.9451,50.81399],[24.10135,50.85388],[23.62928,51.29462],[23.6193,51.65491]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{id:"uniao_dos_palmares",name:"União dos Palmares AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Uniao%20dos%20Palmares&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-35.97725,-9.20752],[-35.9772,-9.19398],[-35.97694,-9.19053],[-35.97678,-9.18607],[-35.97702,-9.18208],[-35.97704,-9.17968],[-35.97682,-9.17734],[-35.97664,-9.17517],[-35.97701,-9.17518],[-35.97696,-9.1707],[-35.97674,-9.17066],[-35.97661,-9.16645],[-35.97618,-9.16222],[-35.9761,-9.16026],[-35.97661,-9.16026],[-35.97672,-9.14608],[-35.97654,-9.14122],[-35.97666,-9.1332],[-35.97653,-9.12184],[-35.97648,-9.11748],[-35.98618,-9.11755],[-35.98947,-9.11733],[-36.00561,-9.11733],[-36.01859,-9.11736],[-36.04601,-9.11722],[-36.06734,-9.11698],[-36.06756,-9.16134],[-36.06771,-9.16405],[-36.06745,-9.16408],[-36.06756,-9.16657],[-36.06777,-9.16654],[-36.06798,-9.20701],[-36.0498,-9.20711],[-36.04671,-9.20698],[-36.02941,-9.20709],[-36.01355,-9.20718],[-35.99318,-9.20733],[-35.97725,-9.20752]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"URBIS2009",name:"URBIS 2009 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2009&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2012",name:"URBIS 2012 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2012&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2014",name:"URBIS 2014 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2014&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[4.4001,50.76373],[4.43093,50.77254],[4.43586,50.77237],[4.46549,50.78373],[4.48189,50.78835],[4.48269,50.79849],[4.46363,50.80686],[4.46407,50.81546],[4.48204,50.81699],[4.48103,50.82343],[4.47465,50.83505],[4.47403,50.84587],[4.46712,50.85447],[4.45257,50.85797],[4.45017,50.86151],[4.42968,50.86764],[4.43423,50.87384],[4.44147,50.87513],[4.44381,50.88004],[4.43534,50.88977],[4.43968,50.89475],[4.43287,50.90363],[4.42096,50.90917],[4.42023,50.91387],[4.38315,50.91381],[4.37879,50.90637],[4.37334,50.90289],[4.36241,50.906],[4.34824,50.90611],[4.33955,50.90685],[4.32771,50.90515],[4.31471,50.89842],[4.30413,50.89498],[4.2871,50.89192],[4.28725,50.88532],[4.29293,50.88265],[4.27948,50.8736],[4.27347,50.86822],[4.27364,50.85871],[4.27688,50.85575],[4.27644,50.84376],[4.26664,50.8405],[4.25488,50.83992],[4.24755,50.83453],[4.24799,50.82866],[4.24357,50.82599],[4.24376,50.81356],[4.25233,50.81268],[4.25649,50.80711],[4.27025,50.8073],[4.27222,50.80537],[4.28414,50.80241],[4.28885,50.80434],[4.29544,50.8043],[4.30046,50.79506],[4.31076,50.79299],[4.31444,50.78372],[4.32628,50.77221],[4.34194,50.76891],[4.34474,50.77029],[4.37535,50.76577],[4.3755,50.76381],[4.4001,50.76373]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2015",name:"URBIS 2015 aerial imagery",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2015&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2016",name:"UrbIS-Ortho 2016",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2016&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2017",name:"UrbIS-Ortho 2017",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=Urbis:Ortho2017&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbisAdmFR",name:"UrbisAdm FR",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisFR&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbisAdmNL",name:"UrbisAdm NL",type:"wms",template:"https://geoservices-urbis.irisnet.be/geoserver/ows?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image/png&TRANSPARENT=true&LAYERS=urbisNL&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISfr2013",name:"URBISfr numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisFR/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISnl2013",name:"URBISnl numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisNL/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"USGS-Large_Scale",name:"USGS Large Scale Imagery",type:"tms",template:"http://{switch:a,b,c}.tile.openstreetmap.us/usgs_large_scale/{zoom}/{x}/{y}.jpg",zoomExtent:[12,20],polygon:[[[-123.25493,48.7529],[-123.25493,48.55923],[-123.19222,48.55923],[-123.19222,48.43484],[-122.94196,48.43484],[-122.94196,48.37208],[-122.88062,48.37208],[-122.88062,48.30948],[-122.81676,48.30948],[-122.81676,48.19046],[-123.00411,48.19046],[-123.00411,48.12759],[-123.05842,48.12759],[-123.05842,48.19051],[-123.25411,48.19051],[-123.25411,48.1275],[-123.37066,48.1275],[-123.37066,48.19084],[-124.05826,48.19084],[-124.05826,48.25344],[-124.18152,48.25344],[-124.18152,48.31647],[-124.43191,48.31647],[-124.43191,48.37826],[-124.55646,48.37826],[-124.55646,48.44083],[-124.75551,48.44083],[-124.75551,48.1915],[-124.81853,48.1915],[-124.81853,48.12284],[-124.7553,48.12284],[-124.7553,47.55353],[-124.38121,47.55353],[-124.38121,47.12187],[-124.19289,47.12187],[-124.19289,43.75694],[-124.44434,43.75694],[-124.44434,43.14256],[-124.63989,43.14256],[-124.63989,42.61945],[-124.44385,42.61945],[-124.44385,39.80807],[-123.88157,39.80807],[-123.88157,39.11028],[-123.75805,39.11028],[-123.75805,38.49688],[-123.27028,38.49688],[-123.27028,37.93319],[-122.81481,37.93319],[-122.81481,37.80196],[-122.56643,37.80196],[-122.56643,36.93196],[-121.8784,36.93196],[-121.8784,36.68976],[-122.00347,36.68976],[-122.00347,36.43411],[-121.94142,36.43411],[-121.94142,35.92976],[-121.5041,35.92976],[-121.5041,35.81003],[-121.37903,35.81003],[-121.37903,35.42392],[-120.94265,35.42392],[-120.94265,35.18497],[-120.8172,35.18497],[-120.8172,35.12199],[-120.69184,35.12199],[-120.69184,34.49668],[-120.50459,34.49668],[-120.50459,34.43397],[-120.00788,34.43397],[-120.00788,34.36826],[-119.52835,34.36826],[-119.52835,34.05764],[-119.0061,34.05764],[-119.0061,33.99753],[-118.50463,33.99753],[-118.50463,33.86946],[-118.44132,33.86946],[-118.44132,33.68653],[-118.06691,33.68653],[-118.06691,33.30638],[-117.503,33.30638],[-117.503,33.05003],[-117.31882,33.05003],[-117.31882,32.62059],[-117.1917,32.62059],[-117.1917,32.49746],[-116.7465,32.49746],[-116.7465,32.56092],[-115.99701,32.56092],[-115.99701,32.62649],[-114.88081,32.62649],[-114.88081,32.43408],[-114.62945,32.43408],[-114.62945,32.37316],[-114.44474,32.37316],[-114.44474,32.30754],[-114.25576,32.30754],[-114.25576,32.24446],[-114.06803,32.24446],[-114.06803,32.18291],[-113.81665,32.18291],[-113.81665,32.12076],[-113.63074,32.12076],[-113.63074,32.05651],[-113.44175,32.05651],[-113.44175,31.99844],[-113.2546,31.99844],[-113.2546,31.93254],[-113.06807,31.93254],[-113.06807,31.87181],[-112.81611,31.87181],[-112.81611,31.81042],[-112.63088,31.81042],[-112.63088,31.74647],[-112.44189,31.74647],[-112.44189,31.6856],[-112.25719,31.6856],[-112.25719,31.62104],[-112.00338,31.62104],[-112.00338,31.55958],[-111.81562,31.55958],[-111.81562,31.49702],[-111.62786,31.49702],[-111.62786,31.43399],[-111.4419,31.43399],[-111.4419,31.37339],[-111.25597,31.37339],[-111.25597,31.31132],[-108.18458,31.31132],[-108.18458,31.74595],[-106.50651,31.74595],[-106.50651,31.68423],[-106.37973,31.68423],[-106.37973,31.62175],[-106.31743,31.62175],[-106.31743,31.49682],[-106.25518,31.49682],[-106.25518,31.43449],[-106.19247,31.43449],[-106.19247,31.37213],[-106.00392,31.37213],[-106.00392,31.30933],[-105.94166,31.30933],[-105.94166,31.24575],[-105.87982,31.24575],[-105.87982,31.18362],[-105.81623,31.18362],[-105.81623,31.12072],[-105.69212,31.12072],[-105.69212,31.05848],[-105.63029,31.05848],[-105.63029,30.93283],[-105.50444,30.93283],[-105.50444,30.87159],[-105.4413,30.87159],[-105.4413,30.80846],[-105.37815,30.80846],[-105.37815,30.74718],[-105.19047,30.74718],[-105.19047,30.68432],[-105.12862,30.68432],[-105.12862,30.61997],[-105.00365,30.61997],[-105.00365,30.55891],[-104.9418,30.55891],[-104.9418,30.49632],[-104.8782,30.49632],[-104.8782,30.30983],[-104.81553,30.30983],[-104.81553,30.24783],[-104.75361,30.24783],[-104.75361,29.93539],[-104.69095,29.93539],[-104.69095,29.80902],[-104.62913,29.80902],[-104.62913,29.68436],[-104.56599,29.68436],[-104.56599,29.62235],[-104.50372,29.62235],[-104.50372,29.55954],[-104.44101,29.55954],[-104.44101,29.49748],[-104.25376,29.49748],[-104.25376,29.37167],[-104.1292,29.37167],[-104.1292,29.30916],[-104.06887,29.30916],[-104.06887,29.24673],[-103.81873,29.24673],[-103.81873,29.18431],[-103.75574,29.18431],[-103.75574,29.12232],[-103.56675,29.12232],[-103.56675,29.05981],[-103.50498,29.05981],[-103.50498,28.99675],[-103.31658,28.99675],[-103.31658,28.93469],[-103.05976,28.93469],[-103.05976,29.0593],[-102.99797,29.0593],[-102.99797,29.12129],[-102.93314,29.12129],[-102.93314,29.18486],[-102.8096,29.18486],[-102.8096,29.25262],[-102.87013,29.25262],[-102.87013,29.3081],[-102.80967,29.3081],[-102.80967,29.37155],[-102.74757,29.37155],[-102.74757,29.55819],[-102.68455,29.55819],[-102.68455,29.68477],[-102.49678,29.68477],[-102.49678,29.74577],[-102.30866,29.74577],[-102.30866,29.80866],[-102.19093,29.80866],[-102.19093,29.74601],[-101.50499,29.74601],[-101.50499,29.68468],[-101.38058,29.68468],[-101.38058,29.55945],[-101.31751,29.55945],[-101.31751,29.49589],[-101.19101,29.49589],[-101.19101,29.43261],[-101.0675,29.43261],[-101.0675,29.30881],[-100.94189,29.30881],[-100.94189,29.24562],[-100.81673,29.24562],[-100.81673,29.11904],[-100.75227,29.11904],[-100.75227,29.05782],[-100.69254,29.05782],[-100.69254,28.87204],[-100.62902,28.87204],[-100.62902,28.80954],[-100.56799,28.80954],[-100.56799,28.62255],[-100.50404,28.62255],[-100.50404,28.55838],[-100.44218,28.55838],[-100.44218,28.49683],[-100.37943,28.49683],[-100.37943,28.30929],[-100.31719,28.30929],[-100.31719,28.18357],[-100.25448,28.18357],[-100.25448,28.12139],[-100.12823,28.12139],[-100.12823,28.05921],[-100.06595,28.05921],[-100.06595,27.99661],[-100.00239,27.99661],[-100.00239,27.93322],[-99.94265,27.93322],[-99.94265,27.74547],[-99.81685,27.74547],[-99.81685,27.68343],[-99.75413,27.68343],[-99.75413,27.62215],[-99.62916,27.62215],[-99.62916,27.5589],[-99.56728,27.5589],[-99.56728,27.43538],[-99.50418,27.43538],[-99.50418,27.3774],[-99.56718,27.3774],[-99.56718,27.24637],[-99.50498,27.24637],[-99.50498,26.99656],[-99.44274,26.99656],[-99.44274,26.8728],[-99.38006,26.8728],[-99.38006,26.80682],[-99.31907,26.80682],[-99.31907,26.74736],[-99.25375,26.74736],[-99.25375,26.62101],[-99.19106,26.62101],[-99.19106,26.49567],[-99.13006,26.49567],[-99.13006,26.37138],[-99.00295,26.37138],[-99.00295,26.30938],[-98.81657,26.30938],[-98.81657,26.24578],[-98.69201,26.24578],[-98.69201,26.18371],[-98.44409,26.18371],[-98.44409,26.12172],[-98.38232,26.12172],[-98.38232,26.05965],[-98.25327,26.05965],[-98.25327,25.99869],[-98.01091,25.99869],[-98.01091,25.99323],[-97.69323,25.99323],[-97.69323,25.93341],[-97.63139,25.93341],[-97.63139,25.86959],[-97.50468,25.86959],[-97.50468,25.80735],[-97.30834,25.80735],[-97.30834,25.87312],[-97.24563,25.87312],[-97.24563,25.93537],[-97.11389,25.93537],[-97.11389,27.68092],[-97.0571,27.68092],[-97.0571,27.81082],[-95.58108,27.81082],[-95.58108,28.74688],[-94.27104,28.74688],[-94.27104,29.55941],[-92.50299,29.55941],[-92.50299,29.49748],[-91.87762,29.49748],[-91.87762,29.3727],[-91.37842,29.3727],[-91.37842,29.24683],[-91.3154,29.24683],[-91.3154,29.18443],[-91.12947,29.18443],[-91.12947,29.12326],[-91.00526,29.12326],[-91.00526,28.99684],[-89.45002,28.99684],[-89.45002,28.86774],[-88.81043,28.86774],[-88.81043,30.18419],[-85.87915,30.18419],[-85.87915,29.5455],[-84.83681,29.5455],[-84.83681,29.62252],[-84.74828,29.62252],[-84.74828,29.68362],[-84.68589,29.68362],[-84.68589,29.74684],[-83.6297,29.74684],[-83.6297,29.43244],[-83.31749,29.43244],[-83.31749,29.05794],[-82.87966,29.05794],[-82.87966,27.74535],[-82.81828,27.74535],[-82.81828,26.92909],[-82.37968,26.92909],[-82.37968,26.36942],[-81.87771,26.36942],[-81.87771,25.80597],[-81.50369,25.80597],[-81.50369,25.74748],[-81.44055,25.74748],[-81.44055,25.68515],[-81.31559,25.68515],[-81.31559,25.5601],[-81.25385,25.5601],[-81.25385,25.43424],[-81.1902,25.43424],[-81.1902,25.12343],[-81.12881,25.12343],[-81.12881,25.06194],[-81.06492,25.06194],[-81.06492,24.81578],[-81.62895,24.81578],[-81.62895,24.75384],[-81.69072,24.75384],[-81.69072,24.68994],[-81.81732,24.68994],[-81.81732,24.62792],[-82.191,24.62792],[-82.191,24.49629],[-81.62166,24.49629],[-81.62166,24.55948],[-81.37201,24.55948],[-81.37201,24.62207],[-81.05933,24.62207],[-81.05933,24.68483],[-80.93471,24.68483],[-80.93471,24.74748],[-80.74711,24.74748],[-80.74711,24.81006],[-80.36299,24.81006],[-80.36299,25.11759],[-80.12234,25.11759],[-80.12234,25.74724],[-80.05885,25.74724],[-80.05885,26.37083],[-79.99584,26.37083],[-79.99584,26.9398],[-80.05873,26.9398],[-80.05873,27.12775],[-80.12263,27.12775],[-80.12263,27.25343],[-80.1847,27.25343],[-80.1847,27.37812],[-80.24617,27.37812],[-80.24617,27.56587],[-80.30948,27.56587],[-80.30948,27.75303],[-80.37215,27.75303],[-80.37215,27.87745],[-80.43515,27.87745],[-80.43515,28.00334],[-80.49661,28.00334],[-80.49661,28.12773],[-80.55872,28.12773],[-80.55872,28.37235],[-80.49663,28.37235],[-80.49663,29.51603],[-81.12136,29.51603],[-81.12136,31.6847],[-80.60187,31.6847],[-80.60187,32.24753],[-79.4921,32.24753],[-79.4921,32.99703],[-79.11165,32.99703],[-79.11165,33.37295],[-78.61536,33.37295],[-78.61536,33.80976],[-77.9317,33.80976],[-77.9317,33.87182],[-77.86923,33.87182],[-77.86923,34.05525],[-77.68264,34.05525],[-77.68264,34.29746],[-77.24535,34.29746],[-77.24535,34.55986],[-76.49733,34.55986],[-76.49733,34.6228],[-76.43376,34.6228],[-76.43376,34.68493],[-76.37321,34.68493],[-76.37321,34.74677],[-76.30594,34.74677],[-76.30594,34.80855],[-76.2468,34.80855],[-76.2468,34.87284],[-76.18259,34.87284],[-76.18259,34.93353],[-76.12081,34.93353],[-76.12081,34.99524],[-75.9979,34.99524],[-75.9979,35.05782],[-75.87034,35.05782],[-75.87034,35.12191],[-75.74622,35.12191],[-75.74622,35.18189],[-75.49297,35.18189],[-75.49297,35.3083],[-75.43257,35.3083],[-75.43257,35.75425],[-75.49699,35.75425],[-75.49699,37.81056],[-75.3083,37.81056],[-75.3083,37.87201],[-75.2456,37.87201],[-75.2456,37.99548],[-75.18288,37.99548],[-75.18288,38.05851],[-75.11848,38.05851],[-75.11848,38.24691],[-75.05921,38.24691],[-75.05921,38.37043],[-74.99481,38.37043],[-74.99481,38.87184],[-74.48783,38.87184],[-74.48783,39.30894],[-74.17663,39.30894],[-74.17663,39.62247],[-74.0567,39.62247],[-74.0567,39.93318],[-73.9959,39.93318],[-73.9959,40.18549],[-73.93416,40.18549],[-73.93416,40.49595],[-73.8723,40.49595],[-73.8723,40.55271],[-71.80745,40.55271],[-71.80745,41.3088],[-70.88251,41.3088],[-70.88251,41.18498],[-70.74619,41.18498],[-70.74619,41.30919],[-70.43376,41.30919],[-70.43376,41.49639],[-69.93343,41.49639],[-69.93343,41.62308],[-69.86986,41.62308],[-69.86986,41.87769],[-69.93579,41.87769],[-69.93579,42.00323],[-69.99758,42.00323],[-69.99758,42.06502],[-70.06061,42.06502],[-70.06061,42.12943],[-70.55729,42.12943],[-70.55729,43.24871],[-70.49741,43.24871],[-70.49741,43.30922],[-70.37042,43.30922],[-70.37042,43.37196],[-70.30857,43.37196],[-70.30857,43.49699],[-70.18392,43.49699],[-70.18392,43.62235],[-70.05758,43.62235],[-70.05758,43.68502],[-69.74552,43.68502],[-69.74552,43.74766],[-69.24728,43.74766],[-69.24728,43.8107],[-69.05607,43.8107],[-69.05607,43.87172],[-68.99505,43.87172],[-68.99505,43.9982],[-68.49637,43.9982],[-68.49637,44.05974],[-68.3081,44.05974],[-68.3081,44.12214],[-68.18518,44.12214],[-68.18518,44.30814],[-67.9956,44.30814],[-67.9956,44.37275],[-67.8103,44.37275],[-67.8103,44.43518],[-67.49653,44.43518],[-67.49653,44.49688],[-67.37102,44.49688],[-67.37102,44.56006],[-67.18488,44.56006],[-67.18488,44.62133],[-67.12212,44.62133],[-67.12212,44.68679],[-67.05936,44.68679],[-67.05936,44.74737],[-66.93111,44.74737],[-66.93111,44.94066],[-66.99468,44.94066],[-66.99468,45.00245],[-67.05958,45.00245],[-67.05958,45.12734],[-67.1202,45.12734],[-67.1202,45.19101],[-67.24698,45.19101],[-67.24698,45.25344],[-67.31775,45.25344],[-67.31775,45.18984],[-67.37075,45.18984],[-67.37075,45.2534],[-67.43269,45.2534],[-67.43269,45.30834],[-67.37086,45.30834],[-67.37086,45.4397],[-67.43056,45.4397],[-67.43056,45.49501],[-67.37099,45.49501],[-67.37099,45.62645],[-67.6215,45.62645],[-67.6215,45.68961],[-67.68383,45.68961],[-67.68383,45.75326],[-67.74621,45.75326],[-67.74621,47.12682],[-67.87001,47.12682],[-67.87001,47.19003],[-67.93238,47.19003],[-67.93238,47.25397],[-67.99594,47.25397],[-67.99594,47.31497],[-68.12067,47.31497],[-68.12067,47.37808],[-68.44232,47.37808],[-68.44232,47.31661],[-68.63143,47.31661],[-68.63143,47.25447],[-68.9978,47.25447],[-68.9978,47.43989],[-69.06072,47.43989],[-69.06072,47.50476],[-69.25381,47.50476],[-69.25381,47.43981],[-69.31793,47.43981],[-69.31793,47.3786],[-69.44385,47.3786],[-69.44385,47.31563],[-69.50382,47.31563],[-69.50382,47.25258],[-69.56678,47.25258],[-69.56678,47.19109],[-69.63035,47.19109],[-69.63035,47.1287],[-69.69331,47.1287],[-69.69331,47.06543],[-69.75571,47.06543],[-69.75571,47.00428],[-69.81804,47.00428],[-69.81804,46.94153],[-69.8804,46.94153],[-69.8804,46.87925],[-69.94217,46.87925],[-69.94217,46.81774],[-70.00631,46.81774],[-70.00631,46.69203],[-70.07043,46.69203],[-70.07043,46.44259],[-70.19459,46.44259],[-70.19459,46.37859],[-70.2562,46.37859],[-70.2562,46.31526],[-70.32037,46.31526],[-70.32037,46.06512],[-70.3815,46.06512],[-70.3815,45.93552],[-70.32016,45.93552],[-70.32016,45.87948],[-70.44931,45.87948],[-70.44931,45.75387],[-70.507,45.75387],[-70.507,45.69169],[-70.63166,45.69169],[-70.63166,45.62916],[-70.75755,45.62916],[-70.75755,45.44147],[-70.88099,45.44147],[-70.88099,45.37806],[-71.13328,45.37806],[-71.13328,45.31515],[-71.38303,45.31515],[-71.38303,45.25342],[-71.50764,45.25342],[-71.50764,45.06557],[-73.94189,45.06557],[-73.94189,45.00312],[-74.74697,45.00312],[-74.74697,45.0649],[-74.8801,45.0649],[-74.8801,45.0029],[-75.06625,45.0029],[-75.06625,44.94152],[-75.25394,44.94152],[-75.25394,44.8776],[-75.37896,44.8776],[-75.37896,44.81535],[-75.44313,44.81535],[-75.44313,44.75361],[-75.56666,44.75361],[-75.56666,44.69099],[-75.62902,44.69099],[-75.62902,44.6285],[-75.75405,44.6285],[-75.75405,44.56638],[-75.81731,44.56638],[-75.81731,44.50289],[-75.87995,44.50289],[-75.87995,44.37849],[-76.13003,44.37849],[-76.13003,44.31592],[-76.1927,44.31592],[-76.1927,44.25344],[-76.31826,44.25344],[-76.31826,44.19167],[-76.3793,44.19167],[-76.3793,44.06537],[-76.44276,44.06537],[-76.44276,43.99638],[-76.31703,43.99638],[-76.31703,43.94146],[-76.50766,43.94146],[-76.50766,43.87233],[-76.383,43.87233],[-76.383,43.80919],[-76.25341,43.80919],[-76.25341,43.56652],[-76.50648,43.56652],[-76.50648,43.50339],[-76.63312,43.50339],[-76.63312,43.44323],[-76.69511,43.44323],[-76.69511,43.37869],[-76.81778,43.37869],[-76.81778,43.31807],[-77.682,43.31807],[-77.682,43.37894],[-78.05659,43.37894],[-78.05659,43.43969],[-78.43897,43.43969],[-78.43897,43.37944],[-78.88034,43.37944],[-78.88034,43.31497],[-79.12989,43.31497],[-79.12989,43.24293],[-79.06696,43.24293],[-79.06696,43.12999],[-79.12989,43.12999],[-79.12989,43.05773],[-79.07126,43.05773],[-79.07126,42.92949],[-78.94326,42.92949],[-78.94326,42.75422],[-79.06944,42.75422],[-79.06944,42.69416],[-79.13344,42.69416],[-79.13344,42.6297],[-79.19475,42.6297],[-79.19475,42.56635],[-79.37868,42.56635],[-79.37868,42.50334],[-79.4443,42.50334],[-79.4443,42.44106],[-79.56799,42.44106],[-79.56799,42.37753],[-79.69062,42.37753],[-79.69062,42.31711],[-79.81646,42.31711],[-79.81646,42.25345],[-80.00524,42.25345],[-80.00524,42.19092],[-80.19168,42.19092],[-80.19168,42.12726],[-80.3168,42.12726],[-80.3168,42.06699],[-80.50632,42.06699],[-80.50632,42.00343],[-80.69305,42.00343],[-80.69305,41.94151],[-80.94404,41.94151],[-80.94404,41.87812],[-81.19427,41.87812],[-81.19427,41.81665],[-81.31901,41.81665],[-81.31901,41.75455],[-81.44184,41.75455],[-81.44184,41.69096],[-81.50535,41.69096],[-81.50535,41.63016],[-82.74701,41.63016],[-82.74701,41.75369],[-82.88391,41.75369],[-82.88391,41.56561],[-82.99572,41.56561],[-82.99572,41.62704],[-83.12578,41.62704],[-83.12578,41.68784],[-83.24747,41.68784],[-83.24747,41.75369],[-83.37373,41.75369],[-83.37373,41.80928],[-83.3106,41.80928],[-83.3106,41.87161],[-83.24747,41.87161],[-83.24747,41.93614],[-83.18434,41.93614],[-83.18434,41.99609],[-83.12077,41.99609],[-83.12077,42.24648],[-83.05892,42.24648],[-83.05892,42.30896],[-82.86853,42.30896],[-82.86853,42.37177],[-82.80722,42.37177],[-82.80722,42.55855],[-82.75537,42.55855],[-82.75537,42.49549],[-82.5599,42.49549],[-82.5599,42.55855],[-82.49678,42.55855],[-82.49678,42.68336],[-82.43289,42.68336],[-82.43289,42.93422],[-82.37006,42.93422],[-82.37006,43.06481],[-82.43289,43.06481],[-82.43289,43.19176],[-82.49475,43.19176],[-82.49475,43.50346],[-82.55713,43.50346],[-82.55713,43.81609],[-82.61979,43.81609],[-82.61979,43.94221],[-82.68395,43.94221],[-82.68395,44.00226],[-82.74653,44.00226],[-82.74653,44.06705],[-82.87087,44.06705],[-82.87087,44.12919],[-83.00852,44.12919],[-83.00852,44.06648],[-83.13361,44.06648],[-83.13361,44.00539],[-83.24145,44.00539],[-83.24145,44.9962],[-83.18061,44.9962],[-83.18061,45.0673],[-83.24552,45.0673],[-83.24552,45.12874],[-83.30659,45.12874],[-83.30659,45.25515],[-83.37061,45.25515],[-83.37061,45.31659],[-83.43256,45.31659],[-83.43256,45.37921],[-83.61784,45.37921],[-83.61784,45.44197],[-83.80843,45.44197],[-83.80843,45.50362],[-84.05507,45.50362],[-84.05507,45.56479],[-84.12352,45.56479],[-84.12352,45.62878],[-84.18075,45.62878],[-84.18075,45.69147],[-84.31116,45.69147],[-84.31116,45.93371],[-83.821,45.93371],[-83.821,45.87251],[-83.49681,45.87251],[-83.49681,45.93371],[-83.43381,45.93371],[-83.43381,46.00169],[-83.49627,46.00169],[-83.49627,46.06682],[-83.56,46.06682],[-83.56,46.12616],[-83.99546,46.12616],[-83.99546,46.19317],[-84.05918,46.19317],[-84.05918,46.3815],[-84.11526,46.3815],[-84.11526,46.49536],[-84.05918,46.49536],[-84.05918,46.56827],[-84.25795,46.56827],[-84.25795,46.50512],[-84.30719,46.50512],[-84.30719,46.56827],[-84.44154,46.56827],[-84.44154,46.50453],[-84.99657,46.50453],[-84.99657,46.68429],[-84.92982,46.68429],[-84.92982,46.81808],[-85.31659,46.81808],[-85.31659,46.75358],[-87.55626,46.75358],[-87.55626,47.44074],[-87.68254,47.44074],[-87.68254,47.50356],[-88.25607,47.50356],[-88.25607,47.44337],[-88.44174,47.44337],[-88.44174,47.37899],[-88.50683,47.37899],[-88.50683,47.31539],[-88.63128,47.31539],[-88.63128,47.25398],[-88.75696,47.25398],[-88.75696,47.19347],[-88.88383,47.19347],[-88.88383,47.12847],[-88.94342,47.12847],[-88.94342,47.06621],[-89.07087,47.06621],[-89.07087,47.00268],[-89.25656,47.00268],[-89.25656,46.94108],[-90.36777,46.94108],[-90.36777,47.68448],[-90.307,47.68448],[-90.307,47.74602],[-89.99486,47.74602],[-89.99486,47.80827],[-89.80486,47.80827],[-89.80486,47.87006],[-89.67977,47.87006],[-89.67977,47.93396],[-89.49338,47.93396],[-89.49338,47.9958],[-89.42847,47.9958],[-89.42847,48.06564],[-89.99327,48.06564],[-89.99327,48.1283],[-90.74559,48.1283],[-90.74559,48.18931],[-90.80873,48.18931],[-90.80873,48.25221],[-91.06776,48.25221],[-91.06776,48.19167],[-91.19462,48.19167],[-91.19462,48.1279],[-91.68142,48.1279],[-91.68142,48.2526],[-91.93219,48.2526],[-91.93219,48.31425],[-91.99297,48.31425],[-91.99297,48.37808],[-92.31894,48.37808],[-92.31894,48.25291],[-92.37322,48.25291],[-92.37322,48.31534],[-92.43223,48.31534],[-92.43223,48.44114],[-92.49772,48.44114],[-92.49772,48.50178],[-92.56794,48.50178],[-92.56794,48.43958],[-92.62105,48.43958],[-92.62105,48.56508],[-92.80868,48.56508],[-92.80868,48.62869],[-92.80868,48.62674],[-92.93318,48.62674],[-92.93318,48.69221],[-93.00517,48.69221],[-93.00517,48.6283],[-93.12259,48.6283],[-93.12259,48.69221],[-93.31908,48.69221],[-93.31908,48.62674],[-93.50495,48.62674],[-93.50495,48.56352],[-93.74746,48.56352],[-93.74746,48.62674],[-93.81355,48.62674],[-93.81355,48.68988],[-94.24531,48.68988],[-94.24531,48.75543],[-94.61832,48.75543],[-94.61832,48.94104],[-94.6809,48.94104],[-94.6809,49.00297],[-94.74415,49.00297],[-94.74415,49.25361],[-94.80841,49.25361],[-94.80841,49.37841],[-95.11924,49.37841],[-95.11924,49.44253],[-95.19343,49.44253],[-95.19343,49.00353],[-96.87069,49.00353],[-96.87069,49.06561],[-99.00493,49.06561],[-99.00493,49.00507],[-109.36993,49.00507],[-109.36993,49.06682],[-109.50587,49.06682],[-109.50587,49.00507],[-114.183,49.00507],[-114.183,49.06873],[-114.75787,49.06873],[-114.75787,49.00507],[-115.43373,49.00507],[-115.43373,49.06714],[-116.50627,49.06714],[-116.50627,49.00507],[-117.30895,49.00507],[-117.30895,49.06598],[-119.88295,49.06598],[-119.88295,49.00507],[-120.12086,49.00507],[-120.12086,49.06784],[-121.44516,49.06784],[-121.44516,49.00507],[-121.93118,49.00507],[-121.93118,49.06561],[-122.81748,49.06561],[-122.81748,49.00291],[-122.87952,49.00291],[-122.87952,48.9347],[-122.81746,48.9347],[-122.81746,48.8102],[-122.75389,48.8102],[-122.75389,48.75338],[-122.87129,48.75338],[-122.87129,48.81539],[-123.00554,48.81539],[-123.00554,48.75295],[-123.12969,48.75295],[-123.12969,48.69022],[-123.18382,48.69022],[-123.18382,48.7529],[-123.25493,48.7529]],[[-122.93417,37.75215],[-122.93475,37.6842],[-123.0679,37.6849],[-123.06737,37.74753],[-123.12926,37.74785],[-123.12869,37.81569],[-123.05907,37.81532],[-123.05959,37.75281],[-122.93417,37.75215]],[[-71.62995,41.25409],[-71.49665,41.25414],[-71.49656,41.12297],[-71.62986,41.12291],[-71.62995,41.25409]],[[-70.31843,41.37752],[-70.31834,41.24482],[-70.19066,41.24487],[-70.19062,41.1886],[-69.9336,41.1887],[-69.93373,41.37919],[-69.99507,41.37917],[-69.99511,41.44316],[-70.07078,41.44313],[-70.0707,41.31449],[-70.24617,41.31443],[-70.24621,41.37755],[-70.31843,41.37752]],[[-68.94034,43.94041],[-68.68569,43.9405],[-68.68565,43.87218],[-68.74654,43.87216],[-68.7465,43.81025],[-68.80908,43.81023],[-68.80903,43.74673],[-68.87731,43.7467],[-68.87735,43.81178],[-68.94025,43.81176],[-68.94034,43.94041]],[[-123.12915,49.06451],[-122.99542,49.06451],[-122.99542,48.93432],[-123.12915,48.93432],[-123.12915,49.06451]],[[-82.94071,24.75359],[-82.87194,24.75359],[-82.87194,24.69057],[-82.74462,24.69057],[-82.74462,24.62146],[-82.8088,24.62146],[-82.8088,24.55949],[-82.94071,24.55949],[-82.94071,24.75359]]],icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{id:"USGS-Scanned_Topographic",name:"USGS Topographic Maps",type:"tms",template:"https://caltopo.s3.amazonaws.com/topo/{zoom}/{x}/{y}.png",zoomExtent:[0,16],polygon:[[[-55.99594,52.00107],[-112.02896,52.00107],[-112.03995,56.01308],[-120.00494,56.00592],[-120.01712,60.01202],[-132.00197,60.00239],[-132.01208,63.00193],[-133.96883,63.0005],[-133.9724,63.99225],[-141.04429,63.98726],[-141.06879,69.92046],[-156.24893,71.51583],[-160.44571,70.83527],[-167.08145,68.42906],[-164.08218,67.03914],[-169.01504,65.68269],[-166.57608,64.50778],[-161.82999,64.05006],[-165.08194,63.2603],[-168.02628,59.78623],[-162.53311,59.73089],[-162.35733,58.55905],[-157.83096,58.31753],[-158.00674,57.52404],[-168.22403,53.51022],[-166.55411,53.14277],[-158.77579,54.88541],[-158.6824,55.74964],[-156.55106,56.00848],[-156.15555,56.77466],[-154.70535,56.14337],[-152.07413,57.37035],[-151.62918,58.22653],[-152.00821,58.98056],[-145.9877,60.24741],[-140.38467,59.48634],[-136.53946,57.8061],[-133.79288,54.83483],[-133.33145,53.14277],[-131.46378,51.69838],[-128.52493,51.74602],[-129.79385,50.90159],[-124.56436,47.49786],[-124.03702,45.48627],[-124.6962,42.90428],[-124.49844,40.34146],[-122.80655,37.53929],[-119.99405,33.37085],[-117.24747,32.5412],[-111.13907,31.1977],[-106.70059,31.23529],[-103.20694,28.64618],[-101.84463,29.8158],[-99.20792,26.28744],[-96.79092,25.75432],[-96.92276,27.96911],[-93.47305,29.68226],[-88.94669,28.87732],[-88.6171,30.17736],[-86.2001,30.36713],[-84.96963,29.43379],[-84.09073,30.06333],[-82.97012,28.95426],[-82.97012,27.26824],[-81.25626,25.07956],[-82.09122,24.56105],[-80.06973,24.76073],[-79.85001,27.11188],[-81.27823,30.70777],[-78.99307,33.20554],[-75.03799,35.5983],[-75.85098,37.24252],[-73.74161,40.4586],[-69.89639,41.60224],[-70.68741,43.17629],[-66.93008,44.69516],[-66.53458,43.08007],[-64.20547,43.35229],[-59.50333,45.73221],[-59.51431,46.24762],[-60.0032,46.25901],[-59.99222,47.24506],[-59.00894,47.2376],[-58.99796,47.50267],[-56.51504,47.50267],[-56.52603,46.7477],[-53.99918,46.7477],[-53.9772,46.48358],[-52.49405,46.46354],[-52.50504,48.75361],[-52.99667,48.75451],[-53.01315,49.99551],[-55.00168,50.0061],[-55.03738,53.74721],[-56.00418,53.73421],[-55.99594,52.00107]],[[-59.50127,43.74954],[-60.5024,43.74954],[-60.5024,44],[-59.9984,44],[-59.9984,44.2494],[-59.50127,44.2494],[-59.50127,43.74954]],[[-155.95024,20.49523],[-157.32675,20.49153],[-157.32903,21.23181],[-155.95251,21.23549],[-155.95024,20.49523]],[[-157.64488,21.24845],[-158.28534,21.24674],[-158.2869,21.74996],[-157.64643,21.75167],[-157.64488,21.24845]],[[-156.12602,20.3247],[-154.74617,20.32841],[-154.74174,18.87578],[-156.1216,18.87203],[-156.12602,20.3247]],[[-159.29077,22.24504],[-159.2893,21.76857],[-160.28917,21.76591],[-160.29064,22.24239],[-159.29077,22.24504]]],terms_url:"https://caltopo.com",terms_text:"© Caltopo",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{id:"USSR-Latvia",name:"USSR - Latvia",type:"wms",template:"http://www.gisnet.lv/cgi-bin/topo?FORMAT=image/jpeg&VERSION=1.1.1&service=WMS&REQUEST=GetMap&LAYERS=DTO,DTC,DIVDPTC,PD,VS,DS,PS,M&SRS={proj}&WIDTH={width}&height={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[26.63086,57.56889],[25.16968,58.04882],[22.54395,57.76866],[21.54419,57.53352],[21.01685,56.81892],[21.01685,56.03523],[22.03857,56.38958],[24.71924,56.33481],[26.75171,55.66519],[28.19092,56.13943],[27.78442,57.40946],[26.63086,57.56889]]]},{id:"sjcgis.org-General_Basemap_WM",name:"Vector Streetmap for San Juan County WA",type:"tms",template:"https://sjcgis.org/arcgis/rest/services/Basemaps/General_Basemap_WM/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[0,19],polygon:[[[-123.27402,48.69297],[-123.00773,48.76726],[-123.00762,48.83158],[-122.7835,48.75842],[-122.6934,48.65852],[-122.76745,48.60361],[-122.74484,48.38708],[-123.24822,48.28353],[-123.11452,48.42261],[-123.21904,48.54857],[-123.27402,48.69297]]],best:true,description:"Public domain street and address data from the San Juan County, WA. Updated at least quarterly."},{id:"Vercors-Orthophotos-1999",name:"Vercors (Réserve naturelle des Hauts-Plateaux du Vercors) - Orthophoto - 1999 - 1 m",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/PNRVercors-RHP-1999/{zoom}/{x}/{y}",endDate:"1999-01-01T00:00:00.000Z",startDate:"1999-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[5.43565,44.99918],[5.43193,44.9229],[5.43624,44.92284],[5.43472,44.89001],[5.43303,44.88995],[5.43065,44.85026],[5.43387,44.85014],[5.43285,44.82638],[5.43548,44.82626],[5.43497,44.8139],[5.44106,44.81372],[5.43717,44.74098],[5.4546,44.74044],[5.45282,44.70425],[5.5211,44.70245],[5.5233,44.73858],[5.58904,44.73684],[5.59298,44.81263],[5.5879,44.81299],[5.58977,44.84947],[5.58823,44.84938],[5.58972,44.87351],[5.53863,44.87503],[5.53947,44.88686],[5.52834,44.88733],[5.53002,44.92012],[5.53319,44.92012],[5.53761,44.99624],[5.43565,44.99918]]],terms_text:"Parc Naturel du Vercors"},{id:"vicosa_al",name:"Viçosa AL",type:"wms",template:"http://geo.seplande.al.gov.br/teogc/terraogcwms.cgi?LAYERS=Vicosa&SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.0&SERVICE=WMS&REQUEST=GetMap&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[-36.198,-9.42067],[-36.19777,-9.41789],[-36.1978,-9.41528],[-36.19801,-9.41074],[-36.19789,-9.40857],[-36.19793,-9.40637],[-36.19797,-9.40561],[-36.19793,-9.40405],[-36.19799,-9.40312],[-36.19827,-9.40028],[-36.19829,-9.39496],[-36.19789,-9.39169],[-36.19844,-9.38932],[-36.19837,-9.3862],[-36.19794,-9.38167],[-36.19801,-9.37972],[-36.19834,-9.37867],[-36.19832,-9.37698],[-36.19817,-9.37586],[-36.19852,-9.37139],[-36.19822,-9.36239],[-36.19862,-9.35319],[-36.19849,-9.35097],[-36.19857,-9.34852],[-36.1988,-9.34668],[-36.1986,-9.34349],[-36.19877,-9.34084],[-36.19895,-9.33301],[-36.19877,-9.33039],[-36.28958,-9.33114],[-36.28938,-9.33319],[-36.2895,-9.33538],[-36.28925,-9.34124],[-36.28945,-9.34291],[-36.28928,-9.34521],[-36.28897,-9.37311],[-36.28915,-9.37481],[-36.28892,-9.37708],[-36.2889,-9.38541],[-36.28872,-9.38633],[-36.28872,-9.39343],[-36.28887,-9.39558],[-36.28877,-9.40129],[-36.28862,-9.40652],[-36.28872,-9.40715],[-36.28877,-9.42133],[-36.198,-9.42067]]],terms_url:"http://www.seplande.al.gov.br",terms_text:"Secretaria de Estado do Planejamento e Desenvolvimento Econômico"},{id:"wien.gv.at-labels",name:"Vienna: Beschriftungen (annotations)",type:"tms",template:"https://maps.wien.gv.at/wmts/beschriftung/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[12,19],polygon:[[[16.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif",overlay:true},{id:"wien.gv.at-gp",name:"Vienna: Mehrzweckkarte (general purpose)",type:"tms",template:"https://maps.wien.gv.at/wmts/fmzk/pastell/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[10,19],polygon:[[[16.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{id:"wien.gv.at-aerial_image",name:"Vienna: Orthofoto (aerial image)",type:"tms",template:"https://maps.wien.gv.at/wmts/lb/farbe/google3857/{zoom}/{y}/{x}.jpeg",zoomExtent:[10,19],polygon:[[[16.14995,48.10832],[16.14989,48.33315],[16.61873,48.33296],[16.61749,48.10813],[16.46644,48.10819],[16.46644,48.10744],[16.18104,48.10756],[16.18104,48.10831],[16.14995,48.10832]]],terms_url:"https://data.wien.gv.at",terms_text:"Stadt Wien",icon:"https://www.wien.gv.at/layout-a/logo/wappen-klein.gif"},{id:"Ville_de_Nyon-HD-2010",name:"Ville de Nyon - Orthophoto 2010 HD 5cm/pi",type:"tms",template:"http://osmdata.asitvd.ch/tiles/nyon2010/{zoom}/{x}/{y}.png",endDate:"2010-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[14,20],polygon:[[[6.24859,46.38252],[6.24848,46.38715],[6.24378,46.38944],[6.24182,46.39109],[6.2414,46.39159],[6.23919,46.39222],[6.23973,46.39373],[6.2379,46.3946],[6.23713,46.39698],[6.23071,46.40107],[6.22789,46.39903],[6.22326,46.40219],[6.22066,46.40189],[6.21582,46.40462],[6.21393,46.40698],[6.20989,46.40563],[6.20928,46.40528],[6.20985,46.40434],[6.20501,46.40332],[6.20527,46.40104],[6.20906,46.40131],[6.20951,46.4013],[6.2149,46.4008],[6.21154,46.39808],[6.21057,46.3968],[6.20954,46.39449],[6.21229,46.39243],[6.21374,46.39168],[6.21639,46.39079],[6.21296,46.38736],[6.21532,46.38514],[6.21403,46.38424],[6.2126,46.38232],[6.21211,46.38102],[6.21212,46.37992],[6.21231,46.37901],[6.21318,46.37697],[6.21454,46.37494],[6.21359,46.37463],[6.21365,46.37276],[6.22133,46.3699],[6.22752,46.36555],[6.22752,46.36541],[6.23738,46.37356],[6.24404,46.37842],[6.24859,46.38252]]],terms_url:"http://www.nyon.ch/fr/officiel/services-offices/informatique-et-population-776-3911",terms_text:"Ville de Nyon"},{id:"VGIN-BuildingFootprints_WM",name:"Virginia Building Footprint Map Service",type:"tms",template:"https://gismaps.vita.virginia.gov/arcgis/rest/services/VA_Base_layers/VA_Building_Footprints/MapServer/tile/{zoom}/{y}/{x}",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=bcd049dfcdc342a7a08ec81644eeb339",terms_text:"Virginia Geographic Information Network (VGIN)",description:"Virginia Building Footprint Map Service",overlay:true},{id:"VGIN-Imagery_WM",name:"Virginia Imagery Service - Most Recent, WGS Web Mercator (VBMP)",type:"tms",template:"https://gismaps.vita.virginia.gov/arcgis/rest/services/MostRecentImagery/MostRecentImagery_WGS/MapServer/tile/{zoom}/{y}/{x}",endDate:"2018-08-01T00:00:00.000Z",startDate:"2013-04-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=36386a7e7dae4032a33cb0b83a1711f1",terms_text:"Virginia Geographic Information Network (VGIN)",description:"The most recently available VBMP orthoimagery for all of Virginia."},{id:"VGIN-PropertyLines_WM",name:"Virginia Tax Parcels Map Service",type:"tms",template:"https://gismaps.vita.virginia.gov/arcgis/rest/services/VA_Base_layers/VA_Parcels/MapServer/tile/{zoom}/{y}/{x}",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=f1dccaf1f42e40cbba791feae2e23690",terms_text:"Virginia Geographic Information Network (VGIN)",description:"A statewide Parcel service showing property ownership outlines where available",overlay:true},{id:"vogis.cnv.at-DGM",name:"VoGIS: DGM (Terrain model)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_terrain&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-DOM",name:"VoGIS: DOM (Surface model)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_hoehen_und_gelaende_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=schummerung_50cm_surface&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-ef2012_12cm",name:"VoGIS: Echtfarbenbild 2012 (12cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2012_12cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[9.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-ef2015_10cm",name:"VoGIS: Echtfarbenbild 2015 (10cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ef2015_10cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[9.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"vogis.cnv.at-wi2015_20cm",name:"VoGIS: Echtfarbenbild Winter 2015 (20cm)",type:"wms",template:"http://vogis.cnv.at/mapserver/mapserv?map=i_luftbilder_r_wms.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=wi2015_20cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[10.17039,46.82979],[10.17108,46.93644],[10.18413,46.94113],[10.1855,47.10157],[10.23906,47.10437],[10.24283,47.15611],[10.25691,47.18704],[10.24558,47.27597],[10.25313,47.32347],[10.26893,47.32626],[10.26446,47.41102],[10.13194,47.4087],[10.13434,47.46107],[10.11752,47.46153],[10.11889,47.47337],[10.08731,47.47429],[10.08491,47.50724],[10.06843,47.507],[10.0674,47.5215],[10.02345,47.52428],[10.00079,47.57943],[9.84904,47.57757],[9.85042,47.61462],[9.72751,47.61277],[9.7203,47.59089],[9.70347,47.58915],[9.70313,47.54491],[9.68219,47.54491],[9.68047,47.55348],[9.56391,47.54931],[9.56202,47.53958],[9.55172,47.53958],[9.55172,47.53402],[9.52168,47.53471],[9.52701,47.30497],[9.50503,47.30264],[9.50091,47.23368],[9.52357,47.23228],[9.52426,47.16557],[9.54486,47.16405],[9.54383,47.15448],[9.57232,47.15401],[9.57026,47.12809],[9.59018,47.12867],[9.59189,47.10029],[9.57232,47.10017],[9.57713,47.02861],[9.72407,47.03048],[9.72304,47.01749],[9.77454,47.01562],[9.77626,47.00555],[9.79274,47.00391],[9.7948,46.99127],[9.83874,46.99314],[9.84012,46.90349],[9.89024,46.90725],[9.88543,46.88707],[9.95925,46.89141],[9.962,46.87675],[10.0001,46.87862],[9.99667,46.85715],[10.01864,46.85656],[10.02345,46.83073],[10.17039,46.82979]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"wroclaw-orto2015",name:"Wrocław: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis1.um.wroc.pl/arcgis/services/ogc/OGC_ortofoto_2015/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[17.14217,51.12846],[17.15659,51.1499],[17.15933,51.16056],[17.15899,51.17886],[17.14371,51.18155],[17.13024,51.18128],[17.12466,51.17396],[17.11436,51.17746],[17.0778,51.17746],[17.07642,51.1766],[17.07548,51.16825],[17.06698,51.16745],[17.04698,51.17493],[17.03376,51.17729],[17.02741,51.17729],[17.02733,51.18246],[17.02252,51.18816],[17.01299,51.18816],[17.0093,51.18499],[17.00312,51.18504],[17.00261,51.20016],[16.99162,51.20559],[16.97008,51.20763],[16.96424,51.20989],[16.95394,51.20968],[16.94656,51.20586],[16.9233,51.2001],[16.90811,51.21043],[16.89927,51.21027],[16.89292,51.2071],[16.88322,51.2071],[16.88073,51.20489],[16.88047,51.19666],[16.88322,51.19048],[16.87403,51.18719],[16.87026,51.18203],[16.85455,51.18031],[16.8421,51.18488],[16.82434,51.18467],[16.82056,51.17875],[16.82099,51.16373],[16.82502,51.15647],[16.80915,51.15194],[16.80657,51.14613],[16.80648,51.1366],[16.80769,51.13595],[16.81687,51.13601],[16.8161,51.13337],[16.81636,51.12459],[16.82932,51.12329],[16.83266,51.11834],[16.82923,51.11386],[16.82923,51.10993],[16.83215,51.10869],[16.84949,51.10826],[16.85661,51.09899],[16.87901,51.09252],[16.88862,51.09258],[16.89197,51.09667],[16.92107,51.09662],[16.9209,51.09263],[16.91661,51.0812],[16.91686,51.07942],[16.93514,51.07948],[16.93849,51.0736],[16.95248,51.06686],[16.95068,51.05806],[16.95454,51.05369],[16.96188,51.0473],[16.96879,51.04568],[16.98072,51.04584],[16.98424,51.05197],[16.99969,51.04668],[17.00776,51.04422],[17.01973,51.04169],[17.03286,51.0419],[17.03415,51.04673],[17.04509,51.04339],[17.06363,51.04339],[17.07037,51.05286],[17.08363,51.04428],[17.095,51.04368],[17.10633,51.04376],[17.10835,51.04684],[17.10822,51.05377],[17.10226,51.05868],[17.11136,51.0716],[17.12341,51.07179],[17.12299,51.07856],[17.15088,51.07861],[17.17277,51.09344],[17.17277,51.09956],[17.17697,51.10303],[17.17676,51.1092],[17.16363,51.1203],[17.14217,51.12846]]],terms_text:"Urząd Miasta Wrocław",icon:"https://i.imgur.com/PRqROXB.png"},{id:"Zabrze-2011",name:"Zabrze: Orthophotomap 2011 (aerial image)",type:"wms",template:"http://siot.um.zabrze.pl/arcgis/services/UMZ_Ortofoto_2011/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.74396,50.2753],[18.75586,50.27523],[18.75578,50.27633],[18.74516,50.28105],[18.74609,50.28886],[18.75084,50.28948],[18.74832,50.2957],[18.73379,50.29618],[18.73208,50.31571],[18.73613,50.31646],[18.73882,50.32763],[18.73725,50.33016],[18.73121,50.33169],[18.73054,50.3344],[18.73422,50.3371],[18.73428,50.34097],[18.73866,50.34308],[18.75419,50.34182],[18.75982,50.34624],[18.75438,50.34744],[18.75119,50.34979],[18.74603,50.36876],[18.75705,50.3692],[18.7639,50.36754],[18.77263,50.37628],[18.78436,50.37077],[18.78713,50.37295],[18.79821,50.37048],[18.80466,50.37561],[18.80165,50.37718],[18.80164,50.38222],[18.80509,50.38317],[18.81527,50.38167],[18.81446,50.37515],[18.82183,50.36883],[18.81737,50.36802],[18.82104,50.35843],[18.8159,50.35336],[18.81687,50.35076],[18.82294,50.35156],[18.83281,50.34962],[18.83474,50.3443],[18.84615,50.34448],[18.86293,50.32852],[18.8607,50.32776],[18.85088,50.33191],[18.84578,50.32923],[18.84891,50.32352],[18.83179,50.32028],[18.83192,50.30483],[18.84451,50.30286],[18.84429,50.29627],[18.82282,50.28615],[18.82845,50.28482],[18.82745,50.27972],[18.82322,50.27994],[18.8214,50.27414],[18.81392,50.27309],[18.79981,50.27351],[18.7987,50.2613],[18.7923,50.24641],[18.78261,50.24583],[18.76416,50.25145],[18.75396,50.25669],[18.75004,50.26402],[18.73991,50.26738],[18.73421,50.27084],[18.74396,50.2753]]],terms_text:"Urząd Miasta Zabrza"}];
23658 var presets = {aerialway:{fields:["aerialway"],geometry:["point","vertex","line"],tags:{aerialway:"*"},terms:["ski lift","funifor","funitel"],searchable:false,name:"Aerialway"},aeroway:{icon:"maki-airport",fields:["aeroway"],geometry:["point","vertex","line","area"],tags:{aeroway:"*"},searchable:false,name:"Aeroway"},amenity:{fields:["amenity"],geometry:["point","vertex","area"],tags:{amenity:"*"},searchable:false,name:"Amenity"},circular:{geometry:["vertex","line"],fields:["name"],tags:{junction:"circular"},name:"Traffic Circle",searchable:false},highway:{fields:["name","highway"],geometry:["point","vertex","line","area"],tags:{highway:"*"},searchable:false,name:"Highway"},place:{fields:["name","place"],geometry:["point","vertex","area"],tags:{place:"*"},searchable:false,name:"Place"},power:{geometry:["point","vertex","line","area"],tags:{power:"*"},fields:["power"],searchable:false,name:"Power"},railway:{fields:["railway"],geometry:["point","vertex","line","area"],tags:{railway:"*"},searchable:false,name:"Railway"},roundabout:{geometry:["vertex","line"],fields:["name"],tags:{junction:"roundabout"},name:"Roundabout",searchable:false},waterway:{fields:["name","waterway"],geometry:["point","vertex","line","area"],tags:{waterway:"*"},searchable:false,name:"Waterway"},address:{fields:["address"],geometry:["point","vertex","area"],tags:{"addr:*":"*"},addTags:{},removeTags:{},reference:{key:"addr"},name:"Address",matchScore:0.15},"advertising/billboard":{fields:["direction","lit"],geometry:["point","vertex","line"],tags:{advertising:"billboard"},name:"Billboard"},"advertising/column":{fields:["direction","lit"],geometry:["point","area"],tags:{advertising:"column"},name:"Advertising Column"},"aerialway/station":{icon:"maki-aerialway",geometry:["point","vertex","area"],fields:["aerialway/access","aerialway/summer/access","elevation","building_area"],tags:{aerialway:"station"},name:"Aerialway Station",searchable:false},"aerialway/cable_car":{geometry:["line"],terms:["tramway","ropeway"],fields:["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/heating"],tags:{aerialway:"cable_car"},name:"Cable Car"},"aerialway/chair_lift":{geometry:["line"],fields:["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],tags:{aerialway:"chair_lift"},name:"Chair Lift"},"aerialway/drag_lift":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"drag_lift"},name:"Drag Lift"},"aerialway/gondola":{geometry:["line"],fields:["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],tags:{aerialway:"gondola"},name:"Gondola"},"aerialway/goods":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"goods"},name:"Goods Aerialway"},"aerialway/magic_carpet":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration","aerialway/heating"],tags:{aerialway:"magic_carpet"},name:"Magic Carpet Lift"},"aerialway/mixed_lift":{geometry:["line"],fields:["name","aerialway/occupancy","aerialway/capacity","aerialway/duration","aerialway/bubble","aerialway/heating"],tags:{aerialway:"mixed_lift"},name:"Mixed Lift"},"aerialway/platter":{geometry:["line"],terms:["button lift","poma lift"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"platter"},name:"Platter Lift"},"aerialway/pylon":{geometry:["point","vertex"],fields:["ref"],tags:{aerialway:"pylon"},name:"Aerialway Pylon"},"aerialway/rope_tow":{geometry:["line"],terms:["handle tow","bugel lift"],fields:["name","aerialway/capacity","aerialway/duration"],tags:{aerialway:"rope_tow"},name:"Rope Tow Lift"},"aerialway/t-bar":{geometry:["line"],fields:["name","aerialway/capacity","aerialway/duration"],terms:["tbar"],tags:{aerialway:"t-bar"},name:"T-bar Lift"},"aeroway/aerodrome":{icon:"maki-airport",geometry:["point","area"],fields:["name","iata","icao","operator","internet_access","internet_access/fee","internet_access/ssid"],terms:["aerodrome","aeroway","airplane","airport","jet","plane"],tags:{aeroway:"aerodrome"},matchScore:0.9,name:"Airport"},"aeroway/apron":{icon:"maki-airport",geometry:["area"],terms:["ramp"],fields:["ref","surface"],tags:{aeroway:"apron"},name:"Apron"},"aeroway/gate":{icon:"maki-airport",geometry:["point"],fields:["ref_aeroway_gate"],tags:{aeroway:"gate"},name:"Airport Gate"},"aeroway/hangar":{geometry:["area"],fields:["name","building_area"],tags:{aeroway:"hangar"},name:"Hangar"},"aeroway/helipad":{icon:"maki-heliport",geometry:["point","area"],fields:["ref"],terms:["helicopter","helipad","heliport"],tags:{aeroway:"helipad"},name:"Helipad"},"aeroway/runway":{geometry:["line","area"],terms:["landing strip"],fields:["ref_runway","surface","length","width"],tags:{aeroway:"runway"},name:"Runway"},"aeroway/taxiway":{geometry:["line"],fields:["ref_taxiway","surface"],tags:{aeroway:"taxiway"},name:"Taxiway"},"aeroway/terminal":{icon:"maki-airport",geometry:["point","area"],terms:["airport","aerodrome"],fields:["name","operator","building_area"],tags:{aeroway:"terminal"},name:"Airport Terminal"},"allotments/plot":{geometry:["area"],fields:["name","ref"],tags:{allotments:"plot"},reference:{key:"allotments",value:"plot"},name:"Community Garden Plot"},"amenity/bus_station":{icon:"maki-bus",fields:["name","building_area","operator","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{amenity:"bus_station"},name:"Bus Station / Terminal",searchable:false},"amenity/coworking_space":{icon:"maki-commercial",fields:["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{amenity:"coworking_space"},name:"Coworking Space",searchable:false},"amenity/ferry_terminal":{icon:"maki-ferry",fields:["name","network","operator","address","building_area"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"ferry_terminal"},name:"Ferry Station / Terminal",searchable:false},"amenity/nursing_home":{icon:"maki-wheelchair",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],tags:{amenity:"nursing_home"},reference:{key:"social_facility",value:"nursing_home"},name:"Nursing Home",searchable:false},"amenity/register_office":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],tags:{amenity:"register_office"},reference:{key:"government",value:"register_office"},name:"Register Office",searchable:false},"amenity/scrapyard":{icon:"maki-car",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{amenity:"scrapyard"},reference:{key:"industrial",value:"scrap_yard"},name:"Scrap Yard",searchable:false},"amenity/swimming_pool":{icon:"maki-swimming",geometry:["point","vertex","area"],tags:{amenity:"swimming_pool"},reference:{key:"leisure",value:"swimming_pool"},name:"Swimming Pool",searchable:false},"amenity/animal_boarding":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_boarding"],geometry:["point","area"],terms:["boarding","cat","cattery","dog","horse","kennel","kitten","pet","pet boarding","pet care","pet hotel","puppy","reptile"],tags:{amenity:"animal_boarding"},name:"Animal Boarding Facility"},"amenity/animal_breeding":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_breeding"],geometry:["point","area"],terms:["breeding","bull","cat","cow","dog","horse","husbandry","kitten","livestock","pet breeding","puppy","reptile"],tags:{amenity:"animal_breeding"},name:"Animal Breeding Facility"},"amenity/animal_shelter":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours","animal_shelter"],geometry:["point","area"],terms:["adoption","aspca","cat","dog","horse","kitten","pet care","pet rescue","puppy","raptor","reptile","rescue","spca"],tags:{amenity:"animal_shelter"},name:"Animal Shelter"},"amenity/arts_centre":{icon:"maki-theatre",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],terms:[],tags:{amenity:"arts_centre"},name:"Arts Center"},"amenity/atm":{icon:"maki-bank",fields:["operator","network","cash_in","currency_multi","drive_through"],geometry:["point","vertex"],terms:["money","cash","machine"],tags:{amenity:"atm"},name:"ATM"},"amenity/bank":{icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],terms:["credit union","check","deposit","fund","investment","repository","reserve","safe","savings","stock","treasury","trust","vault"],tags:{amenity:"bank"},name:"Bank"},"amenity/bar":{icon:"maki-bar",fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],geometry:["point","area"],terms:["dive","beer","bier","booze"],tags:{amenity:"bar"},name:"Bar"},"amenity/bbq":{icon:"maki-bbq",fields:["covered","fuel","access_simple"],geometry:["point"],terms:["bbq","grill"],tags:{amenity:"bbq"},name:"Barbecue/Grill"},"amenity/bench":{icon:"temaki-bench",fields:["backrest"],geometry:["point","vertex","line"],terms:["seat"],tags:{amenity:"bench"},name:"Bench"},"amenity/bicycle_parking":{icon:"maki-bicycle",fields:["bicycle_parking","capacity","operator","covered","access_simple"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_parking"},name:"Bicycle Parking"},"amenity/bicycle_rental":{icon:"maki-bicycle",fields:["capacity","network","operator","payment_multi"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_rental"},name:"Bicycle Rental"},"amenity/bicycle_repair_station":{icon:"maki-bicycle",fields:["operator","brand","opening_hours","fee","service/bicycle"],geometry:["point","vertex"],terms:["bike","repair","chain","pump"],tags:{amenity:"bicycle_repair_station"},name:"Bicycle Repair Tool Stand"},"amenity/biergarten":{icon:"maki-beer",fields:["name","address","building","opening_hours","smoking","outdoor_seating","brewery"],geometry:["point","area"],tags:{amenity:"biergarten"},terms:["beer","bier","booze"],name:"Biergarten"},"amenity/boat_rental":{fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"boat_rental"},name:"Boat Rental"},"amenity/bureau_de_change":{icon:"maki-bank",fields:["name","currency_multi","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["bureau de change","money changer"],tags:{amenity:"bureau_de_change"},name:"Currency Exchange"},"amenity/cafe":{icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],geometry:["point","area"],terms:["bistro","coffee","tea"],tags:{amenity:"cafe"},name:"Cafe"},"amenity/car_pooling":{icon:"maki-car",fields:["name","operator","capacity"],geometry:["point","area"],tags:{amenity:"car_pooling"},name:"Car Pooling"},"amenity/car_rental":{icon:"maki-car",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental"},name:"Car Rental"},"amenity/car_sharing":{icon:"maki-car",fields:["name","operator","capacity","payment_multi"],geometry:["point","area"],tags:{amenity:"car_sharing"},name:"Car Sharing"},"amenity/car_wash":{icon:"maki-car",fields:["address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"car_wash"},name:"Car Wash"},"amenity/casino":{icon:"temaki-dice",fields:["name","operator","address","building_area","opening_hours","payment_multi","smoking"],geometry:["point","area"],terms:["gambling","roulette","craps","poker","blackjack"],tags:{amenity:"casino"},name:"Casino"},"amenity/charging_station":{icon:"maki-car",fields:["operator","capacity"],geometry:["point"],tags:{amenity:"charging_station"},terms:["EV","Electric Vehicle","Supercharger"],name:"Charging Station"},"amenity/childcare":{icon:"maki-school",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["daycare","orphanage","playgroup"],tags:{amenity:"childcare"},name:"Nursery/Childcare"},"amenity/cinema":{icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["drive-in","film","flick","movie","theater","picture","show","screen"],tags:{amenity:"cinema"},name:"Cinema"},"amenity/clinic":{icon:"maki-doctor",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:["medical","urgentcare"],tags:{amenity:"clinic"},addTags:{amenity:"clinic",healthcare:"clinic"},removeTags:{amenity:"clinic",healthcare:"clinic"},reference:{key:"amenity",value:"clinic"},name:"Clinic"},"amenity/clinic/abortion":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:[],tags:{amenity:"clinic",healthcare:"clinic","healthcare:speciality":"abortion"},reference:{key:"amenity",value:"clinic"},name:"Abortion Clinic"},"amenity/clinic/fertility":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:["egg","fertility","reproductive","sperm","ovulation"],tags:{amenity:"clinic",healthcare:"clinic","healthcare:speciality":"fertility"},reference:{key:"amenity",value:"clinic"},name:"Fertility Clinic"},"amenity/clock":{icon:"temaki-clock",fields:["name","support","display","visibility","date","faces"],geometry:["point","vertex"],tags:{amenity:"clock"},name:"Clock"},"amenity/college":{icon:"maki-college",fields:["name","operator","address","internet_access","internet_access/ssid"],geometry:["point","area"],terms:["university"],tags:{amenity:"college"},name:"College Grounds"},"amenity/community_centre":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:["event","hall"],tags:{amenity:"community_centre"},name:"Community Center"},"amenity/compressed_air":{icon:"maki-car",geometry:["point","area"],tags:{amenity:"compressed_air"},name:"Compressed Air"},"amenity/courthouse":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],geometry:["point","area"],tags:{amenity:"courthouse"},name:"Courthouse"},"amenity/crematorium":{icon:"maki-cemetery",fields:["name","website","phone","opening_hours","wheelchair"],geometry:["area","point"],tags:{amenity:"crematorium"},terms:["cemetery","funeral"],name:"Crematorium"},"amenity/dentist":{icon:"maki-dentist",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:["tooth","teeth"],tags:{amenity:"dentist"},addTags:{amenity:"dentist",healthcare:"dentist"},removeTags:{amenity:"dentist",healthcare:"dentist"},reference:{key:"amenity",value:"dentist"},name:"Dentist"},"amenity/doctors":{icon:"maki-doctor",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],terms:["medic*","physician"],tags:{amenity:"doctors"},addTags:{amenity:"doctors",healthcare:"doctor"},removeTags:{amenity:"doctors",healthcare:"doctor"},reference:{key:"amenity",value:"doctors"},name:"Doctor"},"amenity/dojo":{icon:"maki-pitch",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],terms:["martial arts","dojang"],tags:{amenity:"dojo"},name:"Dojo / Martial Arts Academy"},"amenity/drinking_water":{icon:"maki-drinking-water",geometry:["point"],tags:{amenity:"drinking_water"},terms:["fountain","potable"],name:"Drinking Water"},"amenity/driving_school":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"driving_school"},name:"Driving School"},"amenity/embassy":{icon:"maki-embassy",fields:["name","country","address","building_area"],geometry:["point","area"],tags:{amenity:"embassy"},name:"Embassy"},"amenity/fast_food":{icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"fast_food"},terms:["restaurant","takeaway"],name:"Fast Food"},"amenity/fire_station":{icon:"maki-fire-station",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:[],tags:{amenity:"fire_station"},name:"Fire Station"},"amenity/food_court":{icon:"maki-restaurant",fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating"],geometry:["point","area"],terms:["fast food","restaurant","food"],tags:{amenity:"food_court"},name:"Food Court"},"amenity/fountain":{icon:"temaki-fountain",fields:["name"],geometry:["point","area"],tags:{amenity:"fountain"},name:"Fountain"},"amenity/fuel":{icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],terms:["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],tags:{amenity:"fuel"},name:"Gas Station"},"amenity/grave_yard":{icon:"maki-cemetery",fields:["religion","denomination"],geometry:["point","area"],tags:{amenity:"grave_yard"},name:"Graveyard"},"amenity/grit_bin":{fields:["access_simple"],geometry:["point","vertex"],tags:{amenity:"grit_bin"},terms:["salt","sand"],name:"Grit Bin"},"amenity/hospital":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","address","emergency"],geometry:["point","area"],terms:["clinic","doctor","emergency room","health","infirmary","institution","sanatorium","sanitarium","sick","surgery","ward"],tags:{amenity:"hospital"},addTags:{amenity:"hospital",healthcare:"hospital"},removeTags:{amenity:"hospital",healthcare:"hospital"},reference:{key:"amenity",value:"hospital"},name:"Hospital Grounds"},"amenity/hunting_stand":{icon:"temaki-binoculars",fields:["access_simple"],geometry:["point","vertex","area"],terms:["game","gun","lookout","rifle","shoot*","wild","watch"],tags:{amenity:"hunting_stand"},name:"Hunting Stand"},"amenity/ice_cream":{icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],terms:["gelato","sorbet","sherbet","frozen","yogurt"],tags:{amenity:"ice_cream"},name:"Ice Cream Shop"},"amenity/internet_cafe":{icon:"temaki-antenna",fields:["name","operator","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],geometry:["point","area"],terms:["cybercafe","taxiphone","teleboutique","coffee","cafe","net","lanhouse"],tags:{amenity:"internet_cafe"},name:"Internet Cafe"},"amenity/kindergarten":{icon:"maki-school",fields:["name","operator","address"],geometry:["point","area"],terms:["kindergarden","pre-school"],tags:{amenity:"kindergarten"},name:"Preschool/Kindergarten Grounds"},"amenity/library":{icon:"maki-library",fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],geometry:["point","area"],terms:["book"],tags:{amenity:"library"},name:"Library"},"amenity/love_hotel":{icon:"maki-heart",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{amenity:"love_hotel"},name:"Love Hotel"},"amenity/marketplace":{icon:"maki-shop",fields:["name","operator","address","building","opening_hours"],geometry:["point","area"],tags:{amenity:"marketplace"},name:"Marketplace"},"amenity/monastery":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area"],geometry:["point","area"],terms:["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","monastery","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],tags:{amenity:"monastery"},name:"Monastery Grounds"},"amenity/motorcycle_parking":{icon:"fas-motorcycle",fields:["capacity","operator","covered","access_simple"],geometry:["point","vertex","area"],tags:{amenity:"motorcycle_parking"},name:"Motorcycle Parking"},"amenity/music_school":{icon:"maki-school",fields:["name","operator","address"],geometry:["point","area"],terms:["school of music"],tags:{amenity:"music_school"},name:"Music School"},"amenity/nightclub":{icon:"maki-bar",fields:["name","operator","address","building_area","opening_hours","smoking"],geometry:["point","area"],tags:{amenity:"nightclub"},terms:["disco*","night club","dancing","dance club"],name:"Nightclub"},"amenity/parking_entrance":{icon:"maki-entrance-alt1",fields:["access_simple","ref"],geometry:["vertex"],tags:{amenity:"parking_entrance"},name:"Parking Garage Entrance/Exit"},"amenity/parking_space":{fields:["capacity"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"parking_space"},matchScore:0.95,name:"Parking Space"},"amenity/parking":{icon:"maki-parking",fields:["name","operator","parking","capacity","fee","access_simple","supervised","park_ride","surface","maxstay"],geometry:["point","vertex","area"],tags:{amenity:"parking"},terms:[],name:"Car Parking"},"amenity/pavilion":{icon:"maki-shelter",fields:["name","building_area","bench","bin"],geometry:["point","vertex","area"],tags:{amenity:"shelter",shelter_type:"pavilion"},name:"Pavilion"},"amenity/pharmacy":{icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy"},addTags:{amenity:"pharmacy",healthcare:"pharmacy"},removeTags:{amenity:"pharmacy",healthcare:"pharmacy"},reference:{key:"amenity",value:"pharmacy"},terms:["apothecary","drug*","med*","prescription"],name:"Pharmacy"},"amenity/place_of_worship":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area","service_times"],geometry:["point","area"],terms:["abbey","basilica","bethel","cathedral","chancel","chantry","chapel","church","fold","house of God","house of prayer","house of worship","minster","mission","mosque","oratory","parish","sacellum","sanctuary","shrine","synagogue","tabernacle","temple"],tags:{amenity:"place_of_worship"},name:"Place of Worship"},"amenity/place_of_worship/buddhist":{icon:"maki-buddhism",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["stupa","vihara","monastery","temple","pagoda","zendo","dojo"],tags:{amenity:"place_of_worship",religion:"buddhist"},reference:{key:"amenity",value:"place_of_worship"},name:"Buddhist Temple"},"amenity/place_of_worship/christian":{icon:"maki-religious-christian",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["christian","abbey","basilica","bethel","cathedral","chancel","chantry","chapel","fold","house of God","house of prayer","house of worship","minster","mission","oratory","parish","sacellum","sanctuary","shrine","tabernacle","temple"],tags:{amenity:"place_of_worship",religion:"christian"},reference:{key:"amenity",value:"place_of_worship"},name:"Church"},"amenity/place_of_worship/hindu":{icon:"temaki-hinduism",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["kovil","devasthana","mandir","kshetram","alayam","shrine","temple"],tags:{amenity:"place_of_worship",religion:"hindu"},reference:{key:"amenity",value:"place_of_worship"},name:"Hindu Temple"},"amenity/place_of_worship/jewish":{icon:"maki-religious-jewish",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["jewish"],tags:{amenity:"place_of_worship",religion:"jewish"},reference:{key:"amenity",value:"place_of_worship"},name:"Synagogue"},"amenity/place_of_worship/muslim":{icon:"maki-religious-muslim",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["muslim"],tags:{amenity:"place_of_worship",religion:"muslim"},reference:{key:"amenity",value:"place_of_worship"},name:"Mosque"},"amenity/place_of_worship/shinto":{icon:"temaki-shinto",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["kami","torii"],tags:{amenity:"place_of_worship",religion:"shinto"},reference:{key:"amenity",value:"place_of_worship"},name:"Shinto Shrine"},"amenity/place_of_worship/sikh":{icon:"temaki-sikhism",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["gurudwara","temple"],tags:{amenity:"place_of_worship",religion:"sikh"},reference:{key:"amenity",value:"place_of_worship"},name:"Sikh Temple"},"amenity/place_of_worship/taoist":{icon:"temaki-taoism",fields:["name","denomination","building_area","address","service_times"],geometry:["point","area"],terms:["daoist","monastery","temple"],tags:{amenity:"place_of_worship",religion:"taoist"},reference:{key:"amenity",value:"place_of_worship"},name:"Taoist Temple"},"amenity/planetarium":{icon:"maki-museum",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["museum","astronomy","observatory"],tags:{amenity:"planetarium"},name:"Planetarium"},"amenity/police":{icon:"maki-police",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],tags:{amenity:"police"},name:"Police"},"amenity/post_box":{icon:"maki-post",fields:["operator","collection_times","drive_through","ref"],geometry:["point","vertex"],tags:{amenity:"post_box"},terms:["letter","post"],name:"Mailbox"},"amenity/post_office":{icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["letter","mail"],tags:{amenity:"post_office"},name:"Post Office"},"amenity/prison":{icon:"maki-prison",fields:["name","operator","address"],geometry:["point","area"],terms:["cell","jail"],tags:{amenity:"prison"},name:"Prison Grounds"},"amenity/pub":{icon:"maki-beer",fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],geometry:["point","area"],tags:{amenity:"pub"},terms:["alcohol","drink","dive","beer","bier","booze"],name:"Pub"},"amenity/public_bath":{icon:"maki-water",fields:["name","bath/type","bath/open_air","bath/sand_bath","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"public_bath"},terms:["onsen","foot bath","hot springs"],name:"Public Bath"},"amenity/public_bookcase":{icon:"maki-library",fields:["name","operator","capacity","website"],geometry:["point","area"],terms:["library","bookcrossing"],tags:{amenity:"public_bookcase"},name:"Public Bookcase"},"amenity/ranger_station":{icon:"maki-ranger-station",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["visitor center","visitor centre","permit center","permit centre","backcountry office","warden office","warden center"],tags:{amenity:"ranger_station"},name:"Ranger Station"},"amenity/recycling_centre":{icon:"maki-recycling",fields:["name","operator","address","building","opening_hours","recycling_accepts"],geometry:["point","area"],terms:["bottle","can","dump","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling",recycling_type:"centre"},reference:{key:"recycling_type",value:"*"},name:"Recycling Center"},"amenity/recycling":{icon:"maki-recycling",fields:["recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling"},addTags:{amenity:"recycling",recycling_type:"container"},removeTags:{amenity:"recycling",recycling_type:"container"},reference:{key:"amenity",value:"recycling"},name:"Recycling Container"},"amenity/restaurant":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant"},name:"Restaurant"},"amenity/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["operator","access_simple","fee","water_point"],geometry:["point","vertex","area"],terms:["Motor Home","Camper","Sanitary","Dump Station","Elsan","CDP","CTDP","Chemical Toilet"],tags:{amenity:"sanitary_dump_station"},name:"RV Toilet Disposal"},"amenity/school":{icon:"maki-school",fields:["name","operator","address","religion","denomination"],geometry:["point","area"],terms:["academy","elementary school","middle school","high school"],tags:{amenity:"school"},name:"School Grounds"},"amenity/shelter":{icon:"maki-shelter",fields:["name","shelter_type","building_area","bench","bin"],geometry:["point","vertex","area"],terms:["lean-to","gazebo","picnic"],tags:{amenity:"shelter"},name:"Shelter"},"amenity/shower":{icon:"temaki-shower",fields:["operator","opening_hours","fee","supervised","building_area","access_simple"],geometry:["point","vertex","area"],terms:["rain closet"],tags:{amenity:"shower"},name:"Shower"},"amenity/smoking_area":{icon:"fas-smoking",fields:["name","shelter","bin","bench","opening_hours"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"smoking_area"},name:"Smoking Area"},"amenity/social_facility":{icon:"temaki-social_facility",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],terms:[],tags:{amenity:"social_facility"},name:"Social Facility"},"amenity/social_facility/food_bank":{icon:"temaki-social_facility",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours"],geometry:["point","area"],terms:[],tags:{amenity:"social_facility",social_facility:"food_bank"},reference:{key:"social_facility",value:"food_bank"},name:"Food Bank"},"amenity/social_facility/group_home":{icon:"maki-wheelchair",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],terms:["old","senior","living","care home","assisted living"],tags:{amenity:"social_facility",social_facility:"group_home","social_facility:for":"senior"},reference:{key:"social_facility",value:"group_home"},name:"Elderly Group Home"},"amenity/social_facility/homeless_shelter":{icon:"temaki-social_facility",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],terms:["houseless","unhoused","displaced"],tags:{amenity:"social_facility",social_facility:"shelter","social_facility:for":"homeless"},reference:{key:"social_facility",value:"shelter"},name:"Homeless Shelter"},"amenity/social_facility/nursing_home":{icon:"maki-wheelchair",fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],geometry:["point","area"],terms:["elderly","living","nursing","old","senior","assisted living"],tags:{amenity:"social_facility",social_facility:"nursing_home","social_facility:for":"senior"},reference:{key:"social_facility",value:"nursing_home"},name:"Nursing Home"},"amenity/studio":{icon:"maki-karaoke",fields:["name","studio","address","building_area"],geometry:["point","area"],terms:["recording","radio","television"],tags:{amenity:"studio"},name:"Studio"},"amenity/taxi":{icon:"fas-taxi",fields:["name","operator","capacity"],geometry:["point","vertex","area"],terms:["cab"],tags:{amenity:"taxi"},name:"Taxi Stand"},"amenity/telephone":{icon:"maki-telephone",fields:["operator","phone","fee","payment_multi","covered","indoor","booth"],geometry:["point","vertex"],tags:{amenity:"telephone"},terms:["phone"],name:"Telephone"},"amenity/theatre":{icon:"maki-theatre",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:["theatre","performance","play","musical"],tags:{amenity:"theatre"},name:"Theater"},"amenity/toilets":{icon:"maki-toilet",fields:["toilets/disposal","operator","building_area","access_simple","gender","fee","diaper"],geometry:["point","vertex","area"],terms:["bathroom","restroom","outhouse","privy","head","lavatory","latrine","water closet","WC","W.C."],tags:{amenity:"toilets"},name:"Toilets"},"amenity/townhall":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:["village","city","government","courthouse","municipal"],tags:{amenity:"townhall"},name:"Town Hall"},"amenity/university":{icon:"maki-college",fields:["name","operator","address","internet_access","internet_access/ssid"],geometry:["point","area"],terms:["college"],tags:{amenity:"university"},name:"University Grounds"},"amenity/vending_machine":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:[],tags:{amenity:"vending_machine"},name:"Vending Machine"},"amenity/vending_machine/news_papers":{icon:"temaki-vending_machine",fields:["vending","operator","fee","payment_multi","currency_multi"],geometry:["point"],terms:["newspaper"],tags:{amenity:"vending_machine",vending:"news_papers"},reference:{key:"vending",value:"newspapers"},name:"Newspaper Vending Machine",searchable:false},"amenity/vending_machine/cigarettes":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["cigarette"],tags:{amenity:"vending_machine",vending:"cigarettes"},reference:{key:"vending",value:"cigarettes"},name:"Cigarette Vending Machine"},"amenity/vending_machine/coffee":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["coffee"],tags:{amenity:"vending_machine",vending:"coffee"},reference:{key:"vending",value:"coffee"},name:"Coffee Vending Machine"},"amenity/vending_machine/condoms":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["condom"],tags:{amenity:"vending_machine",vending:"condoms"},reference:{key:"vending",value:"condoms"},name:"Condom Vending Machine"},"amenity/vending_machine/drinks":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["drink","soda","beverage","juice","pop"],tags:{amenity:"vending_machine",vending:"drinks"},reference:{key:"vending",value:"drinks"},name:"Drink Vending Machine"},"amenity/vending_machine/electronics":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["cable","charger","earbud","headphone","phone","tablet"],tags:{amenity:"vending_machine",vending:"electronics"},reference:{key:"vending",value:"electronics"},name:"Electronics Vending Machine"},"amenity/vending_machine/elongated_coin":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["coin","crush","elongated","flatten","penny","souvenir"],tags:{amenity:"vending_machine",vending:"elongated_coin"},reference:{key:"vending",value:"elongated_coin"},name:"Flat Coin Vending Machine"},"amenity/vending_machine/excrement_bags":{icon:"temaki-vending_machine",fields:["vending","operator","fee","payment_multi","currency_multi"],geometry:["point"],terms:["excrement bags","poop","dog","animal"],tags:{amenity:"vending_machine",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},name:"Excrement Bag Vending Machine"},"amenity/vending_machine/feminine_hygiene":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["condom","tampon","pad","woman","women","menstrual hygiene products","personal care"],tags:{amenity:"vending_machine",vending:"feminine_hygiene"},reference:{key:"vending",value:"feminine_hygiene"},name:"Feminine Hygiene Vending Machine"},"amenity/vending_machine/food":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["food"],tags:{amenity:"vending_machine",vending:"food"},reference:{key:"vending",value:"food"},name:"Food Vending Machine"},"amenity/vending_machine/fuel":{icon:"maki-fuel",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["petrol","fuel","gasoline","propane","diesel","lng","cng","biodiesel"],tags:{amenity:"vending_machine",vending:"fuel"},reference:{key:"vending",value:"fuel"},name:"Gas Pump"},"amenity/vending_machine/ice_cream":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["chocolate","ice cream","frozen","popsicle","vanilla"],tags:{amenity:"vending_machine",vending:"ice_cream"},reference:{key:"vending",value:"ice_cream"},name:"Ice Cream Vending Machine"},"amenity/vending_machine/newspapers":{icon:"temaki-vending_machine",fields:["vending","operator","fee","payment_multi","currency_multi"],geometry:["point"],terms:["newspaper"],tags:{amenity:"vending_machine",vending:"newspapers"},reference:{key:"vending",value:"newspapers"},name:"Newspaper Vending Machine"},"amenity/vending_machine/parcel_pickup_dropoff":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["parcel","mail","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},name:"Parcel Pickup/Dropoff Vending Machine"},"amenity/vending_machine/parking_tickets":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["parking","ticket"],tags:{amenity:"vending_machine",vending:"parking_tickets"},reference:{key:"vending",value:"parking_tickets"},matchScore:0.94,name:"Parking Ticket Vending Machine"},"amenity/vending_machine/public_transport_tickets":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["bus","train","ferry","rail","ticket","transportation"],tags:{amenity:"vending_machine",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},name:"Transit Ticket Vending Machine"},"amenity/vending_machine/stamps":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["mail","postage","stamp"],tags:{amenity:"vending_machine",vending:"stamps"},reference:{key:"vending",value:"stamps"},name:"Postage Vending Machine"},"amenity/vending_machine/sweets":{icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["candy","gum","chip","pretzel","cookie","cracker"],tags:{amenity:"vending_machine",vending:"sweets"},reference:{key:"vending",value:"sweets"},name:"Snack Vending Machine"},"amenity/veterinary":{icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["pet clinic","veterinarian","animal hospital","pet doctor"],tags:{amenity:"veterinary"},name:"Veterinary"},"amenity/waste_basket":{icon:"maki-waste-basket",fields:["collection_times"],geometry:["point","vertex"],tags:{amenity:"waste_basket"},terms:["bin","garbage","rubbish","litter","trash"],name:"Waste Basket"},"amenity/waste_disposal":{icon:"maki-waste-basket",fields:["collection_times"],geometry:["point","vertex","area"],tags:{amenity:"waste_disposal"},terms:["garbage","rubbish","litter","trash"],name:"Garbage Dumpster"},"amenity/waste_transfer_station":{icon:"maki-waste-basket",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["dump","garbage","recycling","rubbish","scrap","trash"],tags:{amenity:"waste_transfer_station"},name:"Waste Transfer Station"},"amenity/waste/dog_excrement":{icon:"maki-waste-basket",fields:["collection_times"],geometry:["point","vertex","area"],tags:{amenity:"waste_basket",waste:"dog_excrement"},reference:{key:"waste",value:"dog_excrement"},terms:["bin","garbage","rubbish","litter","trash","poo","dog"],name:"Dog Excrement Bin"},"amenity/water_point":{icon:"maki-drinking-water",geometry:["area","vertex","point"],tags:{amenity:"water_point"},name:"RV Drinking Water"},"amenity/watering_place":{icon:"maki-drinking-water",geometry:["area","vertex","point"],tags:{amenity:"watering_place"},name:"Animal Watering Place"},area:{fields:["name"],geometry:["area"],tags:{area:"yes"},name:"Area",matchScore:0.1},"area/highway":{fields:["name","area/highway"],geometry:["area"],tags:{"area:highway":"*"},name:"Road Surface"},"attraction/amusement_ride":{icon:"maki-amusement-park",fields:["name","operator","opening_hours"],geometry:["point","area"],terms:["theme park","carnival ride"],tags:{attraction:"amusement_ride"},name:"Amusement Ride"},"attraction/animal":{icon:"maki-zoo",fields:["name","operator"],geometry:["point","area"],terms:["zoo","theme park","animal park","lion","tiger","bear"],tags:{attraction:"animal"},name:"Animal"},"attraction/big_wheel":{icon:"maki-amusement-park",fields:["name","operator","height","opening_hours"],geometry:["point"],terms:["ferris wheel","theme park","amusement ride"],tags:{attraction:"big_wheel"},name:"Big Wheel"},"attraction/bumper_car":{icon:"maki-car",fields:["name","operator","opening_hours"],geometry:["point","area"],terms:["theme park","dodgem cars","autoscooter"],tags:{attraction:"bumper_car"},name:"Bumper Car"},"attraction/bungee_jumping":{icon:"maki-pitch",fields:["name","operator","height","opening_hours"],geometry:["point","area"],terms:["theme park","bungy jumping","jumping platform"],tags:{attraction:"bungee_jumping"},name:"Bungee Jumping"},"attraction/carousel":{icon:"maki-horse-riding",fields:["name","operator","opening_hours"],geometry:["point","area"],terms:["theme park","roundabout","merry-go-round","galloper","jumper","horseabout","flying horses"],tags:{attraction:"carousel"},name:"Carousel"},"attraction/dark_ride":{icon:"maki-rail-metro",fields:["name","operator","opening_hours"],geometry:["point","line","area"],terms:["theme park","ghost train"],tags:{attraction:"dark_ride"},name:"Dark Ride"},"attraction/drop_tower":{icon:"temaki-tower",fields:["name","operator","height","opening_hours"],geometry:["point","area"],terms:["theme park","amusement ride","gondola","tower","big drop"],tags:{attraction:"drop_tower"},name:"Drop Tower"},"attraction/maze":{icon:"maki-amusement-park",fields:["name","operator"],geometry:["point","area"],terms:["theme park","amusement ride","labyrinth"],tags:{attraction:"maze"},name:"Maze"},"attraction/pirate_ship":{icon:"maki-danger",fields:["name","operator","opening_hours"],geometry:["point"],terms:["theme park","carnival ride","amusement ride"],tags:{attraction:"pirate_ship"},name:"Pirate Ship"},"attraction/river_rafting":{icon:"maki-ferry",fields:["name","operator","opening_hours"],geometry:["point","line"],terms:["theme park","aquatic park","water park","rafting simulator","river rafting ride","river rapids ride"],tags:{attraction:"river_rafting"},name:"River Rafting"},"attraction/roller_coaster":{icon:"maki-amusement-park",fields:["name","operator","opening_hours"],geometry:["point","area"],terms:["theme park","amusement ride"],tags:{attraction:"roller_coaster"},name:"Roller Coaster"},"attraction/train":{icon:"maki-rail",fields:["name","operator","fee","opening_hours"],geometry:["point","line"],terms:["theme park","rackless train","road train","Tschu-Tschu train","dotto train","park train"],tags:{attraction:"train"},name:"Tourist Train"},"attraction/water_slide":{icon:"maki-swimming",fields:["name","operator","opening_hours"],geometry:["line","area"],terms:["theme park","aquatic park","water park","flumes","water chutes","hydroslides"],tags:{attraction:"water_slide"},name:"Water Slide"},barrier:{icon:"maki-roadblock",geometry:["point","vertex","line","area"],tags:{barrier:"*"},fields:["barrier"],name:"Barrier",matchScore:0.4},"barrier/entrance":{icon:"maki-entrance-alt1",geometry:["vertex"],tags:{barrier:"entrance"},name:"Entrance",searchable:false},"barrier/block":{icon:"maki-roadblock",fields:["access"],geometry:["point","vertex"],tags:{barrier:"block"},name:"Block"},"barrier/bollard":{icon:"maki-roadblock",fields:["access"],geometry:["point","vertex","line"],tags:{barrier:"bollard"},name:"Bollard"},"barrier/border_control":{icon:"maki-roadblock",fields:["access","building_area"],geometry:["vertex","area"],tags:{barrier:"border_control"},name:"Border Control"},"barrier/cattle_grid":{icon:"maki-barrier",geometry:["vertex"],tags:{barrier:"cattle_grid"},name:"Cattle Grid"},"barrier/city_wall":{icon:"maki-barrier",fields:["height"],geometry:["line","area"],tags:{barrier:"city_wall"},name:"City Wall"},"barrier/cycle_barrier":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"cycle_barrier"},name:"Cycle Barrier"},"barrier/ditch":{icon:"maki-roadblock",geometry:["line","area"],tags:{barrier:"ditch"},name:"Trench",matchScore:0.25},"barrier/fence":{icon:"maki-fence",fields:["fence_type","height"],geometry:["line"],tags:{barrier:"fence"},name:"Fence",matchScore:0.25},"barrier/gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex","line"],tags:{barrier:"gate"},name:"Gate"},"barrier/hedge":{fields:["height"],geometry:["line","area"],tags:{barrier:"hedge"},name:"Hedge",matchScore:0.25},"barrier/kerb":{icon:"maki-wheelchair",fields:["kerb","tactile_paving"],geometry:["vertex","line"],tags:{barrier:"kerb"},name:"Kerb"},"barrier/kissing_gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex"],tags:{barrier:"kissing_gate"},name:"Kissing Gate"},"barrier/lift_gate":{icon:"maki-roadblock",fields:["access"],geometry:["vertex","line"],tags:{barrier:"lift_gate"},name:"Lift Gate"},"barrier/retaining_wall":{fields:["height"],geometry:["line","area"],tags:{barrier:"retaining_wall"},name:"Retaining Wall"},"barrier/stile":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"stile"},name:"Stile"},"barrier/toll_booth":{icon:"maki-roadblock",fields:["access","building_area"],geometry:["vertex","area"],tags:{barrier:"toll_booth"},name:"Toll Booth"},"barrier/wall":{icon:"maki-barrier",fields:["wall","height"],geometry:["line","area"],tags:{barrier:"wall"},name:"Wall",matchScore:0.25},"boundary/administrative":{name:"Administrative Boundary",geometry:["line"],tags:{boundary:"administrative"},fields:["name","admin_level"]},building:{icon:"maki-home",fields:["name","building","levels","height","address"],geometry:["point","area"],tags:{building:"*"},matchScore:0.6,terms:[],name:"Building"},"building/bunker":{fields:["name","address","levels","height"],geometry:["area"],tags:{building:"bunker"},matchScore:0.5,name:"Bunker",searchable:false},"building/entrance":{icon:"maki-entrance-alt1",geometry:["vertex"],tags:{building:"entrance"},name:"Entrance/Exit",searchable:false},"building/train_station":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["point","vertex","area"],tags:{building:"train_station"},matchScore:0.5,name:"Train Station",searchable:false},"building/apartments":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"apartments"},matchScore:0.5,name:"Apartments"},"building/barn":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"barn"},matchScore:0.5,name:"Barn"},"building/boathouse":{icon:"maki-harbor",fields:["name","levels","height","address"],geometry:["area"],tags:{building:"boathouse"},matchScore:0.5,terms:[],name:"Boathouse"},"building/bungalow":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"bungalow"},terms:["home","detached"],matchScore:0.5,name:"Bungalow"},"building/cabin":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"cabin"},matchScore:0.5,name:"Cabin"},"building/cathedral":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"cathedral"},matchScore:0.5,name:"Cathedral Building"},"building/chapel":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"chapel"},matchScore:0.5,name:"Chapel Building"},"building/church":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"church"},matchScore:0.5,name:"Church Building"},"building/civic":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"civic"},matchScore:0.5,name:"Civic Building"},"building/college":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["university"],tags:{building:"college"},matchScore:0.5,name:"College Building"},"building/commercial":{icon:"maki-suitcase",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"commercial"},matchScore:0.5,name:"Commercial Building"},"building/construction":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"construction"},matchScore:0.5,name:"Building Under Construction"},"building/detached":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"detached"},terms:["home","single","family","residence","dwelling"],matchScore:0.5,name:"Detached House"},"building/dormitory":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"dormitory"},matchScore:0.5,name:"Dormitory"},"building/farm_auxiliary":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"farm_auxiliary"},matchScore:0.5,name:"Farm Building"},"building/farm":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"farm"},matchScore:0.5,name:"Farm House"},"building/garage":{icon:"fas-warehouse",fields:["name","capacity"],geometry:["area"],tags:{building:"garage"},matchScore:0.5,name:"Garage"},"building/garages":{icon:"fas-warehouse",fields:["name","capacity"],geometry:["area"],tags:{building:"garages"},matchScore:0.5,name:"Garages"},"building/grandstand":{icon:"maki-building",fields:["name","height"],geometry:["area"],tags:{building:"grandstand"},terms:["tribune","stand","stands","bleachers"],matchScore:0.5,name:"Grandstand"},"building/greenhouse":{icon:"maki-garden-center",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"greenhouse"},matchScore:0.5,name:"Greenhouse"},"building/hospital":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"hospital"},matchScore:0.5,name:"Hospital Building"},"building/hotel":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"hotel"},matchScore:0.5,name:"Hotel Building"},"building/house":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"house"},terms:["home","family","residence","dwelling"],matchScore:0.5,name:"House"},"building/hut":{geometry:["area"],fields:["name"],tags:{building:"hut"},matchScore:0.5,name:"Hut"},"building/industrial":{icon:"maki-industry",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"industrial"},matchScore:0.5,name:"Industrial Building"},"building/kindergarten":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["kindergarden","pre-school"],tags:{building:"kindergarten"},matchScore:0.5,name:"Preschool/Kindergarten Building"},"building/mosque":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"mosque"},matchScore:0.5,name:"Mosque Building"},"building/public":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"public"},matchScore:0.5,name:"Public Building"},"building/residential":{icon:"maki-residential-community",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"residential"},matchScore:0.5,name:"Residential Building"},"building/retail":{icon:"maki-commercial",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"retail"},matchScore:0.5,name:"Retail Building"},"building/roof":{icon:"maki-shelter",fields:["name","address","layer"],geometry:["area"],tags:{building:"roof"},matchScore:0.5,name:"Roof"},"building/ruins":{icon:"temaki-ruins",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"ruins"},matchScore:0.5,name:"Building Ruins"},"building/school":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["academy","elementary school","middle school","high school"],tags:{building:"school"},matchScore:0.5,name:"School Building"},"building/semidetached_house":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"semidetached_house"},terms:["home","double","duplex","twin","family","residence","dwelling"],matchScore:0.5,name:"Semi-Detached House"},"building/service":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"service"},matchScore:0.5,name:"Service Building"},"building/shed":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"shed"},matchScore:0.5,name:"Shed"},"building/stable":{icon:"maki-horse-riding",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"stable"},matchScore:0.5,name:"Stable"},"building/stadium":{icon:"maki-stadium",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"stadium"},matchScore:0.5,name:"Stadium Building"},"building/static_caravan":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"static_caravan"},matchScore:0.5,name:"Static Mobile Home"},"building/temple":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"temple"},matchScore:0.5,name:"Temple Building"},"building/terrace":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"terrace"},terms:["home","terrace","brownstone","family","residence","dwelling"],matchScore:0.5,name:"Row Houses"},"building/transportation":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"transportation"},matchScore:0.5,name:"Transportation Building"},"building/university":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["college"],tags:{building:"university"},matchScore:0.5,name:"University Building"},"building/warehouse":{icon:"maki-warehouse",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"warehouse"},matchScore:0.5,name:"Warehouse"},"camp_site/camp_pitch":{icon:"maki-campsite",fields:["name","ref"],geometry:["point","area"],terms:["tent","rv"],tags:{camp_site:"camp_pitch"},name:"Camp Pitch"},club:{icon:"maki-heart",fields:["name","club","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{club:"*"},terms:["social"],name:"Club"},craft:{icon:"temaki-tools",fields:["name","craft","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"*"},terms:[],name:"Craft"},"craft/jeweler":{icon:"maki-marker-stroked",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"jeweler"},reference:{key:"shop",value:"jewelry"},name:"Jeweler",searchable:false},"craft/locksmith":{icon:"maki-marker-stroked",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"locksmith"},reference:{key:"shop",value:"locksmith"},name:"Locksmith",searchable:false},"craft/optician":{icon:"maki-marker-stroked",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"optician"},reference:{key:"shop",value:"optician"},name:"Optician",searchable:false},"craft/tailor":{icon:"maki-clothing-store",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["clothes","suit"],tags:{craft:"tailor"},reference:{key:"shop",value:"tailor"},name:"Tailor",searchable:false},"craft/basket_maker":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"basket_maker"},name:"Basket Maker"},"craft/beekeeper":{icon:"maki-farm",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"beekeeper"},name:"Beekeeper"},"craft/blacksmith":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"blacksmith"},name:"Blacksmith"},"craft/boatbuilder":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"boatbuilder"},matchScore:0.4,name:"Boat Builder"},"craft/bookbinder":{icon:"maki-library",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["book repair"],tags:{craft:"bookbinder"},name:"Bookbinder"},"craft/brewery":{icon:"temaki-storage_tank",fields:["name","operator","address","building_area","opening_hours","product"],geometry:["point","area"],terms:["alcohol","beer","beverage","bier","booze","cider"],tags:{craft:"brewery"},name:"Brewery"},"craft/carpenter":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["woodworker"],tags:{craft:"carpenter"},name:"Carpenter"},"craft/carpet_layer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"carpet_layer"},name:"Carpet Layer"},"craft/caterer":{icon:"maki-restaurant",fields:["name","cuisine","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"caterer"},name:"Caterer"},"craft/chimney_sweeper":{icon:"temaki-chimney",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"chimney_sweeper"},name:"Chimney Sweeper"},"craft/clockmaker":{icon:"temaki-clock",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"clockmaker"},name:"Clockmaker"},"craft/confectionery":{icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["sweet","candy"],tags:{craft:"confectionery"},name:"Candy Maker"},"craft/distillery":{icon:"temaki-storage_tank",fields:["name","operator","address","building_area","opening_hours","product"],geometry:["point","area"],terms:["alcohol","beverage","bourbon","booze","brandy","gin","hooch","liquor","mezcal","moonshine","rum","scotch","spirits","still","tequila","vodka","whiskey","whisky"],tags:{craft:"distillery"},name:"Distillery"},"craft/dressmaker":{icon:"maki-clothing-store",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["seamstress"],tags:{craft:"dressmaker"},name:"Dressmaker"},"craft/electrician":{icon:"temaki-power",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["power","wire"],tags:{craft:"electrician"},name:"Electrician"},"craft/electronics_repair":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"electronics_repair"},name:"Electronics Repair Shop"},"craft/gardener":{icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["landscaper","grounds keeper"],tags:{craft:"gardener"},name:"Gardener"},"craft/glaziery":{icon:"temaki-window",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["glass","stained-glass","window"],tags:{craft:"glaziery"},name:"Glaziery"},"craft/handicraft":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"handicraft"},name:"Handicraft"},"craft/hvac":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["heat*","vent*","air conditioning"],tags:{craft:"hvac"},name:"HVAC"},"craft/insulator":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"insulation"},name:"Insulator"},"craft/key_cutter":{icon:"fas-key",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"key_cutter"},name:"Key Cutter"},"craft/metal_construction":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"metal_construction"},name:"Metal Construction"},"craft/painter":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"painter"},name:"Painter"},"craft/photographer":{icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"photographer"},name:"Photographer"},"craft/photographic_laboratory":{icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["film"],tags:{craft:"photographic_laboratory"},name:"Photographic Laboratory"},"craft/plasterer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"plasterer"},name:"Plasterer"},"craft/plumber":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["pipe"],tags:{craft:"plumber"},name:"Plumber"},"craft/pottery":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["ceramic"],tags:{craft:"pottery"},name:"Pottery"},"craft/rigger":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"rigger"},name:"Rigger"},"craft/roofer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"roofer"},name:"Roofer"},"craft/saddler":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"saddler"},name:"Saddler"},"craft/sailmaker":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"sailmaker"},name:"Sailmaker"},"craft/sawmill":{icon:"maki-logging",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["lumber"],tags:{craft:"sawmill"},name:"Sawmill"},"craft/scaffolder":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"scaffolder"},name:"Scaffolder"},"craft/sculptor":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"sculptor"},name:"Sculptor"},"craft/shoemaker":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["cobbler"],tags:{craft:"shoemaker"},name:"Shoemaker"},"craft/stonemason":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["masonry"],tags:{craft:"stonemason"},name:"Stonemason"},"craft/tiler":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"tiler"},name:"Tiler"},"craft/tinsmith":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"tinsmith"},name:"Tinsmith"},"craft/upholsterer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"upholsterer"},name:"Upholsterer"},"craft/watchmaker":{icon:"temaki-clock",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"watchmaker"},name:"Watchmaker"},"craft/window_construction":{icon:"temaki-window",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["glass"],tags:{craft:"window_construction"},name:"Window Construction"},"craft/winery":{icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"winery"},name:"Winery"},embankment:{geometry:["line"],tags:{embankment:"yes"},name:"Embankment",matchScore:0.2},"emergency/designated":{fields:[],geometry:["line"],tags:{emergency:"designated"},terms:[],name:"Emergency Access Designated",searchable:false,matchScore:0.01},"emergency/destination":{fields:[],geometry:["line"],tags:{emergency:"destination"},terms:[],name:"Emergency Access Destination",searchable:false,matchScore:0.01},"emergency/no":{fields:[],geometry:["line"],tags:{emergency:"no"},terms:[],name:"Emergency Access No",searchable:false,matchScore:0.01},"emergency/official":{fields:[],geometry:["line"],tags:{emergency:"official"},terms:[],name:"Emergency Access Official",searchable:false,matchScore:0.01},"emergency/private":{fields:[],geometry:["line"],tags:{emergency:"private"},terms:[],name:"Emergency Access Private",searchable:false,matchScore:0.01},"emergency/yes":{fields:[],geometry:["line"],tags:{emergency:"yes"},terms:[],name:"Emergency Access Yes",searchable:false,matchScore:0.01},"emergency/ambulance_station":{icon:"fas-ambulance",fields:["name","operator","building_area","address"],geometry:["point","area"],terms:["EMS","EMT","rescue"],tags:{emergency:"ambulance_station"},name:"Ambulance Station"},"emergency/defibrillator":{icon:"maki-defibrillator",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["AED"],tags:{emergency:"defibrillator"},name:"Defibrillator"},"emergency/fire_alarm":{icon:"fas-bell",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_alarm_box"},name:"Fire Alarm Call Box"},"emergency/fire_extinguisher":{icon:"fas-fire-extinguisher",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_extinguisher"},name:"Fire Extinguisher"},"emergency/fire_hydrant":{icon:"temaki-fire_hydrant",fields:["fire_hydrant/type","fire_hydrant/position","ref","operator"],geometry:["point","vertex"],terms:["fire plug"],tags:{emergency:"fire_hydrant"},name:"Fire Hydrant"},"emergency/first_aid_kit":{icon:"fas-medkit",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["bandage","first aid","med","med kit","medic*","medkit"],tags:{emergency:"first_aid_kit"},name:"First Aid Kit"},"emergency/life_ring":{icon:"fas-life-ring",fields:["ref","operator"],geometry:["point","vertex"],terms:["life buoy","kisby ring","kisbie ring","perry buoy"],tags:{emergency:"life_ring"},name:"Life Ring"},"emergency/lifeguard":{icon:"fas-life-ring",fields:["ref","operator","building_area","opening_hours"],geometry:["point","area"],terms:["CPR","rescue"],tags:{emergency:"lifeguard"},name:"Lifeguard"},"emergency/phone":{icon:"maki-emergency-phone",fields:["ref","operator","covered","indoor","booth"],geometry:["point","vertex"],tags:{emergency:"phone"},name:"Emergency Phone"},"emergency/siren":{icon:"fas-volume-up",fields:["siren/purpose","siren/type","ref","operator"],geometry:["point","vertex"],terms:["air raid","loud","noise","storm","tornado","warning"],tags:{emergency:"siren"},name:"Siren"},"emergency/water_tank":{icon:"maki-water",fields:["name","ref","operator"],geometry:["point","vertex"],terms:["water tank","cistern","reservoir"],tags:{emergency:"water_tank"},name:"Emergency Water Tank"},entrance:{icon:"maki-entrance-alt1",geometry:["vertex"],terms:["entrance","exit","door"],tags:{entrance:"*"},fields:["entrance","access_simple","address"],name:"Entrance/Exit"},"footway/crossing-raised":{fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Raised Street Crossing"},"footway/crossing":{fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing"},reference:{key:"footway",value:"crossing"},terms:[],name:"Street Crossing"},"footway/crosswalk-raised":{icon:"iD-highway-footway",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","flat top","hump","speed","slow"],name:"Raised Pedestrian Crosswalk"},"footway/crosswalk":{icon:"iD-highway-footway",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra"},reference:{key:"footway",value:"crossing"},terms:["zebra crossing"],name:"Pedestrian Crosswalk"},"footway/sidewalk":{icon:"iD-highway-footway",fields:["surface","lit","width","structure","access"],geometry:["line"],tags:{highway:"footway",footway:"sidewalk"},reference:{key:"footway",value:"sidewalk"},terms:[],name:"Sidewalk"},ford:{geometry:["vertex"],tags:{ford:"yes"},name:"Ford"},"golf/bunker":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"bunker",natural:"sand"},terms:["hazard","bunker"],reference:{key:"golf",value:"bunker"},name:"Sand Trap"},"golf/fairway":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"fairway",landuse:"grass"},reference:{key:"golf",value:"fairway"},name:"Fairway"},"golf/green":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"green",landuse:"grass",leisure:"pitch",sport:"golf"},reference:{key:"golf",value:"green"},name:"Putting Green"},"golf/hole":{icon:"maki-golf",fields:["name","ref_golf_hole","par","handicap"],geometry:["line"],tags:{golf:"hole"},name:"Golf Hole"},"golf/lateral_water_hazard_area":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"lateral_water_hazard",natural:"water"},reference:{key:"golf",value:"lateral_water_hazard"},name:"Lateral Water Hazard"},"golf/lateral_water_hazard_line":{icon:"maki-golf",fields:["name"],geometry:["line"],tags:{golf:"lateral_water_hazard"},name:"Lateral Water Hazard"},"golf/rough":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"rough",landuse:"grass"},reference:{key:"golf",value:"rough"},name:"Rough"},"golf/tee":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"tee",landuse:"grass"},terms:["teeing ground"],reference:{key:"golf",value:"tee"},name:"Tee Box"},"golf/water_hazard_area":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"water_hazard",natural:"water"},reference:{key:"golf",value:"water_hazard"},name:"Water Hazard"},"golf/water_hazard_line":{icon:"maki-golf",fields:["name"],geometry:["line"],tags:{golf:"water_hazard"},name:"Water Hazard"},healthcare:{icon:"maki-hospital",fields:["name","healthcare","operator","healthcare/speciality","address","building_area","opening_hours"],geometry:["point","area"],tags:{healthcare:"*"},terms:["clinic","doctor","disease","health","institution","sick","surgery","wellness"],name:"Healthcare Facility"},"healthcare/alternative":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["acupuncture","anthroposophical","applied kinesiology","aromatherapy","ayurveda","herbalism","homeopathy","hydrotherapy","hypnosis","naturopathy","osteopathy","reflexology","reiki","shiatsu","traditional","tuina","unani"],tags:{healthcare:"alternative"},name:"Alternative Medicine"},"healthcare/alternative/chiropractic":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["back","pain","spine"],tags:{healthcare:"alternative","healthcare:speciality":"chiropractic"},name:"Chiropractor"},"healthcare/audiologist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["ear","hearing","sound"],tags:{healthcare:"audiologist"},name:"Audiologist"},"healthcare/birthing_center":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"birthing_center"},name:"Birthing Center"},"healthcare/blood_donation":{icon:"maki-blood-bank",fields:["name","operator","healthcare/speciality","blood_components","address","building_area","opening_hours"],geometry:["point","area"],terms:["blood bank","blood donation","blood transfusion","apheresis","plasmapheresis","plateletpheresis","stem cell donation"],tags:{healthcare:"blood_donation"},name:"Blood Donor Center"},"healthcare/hospice":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["terminal","illness"],tags:{healthcare:"hospice"},name:"Hospice"},"healthcare/laboratory":{icon:"maki-hospital",fields:["name","operator","website","ref","address","opening_hours"],geometry:["point","area"],terms:["medical_laboratory","medical_lab","blood_check"],tags:{healthcare:"laboratory"},name:"Medical Laboratory"},"healthcare/midwife":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"midwife"},name:"Midwife"},"healthcare/occupational_therapist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["therapist","therapy"],tags:{healthcare:"occupational_therapist"},name:"Occupational Therapist"},"healthcare/optometrist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["eye","glasses","lasik","lenses","vision"],tags:{healthcare:"optometrist"},name:"Optometrist"},"healthcare/physiotherapist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["physical","therapist","therapy"],tags:{healthcare:"physiotherapist"},name:"Physiotherapist"},"healthcare/podiatrist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["foot","feet","nails"],tags:{healthcare:"podiatrist"},name:"Podiatrist"},"healthcare/psychotherapist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],tags:{healthcare:"psychotherapist"},name:"Psychotherapist"},"healthcare/rehabilitation":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["rehab","therapist","therapy"],tags:{healthcare:"rehabilitation"},name:"Rehabilitation Facility"},"healthcare/speech_therapist":{icon:"maki-hospital",fields:["name","operator","healthcare/speciality","building_area","address","opening_hours"],geometry:["point","area"],terms:["speech","therapist","therapy","voice"],tags:{healthcare:"speech_therapist"},name:"Speech Therapist"},"highway/bus_stop":{icon:"maki-bus",fields:["name","network","operator","bench","shelter"],geometry:["point","vertex"],tags:{highway:"bus_stop"},name:"Bus Stop / Platform",searchable:false},"highway/bridleway":{fields:["name","surface","width","structure","access"],icon:"iD-highway-bridleway",geometry:["line"],tags:{highway:"bridleway"},terms:["bridleway","equestrian","horse","trail"],name:"Bridle Path"},"highway/bus_guideway":{icon:"iD-highway-bus-guideway",fields:["name","operator","oneway"],geometry:["line"],tags:{highway:"bus_guideway"},addTags:{highway:"bus_guideway",access:"no",bus:"designated"},removeTags:{highway:"bus_guideway",access:"no",bus:"designated"},terms:[],name:"Bus Guideway"},"highway/corridor":{icon:"iD-highway-footway",fields:["name","width","level","access_simple"],geometry:["line"],tags:{highway:"corridor"},terms:["gallery","hall","hallway","indoor","passage","passageway"],name:"Indoor Corridor"},"highway/crossing-raised":{fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Raised Street Crossing"},"highway/crossing":{fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing"},reference:{key:"highway",value:"crossing"},terms:[],name:"Street Crossing"},"highway/crosswalk-raised":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","flat top","hump","speed","slow"],name:"Raised Pedestrian Crosswalk"},"highway/crosswalk":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing"],name:"Pedestrian Crosswalk"},"highway/cycleway":{icon:"iD-highway-cycleway",fields:["name","oneway","surface","lit","width","structure","access"],geometry:["line"],tags:{highway:"cycleway"},terms:["bike"],name:"Cycle Path"},"highway/elevator":{icon:"temaki-elevator",fields:["access_simple","opening_hours","maxweight","ref"],geometry:["vertex"],tags:{highway:"elevator"},terms:["lift"],name:"Elevator"},"highway/footway":{icon:"iD-highway-footway",fields:["name","surface","lit","width","structure","access"],geometry:["line"],terms:["hike","hiking","trackway","trail","walk"],tags:{highway:"footway"},name:"Foot Path"},"highway/give_way":{icon:"temaki-yield",fields:["direction_vertex"],geometry:["vertex"],tags:{highway:"give_way"},terms:["give way","yield","sign"],name:"Yield Sign"},"highway/living_street":{icon:"iD-highway-living-street",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","access","cycleway"],geometry:["line"],tags:{highway:"living_street"},name:"Living Street"},"highway/mini_roundabout":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"mini_roundabout"},fields:["direction_clock"],name:"Mini-Roundabout"},"highway/motorway_junction":{icon:"temaki-junction",fields:["ref_highway_junction","name"],geometry:["vertex"],tags:{highway:"motorway_junction"},terms:["exit"],name:"Motorway Junction / Exit"},"highway/motorway_link":{icon:"iD-highway-motorway-link",fields:["name","ref_road_number","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"motorway_link"},addTags:{highway:"motorway_link",oneway:"yes"},removeTags:{highway:"motorway_link",oneway:"yes"},terms:["exit","ramp","road","street","on ramp","off ramp"],name:"Motorway Link"},"highway/motorway":{icon:"iD-highway-motorway",fields:["name","ref_road_number","oneway_yes","maxspeed","lanes","surface","structure","maxheight","toll","access"],geometry:["line"],tags:{highway:"motorway"},terms:["autobahn","expressway","freeway","highway","interstate","parkway","road","street","thruway","turnpike"],name:"Motorway"},"highway/passing_place":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"passing_place"},terms:["turnout, pullout"],name:"Passing Place"},"highway/path":{icon:"iD-highway-path",fields:["name","surface","width","structure","access","incline","sac_scale","trail_visibility","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","ref"],geometry:["line"],terms:["hike","hiking","trackway","trail","walk"],tags:{highway:"path"},name:"Path"},"highway/pedestrian_area":{icon:"temaki-pedestrian",fields:["name","surface","lit","width","structure","access"],geometry:["area"],tags:{highway:"pedestrian",area:"yes"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Area"},"highway/pedestrian_line":{icon:"iD-highway-footway",fields:["name","surface","lit","width","oneway","structure","access"],geometry:["line"],tags:{highway:"pedestrian"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Street"},"highway/primary_link":{icon:"iD-highway-primary-link",fields:["name","oneway","maxspeed","maxspeed/advisory","lanes","surface","maxheight","ref_road_number","cycleway","structure","access"],geometry:["line"],tags:{highway:"primary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Primary Link"},"highway/primary":{icon:"iD-highway-primary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"primary"},terms:["road","street"],name:"Primary Road"},"highway/raceway":{icon:"iD-highway-unclassified",fields:["name","oneway","surface","sport_racing_motor","lit","width","lanes","structure"],geometry:["point","line","area"],tags:{highway:"raceway"},addTags:{highway:"raceway",sport:"motor"},terms:["auto*","formula one","kart","motocross","nascar","race*","track"],name:"Racetrack (Motorsport)"},"highway/residential":{icon:"iD-highway-residential",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],geometry:["line"],tags:{highway:"residential"},terms:["road","street"],name:"Residential Road"},"highway/rest_area":{icon:"maki-car",fields:["name"],geometry:["point","vertex","area"],tags:{highway:"rest_area"},terms:["rest stop"],name:"Rest Area"},"highway/road":{icon:"iD-highway-road",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"road"},terms:["road","street"],name:"Unknown Road"},"highway/secondary_link":{icon:"iD-highway-secondary-link",fields:["name","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"secondary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Secondary Link"},"highway/secondary":{icon:"iD-highway-secondary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"secondary"},terms:["road","street"],name:"Secondary Road"},"highway/service":{icon:"iD-highway-service",fields:["name","service","oneway","maxspeed","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"service"},terms:["road","street"],name:"Service Road"},"highway/service/alley":{icon:"iD-highway-service",fields:["name","oneway","maxspeed","structure","access","surface","maxheight"],geometry:["line"],tags:{highway:"service",service:"alley"},reference:{key:"service",value:"alley"},name:"Alley"},"highway/service/drive-through":{icon:"iD-highway-service",fields:["name","oneway","covered","maxheight","maxspeed","structure","access","surface"],geometry:["line"],tags:{highway:"service",service:"drive-through"},reference:{key:"service",value:"drive-through"},name:"Drive-Through"},"highway/service/driveway":{icon:"iD-highway-service",fields:["name","oneway","maxspeed","structure","access","surface","maxheight"],geometry:["line"],tags:{highway:"service",service:"driveway"},reference:{key:"service",value:"driveway"},name:"Driveway"},"highway/service/emergency_access":{icon:"iD-highway-service",fields:["name","oneway","maxspeed","structure","access","surface","maxheight"],geometry:["line"],tags:{highway:"service",service:"emergency_access"},reference:{key:"service",value:"emergency_access"},name:"Emergency Access"},"highway/service/parking_aisle":{icon:"iD-highway-service",fields:["name","oneway","maxspeed","structure","access","surface","maxheight"],geometry:["line"],tags:{highway:"service",service:"parking_aisle"},reference:{key:"service",value:"parking_aisle"},name:"Parking Aisle"},"highway/services":{icon:"maki-car",fields:["name"],geometry:["point","vertex","area"],tags:{highway:"services"},terms:["services","travel plaza","service station"],name:"Service Area"},"highway/speed_camera":{icon:"maki-attraction",geometry:["point","vertex"],fields:["direction","ref"],tags:{highway:"speed_camera"},terms:[],name:"Speed Camera"},"highway/steps":{icon:"iD-highway-steps",fields:["surface","lit","width","incline_steps","handrail","step_count"],geometry:["line"],tags:{highway:"steps"},terms:["stairs","staircase"],name:"Steps"},"highway/stop":{icon:"temaki-stop",fields:["stop","direction_vertex"],geometry:["vertex"],tags:{highway:"stop"},terms:["stop","halt","sign"],name:"Stop Sign"},"highway/street_lamp":{icon:"temaki-bulb",geometry:["point","vertex"],tags:{highway:"street_lamp"},fields:["lamp_type","direction","ref"],terms:["streetlight","street light","lamp","light","gaslight"],name:"Street Lamp"},"highway/tertiary_link":{icon:"iD-highway-tertiary-link",fields:["name","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"tertiary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Tertiary Link"},"highway/tertiary":{icon:"iD-highway-tertiary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"tertiary"},terms:["road","street"],name:"Tertiary Road"},"highway/track":{icon:"iD-highway-track",fields:["name","tracktype","surface","width","structure","access","incline","smoothness","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale"],geometry:["line"],tags:{highway:"track"},terms:["woods road","forest road","logging road","fire road","farm road","agricultural road","ranch road","carriage road","primitive","unmaintained","rut","offroad","4wd","4x4","four wheel drive","atv","quad","jeep","double track","two track"],name:"Unmaintained Track Road"},"highway/traffic_mirror":{geometry:["point","vertex"],fields:["direction"],tags:{highway:"traffic_mirror"},terms:["blind spot","convex","corner","curved","roadside","round","safety","sphere","visibility"],name:"Traffic Mirror"},"highway/traffic_signals":{icon:"temaki-traffic_signals",geometry:["vertex"],tags:{highway:"traffic_signals"},fields:["traffic_signals","traffic_signals/direction"],terms:["light","stoplight","traffic light"],name:"Traffic Signals"},"highway/trunk_link":{icon:"iD-highway-trunk-link",fields:["name","ref_road_number","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"trunk_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Trunk Link"},"highway/trunk":{icon:"iD-highway-trunk",fields:["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","toll","access"],geometry:["line"],tags:{highway:"trunk"},terms:["road","street"],name:"Trunk Road"},"highway/turning_circle":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"turning_circle"},terms:["cul-de-sac"],name:"Turning Circle"},"highway/turning_loop":{icon:"maki-circle",geometry:["vertex"],tags:{highway:"turning_loop"},terms:["cul-de-sac"],name:"Turning Loop (Island)"},"highway/unclassified":{icon:"iD-highway-unclassified",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],geometry:["line"],tags:{highway:"unclassified"},terms:["road","street"],name:"Minor/Unclassified Road"},historic:{icon:"temaki-ruins",fields:["historic","inscription"],geometry:["point","vertex","area"],tags:{historic:"*"},name:"Historic Site"},"historic/archaeological_site":{icon:"temaki-ruins",fields:["name","site_type","historic/civilization","inscription"],geometry:["point","vertex","area"],tags:{historic:"archaeological_site"},name:"Archaeological Site"},"historic/boundary_stone":{icon:"temaki-milestone",fields:["name","inscription"],geometry:["point","vertex"],tags:{historic:"boundary_stone"},name:"Boundary Stone"},"historic/castle":{icon:"maki-castle",fields:["name","castle_type","building_area","historic/civilization"],geometry:["point","area"],tags:{historic:"castle"},name:"Castle"},"historic/memorial":{icon:"maki-monument",fields:["name","memorial","inscription"],geometry:["point","vertex","area"],terms:["dedicatory","epitaph","remember","remembrance","memory","monument","stolperstein"],tags:{historic:"memorial"},name:"Memorial"},"historic/monument":{icon:"maki-monument",fields:["name","inscription"],geometry:["point","vertex","area"],tags:{historic:"monument"},name:"Monument"},"historic/ruins":{icon:"temaki-ruins",fields:["name","historic/civilization","inscription"],geometry:["point","vertex","area"],tags:{historic:"ruins"},name:"Ruins"},"historic/tomb":{icon:"maki-cemetery",fields:["name","tomb","building_area","inscription"],geometry:["point","area"],tags:{historic:"tomb"},name:"Tomb"},"historic/wayside_cross":{icon:"maki-religious-christian",fields:["name","inscription"],geometry:["point","vertex","area"],tags:{historic:"wayside_cross"},name:"Wayside Cross"},"historic/wayside_shrine":{icon:"maki-landmark",fields:["name","religion","denomination","inscription"],geometry:["point","vertex","area"],tags:{historic:"wayside_shrine"},name:"Wayside Shrine"},junction:{icon:"temaki-junction",fields:["name"],geometry:["vertex","area"],tags:{junction:"yes"},name:"Junction"},landuse:{fields:["name","landuse"],geometry:["area"],tags:{landuse:"*"},matchScore:0.9,name:"Land Use"},"landuse/farm":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["point","area"],tags:{landuse:"farm"},terms:[],name:"Farmland",searchable:false},"landuse/allotments":{icon:"maki-garden-center",geometry:["area"],fields:["name"],tags:{landuse:"allotments"},terms:["allotment","garden"],name:"Community Garden"},"landuse/aquaculture":{icon:"maki-aquarium",fields:["name","operator","produce"],geometry:["area"],tags:{landuse:"aquaculture"},terms:["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],name:"Aquaculture"},"landuse/basin":{icon:"maki-water",fields:["name"],geometry:["area"],tags:{landuse:"basin"},terms:[],name:"Basin"},"landuse/brownfield":{geometry:["area"],fields:["name"],tags:{landuse:"brownfield"},terms:[],matchScore:0.9,name:"Brownfield"},"landuse/cemetery":{icon:"maki-cemetery",fields:["name","religion","denomination"],geometry:["area"],tags:{landuse:"cemetery"},terms:[],name:"Cemetery"},"landuse/churchyard":{icon:"maki-religious-christian",fields:["name","religion","denomination"],geometry:["area"],tags:{landuse:"churchyard"},terms:[],name:"Churchyard"},"landuse/commercial":{icon:"maki-suitcase",fields:["name"],geometry:["area"],tags:{landuse:"commercial"},terms:[],matchScore:0.9,name:"Commercial Area"},"landuse/construction":{icon:"temaki-tools",fields:["name","construction","operator"],geometry:["area"],tags:{landuse:"construction"},terms:[],name:"Construction"},"landuse/farmland":{icon:"maki-farm",fields:["name","operator","crop","produce"],geometry:["area"],tags:{landuse:"farmland"},terms:["crop","grow","plant"],name:"Farmland"},"landuse/farmyard":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["area"],tags:{landuse:"farmyard"},terms:["crop","grow","plant"],name:"Farmyard"},"landuse/forest":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle","produce"],geometry:["area"],tags:{landuse:"forest"},terms:["cut","forest","lumber","tree"],name:"Forest"},"landuse/garages":{icon:"fas-warehouse",geometry:["area"],fields:["name"],tags:{landuse:"garages"},terms:[],name:"Garage Landuse"},"landuse/grass":{geometry:["area"],tags:{landuse:"grass"},terms:[],name:"Grass"},"landuse/greenfield":{geometry:["area"],fields:["name"],tags:{landuse:"greenfield"},terms:[],matchScore:0.9,name:"Greenfield"},"landuse/greenhouse_horticulture":{icon:"maki-garden",fields:["name","operator"],geometry:["area"],terms:["flower","greenhouse","horticulture","grow","vivero"],tags:{landuse:"greenhouse_horticulture"},matchScore:0.9,name:"Greenhouse Horticulture"},"landuse/harbour":{icon:"maki-harbor",fields:["name","operator"],geometry:["area"],terms:["boat"],tags:{landuse:"harbour"},name:"Harbor"},"landuse/industrial":{icon:"maki-industry",fields:["name","industrial"],geometry:["area"],tags:{landuse:"industrial"},terms:[],matchScore:0.9,name:"Industrial Area"},"landuse/industrial/scrap_yard":{icon:"maki-car",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{industrial:"scrap_yard"},addTags:{landuse:"industrial",industrial:"scrap_yard"},removeTags:{landuse:"industrial",industrial:"scrap_yard"},reference:{key:"industrial",value:"scrap_yard"},terms:["car","junk","metal","salvage","scrap","u-pull-it","vehicle","wreck","yard"],name:"Scrap Yard"},"landuse/industrial/slaughterhouse":{icon:"maki-slaughterhouse",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{industrial:"slaughterhouse"},addTags:{landuse:"industrial",industrial:"slaughterhouse"},removeTags:{landuse:"industrial",industrial:"slaughterhouse"},reference:{key:"industrial",value:"slaughterhouse"},terms:["abattoir","beef","butchery","calf","chicken","cow","killing house","meat","pig","pork","poultry","shambles","stockyard"],name:"Slaughterhouse"},"landuse/landfill":{geometry:["area"],fields:["name"],tags:{landuse:"landfill"},terms:["dump"],name:"Landfill"},"landuse/meadow":{icon:"maki-garden",geometry:["area"],fields:["name"],tags:{landuse:"meadow"},terms:[],name:"Meadow"},"landuse/military":{icon:"temaki-military",fields:["name"],geometry:["area"],tags:{landuse:"military"},terms:[],matchScore:0.9,name:"Military Area"},"landuse/military/airfield":{icon:"maki-airfield",fields:["name","iata","icao"],geometry:["point","area"],tags:{military:"airfield"},addTags:{aeroway:"aerodrome",landuse:"military",military:"airfield"},removeTags:{aeroway:"aerodrome",landuse:"military",military:"airfield"},reference:{key:"military",value:"airfield"},terms:["aerodrome","aeroway","air force","airplane","airport","army","base","bomb","fight","force","guard","heli*","jet","marine","navy","plane","troop","war"],name:"Military Airfield"},"landuse/military/barracks":{icon:"temaki-military",fields:["name","building_area"],geometry:["point","area"],tags:{military:"barracks"},addTags:{landuse:"military",military:"barracks"},removeTags:{landuse:"military",military:"barracks"},terms:["air force","army","base","fight","force","guard","marine","navy","troop","war"],name:"Barracks"},"landuse/military/bunker":{icon:"temaki-military",fields:["name","bunker_type","building_area"],geometry:["point","area"],tags:{military:"bunker"},addTags:{building:"bunker",landuse:"military",military:"bunker"},removeTags:{building:"bunker",landuse:"military",military:"bunker"},terms:["air force","army","base","fight","force","guard","marine","navy","troop","war"],name:"Military Bunker"},"landuse/military/checkpoint":{icon:"maki-barrier",fields:["name"],geometry:["point","vertex","area"],tags:{military:"checkpoint"},addTags:{landuse:"military",military:"checkpoint"},removeTags:{landuse:"military",military:"checkpoint"},terms:["air force","army","base","force","guard","marine","navy","troop","war"],name:"Checkpoint"},"landuse/military/danger_area":{icon:"maki-danger",fields:["name"],geometry:["point","vertex","area"],tags:{military:"danger_area"},addTags:{landuse:"military",military:"danger_area"},removeTags:{landuse:"military",military:"danger_area"},terms:["air force","army","base","blast","bomb","explo*","force","guard","mine","marine","navy","troop","war"],name:"Danger Area"},"landuse/military/naval_base":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"naval_base"},addTags:{landuse:"military",military:"naval_base"},removeTags:{landuse:"military",military:"naval_base"},terms:["base","fight","force","guard","marine","navy","ship","sub","troop","war"],name:"Naval Base"},"landuse/military/nuclear_explosion_site":{icon:"maki-danger",fields:["name"],geometry:["point","vertex","area"],tags:{military:"nuclear_explosion_site"},addTags:{landuse:"military",military:"nuclear_explosion_site"},removeTags:{landuse:"military",military:"nuclear_explosion_site"},terms:["atom","blast","bomb","detonat*","nuke","site","test"],name:"Nuclear Explosion Site"},"landuse/military/obstacle_course":{icon:"temaki-military",geometry:["point","area"],tags:{military:"obstacle_course"},addTags:{landuse:"military",military:"obstacle_course"},removeTags:{landuse:"military",military:"obstacle_course"},terms:["army","base","force","guard","marine","navy","troop","war"],name:"Obstacle Course"},"landuse/military/office":{icon:"temaki-military",fields:["name","building_area"],geometry:["point","area"],tags:{military:"office"},addTags:{landuse:"military",military:"office"},removeTags:{landuse:"military",military:"office"},terms:["air force","army","base","enlist","fight","force","guard","marine","navy","recruit","troop","war"],name:"Military Office"},"landuse/military/range":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"range"},addTags:{landuse:"military",military:"range"},removeTags:{landuse:"military",military:"range"},terms:["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],name:"Military Range"},"landuse/military/training_area":{icon:"temaki-military",fields:["name"],geometry:["point","area"],tags:{military:"training_area"},addTags:{landuse:"military",military:"training_area"},removeTags:{landuse:"military",military:"training_area"},terms:["air force","army","base","fight","fire","force","guard","gun","marine","navy","rifle","shoot*","snip*","train","troop","war"],name:"Training Area"},"landuse/orchard":{icon:"maki-park-alt1",fields:["name","operator","trees"],geometry:["area"],tags:{landuse:"orchard"},terms:["fruit"],name:"Orchard"},"landuse/plant_nursery":{icon:"maki-garden",fields:["name","operator","plant"],geometry:["area"],tags:{landuse:"plant_nursery"},terms:["flower","garden","grow","vivero"],name:"Plant Nursery"},"landuse/quarry":{geometry:["area"],fields:["name"],tags:{landuse:"quarry"},terms:[],name:"Quarry"},"landuse/railway":{icon:"maki-rail",fields:["operator"],geometry:["area"],tags:{landuse:"railway"},terms:["rail","train","track"],name:"Railway Corridor"},"landuse/recreation_ground":{icon:"maki-pitch",geometry:["area"],fields:["name"],tags:{landuse:"recreation_ground"},terms:["playing fields"],name:"Recreation Ground"},"landuse/religious":{icon:"maki-place-of-worship",geometry:["area"],fields:["name","religion","denomination"],tags:{landuse:"religious"},terms:[],name:"Religious Area"},"landuse/residential":{icon:"maki-building",geometry:["area"],tags:{landuse:"residential"},terms:[],matchScore:0.9,name:"Residential Area"},"landuse/retail":{icon:"maki-commercial",geometry:["area"],fields:["name"],tags:{landuse:"retail"},matchScore:0.9,name:"Retail Area"},"landuse/vineyard":{fields:["name","operator","grape_variety"],geometry:["area"],tags:{landuse:"vineyard"},addTags:{landuse:"vineyard",crop:"grape"},removeTags:{landuse:"vineyard",crop:"grape",grape_variety:"*"},terms:["grape","wine"],name:"Vineyard"},leisure:{icon:"maki-pitch",fields:["name","leisure"],geometry:["point","vertex","area"],tags:{leisure:"*"},name:"Leisure"},"leisure/adult_gaming_centre":{icon:"temaki-dice",fields:["name","operator","address","building_area","opening_hours","smoking"],geometry:["point","area"],terms:["gambling","slot machine"],tags:{leisure:"adult_gaming_centre"},name:"Adult Gaming Center"},"leisure/amusement_arcade":{icon:"maki-gaming",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["pay-to-play games","video games","driving simulators","pinball machines"],tags:{leisure:"amusement_arcade"},name:"Amusement Arcade"},"leisure/beach_resort":{icon:"temaki-beach",fields:["name","address","fee"],geometry:["point","area"],tags:{leisure:"beach_resort"},name:"Beach Resort"},"leisure/bird_hide":{icon:"temaki-binoculars",fields:["building_area"],geometry:["point","area"],tags:{leisure:"bird_hide"},terms:["machan","ornithology"],name:"Bird Hide"},"leisure/bleachers":{geometry:["point","area"],tags:{leisure:"bleachers"},terms:["crowd","bench","sports","stand","stands","seat","seating"],name:"Bleachers"},"leisure/bowling_alley":{icon:"temaki-bowling",fields:["name","operator","address","building_area","opening_hours","smoking"],geometry:["point","area"],terms:["bowling center"],tags:{leisure:"bowling_alley"},name:"Bowling Alley"},"leisure/common":{icon:"temaki-pedestrian",geometry:["point","area"],fields:["name"],terms:["open space"],tags:{leisure:"common"},name:"Common"},"leisure/dance":{icon:"maki-music",fields:["name","operator","address","building_area","dance/style","opening_hours"],geometry:["point","area"],terms:["ballroom","jive","swing","tango","waltz"],tags:{leisure:"dance"},name:"Dance Hall"},"leisure/dancing_school":{icon:"maki-music",fields:["name","operator","address","opening_hours","dance/style"],geometry:["point","area"],terms:["jive","swing","tango","waltz","dance teaching"],tags:{leisure:"dance","dance:teaching":"yes"},reference:{key:"leisure",value:"dance"},name:"Dance School"},"leisure/dog_park":{icon:"maki-dog-park",geometry:["point","area"],fields:["name"],terms:[],tags:{leisure:"dog_park"},name:"Dog Park"},"leisure/firepit":{icon:"maki-fire-station",fields:["access_simple"],geometry:["point","area"],tags:{leisure:"firepit"},terms:["fireplace","campfire"],name:"Firepit"},"leisure/fitness_centre":{icon:"maki-pitch",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre"},terms:["health","gym","leisure","studio"],name:"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{icon:"maki-pitch",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],terms:["studio"],tags:{leisure:"fitness_centre",sport:"yoga"},reference:{key:"sport",value:"yoga"},name:"Yoga Studio"},"leisure/fitness_station":{icon:"maki-pitch",fields:["fitness_station","ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station"},addTags:{leisure:"fitness_station",sport:"fitness"},removeTags:{leisure:"fitness_station",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","trim trail"],name:"Outdoor Fitness Station"},"leisure/fitness_station/balance_beam":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"balance_beam"},addTags:{leisure:"fitness_station",fitness_station:"balance_beam",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"balance_beam",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["balance","exercise","fitness","gym","trim trail"],name:"Exercise Balance Beam"},"leisure/fitness_station/box":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"box"},addTags:{leisure:"fitness_station",fitness_station:"box",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"box",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["box","exercise","fitness","gym","jump","trim trail"],name:"Exercise Box"},"leisure/fitness_station/horizontal_bar":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"horizontal_bar"},addTags:{leisure:"fitness_station",fitness_station:"horizontal_bar",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"horizontal_bar",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","chinup","chin up","exercise","fitness","gym","pullup","pull up","trim trail"],name:"Exercise Horizontal Bar"},"leisure/fitness_station/horizontal_ladder":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"horizontal_ladder"},addTags:{leisure:"fitness_station",fitness_station:"horizontal_ladder",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"horizontal_ladder",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","chinup","chin up","exercise","fitness","gym","ladder","monkey bars","pullup","pull up","trim trail"],name:"Exercise Monkey Bars"},"leisure/fitness_station/hyperextension":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"hyperextension"},addTags:{leisure:"fitness_station",fitness_station:"hyperextension",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"hyperextension",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["back","exercise","extension","fitness","gym","roman chair","trim trail"],name:"Hyperextension Station"},"leisure/fitness_station/parallel_bars":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"parallel_bars"},addTags:{leisure:"fitness_station",fitness_station:"parallel_bars",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"parallel_bars",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","dip","exercise","fitness","gym","trim trail"],name:"Parallel Bars"},"leisure/fitness_station/push-up":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"push-up"},addTags:{leisure:"fitness_station",fitness_station:"push-up",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"push-up",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["bar","exercise","fitness","gym","pushup","push up","trim trail"],name:"Push-Up Station"},"leisure/fitness_station/rings":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"rings"},addTags:{leisure:"fitness_station",fitness_station:"rings",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"rings",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","muscle up","pullup","pull up","trim trail"],name:"Exercise Rings"},"leisure/fitness_station/sign":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"sign"},addTags:{leisure:"fitness_station",fitness_station:"sign",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"sign",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","trim trail"],name:"Exercise Instruction Sign"},"leisure/fitness_station/sit-up":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"sit-up"},addTags:{leisure:"fitness_station",fitness_station:"sit-up",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"sit-up",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["crunch","exercise","fitness","gym","situp","sit up","trim trail"],name:"Sit-Up Station"},"leisure/fitness_station/stairs":{icon:"maki-pitch",fields:["ref","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_station",fitness_station:"stairs"},addTags:{leisure:"fitness_station",fitness_station:"stairs",sport:"fitness"},removeTags:{leisure:"fitness_station",fitness_station:"stairs",sport:"fitness"},reference:{key:"leisure",value:"fitness_station"},terms:["exercise","fitness","gym","steps","trim trail"],name:"Exercise Stairs"},"leisure/garden":{icon:"maki-garden",fields:["name","access_simple"],geometry:["point","vertex","area"],tags:{leisure:"garden"},name:"Garden"},"leisure/golf_course":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["links"],tags:{leisure:"golf_course"},name:"Golf Course"},"leisure/hackerspace":{icon:"maki-commercial",fields:["name","address","building_area","opening_hours","website"],geometry:["point","area"],terms:["makerspace","hackspace","hacklab"],tags:{leisure:"hackerspace"},name:"Hackerspace"},"leisure/horse_riding":{icon:"maki-horse-riding",fields:["name","access_simple","operator","address","building"],geometry:["point","area"],terms:["equestrian","stable"],tags:{leisure:"horse_riding"},name:"Horseback Riding Facility"},"leisure/ice_rink":{icon:"maki-pitch",fields:["name","seasonal","sport_ice","operator","address","building","opening_hours"],geometry:["point","area"],terms:["hockey","skating","curling"],tags:{leisure:"ice_rink"},name:"Ice Rink"},"leisure/marina":{icon:"maki-harbor",fields:["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],terms:["boat"],tags:{leisure:"marina"},name:"Marina"},"leisure/miniature_golf":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["crazy golf","mini golf","putt-putt"],tags:{leisure:"miniature_golf"},name:"Miniature Golf"},"leisure/nature_reserve":{icon:"maki-park",geometry:["point","area"],fields:["name"],tags:{leisure:"nature_reserve"},terms:["protected","wildlife"],name:"Nature Reserve"},"leisure/outdoor_seating":{icon:"maki-picnic-site",geometry:["point","area"],fields:["name","operator"],terms:["al fresco","beer garden","dining","cafe","restaurant","pub","bar","patio"],tags:{leisure:"outdoor_seating"},name:"Outdoor Seating Area"},"leisure/park":{icon:"maki-park",geometry:["point","area"],fields:["name"],terms:["esplanade","estate","forest","garden","grass","green","grounds","lawn","lot","meadow","parkland","place","playground","plaza","pleasure garden","recreation area","square","tract","village green","woodland"],tags:{leisure:"park"},name:"Park"},"leisure/picnic_table":{icon:"maki-picnic-site",geometry:["point"],tags:{leisure:"picnic_table"},terms:["bench"],name:"Picnic Table"},"leisure/pitch":{icon:"maki-pitch",fields:["name","sport","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch"},terms:["field"],name:"Sport Pitch"},"leisure/pitch/american_football":{icon:"maki-america-football",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"american_football"},reference:{key:"sport",value:"american_football"},terms:[],name:"American Football Field"},"leisure/pitch/badminton":{icon:"maki-tennis",fields:["name","surface","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"badminton"},reference:{key:"sport",value:"badminton"},terms:[],name:"Badminton Court"},"leisure/pitch/baseball":{icon:"maki-baseball",fields:["name","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"baseball"},reference:{key:"sport",value:"baseball"},terms:[],name:"Baseball Diamond"},"leisure/pitch/basketball":{icon:"maki-basketball",fields:["name","surface","hoops","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"basketball"},reference:{key:"sport",value:"basketball"},terms:[],name:"Basketball Court"},"leisure/pitch/beachvolleyball":{icon:"maki-basketball",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"beachvolleyball"},addTags:{leisure:"pitch",sport:"beachvolleyball",surface:"sand"},removeTags:{leisure:"pitch",sport:"beachvolleyball",surface:"sand"},reference:{key:"sport",value:"beachvolleyball"},terms:["volleyball"],name:"Beach Volleyball Court"},"leisure/pitch/boules":{icon:"maki-pitch",fields:["name","boules","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"boules"},reference:{key:"sport",value:"boules"},terms:["bocce","lyonnaise","pétanque"],name:"Boules/Bocce Court"},"leisure/pitch/bowls":{icon:"maki-pitch",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"bowls"},reference:{key:"sport",value:"bowls"},terms:[],name:"Bowling Green"},"leisure/pitch/cricket":{icon:"maki-cricket",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"cricket"},reference:{key:"sport",value:"cricket"},terms:[],name:"Cricket Field"},"leisure/pitch/equestrian":{icon:"maki-horse-riding",fields:["name","surface","lit","building"],geometry:["point","area"],tags:{leisure:"pitch",sport:"equestrian"},reference:{key:"sport",value:"equestrian"},terms:["dressage","equestrian","horse","horseback","riding"],name:"Riding Arena"},"leisure/pitch/rugby_league":{icon:"maki-america-football",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"rugby_league"},reference:{key:"sport",value:"rugby_league"},terms:[],name:"Rugby League Field"},"leisure/pitch/rugby_union":{icon:"maki-america-football",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"rugby_union"},reference:{key:"sport",value:"rugby_union"},terms:[],name:"Rugby Union Field"},"leisure/pitch/skateboard":{icon:"maki-pitch",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"skateboard"},reference:{key:"sport",value:"skateboard"},terms:[],name:"Skate Park"},"leisure/pitch/soccer":{icon:"maki-soccer",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"soccer"},reference:{key:"sport",value:"soccer"},terms:["football"],name:"Soccer Field"},"leisure/pitch/table_tennis":{icon:"maki-tennis",fields:["name","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"table_tennis"},reference:{key:"sport",value:"table_tennis"},terms:["table tennis","ping pong"],name:"Ping Pong Table"},"leisure/pitch/tennis":{icon:"maki-tennis",fields:["name","surface","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"tennis"},reference:{key:"sport",value:"tennis"},terms:[],name:"Tennis Court"},"leisure/pitch/volleyball":{icon:"maki-basketball",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"volleyball"},reference:{key:"sport",value:"volleyball"},terms:[],name:"Volleyball Court"},"leisure/playground":{icon:"maki-playground",fields:["name","operator","surface","playground/max_age","playground/min_age","access_simple"],geometry:["point","area"],terms:["jungle gym","play area"],tags:{leisure:"playground"},name:"Playground"},"leisure/resort":{icon:"maki-lodging",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{leisure:"resort"},name:"Resort"},"leisure/running_track":{icon:"maki-pitch",fields:["surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["point","line","area"],tags:{leisure:"track",sport:"running"},terms:["race*","running","sprint","track"],name:"Racetrack (Running)"},"leisure/sauna":{icon:"fas-thermometer-three-quarters",fields:["name","operator","address","opening_hours","access_simple","fee"],geometry:["point","area"],tags:{leisure:"sauna"},name:"Sauna"},"leisure/slipway":{icon:"temaki-beach",fields:["access_simple"],geometry:["point","line"],terms:["boat launch","boat ramp"],tags:{leisure:"slipway"},name:"Slipway"},"leisure/sports_centre":{icon:"maki-pitch",fields:["name","sport","building","address","opening_hours"],geometry:["point","area"],tags:{leisure:"sports_centre"},terms:[],name:"Sports Center / Complex"},"leisure/sports_centre/swimming":{icon:"maki-swimming",fields:["name","access_simple","operator","address","building"],geometry:["point","area"],terms:["dive","water"],tags:{leisure:"sports_centre",sport:"swimming"},reference:{key:"sport",value:"swimming"},name:"Swimming Pool Facility"},"leisure/stadium":{icon:"maki-pitch",fields:["name","sport","address"],geometry:["point","area"],tags:{leisure:"stadium"},name:"Stadium"},"leisure/swimming_pool":{icon:"maki-swimming",fields:["name","access_simple","operator","address"],geometry:["point","area"],terms:["dive","water"],tags:{leisure:"swimming_pool"},name:"Swimming Pool"},"leisure/track":{icon:"iD-highway-road",fields:["surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["point","line","area"],tags:{leisure:"track"},terms:["cycle","dog","greyhound","horse","race*","track"],name:"Racetrack (Non-Motorsport)"},"leisure/water_park":{icon:"maki-swimming",fields:["name","operator","address"],geometry:["point","area"],terms:["swim","pool","dive"],tags:{leisure:"water_park"},name:"Water Park"},line:{fields:["name"],geometry:["line"],tags:{},name:"Line",matchScore:0.1},man_made:{icon:"temaki-storage_tank",fields:["name","man_made"],geometry:["point","vertex","line","area"],tags:{man_made:"*"},name:"Man Made"},"man_made/embankment":{geometry:["line"],tags:{man_made:"embankment"},name:"Embankment",searchable:false},"man_made/adit":{icon:"maki-triangle",geometry:["point","area"],fields:["operator","direction"],terms:["entrance","underground","mine","cave"],tags:{man_made:"adit"},name:"Adit"},"man_made/antenna":{icon:"temaki-antenna",fields:["height","communication_multi"],geometry:["point"],terms:["broadcast","cell phone","cell","communication","mobile phone","radio","television","transmission","tv"],tags:{man_made:"antenna"},name:"Antenna"},"man_made/breakwater":{geometry:["line","area"],tags:{man_made:"breakwater"},name:"Breakwater"},"man_made/bridge":{geometry:["area"],tags:{man_made:"bridge"},name:"Bridge"},"man_made/bunker_silo":{icon:"temaki-silo",fields:["content"],geometry:["point","area"],terms:["Silage","Storage"],tags:{man_made:"bunker_silo"},name:"Bunker Silo"},"man_made/chimney":{icon:"temaki-chimney",geometry:["point","area"],tags:{man_made:"chimney"},name:"Chimney"},"man_made/clearcut":{icon:"maki-logging",geometry:["area"],tags:{man_made:"clearcut"},terms:["cut","forest","lumber","tree","wood"],name:"Clearcut Forest"},"man_made/crane":{icon:"temaki-crane",fields:["operator","height","crane/type"],geometry:["point","line","vertex","area"],tags:{man_made:"crane"},name:"Crane"},"man_made/cutline":{icon:"maki-logging",geometry:["line"],tags:{man_made:"cutline"},name:"Cut line"},"man_made/flagpole":{icon:"maki-embassy",geometry:["point"],tags:{man_made:"flagpole"},name:"Flagpole"},"man_made/gasometer":{icon:"temaki-storage_tank",fields:["content","building_area"],geometry:["point","area"],terms:["gas holder"],tags:{man_made:"gasometer"},name:"Gasometer"},"man_made/groyne":{geometry:["line","area"],tags:{man_made:"groyne"},name:"Groyne"},"man_made/lighthouse":{icon:"maki-lighthouse",fields:["building_area"],geometry:["point","area"],tags:{man_made:"lighthouse"},name:"Lighthouse"},"man_made/mast":{icon:"temaki-antenna",fields:["tower/type","tower/construction","height","communication_multi"],geometry:["point"],terms:["antenna","broadcast tower","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","radio mast","radio tower","television tower","transmission mast","transmission tower","tv tower"],tags:{man_made:"mast"},name:"Mast"},"man_made/monitoring_station":{icon:"temaki-antenna",geometry:["point","area"],fields:["monitoring_multi","operator"],terms:["weather","earthquake","seismology","air","gps"],tags:{man_made:"monitoring_station"},name:"Monitoring Station"},"man_made/observation":{icon:"temaki-tower",geometry:["point","area"],terms:["lookout tower","fire tower"],tags:{man_made:"tower","tower:type":"observation"},name:"Observation Tower"},"man_made/observatory":{geometry:["point","area"],terms:["astronomical","meteorological"],tags:{man_made:"observatory"},name:"Observatory"},"man_made/petroleum_well":{icon:"temaki-storage_tank",geometry:["point"],terms:["drilling rig","oil derrick","oil drill","oil horse","oil rig","oil pump","petroleum well","pumpjack"],tags:{man_made:"petroleum_well"},name:"Oil Well"},"man_made/pier":{icon:"iD-highway-footway",fields:["name","surface","lit","width","access"],geometry:["line","area"],terms:["dock","jetty"],tags:{man_made:"pier"},name:"Pier"},"man_made/pipeline":{icon:"iD-pipeline-line",fields:["location","operator","substance","layer"],geometry:["line"],tags:{man_made:"pipeline"},name:"Pipeline"},"man_made/pumping_station":{icon:"maki-water",geometry:["point","area"],tags:{man_made:"pumping_station"},name:"Pumping Station"},"man_made/silo":{icon:"temaki-silo",fields:["crop","building_area"],geometry:["point","area"],terms:["grain","corn","wheat"],tags:{man_made:"silo"},name:"Silo"},"man_made/storage_tank":{icon:"temaki-storage_tank",fields:["content","building_area"],geometry:["point","area"],terms:["water","oil","gas","petrol"],tags:{man_made:"storage_tank"},name:"Storage Tank"},"man_made/surveillance_camera":{icon:"maki-attraction",geometry:["point","vertex"],fields:["surveillance","surveillance/type","camera/type","camera/mount","camera/direction","surveillance/zone","contact/webcam"],terms:["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],tags:{man_made:"surveillance","surveillance:type":"camera"},name:"Surveillance Camera"},"man_made/surveillance":{icon:"maki-attraction",geometry:["point","vertex"],fields:["surveillance","surveillance/type","surveillance/zone","direction"],terms:["anpr","alpr","camera","car plate recognition","cctv","guard","license plate recognition","monitoring","number plate recognition","security","video","webcam"],tags:{man_made:"surveillance"},name:"Surveillance"},"man_made/survey_point":{icon:"maki-monument",fields:["ref"],geometry:["point","vertex"],terms:["trig point","triangulation pillar","trigonometrical station"],tags:{man_made:"survey_point"},name:"Survey Point"},"man_made/tower":{icon:"temaki-tower",fields:["tower/type","tower/construction","height"],geometry:["point","area"],tags:{man_made:"tower"},name:"Tower"},"man_made/wastewater_plant":{icon:"maki-water",fields:["name","operator","address"],geometry:["point","area"],terms:["sewage*","water treatment plant","reclamation plant"],tags:{man_made:"wastewater_plant"},name:"Wastewater Plant"},"man_made/water_tower":{icon:"maki-water",fields:["operator"],geometry:["point","area"],tags:{man_made:"water_tower"},name:"Water Tower"},"man_made/water_well":{icon:"maki-water",fields:["operator"],geometry:["point","area"],tags:{man_made:"water_well"},name:"Water Well"},"man_made/water_works":{icon:"maki-water",fields:["name","operator","address"],geometry:["point","area"],tags:{man_made:"water_works"},name:"Water Works"},"man_made/watermill":{icon:"maki-buddhism",fields:["building_area"],geometry:["point","area"],terms:["water","wheel","mill"],tags:{man_made:"watermill"},name:"Watermill"},"man_made/windmill":{icon:"temaki-windmill",fields:["building_area"],geometry:["point","area"],terms:["wind","wheel","mill"],tags:{man_made:"windmill"},name:"Windmill"},"man_made/works":{icon:"maki-industry",fields:["name","operator","address","building_area","product"],geometry:["point","area"],terms:["assembly","build","brewery","car","plant","plastic","processing","manufacture","refinery"],tags:{man_made:"works"},name:"Factory"},manhole:{icon:"maki-circle-stroked",fields:["manhole","operator","label","ref"],geometry:["point","vertex"],tags:{manhole:"*"},terms:["cover","hole","sewer","sewage","telecom"],name:"Manhole"},"manhole/drain":{icon:"maki-water",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"drain"},terms:["cover","drain","hole","rain","sewer","sewage","storm"],name:"Storm Drain"},"manhole/telecom":{icon:"maki-circle-stroked",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"telecom"},terms:["cover","phone","hole","telecom","telephone","bt"],name:"Telecom Manhole"},natural:{icon:"maki-natural",fields:["name","natural"],geometry:["point","vertex","area"],tags:{natural:"*"},name:"Natural"},"natural/bare_rock":{geometry:["area"],tags:{natural:"bare_rock"},terms:["rock"],name:"Bare Rock"},"natural/bay":{icon:"temaki-beach",geometry:["point","area"],fields:["name"],tags:{natural:"bay"},terms:[],name:"Bay"},"natural/beach":{icon:"temaki-beach",fields:["surface"],geometry:["point","area"],tags:{natural:"beach"},terms:["shore"],name:"Beach"},"natural/cave_entrance":{icon:"maki-triangle",geometry:["point","area"],fields:["fee","access_simple","direction"],tags:{natural:"cave_entrance"},terms:["cavern","hollow","grotto","shelter","cavity"],name:"Cave Entrance"},"natural/cliff":{icon:"maki-triangle",fields:["name","height"],geometry:["point","vertex","line","area"],tags:{natural:"cliff"},terms:["crag","escarpment","rock face","scarp"],name:"Cliff"},"natural/coastline":{geometry:["line"],tags:{natural:"coastline"},terms:["shore"],name:"Coastline"},"natural/fell":{geometry:["area"],tags:{natural:"fell"},terms:[],name:"Fell"},"natural/glacier":{geometry:["area"],tags:{natural:"glacier"},terms:[],name:"Glacier"},"natural/grassland":{geometry:["area"],tags:{natural:"grassland"},terms:["prairie","savanna"],name:"Grassland"},"natural/heath":{geometry:["area"],tags:{natural:"heath"},terms:[],name:"Heath"},"natural/mud":{geometry:["area"],tags:{natural:"mud"},terms:["wetland"],name:"Mud"},"natural/peak":{icon:"maki-mountain",fields:["name","elevation"],geometry:["point","vertex"],tags:{natural:"peak"},terms:["acme","aiguille","alp","climax","crest","crown","hill","mount","mountain","pinnacle","summit","tip","top"],name:"Peak"},"natural/reef":{icon:"temaki-beach",geometry:["point","area"],tags:{natural:"reef"},terms:["barrier","coral","ocean","sand","shoal"],name:"Reef"},"natural/ridge":{geometry:["line"],tags:{natural:"ridge"},terms:["crest"],name:"Ridge"},"natural/saddle":{icon:"maki-triangle-stroked",fields:["elevation"],geometry:["point","vertex"],tags:{natural:"saddle"},terms:["pass","mountain pass","top"],name:"Saddle"},"natural/sand":{geometry:["area"],tags:{natural:"sand"},terms:["desert"],name:"Sand"},"natural/scree":{geometry:["area"],tags:{natural:"scree"},terms:["loose rocks"],name:"Scree"},"natural/scrub":{geometry:["area"],tags:{natural:"scrub"},terms:["bush","shrubs"],name:"Scrub"},"natural/spring":{icon:"maki-water",fields:["name","intermittent"],geometry:["point","vertex"],tags:{natural:"spring"},terms:[],name:"Spring"},"natural/tree_row":{icon:"maki-park",fields:["leaf_type","leaf_cycle","denotation"],geometry:["line"],tags:{natural:"tree_row"},terms:[],name:"Tree row"},"natural/tree":{icon:"maki-park",fields:["leaf_type_singular","leaf_cycle_singular","denotation"],geometry:["point","vertex"],tags:{natural:"tree"},terms:[],name:"Tree"},"natural/volcano":{icon:"maki-volcano",fields:["name","elevation","volcano/status","volcano/type"],geometry:["point","vertex"],tags:{natural:"volcano"},terms:["mountain","crater"],name:"Volcano"},"natural/water":{icon:"maki-water",fields:["water"],geometry:["area"],tags:{natural:"water"},name:"Water"},"natural/water/lake":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"lake"},reference:{key:"natural",value:"water"},terms:["lakelet","loch","mere"],name:"Lake"},"natural/water/pond":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"pond"},reference:{key:"natural",value:"water"},terms:["lakelet","millpond","tarn","pool","mere"],name:"Pond"},"natural/water/reservoir":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"reservoir"},reference:{key:"natural",value:"water"},name:"Reservoir"},"natural/wetland":{icon:"maki-wetland",fields:["wetland"],geometry:["point","area"],tags:{natural:"wetland"},terms:["bog","marsh","reedbed","swamp","tidalflat"],name:"Wetland"},"natural/wood":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle"],geometry:["point","area"],tags:{natural:"wood"},terms:["tree"],name:"Wood"},"noexit/yes":{icon:"maki-barrier",geometry:["vertex"],terms:["no exit","road end","dead end"],tags:{noexit:"yes"},reference:{key:"noexit",value:"*"},name:"No Exit"},office:{icon:"maki-suitcase",fields:["name","office","address","building_area","opening_hours","smoking"],geometry:["point","vertex","area"],tags:{office:"*"},terms:[],name:"Office"},"office/administrative":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"administrative"},terms:[],searchable:false,name:"Administrative Office"},"office/physician":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"physician"},searchable:false,name:"Physician"},"office/travel_agent":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"travel_agent"},reference:{key:"shop",value:"travel_agency"},terms:[],name:"Travel Agency",searchable:false},"office/accountant":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"accountant"},terms:[],name:"Accountant Office"},"office/adoption_agency":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"adoption_agency"},terms:[],name:"Adoption Agency"},"office/advertising_agency":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"advertising_agency"},terms:["ad","ad agency","advert agency","advertising","marketing"],name:"Advertising Agency"},"office/architect":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"architect"},terms:[],name:"Architect Office"},"office/association":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"association"},terms:["association","non-profit","nonprofit","organization","society"],name:"Nonprofit Organization Office"},"office/charity":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"charity"},terms:["charitable organization"],name:"Charity Office"},"office/company":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","smoking"],geometry:["point","area"],tags:{office:"company"},terms:[],name:"Corporate Office"},"office/coworking":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],terms:["coworking","office"],tags:{office:"coworking"},reference:{key:"amenity",value:"coworking_space"},name:"Coworking Space"},"office/educational_institution":{icon:"maki-school",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"educational_institution"},terms:[],name:"Educational Institution"},"office/employment_agency":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"employment_agency"},terms:["job"],name:"Employment Agency"},"office/energy_supplier":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"energy_supplier"},terms:["electricity","energy company","energy utility","gas utility"],name:"Energy Supplier Office"},"office/estate_agent":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"estate_agent"},terms:[],name:"Real Estate Office"},"office/financial":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"financial"},terms:[],name:"Financial Office"},"office/forestry":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"forestry"},terms:["forest","ranger"],name:"Forestry Office"},"office/foundation":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"foundation"},terms:[],name:"Foundation Office"},"office/government":{icon:"maki-town-hall",fields:["name","government","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"government"},terms:[],name:"Government Office"},"office/government/register_office":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],terms:["clerk","marriage","death","birth","certificate"],tags:{office:"government",government:"register_office"},reference:{key:"government",value:"register_office"},name:"Register Office"},"office/government/tax":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],terms:["fiscal authorities","revenue office","tax office"],tags:{office:"government",government:"tax"},reference:{key:"government",value:"tax"},name:"Tax and Revenue Office"},"office/guide":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"guide"},terms:["dive guide","mountain guide","tour guide"],name:"Tour Guide Office"},"office/insurance":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"insurance"},terms:[],name:"Insurance Office"},"office/it":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"it"},terms:["computer","information","software","technology"],name:"Information Technology Office"},"office/lawyer":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"lawyer"},terms:[],name:"Law Office"},"office/lawyer/notary":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"lawyer",lawyer:"notary"},reference:{key:"office",value:"notary"},searchable:false,name:"Notary Office"},"office/moving_company":{icon:"maki-warehouse",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"moving_company"},terms:["relocation"],name:"Moving Company Office"},"office/newspaper":{icon:"maki-library",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"newspaper"},terms:[],name:"Newspaper Office"},"office/ngo":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","smoking"],geometry:["point","area"],tags:{office:"ngo"},terms:["ngo","non government","non-government","organization","organisation"],name:"NGO Office"},"office/notary":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"notary"},terms:["clerk","deeds","estate","signature","wills"],name:"Notary Office"},"office/political_party":{icon:"maki-town-hall",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"political_party"},terms:[],name:"Political Party"},"office/private_investigator":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"private_investigator"},terms:["PI","private eye","private detective"],name:"Private Investigator Office"},"office/quango":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"quango"},terms:["ngo","non government","non-government","organization","organisation","quasi autonomous","quasi-autonomous"],name:"Quasi-NGO Office"},"office/research":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"research"},terms:[],name:"Research Office"},"office/surveyor":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"surveyor"},terms:[],name:"Surveyor Office"},"office/tax_advisor":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"tax_advisor"},terms:["tax","tax consultant"],name:"Tax Advisor Office"},"office/telecommunication":{icon:"maki-telephone",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"telecommunication"},terms:["communication","internet","phone","voice"],name:"Telecom Office"},"office/therapist":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"therapist"},terms:["therapy"],name:"Therapist Office"},"office/water_utility":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","operator"],geometry:["point","area"],tags:{office:"water_utility"},terms:["water board","utility"],name:"Water Utility Office"},piste:{icon:"maki-skiing",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["point","line","area"],terms:["ski","sled","sleigh","snowboard","nordic","downhill","snowmobile"],tags:{"piste:type":"*"},name:"Piste/Ski Trail"},"place/farm":{icon:"maki-farm",geometry:["point","area"],fields:["name"],tags:{place:"farm"},name:"Farm",searchable:false},"place/city":{icon:"maki-city",fields:["name","population"],geometry:["point","area"],tags:{place:"city"},name:"City"},"place/hamlet":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"hamlet"},name:"Hamlet"},"place/island":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"island"},name:"Island"},"place/islet":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"islet"},name:"Islet"},"place/isolated_dwelling":{icon:"maki-home",geometry:["point","area"],fields:["name"],tags:{place:"isolated_dwelling"},name:"Isolated Dwelling"},"place/locality":{icon:"maki-triangle-stroked",geometry:["point","area"],fields:["name"],tags:{place:"locality"},name:"Locality"},"place/neighbourhood":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"neighbourhood"},terms:["neighbourhood"],name:"Neighborhood"},"place/plot":{icon:"maki-triangle-stroked",fields:["name"],geometry:["point","area"],tags:{place:"plot"},terms:["tract","land","lot","parcel"],name:"Plot"},"place/quarter":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"quarter"},terms:["boro","borough","quarter"],name:"Sub-Borough / Quarter"},"place/square":{geometry:["point","area"],fields:["name"],tags:{place:"square"},name:"Square"},"place/suburb":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"suburb"},terms:["boro","borough","quarter"],name:"Borough / Suburb"},"place/town":{icon:"maki-town",fields:["name","population"],geometry:["point","area"],tags:{place:"town"},name:"Town"},"place/village":{icon:"maki-village",fields:["name","population"],geometry:["point","area"],tags:{place:"village"},name:"Village"},"playground/balance_beam":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"balancebeam"},name:"Play Balance Beam"},"playground/basket_spinner":{icon:"maki-playground",geometry:["point"],terms:["basket rotator"],tags:{playground:"basketrotator"},name:"Basket Spinner"},"playground/basket_swing":{icon:"maki-playground",geometry:["point"],tags:{playground:"basketswing"},name:"Basket Swing"},"playground/climbing_frame":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"climbingframe"},name:"Climbing Frame"},"playground/cushion":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"cushion"},name:"Bouncy Cushion"},"playground/horizontal_bar":{icon:"maki-pitch",fields:["height"],geometry:["point"],terms:["high bar"],tags:{playground:"horizontal_bar"},name:"Play Horizontal Bar"},"playground/rocker":{icon:"maki-playground",geometry:["point"],tags:{playground:"springy"},name:"Spring Rider",terms:["spring rocker","springy rocker"]},"playground/roundabout":{icon:"maki-stadium",fields:["bench"],geometry:["point","area"],tags:{playground:"roundabout"},name:"Play Roundabout",terms:["merry-go-round"]},"playground/sandpit":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"sandpit"},name:"Sandpit"},"playground/seesaw":{icon:"maki-playground",geometry:["point"],tags:{playground:"seesaw"},name:"Seesaw"},"playground/slide":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"slide"},name:"Slide"},"playground/structure":{icon:"maki-pitch",geometry:["point","area"],tags:{playground:"structure"},name:"Play Structure"},"playground/swing":{icon:"maki-playground",fields:["capacity","playground/baby","wheelchair"],geometry:["point"],tags:{playground:"swing"},name:"Swing"},"playground/zipwire":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"zipwire"},name:"Zip Wire"},point:{fields:["name"],geometry:["point"],tags:{},name:"Point",matchScore:0.1},"power/sub_station":{icon:"temaki-power",fields:["substation","operator","building","ref"],geometry:["point","area"],tags:{power:"sub_station"},reference:{key:"power",value:"substation"},name:"Substation",searchable:false},"power/generator":{icon:"temaki-power",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],geometry:["point","vertex","area"],terms:["hydro","solar","turbine","wind"],tags:{power:"generator"},name:"Power Generator"},"power/generator/source_nuclear":{icon:"temaki-radiation",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","ref"],geometry:["point","vertex","area"],terms:["fission","generator","nuclear","nuke","reactor"],tags:{power:"generator","generator:source":"nuclear","generator:method":"fission"},reference:{key:"generator:source",value:"nuclear"},name:"Nuclear Reactor"},"power/generator/source_wind":{icon:"temaki-wind_turbine",fields:["operator","generator/source","generator/method","generator/type","generator/output/electricity","height","ref"],geometry:["point","vertex","area"],terms:["generator","turbine","windmill","wind"],tags:{power:"generator","generator:source":"wind","generator:method":"wind_turbine"},reference:{key:"generator:source",value:"wind"},name:"Wind Turbine"},"power/line":{icon:"iD-power-line",fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"line"},name:"Power Line"},"power/minor_line":{icon:"iD-power-line",fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"minor_line"},name:"Minor Power Line"},"power/plant":{icon:"maki-industry",fields:["name","operator","address","plant/output/electricity","start_date"],geometry:["area"],tags:{power:"plant"},addTags:{power:"plant",landuse:"industrial"},removeTags:{power:"plant",landuse:"industrial"},terms:["coal","gas","generat*","hydro","nuclear","power","station"],name:"Power Station Grounds"},"power/pole":{fields:["ref"],geometry:["point","vertex"],tags:{power:"pole"},name:"Power Pole"},"power/substation":{icon:"temaki-power",fields:["substation","operator","building","ref"],geometry:["point","area"],tags:{power:"substation"},name:"Substation"},"power/switch":{icon:"temaki-power",fields:["switch","operator","location","cables","voltage","ref"],geometry:["point","vertex","area"],tags:{power:"switch"},name:"Power Switch"},"power/tower":{fields:["ref"],geometry:["vertex"],tags:{power:"tower"},name:"High-Voltage Tower"},"power/transformer":{icon:"temaki-power",fields:["transformer","operator","location","rating","devices","phases","frequency","voltage/primary","voltage/secondary","voltage/tertiary","windings","windings/configuration","ref"],geometry:["point","vertex","area"],tags:{power:"transformer"},name:"Transformer"},"public_transport/linear_platform_aerialway":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",aerialway:"yes"},reference:{key:"public_transport",value:"platform"},terms:["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],name:"Aerialway Stop / Platform"},"public_transport/linear_platform_bus":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],geometry:["line"],tags:{public_transport:"platform",bus:"yes"},addTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},removeTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","platform","public transit","public transportation","transit","transportation"],name:"Bus Stop / Platform"},"public_transport/linear_platform_ferry":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",ferry:"yes"},reference:{key:"public_transport",value:"platform"},terms:["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],name:"Ferry Stop / Platform"},"public_transport/linear_platform_light_rail":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",light_rail:"yes"},addTags:{public_transport:"platform",light_rail:"yes",railway:"platform"},removeTags:{public_transport:"platform",light_rail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],name:"Light Rail Stop / Platform"},"public_transport/linear_platform_monorail":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",monorail:"yes"},addTags:{public_transport:"platform",monorail:"yes",railway:"platform"},removeTags:{public_transport:"platform",monorail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["monorail","platform","public transit","public transportation","rail","transit","transportation"],name:"Monorail Stop / Platform"},"public_transport/linear_platform_subway":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",subway:"yes"},addTags:{public_transport:"platform",subway:"yes",railway:"platform"},removeTags:{public_transport:"platform",subway:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],name:"Subway Stop / Platform"},"public_transport/linear_platform_train":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",train:"yes"},addTags:{public_transport:"platform",train:"yes",railway:"platform"},removeTags:{public_transport:"platform",train:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["platform","public transit","public transportation","rail","track","train","transit","transportation"],name:"Train Stop / Platform"},"public_transport/linear_platform_tram":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],geometry:["line"],tags:{public_transport:"platform",tram:"yes"},addTags:{public_transport:"platform",tram:"yes",railway:"platform"},removeTags:{public_transport:"platform",tram:"yes",railway:"platform"},reference:{key:"public_transport",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],name:"Tram Stop / Platform"},"public_transport/linear_platform_trolleybus":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform",trolleybus:"yes"},addTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},removeTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Stop / Platform"},"public_transport/linear_platform":{icon:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["line"],tags:{public_transport:"platform"},terms:["platform","public transit","public transportation","transit","transportation"],name:"Transit Stop / Platform",matchScore:0.2},"public_transport/platform_aerialway":{icon:"maki-aerialway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",aerialway:"yes"},reference:{key:"public_transport",value:"platform"},terms:["aerialway","cable car","platform","public transit","public transportation","transit","transportation"],name:"Aerialway Stop / Platform"},"public_transport/platform_bus":{icon:"maki-bus",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],geometry:["point","area"],tags:{public_transport:"platform",bus:"yes"},addTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},removeTags:{public_transport:"platform",bus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","platform","public transit","public transportation","transit","transportation"],name:"Bus Stop / Platform"},"public_transport/platform_ferry":{icon:"maki-ferry",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",ferry:"yes"},reference:{key:"public_transport",value:"platform"},terms:["boat","dock","ferry","pier","platform","public transit","public transportation","transit","transportation"],name:"Ferry Stop / Platform"},"public_transport/platform_light_rail":{icon:"temaki-light_rail",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",light_rail:"yes"},addTags:{public_transport:"platform",light_rail:"yes",railway:"platform"},removeTags:{public_transport:"platform",light_rail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],name:"Light Rail Stop / Platform"},"public_transport/platform_monorail":{icon:"temaki-monorail",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",monorail:"yes"},addTags:{public_transport:"platform",monorail:"yes",railway:"platform"},removeTags:{public_transport:"platform",monorail:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["monorail","platform","public transit","public transportation","rail","transit","transportation"],name:"Monorail Stop / Platform"},"public_transport/platform_subway":{icon:"temaki-subway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",subway:"yes"},addTags:{public_transport:"platform",subway:"yes",railway:"platform"},removeTags:{public_transport:"platform",subway:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["metro","platform","public transit","public transportation","rail","subway","track","transit","transportation","underground"],name:"Subway Stop / Platform"},"public_transport/platform_train":{icon:"maki-rail",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",train:"yes"},addTags:{public_transport:"platform",train:"yes",railway:"platform"},removeTags:{public_transport:"platform",train:"yes",railway:"platform"},reference:{key:"railway",value:"platform"},terms:["platform","public transit","public transportation","rail","track","train","transit","transportation"],name:"Train Stop / Platform"},"public_transport/platform_tram":{icon:"temaki-tram",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],geometry:["point","area"],tags:{public_transport:"platform",tram:"yes"},addTags:{public_transport:"platform",tram:"yes",railway:"platform"},removeTags:{public_transport:"platform",tram:"yes",railway:"platform"},reference:{key:"public_transport",value:"platform"},terms:["electric","light rail","platform","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],name:"Tram Stop / Platform"},"public_transport/platform_trolleybus":{icon:"temaki-trolleybus",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform",trolleybus:"yes"},addTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},removeTags:{public_transport:"platform",trolleybus:"yes",highway:"bus_stop"},reference:{key:"public_transport",value:"platform"},terms:["bus","electric","platform","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Stop / Platform"},"public_transport/platform":{icon:"maki-bus",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter"],geometry:["point","area"],tags:{public_transport:"platform"},terms:["platform","public transit","public transportation","transit","transportation"],name:"Transit Stop / Platform",matchScore:0.2},"public_transport/station_aerialway":{icon:"maki-aerialway",fields:["name","network","operator","aerialway/access","aerialway/summer/access","elevation","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",aerialway:"yes"},reference:{key:"aerialway",value:"station"},terms:["aerialway","cable car","public transit","public transportation","station","terminal","transit","transportation"],name:"Aerialway Station"},"public_transport/station_bus":{icon:"maki-bus",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",bus:"yes"},addTags:{public_transport:"station",bus:"yes",amenity:"bus_station"},removeTags:{public_transport:"station",bus:"yes",amenity:"bus_station"},reference:{key:"amenity",value:"bus_station"},terms:["bus","public transit","public transportation","station","terminal","transit","transportation"],name:"Bus Station / Terminal"},"public_transport/station_ferry":{icon:"maki-ferry",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",ferry:"yes"},addTags:{public_transport:"station",ferry:"yes",amenity:"ferry_terminal"},removeTags:{public_transport:"station",ferry:"yes",amenity:"ferry_terminal"},reference:{key:"amenity",value:"ferry_terminal"},terms:["boat","dock","ferry","pier","public transit","public transportation","station","terminal","transit","transportation"],name:"Ferry Station / Terminal"},"public_transport/station_light_rail":{icon:"temaki-light_rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",light_rail:"yes"},addTags:{public_transport:"station",light_rail:"yes",railway:"station",station:"light_rail"},removeTags:{public_transport:"station",light_rail:"yes",railway:"station",station:"light_rail"},reference:{key:"station",value:"light_rail"},terms:["electric","light rail","public transit","public transportation","rail","station","terminal","track","tram","trolley","transit","transportation"],name:"Light Rail Station"},"public_transport/station_monorail":{icon:"temaki-monorail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",monorail:"yes"},addTags:{public_transport:"station",monorail:"yes",railway:"station"},removeTags:{public_transport:"station",monorail:"yes",railway:"station"},reference:{key:"railway",value:"station"},terms:["monorail","public transit","public transportation","rail","station","terminal","transit","transportation"],name:"Monorail Station"},"public_transport/station_subway":{icon:"temaki-subway",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",subway:"yes"},addTags:{public_transport:"station",subway:"yes",railway:"station",station:"subway"},removeTags:{public_transport:"station",subway:"yes",railway:"station",station:"subway"},reference:{key:"station",value:"subway"},terms:["metro","public transit","public transportation","rail","station","subway","terminal","track","transit","transportation","underground"],name:"Subway Station"},"public_transport/station_train_halt":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",train:"yes",railway:"halt"},reference:{key:"railway",value:"halt"},terms:["halt","public transit","public transportation","rail","station","track","train","transit","transportation","whistle stop"],name:"Train Station (Halt / Request)"},"public_transport/station_train":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",train:"yes"},addTags:{public_transport:"station",train:"yes",railway:"station"},removeTags:{public_transport:"station",train:"yes",railway:"station"},reference:{key:"railway",value:"station"},terms:["public transit","public transportation","rail","station","terminal","track","train","transit","transportation"],name:"Train Station"},"public_transport/station_tram":{icon:"temaki-tram",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",tram:"yes"},reference:{key:"public_transport",value:"station"},terms:["electric","light rail","public transit","public transportation","rail","station","streetcar","terminal","track","tram","trolley","transit","transportation"],name:"Tram Station"},"public_transport/station_trolleybus":{icon:"temaki-trolleybus",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station",trolleybus:"yes"},addTags:{public_transport:"station",trolleybus:"yes",amenity:"bus_station"},removeTags:{public_transport:"station",trolleybus:"yes",amenity:"bus_station"},reference:{key:"amenity",value:"bus_station"},terms:["bus","electric","public transit","public transportation","station","streetcar","terminal","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Station / Terminal"},"public_transport/station":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{public_transport:"station"},terms:["public transit","public transportation","station","terminal","transit","transportation"],name:"Transit Station",matchScore:0.2},"public_transport/stop_area":{icon:"maki-bus",fields:["name","ref","network","operator"],geometry:["relation"],tags:{type:"public_transport",public_transport:"stop_area"},addTags:{type:"public_transport",public_transport:"stop_area","public_transport:version":"2"},removeTags:{type:"public_transport",public_transport:"stop_area","public_transport:version":"2"},reference:{key:"public_transport",value:"stop_area"},name:"Transit Stop Area"},"public_transport/stop_position_aerialway":{icon:"maki-aerialway",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",aerialway:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["aerialway","cable car","public transit","public transportation","transit","transportation"],name:"Aerialway Stopping Location"},"public_transport/stop_position_bus":{icon:"maki-bus",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",bus:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["bus","public transit","public transportation","transit","transportation"],name:"Bus Stopping Location"},"public_transport/stop_position_ferry":{icon:"maki-ferry",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",ferry:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["boat","dock","ferry","pier","public transit","public transportation","transit","transportation"],name:"Ferry Stopping Location"},"public_transport/stop_position_light_rail":{icon:"temaki-light_rail",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",light_rail:"yes"},addTags:{public_transport:"stop_position",light_rail:"yes",railway:"stop"},removeTags:{public_transport:"stop_position",light_rail:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["electric","light rail","public transit","public transportation","rail","track","tram","trolley","transit","transportation"],name:"Light Rail Stopping Location"},"public_transport/stop_position_monorail":{icon:"temaki-monorail",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",monorail:"yes"},addTags:{public_transport:"stop_position",monorail:"yes",railway:"stop"},removeTags:{public_transport:"stop_position",monorail:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["monorail","public transit","public transportation","rail","transit","transportation"],name:"Monorail Stopping Location"},"public_transport/stop_position_subway":{icon:"temaki-subway",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",subway:"yes"},addTags:{public_transport:"stop_position",subway:"yes",railway:"stop"},removeTags:{public_transport:"stop_position",subway:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["metro","public transit","public transportation","rail","subway","track","transit","transportation","underground"],name:"Subway Stopping Location"},"public_transport/stop_position_train":{icon:"maki-rail",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",train:"yes"},addTags:{public_transport:"stop_position",train:"yes",railway:"stop"},removeTags:{public_transport:"stop_position",train:"yes",railway:"stop"},reference:{key:"railway",value:"stop"},terms:["public transit","public transportation","rail","track","train","transit","transportation"],name:"Train Stopping Location"},"public_transport/stop_position_tram":{icon:"temaki-tram",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",tram:"yes"},addTags:{public_transport:"stop_position",tram:"yes",railway:"tram_stop"},removeTags:{public_transport:"stop_position",tram:"yes",railway:"tram_stop"},reference:{key:"public_transport",value:"stop_position"},terms:["electric","light rail","public transit","public transportation","rail","streetcar","track","tram","trolley","transit","transportation"],name:"Tram Stopping Location"},"public_transport/stop_position_trolleybus":{icon:"temaki-trolleybus",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position",trolleybus:"yes"},reference:{key:"public_transport",value:"stop_position"},terms:["bus","electric","public transit","public transportation","streetcar","trackless","tram","trolley","transit","transportation"],name:"Trolleybus Stopping Location"},"public_transport/stop_position":{icon:"maki-bus",fields:["name","ref_stop_position","network","operator"],geometry:["vertex"],tags:{public_transport:"stop_position"},terms:["public transit","public transportation","transit","transportation"],name:"Transit Stopping Location",matchScore:0.2},"railway/halt":{icon:"maki-rail",geometry:["point","vertex"],tags:{railway:"halt"},terms:["break","interrupt","rest","wait","interruption"],name:"Train Station (Halt / Request)",searchable:false},"railway/platform":{icon:"iD-highway-footway",fields:["name","ref_platform","surface","lit","shelter"],geometry:["line","area"],tags:{railway:"platform"},name:"Train Stop / Platform",searchable:false},"railway/station":{icon:"maki-rail",fields:["name","network","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],tags:{railway:"station"},terms:["train station","station"],name:"Train Station",searchable:false},"railway/tram_stop":{icon:"temaki-tram",fields:["name","network","operator"],geometry:["vertex"],tags:{railway:"tram_stop"},terms:["light rail","streetcar","tram","trolley"],name:"Tram Stopping Position",searchable:false},"railway/abandoned":{icon:"iD-railway-abandoned",fields:["name","structure","service_rail","usage_rail"],geometry:["line"],tags:{railway:"abandoned"},terms:[],name:"Abandoned Railway"},"railway/buffer_stop":{icon:"temaki-buffer_stop",geometry:["vertex"],tags:{railway:"buffer_stop"},terms:["stop","halt","buffer"],name:"Buffer Stop"},"railway/crossing":{icon:"temaki-pedestrian",geometry:["vertex"],tags:{railway:"crossing"},terms:["crossing","pedestrian crossing","railroad crossing","level crossing","grade crossing","path through railroad","train crossing"],name:"Railway Crossing (Path)"},"railway/derail":{icon:"maki-roadblock",geometry:["vertex"],tags:{railway:"derail"},terms:["derailer"],name:"Railway Derailer"},"railway/disused":{icon:"iD-railway-disused",fields:["structure","service_rail","usage_rail"],geometry:["line"],tags:{railway:"disused"},terms:[],name:"Disused Railway"},"railway/funicular":{icon:"iD-railway-rail",geometry:["line"],terms:["venicular","cliff railway","cable car","cable railway","funicular railway"],fields:["structure","gauge","service_rail"],tags:{railway:"funicular"},name:"Funicular"},"railway/level_crossing":{icon:"maki-cross",geometry:["vertex"],tags:{railway:"level_crossing"},terms:["crossing","railroad crossing","level crossing","grade crossing","road through railroad","train crossing"],name:"Railway Crossing (Road)"},"railway/light_rail":{icon:"iD-railway-light-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"light_rail"},terms:["light rail","streetcar","trolley"],name:"Light Rail"},"railway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["railway/position"],tags:{railway:"milestone"},terms:["milestone","marker"],name:"Railway Milestone"},"railway/miniature":{icon:"iD-railway-rail",geometry:["line"],tags:{railway:"miniature"},fields:["name","structure","gauge","electrified","service_rail"],terms:["rideable miniature railway","narrow gauge railway","minimum gauge railway"],name:"Miniature Railway"},"railway/monorail":{icon:"iD-railway-monorail",fields:["name","structure","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"monorail"},terms:[],name:"Monorail"},"railway/narrow_gauge":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"narrow_gauge"},terms:["narrow gauge railway","narrow gauge railroad"],name:"Narrow Gauge Rail"},"railway/rail":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","maxspeed","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"rail"},terms:[],name:"Rail"},"railway/signal":{icon:"temaki-railway_signals",geometry:["point","vertex"],fields:["railway/position","railway/signal/direction","ref"],tags:{railway:"signal"},terms:["signal","lights"],name:"Railway Signal"},"railway/subway_entrance":{icon:"maki-entrance",geometry:["point","vertex"],fields:["name"],tags:{railway:"subway_entrance"},terms:["metro","transit"],name:"Subway Entrance"},"railway/subway":{icon:"iD-railway-subway",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"subway"},terms:["metro","transit"],name:"Subway"},"railway/switch":{icon:"temaki-junction",geometry:["vertex"],tags:{railway:"switch"},terms:["switch","points"],name:"Railway Switch"},"railway/train_wash":{icon:"maki-rail",geometry:["point","vertex","area"],fields:["operator","building_area"],tags:{railway:"wash"},terms:["wash","clean"],name:"Train Wash"},"railway/tram":{icon:"iD-railway-light-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"tram"},terms:["light rail","streetcar","tram","trolley"],name:"Tram"},relation:{icon:"iD-relation",fields:["name","relation"],geometry:["relation"],tags:{},name:"Relation"},"route/ferry":{icon:"iD-ferry-line",geometry:["line"],fields:["name","operator","duration","access"],tags:{route:"ferry"},name:"Ferry Route"},shop:{icon:"maki-shop",fields:["name","shop","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"*"},terms:[],name:"Shop"},"shop/fishmonger":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"fishmonger"},reference:{key:"shop",value:"seafood"},name:"Fishmonger",searchable:false},"shop/furnace":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["oven","stove"],tags:{shop:"furnace"},name:"Furnace Store",searchable:false},"shop/vacant":{icon:"maki-shop",fields:["name","address","building_area"],geometry:["point","area"],tags:{shop:"vacant"},name:"Vacant Shop",searchable:false},"shop/agrarian":{icon:"maki-shop",fields:["name","operator","agrarian","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["agricultural inputs","agricultural machines","seeds","pesticides","fertilizer","agricultural tools"],tags:{shop:"agrarian"},name:"Farm Supply Shop"},"shop/alcohol":{icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],terms:["alcohol","beer","booze","wine"],tags:{shop:"alcohol"},name:"Liquor Store"},"shop/anime":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"anime"},terms:["manga","japan","cosplay","figurine","dakimakura"],name:"Anime Shop"},"shop/antiques":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"antiques"},name:"Antiques Shop"},"shop/appliance":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["air conditioner","appliance","dishwasher","dryer","freezer","fridge","grill","kitchen","oven","refrigerator","stove","washer","washing machine"],tags:{shop:"appliance"},name:"Appliance Store"},"shop/art":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["art*","exhibit*","gallery"],tags:{shop:"art"},name:"Art Store"},"shop/baby_goods":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"baby_goods"},name:"Baby Goods Store"},"shop/bag":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["handbag","purse"],tags:{shop:"bag"},name:"Bag/Luggage Store"},"shop/bakery":{icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery"},name:"Bakery"},"shop/bathroom_furnishing":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bathroom_furnishing"},name:"Bathroom Furnishing Store"},"shop/beauty":{icon:"maki-shop",fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],geometry:["point","area"],terms:["spa","salon","tanning"],tags:{shop:"beauty"},name:"Beauty Shop"},"shop/beauty/nails":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["manicure","pedicure"],tags:{shop:"beauty",beauty:"nails"},reference:{key:"shop",value:"beauty"},name:"Nail Salon"},"shop/beauty/tanning":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beauty",beauty:"tanning"},reference:{key:"leisure",value:"tanning_salon"},name:"Tanning Salon"},"shop/bed":{icon:"maki-lodging",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bed"},name:"Bedding/Mattress Store"},"shop/beverages":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages"},name:"Beverage Store"},"shop/bicycle":{icon:"maki-bicycle",fields:["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],geometry:["point","area"],terms:["bike","repair"],tags:{shop:"bicycle"},name:"Bicycle Shop"},"shop/bookmaker":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["betting"],tags:{shop:"bookmaker"},name:"Bookmaker"},"shop/books":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books"},name:"Book Store"},"shop/boutique":{icon:"maki-shop",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"boutique"},name:"Boutique"},"shop/butcher":{icon:"maki-slaughterhouse",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["meat"],tags:{shop:"butcher"},name:"Butcher"},"shop/candles":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"candles"},name:"Candle Shop"},"shop/car_parts":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto"],tags:{shop:"car_parts"},name:"Car Parts Store"},"shop/car_repair":{icon:"maki-car",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto","garage","service"],tags:{shop:"car_repair"},name:"Car Repair Shop"},"shop/car":{icon:"maki-car",fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto"],tags:{shop:"car"},name:"Car Dealership"},"shop/carpet":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["rug"],tags:{shop:"carpet"},name:"Carpet Store"},"shop/charity":{icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],terms:["thrift","op shop","nonprofit"],tags:{shop:"charity"},name:"Charity Store"},"shop/cheese":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cheese"},name:"Cheese Store"},"shop/chemist":{icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist"},terms:["apothecary","med*","drug*","gift"],name:"Drugstore"},"shop/chocolate":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chocolate"},name:"Chocolate Store"},"shop/clothes":{icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes"},name:"Clothing Store"},"shop/coffee":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"coffee"},name:"Coffee Store"},"shop/computer":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"computer"},name:"Computer Store"},"shop/confectionery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["sweet"],tags:{shop:"confectionery"},name:"Candy Store"},"shop/convenience":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience"},name:"Convenience Store"},"shop/copyshop":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"copyshop"},name:"Copy Store"},"shop/cosmetics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics"},name:"Cosmetics Store"},"shop/craft":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"craft"},terms:["art*","paint*","frame"],name:"Arts and Crafts Store"},"shop/curtain":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["drape*","window"],tags:{shop:"curtain"},name:"Curtain Store"},"shop/dairy":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["milk","egg","cheese"],tags:{shop:"dairy"},name:"Dairy Store"},"shop/deli":{icon:"maki-restaurant",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["lunch","meat","sandwich"],tags:{shop:"deli"},name:"Deli"},"shop/department_store":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store"},name:"Department Store"},"shop/doityourself":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself"},name:"DIY Store"},"shop/dry_cleaning":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"dry_cleaning"},name:"Dry Cleaner"},"shop/e-cigarette":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"e-cigarette"},terms:["electronic","vapor"],name:"E-Cigarette Shop"},"shop/electronics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["appliance","audio","blueray","camera","computer","dvd","home theater","radio","speaker","tv","video"],tags:{shop:"electronics"},name:"Electronics Store"},"shop/erotic":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["sex","porn"],tags:{shop:"erotic"},name:"Erotic Store"},"shop/fabric":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["sew"],tags:{shop:"fabric"},name:"Fabric Store"},"shop/farm":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["farm shop","farm stand"],tags:{shop:"farm"},name:"Produce Stand"},"shop/fashion":{icon:"maki-shop",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"fashion"},name:"Fashion Store"},"shop/florist":{icon:"maki-florist",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["flower"],tags:{shop:"florist"},name:"Florist"},"shop/frame":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"frame"},terms:["art*","paint*","photo*","frame"],name:"Framing Shop"},"shop/funeral_directors":{icon:"maki-cemetery",fields:["name","operator","address","building_area","religion","denomination"],geometry:["point","area"],terms:["undertaker","memorial home"],tags:{shop:"funeral_directors"},name:"Funeral Home"},"shop/furniture":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["chair","sofa","table"],tags:{shop:"furniture"},name:"Furniture Store"},"shop/garden_centre":{icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["landscape","mulch","shrub","tree"],tags:{shop:"garden_centre"},name:"Garden Center"},"shop/gas":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["cng","lpg","natural gas","propane","refill","tank"],tags:{shop:"gas"},name:"Bottled Gas Shop"},"shop/gift":{icon:"maki-gift",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["souvenir"],tags:{shop:"gift"},name:"Gift Shop"},"shop/greengrocer":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["fruit","vegetable"],tags:{shop:"greengrocer"},name:"Greengrocer"},"shop/hairdresser":{icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["barber"],tags:{shop:"hairdresser"},name:"Hairdresser"},"shop/hardware":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hardware"},name:"Hardware Store"},"shop/health_food":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["wholefood","vitamins","vegetarian","vegan"],tags:{shop:"health_food"},name:"Health Food Shop"},"shop/hearing_aids":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hearing_aids"},name:"Hearing Aids Store"},"shop/herbalist":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"herbalist"},name:"Herbalist"},"shop/hifi":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["stereo","video"],tags:{shop:"hifi"},name:"Hifi Store"},"shop/houseware":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["home","household"],tags:{shop:"houseware"},name:"Houseware Store"},"shop/interior_decoration":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"interior_decoration"},name:"Interior Decoration Store"},"shop/jewelry":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["diamond","gem","ring"],tags:{shop:"jewelry"},name:"Jeweler"},"shop/kiosk":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk"},name:"Kiosk"},"shop/kitchen":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"kitchen"},name:"Kitchen Design Store"},"shop/laundry":{icon:"maki-laundry",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"laundry"},name:"Laundry"},"shop/leather":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"leather"},name:"Leather Store"},"shop/locksmith":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["key","lockpick"],tags:{shop:"locksmith"},name:"Locksmith"},"shop/lottery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"lottery"},name:"Lottery Shop"},"shop/mall":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["shopping"],tags:{shop:"mall"},name:"Mall"},"shop/massage":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"massage"},name:"Massage Shop"},"shop/medical_supply":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"medical_supply"},name:"Medical Supply Store"},"shop/mobile_phone":{icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone"},name:"Mobile Phone Store"},"shop/money_lender":{icon:"maki-bank",fields:["name","operator","address","building_area","opening_hours","currency_multi"],geometry:["point","area"],tags:{shop:"money_lender"},name:"Money Lender"},"shop/motorcycle_repair":{icon:"fas-motorcycle",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto","bike","garage","motorcycle","repair","service"],tags:{shop:"motorcycle_repair"},name:"Motorcycle Repair Shop"},"shop/motorcycle":{icon:"fas-motorcycle",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["bike"],tags:{shop:"motorcycle"},name:"Motorcycle Dealership"},"shop/music":{icon:"maki-music",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["CD","vinyl"],tags:{shop:"music"},name:"Music Store"},"shop/musical_instrument":{icon:"maki-music",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["guitar"],tags:{shop:"musical_instrument"},name:"Musical Instrument Store"},"shop/newsagent":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"newsagent"},name:"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"nutrition_supplements"},name:"Nutrition Supplements Store"},"shop/optician":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["eye","glasses"],tags:{shop:"optician"},name:"Optician"},"shop/organic":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket",organic:"only"},name:"Organic Goods Store"},"shop/outdoor":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["camping","climbing","hiking"],tags:{shop:"outdoor"},name:"Outdoors Store"},"shop/paint":{icon:"maki-water",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"paint"},name:"Paint Store"},"shop/pastry":{icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pastry"},terms:["patisserie","cake shop","cakery"],name:"Pastry Shop"},"shop/pawnbroker":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pawnbroker"},name:"Pawn Shop"},"shop/perfumery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"perfumery"},name:"Perfume Store"},"shop/pet_grooming":{icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["dog"],tags:{shop:"pet_grooming"},name:"Pet Grooming Store"},"shop/pet":{icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["animal","cat","dog","fish","kitten","puppy","reptile"],tags:{shop:"pet"},name:"Pet Store"},"shop/photo":{icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["camera","film"],tags:{shop:"photo"},name:"Photography Store"},"shop/pyrotechnics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pyrotechnics"},name:"Fireworks Store"},"shop/radiotechnics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"radiotechnics"},name:"Radio/Electronic Component Store"},"shop/religion":{icon:"maki-shop",fields:["name","operator","address","building_area","religion","denomination","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"religion"},name:"Religious Store"},"shop/scuba_diving":{icon:"maki-swimming",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"scuba_diving"},name:"Scuba Diving Shop"},"shop/seafood":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["fishmonger"],tags:{shop:"seafood"},name:"Seafood Shop"},"shop/second_hand":{icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],terms:["secondhand","second hand","resale","thrift","used"],tags:{shop:"second_hand"},name:"Consignment/Thrift Store"},"shop/shoes":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes"},name:"Shoe Store"},"shop/sports":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports"},name:"Sporting Goods Store"},"shop/stationery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["card","paper"],tags:{shop:"stationery"},name:"Stationery Store"},"shop/storage_rental":{icon:"maki-shop",fields:["name","operator","address","building","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"storage_rental"},name:"Storage Rental"},"shop/supermarket":{icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["grocery","store","shop"],tags:{shop:"supermarket"},name:"Supermarket"},"shop/tailor":{icon:"maki-clothing-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["clothes","suit"],tags:{shop:"tailor"},name:"Tailor"},"shop/tattoo":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tattoo"},name:"Tattoo Parlor"},"shop/tea":{icon:"maki-teahouse",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tea"},name:"Tea Store"},"shop/ticket":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"ticket"},name:"Ticket Seller"},"shop/tiles":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tiles"},name:"Tile Shop"},"shop/tobacco":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tobacco"},name:"Tobacco Shop"},"shop/toys":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys"},name:"Toy Store"},"shop/trade":{icon:"maki-shop",fields:["name","trade","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"trade"},name:"Trade Shop"},"shop/travel_agency":{icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency"},name:"Travel Agency"},"shop/tyres":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres"},name:"Tire Store"},"shop/vacuum_cleaner":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"vacuum_cleaner"},name:"Vacuum Cleaner Store"},"shop/variety_store":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store"},name:"Variety Store"},"shop/video_games":{icon:"maki-gaming",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video_games"},name:"Video Game Store"},"shop/video":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["DVD"],tags:{shop:"video"},name:"Video Store"},"shop/watches":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"watches"},name:"Watches Shop"},"shop/water_sports":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"water_sports"},name:"Watersport/Swim Shop"},"shop/weapons":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["ammo","gun","knife","knives"],tags:{shop:"weapons"},name:"Weapon Shop"},"shop/wholesale":{icon:"maki-warehouse",fields:["name","operator","wholesale","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["warehouse club","cash and carry"],tags:{shop:"wholesale"},name:"Wholesale Store"},"shop/window_blind":{icon:"temaki-window",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"window_blind"},name:"Window Blind Store"},"shop/wine":{icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"wine"},name:"Wine Shop"},tourism:{icon:"maki-attraction",fields:["name","tourism"],geometry:["point","vertex","area"],tags:{tourism:"*"},name:"Tourism"},"tourism/alpine_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],terms:["climbing hut"],tags:{tourism:"alpine_hut"},name:"Alpine Hut"},"tourism/apartment":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"apartment"},name:"Guest Apartment / Condo"},"tourism/aquarium":{icon:"maki-aquarium",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["fish","sea","water"],tags:{tourism:"aquarium"},name:"Aquarium"},"tourism/artwork":{icon:"maki-art-gallery",fields:["name","artwork_type","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork"},terms:["mural","sculpture","statue"],name:"Artwork"},"tourism/attraction":{icon:"maki-star",fields:["name","operator","address"],geometry:["point","vertex","area"],tags:{tourism:"attraction"},name:"Tourist Attraction"},"tourism/camp_site":{icon:"maki-campsite",fields:["name","operator","address","access_simple","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],terms:["tent","rv"],tags:{tourism:"camp_site"},name:"Campground"},"tourism/caravan_site":{icon:"maki-bus",fields:["name","operator","address","capacity","fee","sanitary_dump_station","power_supply","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","vertex","area"],terms:["Motor Home","Camper"],tags:{tourism:"caravan_site"},name:"RV Park"},"tourism/chalet":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],terms:["holiday","holiday cottage","holiday home","vacation","vacation home"],tags:{tourism:"chalet"},name:"Holiday Cottage"},"tourism/gallery":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["art*","exhibit*","paint*","photo*","sculpt*"],tags:{tourism:"gallery"},name:"Art Gallery"},"tourism/guest_house":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"guest_house"},terms:["B&B","Bed and Breakfast"],name:"Guest House"},"tourism/hostel":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hostel"},name:"Hostel"},"tourism/hotel":{icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"hotel"},name:"Hotel"},"tourism/information":{icon:"maki-information",fields:["information","operator","address","building_area"],geometry:["point","vertex","area"],tags:{tourism:"information"},name:"Information"},"tourism/information/board":{icon:"maki-information",fields:["name","operator","board_type","direction"],geometry:["point","vertex"],tags:{tourism:"information",information:"board"},reference:{key:"information",value:"board"},name:"Information Board"},"tourism/information/guidepost":{icon:"maki-information",fields:["name","elevation","operator","ref"],geometry:["point","vertex"],terms:["signpost"],tags:{tourism:"information",information:"guidepost"},reference:{key:"information",value:"guidepost"},name:"Guidepost"},"tourism/information/map":{icon:"maki-information",fields:["operator","map_type","map_size","direction"],geometry:["point","vertex"],tags:{tourism:"information",information:"map"},reference:{key:"information",value:"map"},name:"Map"},"tourism/information/office":{icon:"maki-information",fields:["name","operator","address","building_area"],geometry:["point","vertex","area"],tags:{tourism:"information",information:"office"},reference:{key:"information",value:"office"},name:"Tourist Information Office"},"tourism/motel":{icon:"maki-lodging",fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"motel"},name:"Motel"},"tourism/museum":{icon:"maki-museum",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["art*","exhibit*","gallery","foundation","hall","institution","paint*","photo*","sculpt*"],tags:{tourism:"museum"},name:"Museum"},"tourism/picnic_site":{icon:"maki-picnic-site",fields:["name","operator","address","access_simple","capacity","smoking"],geometry:["point","vertex","area"],terms:["camp"],tags:{tourism:"picnic_site"},name:"Picnic Site"},"tourism/theme_park":{icon:"maki-amusement-park",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{tourism:"theme_park"},name:"Theme Park"},"tourism/trail_riding_station":{icon:"maki-horse-riding",fields:["name","horse_stables","horse_riding","horse_dressage","address","phone","website","description"],geometry:["point","area"],tags:{tourism:"trail_riding_station"},name:"Trail Riding Station",matchScore:2},"tourism/viewpoint":{icon:"temaki-binoculars",geometry:["point","vertex"],fields:["direction"],tags:{tourism:"viewpoint"},name:"Viewpoint"},"tourism/wilderness_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:["wilderness hut","backcountry hut","bothy"],tags:{tourism:"wilderness_hut"},name:"Wilderness Hut"},"tourism/zoo":{icon:"maki-zoo",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["animal"],tags:{tourism:"zoo"},name:"Zoo"},traffic_calming:{icon:"temaki-diamond",fields:["traffic_calming","direction_vertex"],geometry:["vertex","line"],tags:{traffic_calming:"*"},terms:["bump","hump","slow","speed"],name:"Traffic Calming"},"traffic_calming/bump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["hump","speed","slow"],tags:{traffic_calming:"bump"},name:"Speed Bump"},"traffic_calming/chicane":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["driveway link","speed","slow"],tags:{traffic_calming:"chicane"},name:"Traffic Chicane"},"traffic_calming/choker":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["speed","slow"],tags:{traffic_calming:"choker"},name:"Traffic Choker"},"traffic_calming/cushion":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","hump","speed","slow"],tags:{traffic_calming:"cushion"},name:"Speed Cushion"},"traffic_calming/dip":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["speed","slow"],tags:{traffic_calming:"dip"},name:"Dip"},"traffic_calming/hump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","speed","slow"],tags:{traffic_calming:"hump"},name:"Speed Hump"},"traffic_calming/island":{icon:"temaki-diamond",geometry:["vertex"],terms:["circle","roundabout","slow"],tags:{traffic_calming:"island"},name:"Traffic Island"},"traffic_calming/rumble_strip":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["audible lines","sleeper lines","growlers"],tags:{traffic_calming:"rumble_strip"},name:"Rumble Strip"},"traffic_calming/table":{icon:"temaki-diamond",fields:["surface"],geometry:["vertex"],tags:{traffic_calming:"table"},terms:["flat top","hump","speed","slow"],name:"Speed Table"},"type/multipolygon":{icon:"iD-multipolygon",geometry:["area","relation"],tags:{type:"multipolygon"},removeTags:{},name:"Multipolygon",searchable:false,matchScore:0.1},"type/boundary":{icon:"iD-boundary",fields:["name","boundary"],geometry:["relation"],tags:{type:"boundary"},name:"Boundary"},"type/boundary/administrative":{icon:"iD-boundary",fields:["name","admin_level"],geometry:["relation"],tags:{type:"boundary",boundary:"administrative"},reference:{key:"boundary",value:"administrative"},name:"Administrative Boundary"},"type/restriction":{icon:"iD-restriction",fields:["name","restriction","except"],geometry:["relation"],tags:{type:"restriction"},name:"Restriction"},"type/restriction/no_left_turn":{icon:"iD-restriction-no-left-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"no_left_turn"},name:"No Left Turn"},"type/restriction/no_right_turn":{icon:"iD-restriction-no-right-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"no_right_turn"},name:"No Right Turn"},"type/restriction/no_straight_on":{icon:"iD-restriction-no-straight-on",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"no_straight_on"},name:"No Straight On"},"type/restriction/no_u_turn":{icon:"iD-restriction-no-u-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"no_u_turn"},name:"No U-turn"},"type/restriction/only_left_turn":{icon:"iD-restriction-only-left-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_left_turn"},name:"Only Left Turn"},"type/restriction/only_right_turn":{icon:"iD-restriction-only-right-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_right_turn"},name:"Only Right Turn"},"type/restriction/only_straight_on":{icon:"iD-restriction-only-straight-on",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_straight_on"},name:"Only Straight On"},"type/restriction/only_u_turn":{icon:"iD-restriction-only-u-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_u_turn"},name:"Only U-turn"},"type/route_master":{icon:"iD-route-master",fields:["name","route_master","ref","operator","network"],geometry:["relation"],tags:{type:"route_master"},name:"Route Master"},"type/route":{icon:"iD-route",fields:["name","route","ref_route","operator","network"],geometry:["relation"],tags:{type:"route"},name:"Route"},"type/route/bicycle":{icon:"iD-route-bicycle",fields:["name","ref_route","network_bicycle","cycle_network"],geometry:["relation"],tags:{type:"route",route:"bicycle"},name:"Cycle Route"},"type/route/bus":{icon:"iD-route-bus",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"bus"},name:"Bus Route"},"type/route/detour":{icon:"iD-route-detour",fields:["name","ref_route"],geometry:["relation"],tags:{type:"route",route:"detour"},name:"Detour Route"},"type/route/ferry":{icon:"iD-route-ferry",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"ferry"},name:"Ferry Route"},"type/route/foot":{icon:"iD-route-foot",fields:["name","ref_route","operator","network_foot"],geometry:["relation"],tags:{type:"route",route:"foot"},name:"Foot Route"},"type/route/hiking":{icon:"iD-route-foot",fields:["name","ref_route","operator","network_foot","description","distance"],geometry:["relation"],tags:{type:"route",route:"hiking"},name:"Hiking Route"},"type/route/horse":{icon:"iD-route-horse",fields:["name","ref_route","operator","network_horse","description","distance"],geometry:["relation"],tags:{type:"route",route:"horse"},name:"Riding Route"},"type/route/light_rail":{icon:"iD-route-light-rail",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"light_rail"},name:"Light Rail Route"},"type/route/pipeline":{icon:"iD-route-pipeline",fields:["name","ref_route","operator"],geometry:["relation"],tags:{type:"route",route:"pipeline"},name:"Pipeline Route"},"type/route/piste":{icon:"iD-route-piste",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"piste"},name:"Piste/Ski Route"},"type/route/power":{icon:"iD-route-power",fields:["name","ref_route","operator"],geometry:["relation"],tags:{type:"route",route:"power"},name:"Power Route"},"type/route/road":{icon:"iD-route-road",fields:["name","ref_route","network_road"],geometry:["relation"],tags:{type:"route",route:"road"},name:"Road Route"},"type/route/subway":{icon:"iD-route-subway",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"subway"},name:"Subway Route"},"type/route/train":{icon:"iD-route-train",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"train"},name:"Train Route"},"type/route/tram":{icon:"iD-route-tram",fields:["name","ref_route","operator","network"],geometry:["relation"],tags:{type:"route",route:"tram"},name:"Tram Route"},"type/site":{icon:"iD-relation",fields:["name","site"],geometry:["relation"],tags:{type:"site"},name:"Site"},"type/waterway":{icon:"iD-route-water",fields:["name","waterway","ref"],geometry:["relation"],tags:{type:"waterway"},name:"Waterway"},vertex:{fields:["name"],geometry:["vertex"],tags:{},name:"Other",matchScore:0.1},"waterway/boatyard":{icon:"maki-harbor",fields:["name","operator"],geometry:["area","vertex","point"],tags:{waterway:"boatyard"},name:"Boatyard"},"waterway/canal":{icon:"iD-waterway-canal",fields:["name","width","intermittent"],geometry:["line"],tags:{waterway:"canal"},name:"Canal"},"waterway/dam":{icon:"maki-dam",geometry:["point","vertex","line","area"],fields:["name"],tags:{waterway:"dam"},name:"Dam"},"waterway/ditch":{icon:"iD-waterway-ditch",fields:["structure_waterway","intermittent"],geometry:["line"],tags:{waterway:"ditch"},name:"Ditch"},"waterway/dock":{icon:"maki-harbor",fields:["name","dock","operator"],geometry:["area","vertex","point"],terms:["boat","ship","vessel","marine"],tags:{waterway:"dock"},name:"Wet Dock / Dry Dock"},"waterway/drain":{icon:"iD-waterway-ditch",fields:["structure_waterway","intermittent"],geometry:["line"],tags:{waterway:"drain"},name:"Drain"},"waterway/fuel":{icon:"maki-fuel",fields:["name","operator","address","opening_hours","fuel_multi"],geometry:["point","area"],terms:["petrol","gas","diesel","boat"],tags:{waterway:"fuel"},name:"Marine Fuel Station"},"waterway/river":{icon:"iD-waterway-river",fields:["name","structure_waterway","width","intermittent"],geometry:["line"],terms:["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],tags:{waterway:"river"},name:"River"},"waterway/riverbank":{icon:"maki-water",geometry:["area"],tags:{waterway:"riverbank"},name:"Riverbank"},"waterway/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["name","operator","access_simple","fee","water_point"],geometry:["point","vertex","area"],terms:["Boat","Watercraft","Sanitary","Dump Station","Pumpout","Pump out","Elsan","CDP","CTDP","Chemical Toilet"],tags:{waterway:"sanitary_dump_station"},name:"Marine Toilet Disposal"},"waterway/stream_intermittent":{icon:"iD-waterway-stream",fields:["name","structure_waterway","width","intermittent"],geometry:["line"],terms:["arroyo","beck","branch","brook","burn","course","creek","drift","flood","flow","gully","run","runnel","rush","spate","spritz","tributary","wadi","wash","watercourse"],tags:{waterway:"stream",intermittent:"yes"},reference:{key:"waterway",value:"stream"},name:"Intermittent Stream"},"waterway/stream":{icon:"iD-waterway-stream",fields:["name","structure_waterway","width","intermittent"],geometry:["line"],terms:["beck","branch","brook","burn","course","creek","current","drift","flood","flow","freshet","race","rill","rindle","rivulet","run","runnel","rush","spate","spritz","surge","tide","torrent","tributary","watercourse"],tags:{waterway:"stream"},name:"Stream"},"waterway/water_point":{icon:"maki-drinking-water",geometry:["area","vertex","point"],tags:{waterway:"water_point"},name:"Marine Drinking Water"},"waterway/waterfall":{icon:"maki-water",fields:["name","height","width","intermittent"],geometry:["vertex"],terms:["fall"],tags:{waterway:"waterfall"},name:"Waterfall"},"waterway/weir":{icon:"maki-dam",geometry:["vertex","line"],tags:{waterway:"weir"},name:"Weir"},"amenity/arts_centre/Świetlica wiejska":{tags:{name:"Świetlica wiejska",amenity:"arts_centre"},name:"Świetlica wiejska",icon:"maki-theatre",geometry:["point","area"],fields:["name","address","building_area","opening_hours"],suggestion:true},"amenity/arts_centre/Дом культуры":{tags:{name:"Дом культуры",amenity:"arts_centre"},name:"Дом культуры",icon:"maki-theatre",geometry:["point","area"],fields:["name","address","building_area","opening_hours"],suggestion:true},"amenity/bank/ABANCA":{tags:{name:"ABANCA",amenity:"bank"},name:"ABANCA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ABN AMRO":{tags:{name:"ABN AMRO",amenity:"bank"},name:"ABN AMRO",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ABSA":{tags:{name:"ABSA",amenity:"bank"},name:"ABSA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/AIB":{tags:{name:"AIB",amenity:"bank"},name:"AIB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ANZ":{tags:{name:"ANZ",amenity:"bank"},name:"ANZ",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ASB Bank":{tags:{name:"ASB Bank",amenity:"bank"},name:"ASB Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ATB Financial":{tags:{name:"ATB Financial",amenity:"bank"},name:"ATB Financial",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/AXA":{tags:{name:"AXA",amenity:"bank"},name:"AXA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Agribank":{tags:{name:"Agribank",amenity:"bank"},name:"Agribank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Akbank":{tags:{name:"Akbank",amenity:"bank"},name:"Akbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Alior Bank":{tags:{name:"Alior Bank",amenity:"bank"},name:"Alior Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Allahabad Bank":{tags:{name:"Allahabad Bank",amenity:"bank"},name:"Allahabad Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Allied Bank":{tags:{name:"Allied Bank",amenity:"bank"},name:"Allied Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Alpha Bank":{tags:{name:"Alpha Bank",amenity:"bank"},name:"Alpha Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Andhra Bank":{tags:{name:"Andhra Bank",amenity:"bank"},name:"Andhra Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Antonveneta":{tags:{name:"Antonveneta",amenity:"bank"},name:"Antonveneta",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Argenta":{tags:{name:"Argenta",amenity:"bank"},name:"Argenta",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Asia United Bank":{tags:{name:"Asia United Bank",amenity:"bank"},name:"Asia United Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Askari Bank":{tags:{name:"Askari Bank",amenity:"bank"},name:"Askari Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Associated Bank":{tags:{name:"Associated Bank",amenity:"bank"},name:"Associated Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Axis Bank":{tags:{name:"Axis Bank",amenity:"bank"},name:"Axis Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BAC":{tags:{name:"BAC",amenity:"bank"},name:"BAC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BAWAG PSK":{tags:{name:"BAWAG PSK",amenity:"bank"},name:"BAWAG PSK",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BB&T":{tags:{name:"BB&T",amenity:"bank"},name:"BB&T",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBBank":{tags:{name:"BBBank",amenity:"bank"},name:"BBBank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBK":{tags:{name:"BBK",amenity:"bank"},name:"BBK",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBVA":{tags:{name:"BBVA",amenity:"bank"},name:"BBVA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBVA Bancomer":{tags:{name:"BBVA Bancomer",amenity:"bank"},name:"BBVA Bancomer",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBVA Compass":{tags:{name:"BBVA Compass",amenity:"bank"},name:"BBVA Compass",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBVA Continental":{tags:{name:"BBVA Continental",amenity:"bank"},name:"BBVA Continental",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BBVA Francés":{tags:{name:"BBVA Francés",amenity:"bank"},name:"BBVA Francés",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BCA":{tags:{name:"BCA",amenity:"bank"},name:"BCA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BCI":{tags:{name:"BCI",amenity:"bank"},name:"BCI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BCP":{tags:{name:"BCP",amenity:"bank"},name:"BCP",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BCR":{tags:{name:"BCR",amenity:"bank"},name:"BCR",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BDO":{tags:{name:"BDO",amenity:"bank"},name:"BDO",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BGŻ BNP Paribas":{tags:{name:"BGŻ BNP Paribas",amenity:"bank"},name:"BGŻ BNP Paribas",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BMCE":{tags:{name:"BMCE",amenity:"bank"},name:"BMCE",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BMN":{tags:{name:"BMN",amenity:"bank"},name:"BMN",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BMO":{tags:{name:"BMO",amenity:"bank"},name:"BMO",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BMO Harris Bank":{tags:{name:"BMO Harris Bank",amenity:"bank"},name:"BMO Harris Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BNA":{tags:{name:"BNA",amenity:"bank"},name:"BNA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BNI":{tags:{name:"BNI",amenity:"bank"},name:"BNI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BNL":{tags:{name:"BNL",amenity:"bank"},name:"BNL",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BNP Paribas":{tags:{name:"BNP Paribas",amenity:"bank"},name:"BNP Paribas",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BNP Paribas Fortis":{tags:{name:"BNP Paribas Fortis",amenity:"bank"},name:"BNP Paribas Fortis",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BOC":{tags:{name:"BOC",amenity:"bank"},name:"BOC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BPH":{tags:{name:"BPH",amenity:"bank"},name:"BPH",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BPI":{tags:{name:"BPI",amenity:"bank"},name:"BPI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BPI Family Savings Bank":{tags:{name:"BPI Family Savings Bank",amenity:"bank"},name:"BPI Family Savings Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BRD":{tags:{name:"BRD",amenity:"bank"},name:"BRD",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BRED":{tags:{name:"BRED",amenity:"bank"},name:"BRED",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BRI":{tags:{name:"BRI",amenity:"bank"},name:"BRI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BW-Bank":{tags:{name:"BW-Bank",amenity:"bank"},name:"BW-Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BZ WBK":{tags:{name:"BZ WBK",amenity:"bank"},name:"BZ WBK",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banamex":{tags:{name:"Banamex",amenity:"bank"},name:"Banamex",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banc Sabadell":{tags:{name:"Banc Sabadell",amenity:"bank"},name:"Banc Sabadell",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Intesa":{tags:{name:"Banca Intesa",amenity:"bank"},name:"Banca Intesa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca March":{tags:{name:"Banca March",amenity:"bank"},name:"Banca March",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Popolare di Milano":{tags:{name:"Banca Popolare di Milano",amenity:"bank"},name:"Banca Popolare di Milano",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Popolare di Novara":{tags:{name:"Banca Popolare di Novara",amenity:"bank"},name:"Banca Popolare di Novara",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Popolare di Sondrio":{tags:{name:"Banca Popolare di Sondrio",amenity:"bank"},name:"Banca Popolare di Sondrio",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Popolare di Verona":{tags:{name:"Banca Popolare di Verona",amenity:"bank"},name:"Banca Popolare di Verona",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Popolare di Vicenza":{tags:{name:"Banca Popolare di Vicenza",amenity:"bank"},name:"Banca Popolare di Vicenza",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Românească":{tags:{name:"Banca Românească",amenity:"bank"},name:"Banca Românească",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Sella":{tags:{name:"Banca Sella",amenity:"bank"},name:"Banca Sella",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banca Transilvania":{tags:{name:"Banca Transilvania",amenity:"bank"},name:"Banca Transilvania",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Agrario":{tags:{name:"Banco Agrario",amenity:"bank"},name:"Banco Agrario",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Azteca":{tags:{name:"Banco Azteca",amenity:"bank"},name:"Banco Azteca",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco BCI":{tags:{name:"Banco BCI",amenity:"bank"},name:"Banco BCI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Continental":{tags:{name:"Banco Continental",amenity:"bank"},name:"Banco Continental",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Estado":{tags:{name:"Banco Estado",amenity:"bank"},name:"Banco Estado",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Fassil":{tags:{name:"Banco Fassil",amenity:"bank"},name:"Banco Fassil",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco G&T Continental":{tags:{name:"Banco G&T Continental",amenity:"bank"},name:"Banco G&T Continental",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco General":{tags:{name:"Banco General",amenity:"bank"},name:"Banco General",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Industrial":{tags:{name:"Banco Industrial",amenity:"bank"},name:"Banco Industrial",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Internacional":{tags:{name:"Banco Internacional",amenity:"bank"},name:"Banco Internacional",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Nacional":{tags:{name:"Banco Nacional",amenity:"bank"},name:"Banco Nacional",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Nación":{tags:{name:"Banco Nación",amenity:"bank"},name:"Banco Nación",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Pastor":{tags:{name:"Banco Pastor",amenity:"bank"},name:"Banco Pastor",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Pichincha":{tags:{name:"Banco Pichincha",amenity:"bank"},name:"Banco Pichincha",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Popular":{tags:{name:"Banco Popular",amenity:"bank"},name:"Banco Popular",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Provincia":{tags:{name:"Banco Provincia",amenity:"bank"},name:"Banco Provincia",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Sabadell":{tags:{name:"Banco Sabadell",amenity:"bank"},name:"Banco Sabadell",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Santander":{tags:{name:"Banco Santander",amenity:"bank"},name:"Banco Santander",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco Sol":{tags:{name:"Banco Sol",amenity:"bank"},name:"Banco Sol",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de Bogotá":{tags:{name:"Banco de Bogotá",amenity:"bank"},name:"Banco de Bogotá",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de Chile":{tags:{name:"Banco de Chile",amenity:"bank"},name:"Banco de Chile",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de Costa Rica":{tags:{name:"Banco de Costa Rica",amenity:"bank"},name:"Banco de Costa Rica",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de Desarrollo Banrural":{tags:{name:"Banco de Desarrollo Banrural",amenity:"bank"},name:"Banco de Desarrollo Banrural",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de Occidente":{tags:{name:"Banco de Occidente",amenity:"bank"},name:"Banco de Occidente",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de Venezuela":{tags:{name:"Banco de Venezuela",amenity:"bank"},name:"Banco de Venezuela",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de la Nación":{tags:{name:"Banco de la Nación",amenity:"bank"},name:"Banco de la Nación",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco de la Nación Argentina":{tags:{name:"Banco de la Nación Argentina",amenity:"bank"},name:"Banco de la Nación Argentina",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco di Napoli":{tags:{name:"Banco di Napoli",amenity:"bank"},name:"Banco di Napoli",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco di Sardegna":{tags:{name:"Banco di Sardegna",amenity:"bank"},name:"Banco di Sardegna",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco do Brasil":{tags:{name:"Banco do Brasil",amenity:"bank"},name:"Banco do Brasil",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banco do Nordeste":{tags:{name:"Banco do Nordeste",amenity:"bank"},name:"Banco do Nordeste",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/BancoEstado":{tags:{name:"BancoEstado",amenity:"bank"},name:"BancoEstado",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bancolombia":{tags:{name:"Bancolombia",amenity:"bank"},name:"Bancolombia",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bancomer":{tags:{name:"Bancomer",amenity:"bank"},name:"Bancomer",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bancpost":{tags:{name:"Bancpost",amenity:"bank"},name:"Bancpost",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banesco":{tags:{name:"Banesco",amenity:"bank"},name:"Banesco",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bangkok Bank":{tags:{name:"Bangkok Bank",amenity:"bank"},name:"Bangkok Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Al Habib":{tags:{name:"Bank Al Habib",amenity:"bank"},name:"Bank Al Habib",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Alfalah":{tags:{name:"Bank Alfalah",amenity:"bank"},name:"Bank Alfalah",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Austria":{tags:{name:"Bank Austria",amenity:"bank"},name:"Bank Austria",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank BCA":{tags:{name:"Bank BCA",amenity:"bank"},name:"Bank BCA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank BNI":{tags:{name:"Bank BNI",amenity:"bank"},name:"Bank BNI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank BPH":{tags:{name:"Bank BPH",amenity:"bank"},name:"Bank BPH",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank BRI":{tags:{name:"Bank BRI",amenity:"bank"},name:"Bank BRI",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Danamon":{tags:{name:"Bank Danamon",amenity:"bank"},name:"Bank Danamon",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Mandiri":{tags:{name:"Bank Mandiri",amenity:"bank"},name:"Bank Mandiri",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Mega":{tags:{name:"Bank Mega",amenity:"bank"},name:"Bank Mega",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Spółdzielczy":{tags:{name:"Bank Spółdzielczy",amenity:"bank"},name:"Bank Spółdzielczy",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank Zachodni WBK":{tags:{name:"Bank Zachodni WBK",amenity:"bank"},name:"Bank Zachodni WBK",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Africa":{tags:{name:"Bank of Africa",amenity:"bank"},name:"Bank of Africa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of America":{tags:{name:"Bank of America",amenity:"bank"},name:"Bank of America",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Baroda":{tags:{name:"Bank of Baroda",amenity:"bank"},name:"Bank of Baroda",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Ceylon":{tags:{name:"Bank of Ceylon",amenity:"bank"},name:"Bank of Ceylon",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of China":{tags:{name:"Bank of China",amenity:"bank"},name:"Bank of China",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Commerce":{tags:{name:"Bank of Commerce",amenity:"bank"},name:"Bank of Commerce",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of India":{tags:{name:"Bank of India",amenity:"bank"},name:"Bank of India",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Ireland":{tags:{name:"Bank of Ireland",amenity:"bank"},name:"Bank of Ireland",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Montreal":{tags:{name:"Bank of Montreal",amenity:"bank"},name:"Bank of Montreal",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of New Zealand":{tags:{name:"Bank of New Zealand",amenity:"bank"},name:"Bank of New Zealand",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of Scotland":{tags:{name:"Bank of Scotland",amenity:"bank"},name:"Bank of Scotland",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bank of the West":{tags:{name:"Bank of the West",amenity:"bank"},name:"Bank of the West",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bankia":{tags:{name:"Bankia",amenity:"bank"},name:"Bankia",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bankinter":{tags:{name:"Bankinter",amenity:"bank"},name:"Bankinter",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banner Bank":{tags:{name:"Banner Bank",amenity:"bank"},name:"Banner Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banorte":{tags:{name:"Banorte",amenity:"bank"},name:"Banorte",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banque Atlantique":{tags:{name:"Banque Atlantique",amenity:"bank"},name:"Banque Atlantique",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banque Nationale":{tags:{name:"Banque Nationale",amenity:"bank"},name:"Banque Nationale",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banque Populaire":{tags:{name:"Banque Populaire",amenity:"bank"},name:"Banque Populaire",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banrisul":{tags:{name:"Banrisul",amenity:"bank"},name:"Banrisul",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Banrural":{tags:{name:"Banrural",amenity:"bank"},name:"Banrural",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Barclays":{tags:{name:"Barclays",amenity:"bank"},name:"Barclays",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bcc":{tags:{name:"Bcc",amenity:"bank"},name:"Bcc",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Belfius":{tags:{name:"Belfius",amenity:"bank"},name:"Belfius",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bendigo Bank":{tags:{name:"Bendigo Bank",amenity:"bank"},name:"Bendigo Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Berliner Volksbank":{tags:{name:"Berliner Volksbank",amenity:"bank"},name:"Berliner Volksbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bicentenario":{tags:{name:"Bicentenario",amenity:"bank"},name:"Bicentenario",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Bradesco":{tags:{name:"Bradesco",amenity:"bank"},name:"Bradesco",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Budapest Bank":{tags:{name:"Budapest Bank",amenity:"bank"},name:"Budapest Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CBAO":{tags:{name:"CBAO",amenity:"bank"},name:"CBAO",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CEC Bank":{tags:{name:"CEC Bank",amenity:"bank"},name:"CEC Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CGD":{tags:{name:"CGD",amenity:"bank"},name:"CGD",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CIB Bank":{tags:{name:"CIB Bank",amenity:"bank"},name:"CIB Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CIBC":{tags:{name:"CIBC",amenity:"bank"},name:"CIBC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CIC":{tags:{name:"CIC",amenity:"bank"},name:"CIC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CIMB Bank":{tags:{name:"CIMB Bank",amenity:"bank"},name:"CIMB Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CNEP":{tags:{name:"CNEP",amenity:"bank"},name:"CNEP",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caisse Desjardins":{tags:{name:"Caisse Desjardins",amenity:"bank"},name:"Caisse Desjardins",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caisse d'Épargne":{tags:{name:"Caisse d'Épargne",amenity:"bank"},name:"Caisse d'Épargne",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caixa":{tags:{name:"Caixa",amenity:"bank"},name:"Caixa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caixa Econômica Federal":{tags:{name:"Caixa Econômica Federal",amenity:"bank"},name:"Caixa Econômica Federal",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caixa Geral de Depósitos":{tags:{name:"Caixa Geral de Depósitos",amenity:"bank"},name:"Caixa Geral de Depósitos",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CaixaBank":{tags:{name:"CaixaBank",amenity:"bank"},name:"CaixaBank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caja Círculo":{tags:{name:"Caja Círculo",amenity:"bank"},name:"Caja Círculo",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caja Duero":{tags:{name:"Caja Duero",amenity:"bank"},name:"Caja Duero",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caja España":{tags:{name:"Caja España",amenity:"bank"},name:"Caja España",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caja Rural":{tags:{name:"Caja Rural",amenity:"bank"},name:"Caja Rural",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Caja Rural de Jaén":{tags:{name:"Caja Rural de Jaén",amenity:"bank"},name:"Caja Rural de Jaén",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CajaSur":{tags:{name:"CajaSur",amenity:"bank"},name:"CajaSur",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Cajamar":{tags:{name:"Cajamar",amenity:"bank"},name:"Cajamar",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Cajero Automatico Bancared":{tags:{name:"Cajero Automatico Bancared",amenity:"bank"},name:"Cajero Automatico Bancared",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Canara Bank":{tags:{name:"Canara Bank",amenity:"bank"},name:"Canara Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Capital One":{tags:{name:"Capital One",amenity:"bank"},name:"Capital One",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Carige":{tags:{name:"Carige",amenity:"bank"},name:"Carige",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Cariparma":{tags:{name:"Cariparma",amenity:"bank"},name:"Cariparma",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Cassa di Risparmio del Veneto":{tags:{name:"Cassa di Risparmio del Veneto",amenity:"bank"},name:"Cassa di Risparmio del Veneto",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/CatalunyaCaixa":{tags:{name:"CatalunyaCaixa",amenity:"bank"},name:"CatalunyaCaixa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Central Bank of India":{tags:{name:"Central Bank of India",amenity:"bank"},name:"Central Bank of India",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Chase":{tags:{name:"Chase",amenity:"bank"},name:"Chase",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/China Bank":{tags:{name:"China Bank",amenity:"bank"},name:"China Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/China Bank Savings":{tags:{name:"China Bank Savings",amenity:"bank"},name:"China Bank Savings",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/China Construction Bank":{tags:{name:"China Construction Bank",amenity:"bank"},name:"China Construction Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Citibank":{tags:{name:"Citibank",amenity:"bank"},name:"Citibank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Citizens Bank":{tags:{name:"Citizens Bank",amenity:"bank"},name:"Citizens Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Clydesdale Bank":{tags:{name:"Clydesdale Bank",amenity:"bank"},name:"Clydesdale Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Columbia Bank":{tags:{name:"Columbia Bank",amenity:"bank"},name:"Columbia Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Comerica Bank":{tags:{name:"Comerica Bank",amenity:"bank"},name:"Comerica Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Commerce Bank":{tags:{name:"Commerce Bank",amenity:"bank"},name:"Commerce Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Commercial Bank":{tags:{name:"Commercial Bank",amenity:"bank"},name:"Commercial Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Commercial Bank of Ceylon PLC":{tags:{name:"Commercial Bank of Ceylon PLC",amenity:"bank"},name:"Commercial Bank of Ceylon PLC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Commerzbank":{tags:{name:"Commerzbank",amenity:"bank"},name:"Commerzbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Commonwealth Bank":{tags:{name:"Commonwealth Bank",amenity:"bank"},name:"Commonwealth Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Corporation Bank":{tags:{name:"Corporation Bank",amenity:"bank"},name:"Corporation Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Credem":{tags:{name:"Credem",amenity:"bank"},name:"Credem",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Credicoop":{tags:{name:"Credicoop",amenity:"bank"},name:"Credicoop",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Credit Agricole":{tags:{name:"Credit Agricole",amenity:"bank"},name:"Credit Agricole",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Credit Suisse":{tags:{name:"Credit Suisse",amenity:"bank"},name:"Credit Suisse",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Crelan":{tags:{name:"Crelan",amenity:"bank"},name:"Crelan",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Crédit Agricole":{tags:{name:"Crédit Agricole",amenity:"bank"},name:"Crédit Agricole",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Crédit Mutuel":{tags:{name:"Crédit Mutuel",amenity:"bank"},name:"Crédit Mutuel",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Crédit Mutuel de Bretagne":{tags:{name:"Crédit Mutuel de Bretagne",amenity:"bank"},name:"Crédit Mutuel de Bretagne",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Crédit du Nord":{tags:{name:"Crédit du Nord",amenity:"bank"},name:"Crédit du Nord",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Crédito Agrícola":{tags:{name:"Crédito Agrícola",amenity:"bank"},name:"Crédito Agrícola",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Cбербанк":{tags:{name:"Cбербанк",amenity:"bank"},name:"Cбербанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Danske Bank":{tags:{name:"Danske Bank",amenity:"bank"},name:"Danske Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Davivienda":{tags:{name:"Davivienda",amenity:"bank"},name:"Davivienda",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/De Venezuela":{tags:{name:"De Venezuela",amenity:"bank"},name:"De Venezuela",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Denizbank":{tags:{name:"Denizbank",amenity:"bank"},name:"Denizbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Desjardins":{tags:{name:"Desjardins",amenity:"bank"},name:"Desjardins",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Deutsche Bank":{tags:{name:"Deutsche Bank",amenity:"bank"},name:"Deutsche Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Dubai Islamic Bank":{tags:{name:"Dubai Islamic Bank",amenity:"bank"},name:"Dubai Islamic Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/EastWest Bank":{tags:{name:"EastWest Bank",amenity:"bank"},name:"EastWest Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Ecobank":{tags:{name:"Ecobank",amenity:"bank"},name:"Ecobank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Erste Bank":{tags:{name:"Erste Bank",amenity:"bank"},name:"Erste Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Eurobank":{tags:{name:"Eurobank",amenity:"bank"},name:"Eurobank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Express Union":{tags:{name:"Express Union",amenity:"bank"},name:"Express Union",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/FNB":{tags:{name:"FNB",amenity:"bank"},name:"FNB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Federal Bank":{tags:{name:"Federal Bank",amenity:"bank"},name:"Federal Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Fifth Third Bank":{tags:{name:"Fifth Third Bank",amenity:"bank"},name:"Fifth Third Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Finansbank":{tags:{name:"Finansbank",amenity:"bank"},name:"Finansbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/First Bank":{tags:{name:"First Bank",amenity:"bank"},name:"First Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/First Citizens Bank":{tags:{name:"First Citizens Bank",amenity:"bank"},name:"First Citizens Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/First National Bank":{tags:{name:"First National Bank",amenity:"bank"},name:"First National Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Galicia":{tags:{name:"Galicia",amenity:"bank"},name:"Galicia",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Garanti":{tags:{name:"Garanti",amenity:"bank"},name:"Garanti",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Garanti Bankası":{tags:{name:"Garanti Bankası",amenity:"bank"},name:"Garanti Bankası",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Getin Bank":{tags:{name:"Getin Bank",amenity:"bank"},name:"Getin Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Groupama":{tags:{name:"Groupama",amenity:"bank"},name:"Groupama",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/HDFC Bank":{tags:{name:"HDFC Bank",amenity:"bank"},name:"HDFC Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/HNB":{tags:{name:"HNB",amenity:"bank"},name:"HNB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/HSBC":{tags:{name:"HSBC",amenity:"bank"},name:"HSBC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Halifax":{tags:{name:"Halifax",amenity:"bank"},name:"Halifax",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Halkbank":{tags:{name:"Halkbank",amenity:"bank"},name:"Halkbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Hamburger Sparkasse":{tags:{name:"Hamburger Sparkasse",amenity:"bank"},name:"Hamburger Sparkasse",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Handelsbanken":{tags:{name:"Handelsbanken",amenity:"bank"},name:"Handelsbanken",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Hong Leong Bank":{tags:{name:"Hong Leong Bank",amenity:"bank"},name:"Hong Leong Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Hrvatska poštanska banka":{tags:{name:"Hrvatska poštanska banka",amenity:"bank"},name:"Hrvatska poštanska banka",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Huntington Bank":{tags:{name:"Huntington Bank",amenity:"bank"},name:"Huntington Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/HypoVereinsbank":{tags:{name:"HypoVereinsbank",amenity:"bank"},name:"HypoVereinsbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ICBC":{tags:{name:"ICBC",amenity:"bank"},name:"ICBC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ICICI Bank":{tags:{name:"ICICI Bank",amenity:"bank"},name:"ICICI Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/IDBI Bank":{tags:{name:"IDBI Bank",amenity:"bank"},name:"IDBI Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ING":{tags:{name:"ING",amenity:"bank"},name:"ING",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ING Bank Śląski":{tags:{name:"ING Bank Śląski",amenity:"bank"},name:"ING Bank Śląski",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/IberCaja":{tags:{name:"IberCaja",amenity:"bank"},name:"IberCaja",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Indian Bank":{tags:{name:"Indian Bank",amenity:"bank"},name:"Indian Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Indian Overseas Bank":{tags:{name:"Indian Overseas Bank",amenity:"bank"},name:"Indian Overseas Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Interbank":{tags:{name:"Interbank",amenity:"bank"},name:"Interbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Intesa San Paolo":{tags:{name:"Intesa San Paolo",amenity:"bank"},name:"Intesa San Paolo",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Itaú":{tags:{name:"Itaú",amenity:"bank"},name:"Itaú",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/K&H Bank":{tags:{name:"K&H Bank",amenity:"bank"},name:"K&H Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/KBC":{tags:{name:"KBC",amenity:"bank"},name:"KBC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Kasa Stefczyka":{tags:{name:"Kasa Stefczyka",amenity:"bank"},name:"Kasa Stefczyka",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Key Bank":{tags:{name:"Key Bank",amenity:"bank"},name:"Key Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Komerční banka":{tags:{name:"Komerční banka",amenity:"bank"},name:"Komerční banka",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Kreissparkasse":{tags:{name:"Kreissparkasse",amenity:"bank"},name:"Kreissparkasse",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Kreissparkasse Köln":{tags:{name:"Kreissparkasse Köln",amenity:"bank"},name:"Kreissparkasse Köln",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Kutxabank":{tags:{name:"Kutxabank",amenity:"bank"},name:"Kutxabank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/LCL":{tags:{name:"LCL",amenity:"bank"},name:"LCL",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/La Banque Postale":{tags:{name:"La Banque Postale",amenity:"bank"},name:"La Banque Postale",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/La Caixa":{tags:{name:"La Caixa",amenity:"bank"},name:"La Caixa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Laboral Kutxa":{tags:{name:"Laboral Kutxa",amenity:"bank"},name:"Laboral Kutxa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Landbank":{tags:{name:"Landbank",amenity:"bank"},name:"Landbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Liberbank":{tags:{name:"Liberbank",amenity:"bank"},name:"Liberbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Lloyds Bank":{tags:{name:"Lloyds Bank",amenity:"bank"},name:"Lloyds Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/M&T Bank":{tags:{name:"M&T Bank",amenity:"bank"},name:"M&T Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/MCB":{tags:{name:"MCB",amenity:"bank"},name:"MCB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/MCB Bank":{tags:{name:"MCB Bank",amenity:"bank"},name:"MCB Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/MONETA Money Bank":{tags:{name:"MONETA Money Bank",amenity:"bank"},name:"MONETA Money Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Macro":{tags:{name:"Macro",amenity:"bank"},name:"Macro",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Maybank":{tags:{name:"Maybank",amenity:"bank"},name:"Maybank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Meezan Bank":{tags:{name:"Meezan Bank",amenity:"bank"},name:"Meezan Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Mercantil":{tags:{name:"Mercantil",amenity:"bank"},name:"Mercantil",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Metro Bank":{tags:{name:"Metro Bank",amenity:"bank"},name:"Metro Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Metrobank":{tags:{name:"Metrobank",amenity:"bank"},name:"Metrobank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Millennium BCP":{tags:{name:"Millennium BCP",amenity:"bank"},name:"Millennium BCP",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Millennium Bank":{tags:{name:"Millennium Bank",amenity:"bank"},name:"Millennium Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Monte dei Paschi di Siena":{tags:{name:"Monte dei Paschi di Siena",amenity:"bank"},name:"Monte dei Paschi di Siena",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Montepio":{tags:{name:"Montepio",amenity:"bank"},name:"Montepio",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/NAB":{tags:{name:"NAB",amenity:"bank"},name:"NAB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/NSB":{tags:{name:"NSB",amenity:"bank"},name:"NSB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/NatWest":{tags:{name:"NatWest",amenity:"bank"},name:"NatWest",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/National Bank":{tags:{name:"National Bank",amenity:"bank"},name:"National Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Nationwide":{tags:{name:"Nationwide",amenity:"bank"},name:"Nationwide",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Nedbank":{tags:{name:"Nedbank",amenity:"bank"},name:"Nedbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Nordea":{tags:{name:"Nordea",amenity:"bank"},name:"Nordea",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Novo Banco":{tags:{name:"Novo Banco",amenity:"bank"},name:"Novo Banco",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/OLB":{tags:{name:"OLB",amenity:"bank"},name:"OLB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/OTP":{tags:{name:"OTP",amenity:"bank"},name:"OTP",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Oberbank":{tags:{name:"Oberbank",amenity:"bank"},name:"Oberbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Occidental de Descuento":{tags:{name:"Occidental de Descuento",amenity:"bank"},name:"Occidental de Descuento",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Oldenburgische Landesbank":{tags:{name:"Oldenburgische Landesbank",amenity:"bank"},name:"Oldenburgische Landesbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/One Network Bank":{tags:{name:"One Network Bank",amenity:"bank"},name:"One Network Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Osuuspankki":{tags:{name:"Osuuspankki",amenity:"bank"},name:"Osuuspankki",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PBZ":{tags:{name:"PBZ",amenity:"bank"},name:"PBZ",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PKO":{tags:{name:"PKO",amenity:"bank"},name:"PKO",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PKO BP":{tags:{name:"PKO BP",amenity:"bank"},name:"PKO BP",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PNB":{tags:{name:"PNB",amenity:"bank"},name:"PNB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PNC":{tags:{name:"PNC",amenity:"bank"},name:"PNC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PNC Bank":{tags:{name:"PNC Bank",amenity:"bank"},name:"PNC Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/PSBank":{tags:{name:"PSBank",amenity:"bank"},name:"PSBank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Patagonia":{tags:{name:"Patagonia",amenity:"bank"},name:"Patagonia",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Pekao SA":{tags:{name:"Pekao SA",amenity:"bank"},name:"Pekao SA",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Peoples Bank":{tags:{name:"Peoples Bank",amenity:"bank"},name:"Peoples Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Philippine National Bank":{tags:{name:"Philippine National Bank",amenity:"bank"},name:"Philippine National Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Piraeus Bank":{tags:{name:"Piraeus Bank",amenity:"bank"},name:"Piraeus Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Popular":{tags:{name:"Popular",amenity:"bank"},name:"Popular",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Postbank":{tags:{name:"Postbank",amenity:"bank"},name:"Postbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Postbank Finanzcenter":{tags:{name:"Postbank Finanzcenter",amenity:"bank"},name:"Postbank Finanzcenter",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Provincial":{tags:{name:"Provincial",amenity:"bank"},name:"Provincial",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Public Bank":{tags:{name:"Public Bank",amenity:"bank"},name:"Public Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Punjab National Bank":{tags:{name:"Punjab National Bank",amenity:"bank"},name:"Punjab National Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/RBC":{tags:{name:"RBC",amenity:"bank"},name:"RBC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/RBC Financial Group":{tags:{name:"RBC Financial Group",amenity:"bank"},name:"RBC Financial Group",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/RBS":{tags:{name:"RBS",amenity:"bank"},name:"RBS",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/RCBC":{tags:{name:"RCBC",amenity:"bank"},name:"RCBC",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/RCBC Savings Bank":{tags:{name:"RCBC Savings Bank",amenity:"bank"},name:"RCBC Savings Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Rabobank":{tags:{name:"Rabobank",amenity:"bank"},name:"Rabobank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Raiffeisen Polbank":{tags:{name:"Raiffeisen Polbank",amenity:"bank"},name:"Raiffeisen Polbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Raiffeisenbank":{tags:{name:"Raiffeisenbank",amenity:"bank"},name:"Raiffeisenbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Regions Bank":{tags:{name:"Regions Bank",amenity:"bank"},name:"Regions Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Republic Bank":{tags:{name:"Republic Bank",amenity:"bank"},name:"Republic Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Royal Bank":{tags:{name:"Royal Bank",amenity:"bank"},name:"Royal Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Royal Bank of Canada":{tags:{name:"Royal Bank of Canada",amenity:"bank"},name:"Royal Bank of Canada",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Royal Bank of Scotland":{tags:{name:"Royal Bank of Scotland",amenity:"bank"},name:"Royal Bank of Scotland",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/SEB":{tags:{name:"SEB",amenity:"bank"},name:"SEB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/SNS Bank":{tags:{name:"SNS Bank",amenity:"bank"},name:"SNS Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sabadell":{tags:{name:"Sabadell",amenity:"bank"},name:"Sabadell",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sampath Bank":{tags:{name:"Sampath Bank",amenity:"bank"},name:"Sampath Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Santander":{tags:{name:"Santander",amenity:"bank"},name:"Santander",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Santander Consumer Bank":{tags:{name:"Santander Consumer Bank",amenity:"bank"},name:"Santander Consumer Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Santander Río":{tags:{name:"Santander Río",amenity:"bank"},name:"Santander Río",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Santander Totta":{tags:{name:"Santander Totta",amenity:"bank"},name:"Santander Totta",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sberbank":{tags:{name:"Sberbank",amenity:"bank"},name:"Sberbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Scotiabank":{tags:{name:"Scotiabank",amenity:"bank"},name:"Scotiabank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Security Bank":{tags:{name:"Security Bank",amenity:"bank"},name:"Security Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sicredi":{tags:{name:"Sicredi",amenity:"bank"},name:"Sicredi",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Slovenská sporiteľňa":{tags:{name:"Slovenská sporiteľňa",amenity:"bank"},name:"Slovenská sporiteľňa",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Société Générale":{tags:{name:"Société Générale",amenity:"bank"},name:"Société Générale",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sparda-Bank":{tags:{name:"Sparda-Bank",amenity:"bank"},name:"Sparda-Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sparkasse":{tags:{name:"Sparkasse",amenity:"bank"},name:"Sparkasse",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sparkasse Aachen":{tags:{name:"Sparkasse Aachen",amenity:"bank"},name:"Sparkasse Aachen",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Sparkasse KölnBonn":{tags:{name:"Sparkasse KölnBonn",amenity:"bank"},name:"Sparkasse KölnBonn",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Stadtsparkasse":{tags:{name:"Stadtsparkasse",amenity:"bank"},name:"Stadtsparkasse",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Stanbic Bank":{tags:{name:"Stanbic Bank",amenity:"bank"},name:"Stanbic Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Standard Bank":{tags:{name:"Standard Bank",amenity:"bank"},name:"Standard Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Standard Chartered":{tags:{name:"Standard Chartered",amenity:"bank"},name:"Standard Chartered",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Standard Chartered Bank":{tags:{name:"Standard Chartered Bank",amenity:"bank"},name:"Standard Chartered Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/State Bank of India":{tags:{name:"State Bank of India",amenity:"bank"},name:"State Bank of India",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/SunTrust":{tags:{name:"SunTrust",amenity:"bank"},name:"SunTrust",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Supervielle":{tags:{name:"Supervielle",amenity:"bank"},name:"Supervielle",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Swedbank":{tags:{name:"Swedbank",amenity:"bank"},name:"Swedbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Syndicate Bank":{tags:{name:"Syndicate Bank",amenity:"bank"},name:"Syndicate Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/TCF Bank":{tags:{name:"TCF Bank",amenity:"bank"},name:"TCF Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/TD Bank":{tags:{name:"TD Bank",amenity:"bank"},name:"TD Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/TD Canada Trust":{tags:{name:"TD Canada Trust",amenity:"bank"},name:"TD Canada Trust",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/TEB":{tags:{name:"TEB",amenity:"bank"},name:"TEB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/TSB":{tags:{name:"TSB",amenity:"bank"},name:"TSB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Takarékszövetkezet":{tags:{name:"Takarékszövetkezet",amenity:"bank"},name:"Takarékszövetkezet",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Targobank":{tags:{name:"Targobank",amenity:"bank"},name:"Targobank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Tatra banka":{tags:{name:"Tatra banka",amenity:"bank"},name:"Tatra banka",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Türkiye İş Bankası":{tags:{name:"Türkiye İş Bankası",amenity:"bank"},name:"Türkiye İş Bankası",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/UBS":{tags:{name:"UBS",amenity:"bank"},name:"UBS",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/UCO Bank":{tags:{name:"UCO Bank",amenity:"bank"},name:"UCO Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/UCPB":{tags:{name:"UCPB",amenity:"bank"},name:"UCPB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/UOB":{tags:{name:"UOB",amenity:"bank"},name:"UOB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/US Bank":{tags:{name:"US Bank",amenity:"bank"},name:"US Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Ulster Bank":{tags:{name:"Ulster Bank",amenity:"bank"},name:"Ulster Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Umpqua Bank":{tags:{name:"Umpqua Bank",amenity:"bank"},name:"Umpqua Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/UniCredit Bank":{tags:{name:"UniCredit Bank",amenity:"bank"},name:"UniCredit Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Unicaja Banco":{tags:{name:"Unicaja Banco",amenity:"bank"},name:"Unicaja Banco",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Unicredit Banca":{tags:{name:"Unicredit Banca",amenity:"bank"},name:"Unicredit Banca",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Union Bank":{tags:{name:"Union Bank",amenity:"bank"},name:"Union Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/United Bank":{tags:{name:"United Bank",amenity:"bank"},name:"United Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/VR-Bank":{tags:{name:"VR-Bank",amenity:"bank"},name:"VR-Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Vakıfbank":{tags:{name:"Vakıfbank",amenity:"bank"},name:"Vakıfbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Veneto Banca":{tags:{name:"Veneto Banca",amenity:"bank"},name:"Veneto Banca",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Vijaya Bank":{tags:{name:"Vijaya Bank",amenity:"bank"},name:"Vijaya Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Volks- und Raiffeisenbank":{tags:{name:"Volks- und Raiffeisenbank",amenity:"bank"},name:"Volks- und Raiffeisenbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Volksbank":{tags:{name:"Volksbank",amenity:"bank"},name:"Volksbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Volksbank Mittelhessen":{tags:{name:"Volksbank Mittelhessen",amenity:"bank"},name:"Volksbank Mittelhessen",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Volksbank Raiffeisenbank":{tags:{name:"Volksbank Raiffeisenbank",amenity:"bank"},name:"Volksbank Raiffeisenbank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/VÚB":{tags:{name:"VÚB",amenity:"bank"},name:"VÚB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Washington Federal":{tags:{name:"Washington Federal",amenity:"bank"},name:"Washington Federal",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Wells Fargo":{tags:{name:"Wells Fargo",amenity:"bank"},name:"Wells Fargo",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Western Union":{tags:{name:"Western Union",amenity:"bank"},name:"Western Union",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Westpac":{tags:{name:"Westpac",amenity:"bank"},name:"Westpac",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Yorkshire Bank":{tags:{name:"Yorkshire Bank",amenity:"bank"},name:"Yorkshire Bank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Yorkshire Building Society":{tags:{name:"Yorkshire Building Society",amenity:"bank"},name:"Yorkshire Building Society",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Zagrebačka banka":{tags:{name:"Zagrebačka banka",amenity:"bank"},name:"Zagrebačka banka",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Ziraat Bankası":{tags:{name:"Ziraat Bankası",amenity:"bank"},name:"Ziraat Bankası",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/mBank":{tags:{name:"mBank",amenity:"bank"},name:"mBank",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ČSOB":{tags:{name:"ČSOB",amenity:"bank"},name:"ČSOB",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Česká spořitelna":{tags:{name:"Česká spořitelna",amenity:"bank"},name:"Česká spořitelna",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/İş Bankası":{tags:{name:"İş Bankası",amenity:"bank"},name:"İş Bankası",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Εθνική Τράπεζα":{tags:{name:"Εθνική Τράπεζα",amenity:"bank"},name:"Εθνική Τράπεζα",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Πειραιώς":{tags:{name:"Πειραιώς",amenity:"bank"},name:"Πειραιώς",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Τράπεζα Πειραιώς":{tags:{name:"Τράπεζα Πειραιώς",amenity:"bank"},name:"Τράπεζα Πειραιώς",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Авангард":{tags:{name:"Авангард",amenity:"bank"},name:"Авангард",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Альфа-Банк":{tags:{name:"Альфа-Банк",amenity:"bank"},name:"Альфа-Банк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Банк Москвы":{tags:{name:"Банк Москвы",amenity:"bank"},name:"Банк Москвы",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Банка ДСК":{tags:{name:"Банка ДСК",amenity:"bank"},name:"Банка ДСК",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Белагропромбанк":{tags:{name:"Белагропромбанк",amenity:"bank"},name:"Белагропромбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Беларусбанк":{tags:{name:"Беларусбанк",amenity:"bank"},name:"Беларусбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Белинвестбанк":{tags:{name:"Белинвестбанк",amenity:"bank"},name:"Белинвестбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Бинбанк":{tags:{name:"Бинбанк",amenity:"bank"},name:"Бинбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ВТБ":{tags:{name:"ВТБ",amenity:"bank"},name:"ВТБ",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ВТБ24":{tags:{name:"ВТБ24",amenity:"bank"},name:"ВТБ24",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Возрождение":{tags:{name:"Возрождение",amenity:"bank"},name:"Возрождение",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Газпромбанк":{tags:{name:"Газпромбанк",amenity:"bank"},name:"Газпромбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Генбанк":{tags:{name:"Генбанк",amenity:"bank"},name:"Генбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Казкоммерцбанк":{tags:{name:"Казкоммерцбанк",amenity:"bank"},name:"Казкоммерцбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/МДМ Банк":{tags:{name:"МДМ Банк",amenity:"bank"},name:"МДМ Банк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Московский индустриальный банк":{tags:{name:"Московский индустриальный банк",amenity:"bank"},name:"Московский индустриальный банк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Мособлбанк":{tags:{name:"Мособлбанк",amenity:"bank"},name:"Мособлбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Народный банк":{tags:{name:"Народный банк",amenity:"bank"},name:"Народный банк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ОТП Банк":{tags:{name:"ОТП Банк",amenity:"bank"},name:"ОТП Банк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Открытие":{tags:{name:"Открытие",amenity:"bank"},name:"Открытие",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Ощадбанк":{tags:{name:"Ощадбанк",amenity:"bank"},name:"Ощадбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ПУМБ":{tags:{name:"ПУМБ",amenity:"bank"},name:"ПУМБ",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Почта Банк":{tags:{name:"Почта Банк",amenity:"bank"},name:"Почта Банк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ПриватБанк":{tags:{name:"ПриватБанк",amenity:"bank"},name:"ПриватБанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Приватбанк":{tags:{name:"Приватбанк",amenity:"bank"},name:"Приватбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Приднестровский Сбербанк":{tags:{name:"Приднестровский Сбербанк",amenity:"bank"},name:"Приднестровский Сбербанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Приорбанк":{tags:{name:"Приорбанк",amenity:"bank"},name:"Приорбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Промсвязьбанк":{tags:{name:"Промсвязьбанк",amenity:"bank"},name:"Промсвязьбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/РНКБ":{tags:{name:"РНКБ",amenity:"bank"},name:"РНКБ",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Райффайзен":{tags:{name:"Райффайзен",amenity:"bank"},name:"Райффайзен",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Райффайзен Банк Аваль":{tags:{name:"Райффайзен Банк Аваль",amenity:"bank"},name:"Райффайзен Банк Аваль",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Райффайзенбанк":{tags:{name:"Райффайзенбанк",amenity:"bank"},name:"Райффайзенбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Росбанк":{tags:{name:"Росбанк",amenity:"bank"},name:"Росбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Россельхозбанк":{tags:{name:"Россельхозбанк",amenity:"bank"},name:"Россельхозбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Русский стандарт":{tags:{name:"Русский стандарт",amenity:"bank"},name:"Русский стандарт",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Сбербанк":{tags:{name:"Сбербанк",amenity:"bank"},name:"Сбербанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Совкомбанк":{tags:{name:"Совкомбанк",amenity:"bank"},name:"Совкомбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/УкрСиббанк":{tags:{name:"УкрСиббанк",amenity:"bank"},name:"УкрСиббанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Укрсоцбанк":{tags:{name:"Укрсоцбанк",amenity:"bank"},name:"Укрсоцбанк",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Уралсиб":{tags:{name:"Уралсиб",amenity:"bank"},name:"Уралсиб",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/Хоум Кредит":{tags:{name:"Хоум Кредит",amenity:"bank"},name:"Хоум Кредит",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/בנק הפועלים":{tags:{name:"בנק הפועלים",amenity:"bank"},name:"בנק הפועלים",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/בנק לאומי":{tags:{name:"בנק לאומי",amenity:"bank"},name:"בנק לאומי",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک":{tags:{name:"بانک",amenity:"bank"},name:"بانک",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک آینده":{tags:{name:"بانک آینده",amenity:"bank"},name:"بانک آینده",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک اقتصاد نوین":{tags:{name:"بانک اقتصاد نوین",amenity:"bank"},name:"بانک اقتصاد نوین",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک انصار":{tags:{name:"بانک انصار",amenity:"bank"},name:"بانک انصار",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک تجارت":{tags:{name:"بانک تجارت",amenity:"bank"},name:"بانک تجارت",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک رفاه":{tags:{name:"بانک رفاه",amenity:"bank"},name:"بانک رفاه",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک رفاه کارگران":{tags:{name:"بانک رفاه کارگران",amenity:"bank"},name:"بانک رفاه کارگران",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک سپه":{tags:{name:"بانک سپه",amenity:"bank"},name:"بانک سپه",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک شهر":{tags:{name:"بانک شهر",amenity:"bank"},name:"بانک شهر",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک صادرات":{tags:{name:"بانک صادرات",amenity:"bank"},name:"بانک صادرات",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک قوامین":{tags:{name:"بانک قوامین",amenity:"bank"},name:"بانک قوامین",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک مسکن":{tags:{name:"بانک مسکن",amenity:"bank"},name:"بانک مسکن",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک ملت":{tags:{name:"بانک ملت",amenity:"bank"},name:"بانک ملت",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک ملی":{tags:{name:"بانک ملی",amenity:"bank"},name:"بانک ملی",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک ملی ایران":{tags:{name:"بانک ملی ایران",amenity:"bank"},name:"بانک ملی ایران",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک مهر اقتصاد":{tags:{name:"بانک مهر اقتصاد",amenity:"bank"},name:"بانک مهر اقتصاد",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک پارسیان":{tags:{name:"بانک پارسیان",amenity:"bank"},name:"بانک پارسیان",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک پاسارگاد":{tags:{name:"بانک پاسارگاد",amenity:"bank"},name:"بانک پاسارگاد",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/بانک کشاورزی":{tags:{name:"بانک کشاورزی",amenity:"bank"},name:"بانک کشاورزی",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/صادرات":{tags:{name:"صادرات",amenity:"bank"},name:"صادرات",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ملی":{tags:{name:"ملی",amenity:"bank"},name:"ملی",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/پست بانک":{tags:{name:"پست بانک",amenity:"bank"},name:"پست بانک",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ธนาคารกรุงเทพ":{tags:{name:"ธนาคารกรุงเทพ",amenity:"bank"},name:"ธนาคารกรุงเทพ",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ธนาคารกรุงไทย":{tags:{name:"ธนาคารกรุงไทย",amenity:"bank"},name:"ธนาคารกรุงไทย",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ธนาคารกสิกรไทย":{tags:{name:"ธนาคารกสิกรไทย",amenity:"bank"},name:"ธนาคารกสิกรไทย",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ธนาคารออมสิน":{tags:{name:"ธนาคารออมสิน",amenity:"bank"},name:"ธนาคารออมสิน",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/ธนาคารไทยพาณิชย์":{tags:{name:"ธนาคารไทยพาณิชย์",amenity:"bank"},name:"ธนาคารไทยพาณิชย์",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/みずほ銀行":{tags:{name:"みずほ銀行",amenity:"bank"},name:"みずほ銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/りそな銀行":{tags:{name:"りそな銀行",amenity:"bank"},name:"りそな銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/三井住友銀行":{tags:{name:"三井住友銀行",amenity:"bank"},name:"三井住友銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/三菱東京UFJ銀行":{tags:{name:"三菱東京UFJ銀行",amenity:"bank"},name:"三菱東京UFJ銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/中国农业银行":{tags:{name:"中国农业银行",amenity:"bank"},name:"中国农业银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/中国工商银行":{tags:{name:"中国工商银行",amenity:"bank"},name:"中国工商银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/中国建设银行":{tags:{name:"中国建设银行",amenity:"bank"},name:"中国建设银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/中国邮政储蓄银行":{tags:{name:"中国邮政储蓄银行",amenity:"bank"},name:"中国邮政储蓄银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/中国银行":{tags:{name:"中国银行",amenity:"bank"},name:"中国银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/交通银行":{tags:{name:"交通银行",amenity:"bank"},name:"交通银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/京都中央信用金庫":{tags:{name:"京都中央信用金庫",amenity:"bank"},name:"京都中央信用金庫",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/京都銀行":{tags:{name:"京都銀行",amenity:"bank"},name:"京都銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/农业银行":{tags:{name:"农业银行",amenity:"bank"},name:"农业银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/北海道銀行":{tags:{name:"北海道銀行",amenity:"bank"},name:"北海道銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/合作金庫銀行":{tags:{name:"合作金庫銀行",amenity:"bank"},name:"合作金庫銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/土地銀行":{tags:{name:"土地銀行",amenity:"bank"},name:"土地銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/工商银行":{tags:{name:"工商银行",amenity:"bank"},name:"工商银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/建设银行":{tags:{name:"建设银行",amenity:"bank"},name:"建设银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/彰化銀行":{tags:{name:"彰化銀行",amenity:"bank"},name:"彰化銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/招商银行":{tags:{name:"招商银行",amenity:"bank"},name:"招商银行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/横浜銀行":{tags:{name:"横浜銀行",amenity:"bank"},name:"横浜銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/第一銀行":{tags:{name:"第一銀行",amenity:"bank"},name:"第一銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/華南銀行":{tags:{name:"華南銀行",amenity:"bank"},name:"華南銀行",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/국민은행":{tags:{name:"국민은행","name:en":"Gungmin Bank",amenity:"bank"},name:"국민은행",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/기업은행":{tags:{name:"기업은행",amenity:"bank"},name:"기업은행",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/농협":{tags:{name:"농협",amenity:"bank"},name:"농협",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/새마을금고":{tags:{name:"새마을금고",amenity:"bank"},name:"새마을금고",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/신한은행":{tags:{name:"신한은행","name:en":"Sinhan Bank",amenity:"bank"},name:"신한은행",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/우리은행":{tags:{name:"우리은행","name:en":"Uri Bank",amenity:"bank"},name:"우리은행",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bank/하나은행":{tags:{name:"하나은행",amenity:"bank"},name:"하나은행",icon:"maki-bank",geometry:["point","area"],fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],suggestion:true},"amenity/bar/Bar Centrale":{tags:{name:"Bar Centrale",amenity:"bar"},name:"Bar Centrale",icon:"maki-bar",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/bar/Bar Sport":{tags:{name:"Bar Sport",amenity:"bar"},name:"Bar Sport",icon:"maki-bar",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/bar/Beach Bar":{tags:{name:"Beach Bar",amenity:"bar"},name:"Beach Bar",icon:"maki-bar",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/bar/Pool Bar":{tags:{name:"Pool Bar",amenity:"bar"},name:"Pool Bar",icon:"maki-bar",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/bicycle_rental/Bicing":{tags:{name:"Bicing",amenity:"bicycle_rental"},name:"Bicing",icon:"maki-bicycle",geometry:["point","vertex","area"],fields:["capacity","network","operator","payment_multi"],suggestion:true},"amenity/bicycle_rental/Call a Bike":{tags:{name:"Call a Bike",amenity:"bicycle_rental"},name:"Call a Bike",icon:"maki-bicycle",geometry:["point","vertex","area"],fields:["capacity","network","operator","payment_multi"],suggestion:true},"amenity/bicycle_rental/Grid":{tags:{name:"Grid",amenity:"bicycle_rental"},name:"Grid",icon:"maki-bicycle",geometry:["point","vertex","area"],fields:["capacity","network","operator","payment_multi"],suggestion:true},"amenity/bicycle_rental/Mibici":{tags:{name:"Mibici",amenity:"bicycle_rental"},name:"Mibici",icon:"maki-bicycle",geometry:["point","vertex","area"],fields:["capacity","network","operator","payment_multi"],suggestion:true},"amenity/bicycle_rental/metropolradruhr":{tags:{name:"metropolradruhr",amenity:"bicycle_rental"},name:"metropolradruhr",icon:"maki-bicycle",geometry:["point","vertex","area"],fields:["capacity","network","operator","payment_multi"],suggestion:true},"amenity/bureau_de_change/Abitab":{tags:{name:"Abitab",amenity:"bureau_de_change"},name:"Abitab",icon:"maki-bank",geometry:["point","area"],fields:["name","currency_multi","operator","address","building_area","opening_hours"],suggestion:true},"amenity/bureau_de_change/Change":{tags:{name:"Change",amenity:"bureau_de_change"},name:"Change",icon:"maki-bank",geometry:["point","area"],fields:["name","currency_multi","operator","address","building_area","opening_hours"],suggestion:true},"amenity/bureau_de_change/Travelex":{tags:{name:"Travelex",amenity:"bureau_de_change"},name:"Travelex",icon:"maki-bank",geometry:["point","area"],fields:["name","currency_multi","operator","address","building_area","opening_hours"],suggestion:true},"amenity/cafe/85度C":{tags:{name:"85度C",amenity:"cafe"},name:"85度C",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Bar Kafe":{tags:{name:"Bar Kafe",amenity:"cafe"},name:"Bar Kafe",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Barista":{tags:{name:"Barista",amenity:"cafe"},name:"Barista",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Bonafide":{tags:{name:"Bonafide",amenity:"cafe"},name:"Bonafide",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Cafe Coffee Day":{tags:{name:"Cafe Coffee Day",amenity:"cafe"},name:"Cafe Coffee Day",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Cafe Nero":{tags:{name:"Cafe Nero",amenity:"cafe"},name:"Cafe Nero",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Cafeteria":{tags:{name:"Cafeteria",amenity:"cafe"},name:"Cafeteria",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Cafetería":{tags:{name:"Cafetería",amenity:"cafe"},name:"Cafetería",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Caffè Nero":{tags:{name:"Caffè Nero",amenity:"cafe"},name:"Caffè Nero",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Café Amazon":{tags:{name:"Café Amazon",amenity:"cafe"},name:"Café Amazon",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Café Central":{tags:{name:"Café Central",amenity:"cafe"},name:"Café Central",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Café de la Place":{tags:{name:"Café de la Place",amenity:"cafe"},name:"Café de la Place",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Café des Sports":{tags:{name:"Café des Sports",amenity:"cafe"},name:"Café des Sports",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Caribou Coffee":{tags:{name:"Caribou Coffee",amenity:"cafe"},name:"Caribou Coffee",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Coffee Fellows":{tags:{name:"Coffee Fellows",amenity:"cafe"},name:"Coffee Fellows",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Coffee House":{tags:{name:"Coffee House",amenity:"cafe"},name:"Coffee House",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Coffee Island":{tags:{name:"Coffee Island",amenity:"cafe"},name:"Coffee Island",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Coffee Time":{tags:{name:"Coffee Time",amenity:"cafe"},name:"Coffee Time",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Costa":{tags:{name:"Costa",amenity:"cafe"},name:"Costa",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Country Style":{tags:{name:"Country Style",amenity:"cafe"},name:"Country Style",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Dunkin' Donuts":{tags:{name:"Dunkin' Donuts",cuisine:"donut",amenity:"cafe"},name:"Dunkin' Donuts",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Eiscafe Dolomiti":{tags:{name:"Eiscafe Dolomiti",amenity:"cafe"},name:"Eiscafe Dolomiti",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Eiscafe Venezia":{tags:{name:"Eiscafe Venezia",amenity:"cafe"},name:"Eiscafe Venezia",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Espresso House":{tags:{name:"Espresso House",amenity:"cafe"},name:"Espresso House",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Havanna":{tags:{name:"Havanna",amenity:"cafe"},name:"Havanna",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Internet Cafe":{tags:{name:"Internet Cafe",amenity:"cafe"},name:"Internet Cafe",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Kafe":{tags:{name:"Kafe",amenity:"cafe"},name:"Kafe",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Krispy Kreme":{tags:{name:"Krispy Kreme",amenity:"cafe"},name:"Krispy Kreme",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Le Pain Quotidien":{tags:{name:"Le Pain Quotidien",amenity:"cafe"},name:"Le Pain Quotidien",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/McCafé":{tags:{name:"McCafé",amenity:"cafe",cuisine:"coffee_shop"},name:"McCafé",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Peet's Coffee & Tea":{tags:{name:"Peet's Coffee & Tea",amenity:"cafe"},name:"Peet's Coffee & Tea",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Pret A Manger":{tags:{name:"Pret A Manger",amenity:"cafe"},name:"Pret A Manger",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Prime":{tags:{name:"Prime",amenity:"cafe"},name:"Prime",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Second Cup":{tags:{name:"Second Cup",amenity:"cafe"},name:"Second Cup",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Segafredo":{tags:{name:"Segafredo",amenity:"cafe"},name:"Segafredo",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Starbucks":{tags:{name:"Starbucks",cuisine:"coffee_shop",amenity:"cafe"},name:"Starbucks",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/The Coffee Bean & Tea Leaf":{tags:{name:"The Coffee Bean & Tea Leaf",amenity:"cafe"},name:"The Coffee Bean & Tea Leaf",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/The Coffee Club":{tags:{name:"The Coffee Club",amenity:"cafe"},name:"The Coffee Club",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Tim Hortons":{tags:{name:"Tim Hortons",amenity:"cafe"},name:"Tim Hortons",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Traveler's Coffee":{tags:{name:"Traveler's Coffee",amenity:"cafe"},name:"Traveler's Coffee",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Wayne's Coffee":{tags:{name:"Wayne's Coffee",amenity:"cafe"},name:"Wayne's Coffee",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Бистро":{tags:{name:"Бистро",amenity:"cafe"},name:"Бистро",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Буфет":{tags:{name:"Буфет",amenity:"cafe"},name:"Буфет",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Встреча":{tags:{name:"Встреча",amenity:"cafe"},name:"Встреча",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Даблби":{tags:{name:"Даблби",amenity:"cafe"},name:"Даблби",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Закусочная":{tags:{name:"Закусочная",amenity:"cafe"},name:"Закусочная",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Кофе Хауз":{tags:{name:"Кофе Хауз",amenity:"cafe"},name:"Кофе Хауз",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Кофейня":{tags:{name:"Кофейня",amenity:"cafe"},name:"Кофейня",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Лакомка":{tags:{name:"Лакомка",amenity:"cafe"},name:"Лакомка",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Летнее кафе":{tags:{name:"Летнее кафе",amenity:"cafe"},name:"Летнее кафе",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Пельменная":{tags:{name:"Пельменная",amenity:"cafe"},name:"Пельменная",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Пиццерия":{tags:{name:"Пиццерия",amenity:"cafe"},name:"Пиццерия",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Рандеву":{tags:{name:"Рандеву",amenity:"cafe"},name:"Рандеву",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Сказка":{tags:{name:"Сказка",amenity:"cafe"},name:"Сказка",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Старбакс":{tags:{name:"Старбакс",amenity:"cafe"},name:"Старбакс",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Столовая":{tags:{name:"Столовая",amenity:"cafe"},name:"Столовая",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Уют":{tags:{name:"Уют",amenity:"cafe"},name:"Уют",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Хуторок":{tags:{name:"Хуторок",amenity:"cafe"},name:"Хуторок",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Шашлычная":{tags:{name:"Шашлычная",amenity:"cafe"},name:"Шашлычная",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Шоколад":{tags:{name:"Шоколад",amenity:"cafe"},name:"Шоколад",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/Шоколадница":{tags:{name:"Шоколадница",amenity:"cafe"},name:"Шоколадница",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/ארומה":{tags:{name:"ארומה",amenity:"cafe"},name:"ארומה",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/مقهى":{tags:{name:"مقهى",amenity:"cafe"},name:"مقهى",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/คาเฟ่ อเมซอน":{tags:{name:"คาเฟ่ อเมซอน",amenity:"cafe"},name:"คาเฟ่ อเมซอน",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/エクセルシオール カフェ":{tags:{name:"エクセルシオール カフェ",amenity:"cafe"},name:"エクセルシオール カフェ",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/カフェ・ド・クリエ":{tags:{name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE",amenity:"cafe"},name:"カフェ・ド・クリエ",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/カフェ・ベローチェ":{tags:{name:"カフェ・ベローチェ",amenity:"cafe"},name:"カフェ・ベローチェ",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/コメダ珈琲店":{tags:{name:"コメダ珈琲店",amenity:"cafe"},name:"コメダ珈琲店",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/サンマルクカフェ":{tags:{name:"サンマルクカフェ",amenity:"cafe"},name:"サンマルクカフェ",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/スターバックス":{tags:{name:"スターバックス","name:en":"Starbucks",amenity:"cafe"},name:"スターバックス",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/タリーズコーヒー":{tags:{name:"タリーズコーヒー",amenity:"cafe"},name:"タリーズコーヒー",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/ドトールコーヒーショップ":{tags:{name:"ドトールコーヒーショップ","name:en":"Doutor",amenity:"cafe"},name:"ドトールコーヒーショップ",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/星巴克":{tags:{name:"星巴克",amenity:"cafe"},name:"星巴克",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/cafe/스타벅스":{tags:{name:"스타벅스",amenity:"cafe"},name:"스타벅스",icon:"maki-cafe",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating"],suggestion:true},"amenity/car_rental/Alamo":{tags:{name:"Alamo",amenity:"car_rental"},name:"Alamo",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Avis":{tags:{name:"Avis",amenity:"car_rental"},name:"Avis",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Budget":{tags:{name:"Budget",amenity:"car_rental"},name:"Budget",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Enterprise":{tags:{name:"Enterprise",amenity:"car_rental"},name:"Enterprise",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Enterprise Rent-a-Car":{tags:{name:"Enterprise Rent-a-Car",amenity:"car_rental"},name:"Enterprise Rent-a-Car",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Europcar":{tags:{name:"Europcar",amenity:"car_rental"},name:"Europcar",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Hertz":{tags:{name:"Hertz",amenity:"car_rental"},name:"Hertz",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Localiza":{tags:{name:"Localiza",amenity:"car_rental"},name:"Localiza",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Sixt":{tags:{name:"Sixt",amenity:"car_rental"},name:"Sixt",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/Thrifty":{tags:{name:"Thrifty",amenity:"car_rental"},name:"Thrifty",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/U-Haul":{tags:{name:"U-Haul",amenity:"car_rental"},name:"U-Haul",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/オリックスレンタカー":{tags:{name:"オリックスレンタカー",amenity:"car_rental"},name:"オリックスレンタカー",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/トヨタレンタカー":{tags:{name:"トヨタレンタカー",amenity:"car_rental"},name:"トヨタレンタカー",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/トヨタレンタリース":{tags:{name:"トヨタレンタリース",amenity:"car_rental"},name:"トヨタレンタリース",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_rental/ニッポンレンタカー":{tags:{name:"ニッポンレンタカー",amenity:"car_rental"},name:"ニッポンレンタカー",icon:"maki-car",geometry:["point","area"],fields:["name","operator","payment_multi"],suggestion:true},"amenity/car_wash/Autolavaggio":{tags:{name:"Autolavaggio",amenity:"car_wash"},name:"Autolavaggio",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/H-E-B Car Wash":{tags:{name:"H-E-B Car Wash",amenity:"car_wash"},name:"H-E-B Car Wash",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Lavage Auto":{tags:{name:"Lavage Auto",amenity:"car_wash"},name:"Lavage Auto",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Lavazh":{tags:{name:"Lavazh",amenity:"car_wash"},name:"Lavazh",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Myjnia":{tags:{name:"Myjnia",amenity:"car_wash"},name:"Myjnia",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Myjnia bezdotykowa":{tags:{name:"Myjnia bezdotykowa",amenity:"car_wash"},name:"Myjnia bezdotykowa",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Myjnia samochodowa":{tags:{name:"Myjnia samochodowa",amenity:"car_wash"},name:"Myjnia samochodowa",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Spălătorie Auto":{tags:{name:"Spălătorie Auto",amenity:"car_wash"},name:"Spălătorie Auto",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Spălătorie auto":{tags:{name:"Spălătorie auto",amenity:"car_wash"},name:"Spălătorie auto",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/car_wash/Автомийка":{tags:{name:"Автомийка",amenity:"car_wash"},name:"Автомийка",icon:"maki-car",geometry:["point","area"],fields:["address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/cinema/Cinema City":{tags:{name:"Cinema City",amenity:"cinema"},name:"Cinema City",icon:"maki-cinema",geometry:["point","area"],fields:["name","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/cinema/Cinemark":{tags:{name:"Cinemark",amenity:"cinema"},name:"Cinemark",icon:"maki-cinema",geometry:["point","area"],fields:["name","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/cinema/Cinemex":{tags:{name:"Cinemex",amenity:"cinema"},name:"Cinemex",icon:"maki-cinema",geometry:["point","area"],fields:["name","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/cinema/Cinepolis":{tags:{name:"Cinepolis",amenity:"cinema"},name:"Cinepolis",icon:"maki-cinema",geometry:["point","area"],fields:["name","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/cinema/Cineworld":{tags:{name:"Cineworld",amenity:"cinema"},name:"Cineworld",icon:"maki-cinema",geometry:["point","area"],fields:["name","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/cinema/Odeon":{tags:{name:"Odeon",amenity:"cinema"},name:"Odeon",icon:"maki-cinema",geometry:["point","area"],fields:["name","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/clinic/ФАП":{tags:{name:"ФАП",healthcare:"clinic",amenity:"clinic"},name:"ФАП",icon:"maki-doctor",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/dentist/Aspen Dental":{tags:{name:"Aspen Dental",healthcare:"dentist",amenity:"dentist"},name:"Aspen Dental",icon:"maki-dentist",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/dentist/Family Dentistry":{tags:{name:"Family Dentistry",healthcare:"dentist",amenity:"dentist"},name:"Family Dentistry",icon:"maki-dentist",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/dentist/Vitaldent":{tags:{name:"Vitaldent",healthcare:"dentist",amenity:"dentist"},name:"Vitaldent",icon:"maki-dentist",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/dentist/Стоматолог":{tags:{name:"Стоматолог",healthcare:"dentist",amenity:"dentist"},name:"Стоматолог",icon:"maki-dentist",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/dentist/Стоматологія":{tags:{name:"Стоматологія",healthcare:"dentist",amenity:"dentist"},name:"Стоматологія",icon:"maki-dentist",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/doctors/Háziorvosi rendelő":{tags:{name:"Háziorvosi rendelő",healthcare:"doctor",amenity:"doctors"},name:"Háziorvosi rendelő",icon:"maki-doctor",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/doctors/Инвитро":{tags:{name:"Инвитро",healthcare:"doctor",amenity:"doctors"},name:"Инвитро",icon:"maki-doctor",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],suggestion:true},"amenity/driving_school/Автодром":{tags:{name:"Автодром",amenity:"driving_school"},name:"Автодром",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"amenity/fast_food/A&W":{tags:{name:"A&W",amenity:"fast_food"},name:"A&W",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Ali Baba":{tags:{name:"Ali Baba",amenity:"fast_food"},name:"Ali Baba",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Angel's Burger":{tags:{name:"Angel's Burger",amenity:"fast_food"},name:"Angel's Burger",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Antalya":{tags:{name:"Antalya",amenity:"fast_food"},name:"Antalya",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Arby's":{tags:{name:"Arby's",amenity:"fast_food"},name:"Arby's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Asia Bistro":{tags:{name:"Asia Bistro",amenity:"fast_food"},name:"Asia Bistro",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Asia Wok":{tags:{name:"Asia Wok",amenity:"fast_food"},name:"Asia Wok",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Baskin-Robbins":{tags:{name:"Baskin-Robbins",amenity:"fast_food"},name:"Baskin-Robbins",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Bistro":{tags:{name:"Bistro",amenity:"fast_food"},name:"Bistro",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Bob's":{tags:{name:"Bob's",amenity:"fast_food"},name:"Bob's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Bojangles":{tags:{name:"Bojangles",amenity:"fast_food"},name:"Bojangles",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Booster Juice":{tags:{name:"Booster Juice",amenity:"fast_food"},name:"Booster Juice",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Boston Market":{tags:{name:"Boston Market",amenity:"fast_food"},name:"Boston Market",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Braum's":{tags:{name:"Braum's",amenity:"fast_food"},name:"Braum's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Burger King":{tags:{name:"Burger King",cuisine:"burger",amenity:"fast_food"},name:"Burger King",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Burger Machine":{tags:{name:"Burger Machine",amenity:"fast_food"},name:"Burger Machine",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Büfé":{tags:{name:"Büfé",amenity:"fast_food"},name:"Büfé",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Captain D's":{tags:{name:"Captain D's",amenity:"fast_food"},name:"Captain D's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Carl's Jr.":{tags:{name:"Carl's Jr.",cuisine:"burger",amenity:"fast_food"},name:"Carl's Jr.",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Chick-fil-A":{tags:{name:"Chick-fil-A",cuisine:"chicken",amenity:"fast_food"},name:"Chick-fil-A",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Chicken Express":{tags:{name:"Chicken Express",amenity:"fast_food"},name:"Chicken Express",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Chipotle":{tags:{name:"Chipotle",cuisine:"mexican",amenity:"fast_food"},name:"Chipotle",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Chowking":{tags:{name:"Chowking",amenity:"fast_food"},name:"Chowking",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Church's Chicken":{tags:{name:"Church's Chicken",amenity:"fast_food"},name:"Church's Chicken",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/CoCo壱番屋":{tags:{name:"CoCo壱番屋",amenity:"fast_food"},name:"CoCo壱番屋",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Cold Stone Creamery":{tags:{name:"Cold Stone Creamery",amenity:"fast_food"},name:"Cold Stone Creamery",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Cook Out":{tags:{name:"Cook Out",amenity:"fast_food"},name:"Cook Out",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Culver's":{tags:{name:"Culver's",amenity:"fast_food"},name:"Culver's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/DQ":{tags:{name:"DQ",amenity:"fast_food"},name:"DQ",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Dairy Queen":{tags:{name:"Dairy Queen",amenity:"fast_food"},name:"Dairy Queen",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Del Taco":{tags:{name:"Del Taco",amenity:"fast_food"},name:"Del Taco",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Domino's Pizza":{tags:{name:"Domino's Pizza",cuisine:"pizza",amenity:"fast_food"},name:"Domino's Pizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/El Pollo Loco":{tags:{name:"El Pollo Loco",amenity:"fast_food"},name:"El Pollo Loco",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Everest":{tags:{name:"Everest",amenity:"fast_food"},name:"Everest",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Extreme Pita":{tags:{name:"Extreme Pita",amenity:"fast_food"},name:"Extreme Pita",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Fazoli's":{tags:{name:"Fazoli's",amenity:"fast_food"},name:"Fazoli's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Firehouse Subs":{tags:{name:"Firehouse Subs",amenity:"fast_food"},name:"Firehouse Subs",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Fish & Chips":{tags:{name:"Fish & Chips",amenity:"fast_food"},name:"Fish & Chips",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Fish and Chips":{tags:{name:"Fish and Chips",amenity:"fast_food"},name:"Fish and Chips",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Five Guys":{tags:{name:"Five Guys",amenity:"fast_food"},name:"Five Guys",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Greenwich":{tags:{name:"Greenwich",amenity:"fast_food"},name:"Greenwich",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Habib's":{tags:{name:"Habib's",amenity:"fast_food"},name:"Habib's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Hallo Pizza":{tags:{name:"Hallo Pizza",amenity:"fast_food"},name:"Hallo Pizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Hardee's":{tags:{name:"Hardee's",cuisine:"burger",amenity:"fast_food"},name:"Hardee's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Harvey's":{tags:{name:"Harvey's",amenity:"fast_food"},name:"Harvey's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Hesburger":{tags:{name:"Hesburger",amenity:"fast_food"},name:"Hesburger",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Hungry Jacks":{tags:{name:"Hungry Jacks",cuisine:"burger",amenity:"fast_food"},name:"Hungry Jacks",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/In-N-Out Burger":{tags:{name:"In-N-Out Burger",amenity:"fast_food"},name:"In-N-Out Burger",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Istanbul":{tags:{name:"Istanbul",amenity:"fast_food"},name:"Istanbul",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Istanbul Kebab":{tags:{name:"Istanbul Kebab",amenity:"fast_food"},name:"Istanbul Kebab",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Jack in the Box":{tags:{name:"Jack in the Box",cuisine:"burger",amenity:"fast_food"},name:"Jack in the Box",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Jamba Juice":{tags:{name:"Jamba Juice",amenity:"fast_food"},name:"Jamba Juice",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Jersey Mike's Subs":{tags:{name:"Jersey Mike's Subs",amenity:"fast_food"},name:"Jersey Mike's Subs",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Jimmy John's":{tags:{name:"Jimmy John's",cuisine:"sandwich",amenity:"fast_food"},name:"Jimmy John's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Jollibee":{tags:{name:"Jollibee",amenity:"fast_food"},name:"Jollibee",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/KFC":{tags:{name:"KFC",cuisine:"chicken",amenity:"fast_food"},name:"KFC",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/KFC/Taco Bell":{tags:{name:"KFC/Taco Bell",amenity:"fast_food"},name:"KFC/Taco Bell",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Kebab House":{tags:{name:"Kebab House",amenity:"fast_food"},name:"Kebab House",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Kebabai":{tags:{name:"Kebabai",amenity:"fast_food"},name:"Kebabai",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Kochlöffel":{tags:{name:"Kochlöffel",amenity:"fast_food"},name:"Kochlöffel",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Kotipizza":{tags:{name:"Kotipizza",amenity:"fast_food"},name:"Kotipizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Krystal":{tags:{name:"Krystal",amenity:"fast_food"},name:"Krystal",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Little Caesars":{tags:{name:"Little Caesars",amenity:"fast_food"},name:"Little Caesars",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Little Caesars Pizza":{tags:{name:"Little Caesars Pizza",amenity:"fast_food"},name:"Little Caesars Pizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Long John Silver's":{tags:{name:"Long John Silver's",amenity:"fast_food"},name:"Long John Silver's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Lotteria":{tags:{name:"Lotteria",amenity:"fast_food"},name:"Lotteria",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Max":{tags:{name:"Max",amenity:"fast_food"},name:"Max",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/McDonald's":{tags:{name:"McDonald's",cuisine:"burger",amenity:"fast_food"},name:"McDonald's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Minute Burger":{tags:{name:"Minute Burger",amenity:"fast_food"},name:"Minute Burger",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Mr. Sub":{tags:{name:"Mr. Sub",amenity:"fast_food"},name:"Mr. Sub",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/New York Pizza":{tags:{name:"New York Pizza",amenity:"fast_food"},name:"New York Pizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Nordsee":{tags:{name:"Nordsee",amenity:"fast_food"},name:"Nordsee",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Panda Express":{tags:{name:"Panda Express",cuisine:"chinese",amenity:"fast_food"},name:"Panda Express",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Papa John's":{tags:{name:"Papa John's",cuisine:"pizza",amenity:"fast_food"},name:"Papa John's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Papa Murphy's":{tags:{name:"Papa Murphy's",amenity:"fast_food"},name:"Papa Murphy's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pinulito":{tags:{name:"Pinulito",amenity:"fast_food"},name:"Pinulito",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pita Pit":{tags:{name:"Pita Pit",amenity:"fast_food"},name:"Pita Pit",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pizza Hut Delivery":{tags:{name:"Pizza Hut Delivery",amenity:"fast_food"},name:"Pizza Hut Delivery",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pizza King":{tags:{name:"Pizza King",amenity:"fast_food"},name:"Pizza King",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pizza Nova":{tags:{name:"Pizza Nova",amenity:"fast_food"},name:"Pizza Nova",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pizza Pizza":{tags:{name:"Pizza Pizza",amenity:"fast_food"},name:"Pizza Pizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pollo Campero":{tags:{name:"Pollo Campero",amenity:"fast_food"},name:"Pollo Campero",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Pollo Granjero":{tags:{name:"Pollo Granjero",amenity:"fast_food"},name:"Pollo Granjero",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Popeye's":{tags:{name:"Popeye's",cuisine:"chicken",amenity:"fast_food"},name:"Popeye's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Popeyes Louisiana Kitchen":{tags:{name:"Popeyes Louisiana Kitchen",amenity:"fast_food"},name:"Popeyes Louisiana Kitchen",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Qdoba":{tags:{name:"Qdoba",amenity:"fast_food"},name:"Qdoba",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Quick":{tags:{name:"Quick",amenity:"fast_food"},name:"Quick",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Quiznos":{tags:{name:"Quiznos",amenity:"fast_food"},name:"Quiznos",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Rally's":{tags:{name:"Rally's",amenity:"fast_food"},name:"Rally's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Red Rooster":{tags:{name:"Red Rooster",amenity:"fast_food"},name:"Red Rooster",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Sbarro":{tags:{name:"Sbarro",amenity:"fast_food"},name:"Sbarro",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Schlotzsky's Deli":{tags:{name:"Schlotzsky's Deli",amenity:"fast_food"},name:"Schlotzsky's Deli",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Sibylla":{tags:{name:"Sibylla",amenity:"fast_food"},name:"Sibylla",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Sonic":{tags:{name:"Sonic",cuisine:"burger",amenity:"fast_food"},name:"Sonic",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Steers":{tags:{name:"Steers",amenity:"fast_food"},name:"Steers",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Subway":{tags:{name:"Subway",amenity:"fast_food"},name:"Subway",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Taco Bell":{tags:{name:"Taco Bell",cuisine:"mexican",amenity:"fast_food"},name:"Taco Bell",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Taco Bueno":{tags:{name:"Taco Bueno",amenity:"fast_food"},name:"Taco Bueno",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Taco Cabana":{tags:{name:"Taco Cabana",amenity:"fast_food"},name:"Taco Cabana",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Taco Del Mar":{tags:{name:"Taco Del Mar",amenity:"fast_food"},name:"Taco Del Mar",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Taco John's":{tags:{name:"Taco John's",amenity:"fast_food"},name:"Taco John's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Taco Time":{tags:{name:"Taco Time",amenity:"fast_food"},name:"Taco Time",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Telepizza":{tags:{name:"Telepizza",amenity:"fast_food"},name:"Telepizza",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Thai Express":{tags:{name:"Thai Express",amenity:"fast_food"},name:"Thai Express",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/The Pizza Company":{tags:{name:"The Pizza Company",amenity:"fast_food"},name:"The Pizza Company",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Wendy's":{tags:{name:"Wendy's",cuisine:"burger",amenity:"fast_food"},name:"Wendy's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Whataburger":{tags:{name:"Whataburger",amenity:"fast_food"},name:"Whataburger",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/White Castle":{tags:{name:"White Castle",amenity:"fast_food"},name:"White Castle",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Wienerschnitzel":{tags:{name:"Wienerschnitzel",amenity:"fast_food"},name:"Wienerschnitzel",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Wimpy":{tags:{name:"Wimpy",amenity:"fast_food"},name:"Wimpy",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Zaxby's":{tags:{name:"Zaxby's",amenity:"fast_food"},name:"Zaxby's",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Γρηγόρης":{tags:{name:"Γρηγόρης",amenity:"fast_food"},name:"Γρηγόρης",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Бургер Кинг":{tags:{name:"Бургер Кинг",amenity:"fast_food"},name:"Бургер Кинг",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Крошка Картошка":{tags:{name:"Крошка Картошка",amenity:"fast_food"},name:"Крошка Картошка",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Макдоналдс":{tags:{name:"Макдоналдс","name:en":"McDonald's",amenity:"fast_food"},name:"Макдоналдс",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Робин Сдобин":{tags:{name:"Робин Сдобин",amenity:"fast_food"},name:"Робин Сдобин",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Русский Аппетит":{tags:{name:"Русский Аппетит",amenity:"fast_food"},name:"Русский Аппетит",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Сабвэй":{tags:{name:"Сабвэй",amenity:"fast_food"},name:"Сабвэй",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Стардог!s":{tags:{name:"Стардог!s",amenity:"fast_food"},name:"Стардог!s",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Теремок":{tags:{name:"Теремок",amenity:"fast_food"},name:"Теремок",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Шаверма":{tags:{name:"Шаверма",amenity:"fast_food"},name:"Шаверма",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/Шаурма":{tags:{name:"Шаурма",amenity:"fast_food"},name:"Шаурма",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/かっぱ寿司":{tags:{name:"かっぱ寿司",amenity:"fast_food"},name:"かっぱ寿司",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/かつや":{tags:{name:"かつや",amenity:"fast_food"},name:"かつや",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/くら寿司":{tags:{name:"くら寿司",amenity:"fast_food"},name:"くら寿司",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/すき家":{tags:{name:"すき家","name:en":"Sukiya",amenity:"fast_food"},name:"すき家",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/なか卯":{tags:{name:"なか卯",amenity:"fast_food"},name:"なか卯",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/ほっかほっか亭":{tags:{name:"ほっかほっか亭",amenity:"fast_food"},name:"ほっかほっか亭",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/ほっともっと":{tags:{name:"ほっともっと",amenity:"fast_food"},name:"ほっともっと",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/オリジン弁当":{tags:{name:"オリジン弁当",amenity:"fast_food"},name:"オリジン弁当",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/ケンタッキーフライドチキン":{tags:{name:"ケンタッキーフライドチキン",cuisine:"chicken","name:en":"KFC",amenity:"fast_food"},name:"ケンタッキーフライドチキン",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/サブウェイ":{tags:{name:"サブウェイ",amenity:"fast_food"},name:"サブウェイ",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/スシロー":{tags:{name:"スシロー",amenity:"fast_food"},name:"スシロー",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/マクドナルド":{tags:{name:"マクドナルド",cuisine:"burger","name:en":"McDonald's",amenity:"fast_food"},name:"マクドナルド",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/ミスタードーナツ":{tags:{name:"ミスタードーナツ",amenity:"fast_food"},name:"ミスタードーナツ",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/モスバーガー":{tags:{name:"モスバーガー","name:en":"Mos Burger",amenity:"fast_food"},name:"モスバーガー",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/ロッテリア":{tags:{name:"ロッテリア",amenity:"fast_food"},name:"ロッテリア",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/吉野家":{tags:{name:"吉野家",amenity:"fast_food"},name:"吉野家",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/幸楽苑":{tags:{name:"幸楽苑",amenity:"fast_food"},name:"幸楽苑",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/摩斯漢堡":{tags:{name:"摩斯漢堡",amenity:"fast_food"},name:"摩斯漢堡",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/松屋":{tags:{name:"松屋","name:en":"Matsuya",amenity:"fast_food"},name:"松屋",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/肯德基":{tags:{name:"肯德基",amenity:"fast_food"},name:"肯德基",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/麥當勞":{tags:{name:"麥當勞",amenity:"fast_food"},name:"麥當勞",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/麦当劳":{tags:{name:"麦当劳",amenity:"fast_food"},name:"麦当劳",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fast_food/롯데리아":{tags:{name:"롯데리아",amenity:"fast_food"},name:"롯데리아",icon:"maki-fast-food",geometry:["point","area"],fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],suggestion:true},"amenity/fuel/76":{tags:{name:"76",amenity:"fuel"},name:"76",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/1-2-3":{tags:{name:"1-2-3",amenity:"fuel"},name:"1-2-3",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ADNOC":{tags:{name:"ADNOC",amenity:"fuel"},name:"ADNOC",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ANP":{tags:{name:"ANP",amenity:"fuel"},name:"ANP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ARAL":{tags:{name:"ARAL",amenity:"fuel"},name:"ARAL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Aegean":{tags:{name:"Aegean",amenity:"fuel"},name:"Aegean",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Afriquia":{tags:{name:"Afriquia",amenity:"fuel"},name:"Afriquia",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Agip":{tags:{name:"Agip",amenity:"fuel"},name:"Agip",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Agrola":{tags:{name:"Agrola",amenity:"fuel"},name:"Agrola",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Alon":{tags:{name:"Alon",amenity:"fuel"},name:"Alon",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Alpet":{tags:{name:"Alpet",amenity:"fuel"},name:"Alpet",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Api":{tags:{name:"Api",amenity:"fuel"},name:"Api",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Aral":{tags:{name:"Aral",amenity:"fuel"},name:"Aral",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Arco":{tags:{name:"Arco",amenity:"fuel"},name:"Arco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Avanti":{tags:{name:"Avanti",amenity:"fuel"},name:"Avanti",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Avia":{tags:{name:"Avia",amenity:"fuel"},name:"Avia",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BEBECO":{tags:{name:"BEBECO",amenity:"fuel"},name:"BEBECO",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BFT":{tags:{name:"BFT",amenity:"fuel"},name:"BFT",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BHPetrol":{tags:{name:"BHPetrol",amenity:"fuel"},name:"BHPetrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BP":{tags:{name:"BP",amenity:"fuel"},name:"BP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/BR":{tags:{name:"BR",amenity:"fuel"},name:"BR",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Bangchak":{tags:{name:"Bangchak",amenity:"fuel"},name:"Bangchak",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Benzina":{tags:{name:"Benzina",amenity:"fuel"},name:"Benzina",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Bharat Petroleum":{tags:{name:"Bharat Petroleum",amenity:"fuel"},name:"Bharat Petroleum",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Bliska":{tags:{name:"Bliska",amenity:"fuel"},name:"Bliska",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/CAMPSA":{tags:{name:"CAMPSA",amenity:"fuel"},name:"CAMPSA",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/CARREFOUR":{tags:{name:"CARREFOUR",amenity:"fuel"},name:"CARREFOUR",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/CEPSA":{tags:{name:"CEPSA",amenity:"fuel"},name:"CEPSA",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/CNG":{tags:{name:"CNG",amenity:"fuel"},name:"CNG",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Caltex":{tags:{name:"Caltex",amenity:"fuel"},name:"Caltex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Campsa":{tags:{name:"Campsa",amenity:"fuel"},name:"Campsa",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Casey's General Store":{tags:{name:"Casey's General Store",amenity:"fuel"},name:"Casey's General Store",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Cenex":{tags:{name:"Cenex",amenity:"fuel"},name:"Cenex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Cepsa":{tags:{name:"Cepsa",amenity:"fuel"},name:"Cepsa",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Ceypetco":{tags:{name:"Ceypetco",amenity:"fuel"},name:"Ceypetco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Chevron":{tags:{name:"Chevron",amenity:"fuel"},name:"Chevron",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Citgo":{tags:{name:"Citgo",amenity:"fuel"},name:"Citgo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Clark":{tags:{name:"Clark",amenity:"fuel"},name:"Clark",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Coles Express":{tags:{name:"Coles Express",amenity:"fuel"},name:"Coles Express",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Conoco":{tags:{name:"Conoco",amenity:"fuel"},name:"Conoco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Copec":{tags:{name:"Copec",amenity:"fuel"},name:"Copec",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Copetrol":{tags:{name:"Copetrol",amenity:"fuel"},name:"Copetrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Cosmo":{tags:{name:"Cosmo",amenity:"fuel"},name:"Cosmo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Crodux":{tags:{name:"Crodux",amenity:"fuel"},name:"Crodux",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Delta":{tags:{name:"Delta",amenity:"fuel"},name:"Delta",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Diamond Shamrock":{tags:{name:"Diamond Shamrock",amenity:"fuel"},name:"Diamond Shamrock",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Drummed Fuel":{tags:{name:"Drummed Fuel",amenity:"fuel"},name:"Drummed Fuel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/EKO":{tags:{name:"EKO",amenity:"fuel"},name:"EKO",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ENEOS":{tags:{name:"ENEOS",amenity:"fuel"},name:"ENEOS",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ENI":{tags:{name:"ENI",amenity:"fuel"},name:"ENI",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ERG":{tags:{name:"ERG",amenity:"fuel"},name:"ERG",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Elan":{tags:{name:"Elan",amenity:"fuel"},name:"Elan",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Eneos":{tags:{name:"Eneos",amenity:"fuel"},name:"Eneos",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Engen":{tags:{name:"Engen",amenity:"fuel"},name:"Engen",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Eni":{tags:{name:"Eni",amenity:"fuel"},name:"Eni",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Erg":{tags:{name:"Erg",amenity:"fuel"},name:"Erg",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Esso":{tags:{name:"Esso",amenity:"fuel"},name:"Esso",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Esso Express":{tags:{name:"Esso Express",amenity:"fuel"},name:"Esso Express",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/EuroOil":{tags:{name:"EuroOil",amenity:"fuel"},name:"EuroOil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Exxon":{tags:{name:"Exxon",amenity:"fuel"},name:"Exxon",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/F24":{tags:{name:"F24",amenity:"fuel"},name:"F24",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Firezone":{tags:{name:"Firezone",amenity:"fuel"},name:"Firezone",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Flying V":{tags:{name:"Flying V",amenity:"fuel"},name:"Flying V",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/GALP":{tags:{name:"GALP",amenity:"fuel"},name:"GALP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Gazprom":{tags:{name:"Gazprom",amenity:"fuel"},name:"Gazprom",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/GetGo":{tags:{name:"GetGo",amenity:"fuel"},name:"GetGo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Goil":{tags:{name:"Goil",amenity:"fuel"},name:"Goil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Gulf":{tags:{name:"Gulf",amenity:"fuel"},name:"Gulf",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/H-E-B Fuel":{tags:{name:"H-E-B Fuel",amenity:"fuel"},name:"H-E-B Fuel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/H-E-B Gas":{tags:{name:"H-E-B Gas",amenity:"fuel"},name:"H-E-B Gas",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/HEM":{tags:{name:"HEM",amenity:"fuel"},name:"HEM",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/HP":{tags:{name:"HP",amenity:"fuel"},name:"HP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/HP Petrol Pump":{tags:{name:"HP Petrol Pump",amenity:"fuel"},name:"HP Petrol Pump",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Helios":{tags:{name:"Helios",amenity:"fuel"},name:"Helios",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Hess":{tags:{name:"Hess",amenity:"fuel"},name:"Hess",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Hindustan Petroleum":{tags:{name:"Hindustan Petroleum",amenity:"fuel"},name:"Hindustan Petroleum",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Holiday":{tags:{name:"Holiday",amenity:"fuel"},name:"Holiday",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Husky":{tags:{name:"Husky",amenity:"fuel"},name:"Husky",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/IES":{tags:{name:"IES",amenity:"fuel"},name:"IES",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/IP":{tags:{name:"IP",amenity:"fuel"},name:"IP",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Independent Fuel Station":{tags:{name:"Independent Fuel Station",amenity:"fuel"},name:"Independent Fuel Station",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Indian Oil":{tags:{name:"Indian Oil",amenity:"fuel"},name:"Indian Oil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Indipend.":{tags:{name:"Indipend.",amenity:"fuel"},name:"Indipend.",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Ingo":{tags:{name:"Ingo",amenity:"fuel"},name:"Ingo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Ipiranga":{tags:{name:"Ipiranga",amenity:"fuel"},name:"Ipiranga",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Irving":{tags:{name:"Irving",amenity:"fuel"},name:"Irving",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/JA-SS":{tags:{name:"JA-SS",amenity:"fuel"},name:"JA-SS",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/JOMO":{tags:{name:"JOMO",amenity:"fuel"},name:"JOMO",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Jet":{tags:{name:"Jet",amenity:"fuel"},name:"Jet",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Jetti":{tags:{name:"Jetti",amenity:"fuel"},name:"Jetti",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kangaroo":{tags:{name:"Kangaroo",amenity:"fuel"},name:"Kangaroo",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kobil":{tags:{name:"Kobil",amenity:"fuel"},name:"Kobil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kroger Fuel":{tags:{name:"Kroger Fuel",amenity:"fuel"},name:"Kroger Fuel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kum & Go":{tags:{name:"Kum & Go",amenity:"fuel"},name:"Kum & Go",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Kwik Trip":{tags:{name:"Kwik Trip",amenity:"fuel"},name:"Kwik Trip",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/LPG":{tags:{name:"LPG",amenity:"fuel"},name:"LPG",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/LPG Station":{tags:{name:"LPG Station",amenity:"fuel"},name:"LPG Station",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/LUKOIL":{tags:{name:"LUKOIL",amenity:"fuel"},name:"LUKOIL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Liberty":{tags:{name:"Liberty",amenity:"fuel"},name:"Liberty",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Lotos":{tags:{name:"Lotos",amenity:"fuel"},name:"Lotos",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Lotos Optima":{tags:{name:"Lotos Optima",amenity:"fuel"},name:"Lotos Optima",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Love's":{tags:{name:"Love's",amenity:"fuel"},name:"Love's",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Lukoil":{tags:{name:"Lukoil",amenity:"fuel"},name:"Lukoil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/MEROIL":{tags:{name:"MEROIL",amenity:"fuel"},name:"MEROIL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/MOL":{tags:{name:"MOL",amenity:"fuel"},name:"MOL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/MRS":{tags:{name:"MRS",amenity:"fuel"},name:"MRS",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Marathon":{tags:{name:"Marathon",amenity:"fuel"},name:"Marathon",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Maverik":{tags:{name:"Maverik",amenity:"fuel"},name:"Maverik",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Maxol":{tags:{name:"Maxol",amenity:"fuel"},name:"Maxol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Metano":{tags:{name:"Metano",amenity:"fuel"},name:"Metano",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Migrol":{tags:{name:"Migrol",amenity:"fuel"},name:"Migrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Minipump":{tags:{name:"Minipump",amenity:"fuel"},name:"Minipump",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Mobil":{tags:{name:"Mobil",amenity:"fuel"},name:"Mobil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Mobile":{tags:{name:"Mobile",amenity:"fuel"},name:"Mobile",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Mol":{tags:{name:"Mol",amenity:"fuel"},name:"Mol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Moya":{tags:{name:"Moya",amenity:"fuel"},name:"Moya",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Murphy USA":{tags:{name:"Murphy USA",amenity:"fuel"},name:"Murphy USA",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Neste":{tags:{name:"Neste",amenity:"fuel"},name:"Neste",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/OIL!":{tags:{name:"OIL!",amenity:"fuel"},name:"OIL!",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/OK":{tags:{name:"OK",amenity:"fuel"},name:"OK",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/OKQ8":{tags:{name:"OKQ8",amenity:"fuel"},name:"OKQ8",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/OMV":{tags:{name:"OMV",amenity:"fuel"},name:"OMV",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Oilibya":{tags:{name:"Oilibya",brand:"Oilibya","name:ar":"أويليبيا",amenity:"fuel"},name:"Oilibya",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Opet":{tags:{name:"Opet",amenity:"fuel"},name:"Opet",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Orlen":{tags:{name:"Orlen",amenity:"fuel"},name:"Orlen",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PETRONOR":{tags:{name:"PETRONOR",amenity:"fuel"},name:"PETRONOR",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PSO":{tags:{name:"PSO",amenity:"fuel"},name:"PSO",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PSO Petrol Pump":{tags:{name:"PSO Petrol Pump",amenity:"fuel"},name:"PSO Petrol Pump",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PT":{tags:{name:"PT",amenity:"fuel"},name:"PT",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PTT":{tags:{name:"PTT",amenity:"fuel"},name:"PTT",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/PV Oil":{tags:{name:"PV Oil",amenity:"fuel"},name:"PV Oil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pacific Pride":{tags:{name:"Pacific Pride",amenity:"fuel"},name:"Pacific Pride",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pecsa":{tags:{name:"Pecsa",amenity:"fuel"},name:"Pecsa",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pemex":{tags:{name:"Pemex",amenity:"fuel"},name:"Pemex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pertamina":{tags:{name:"Pertamina",amenity:"fuel"},name:"Pertamina",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petro":{tags:{name:"Petro",amenity:"fuel"},name:"Petro",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petro-Canada":{tags:{name:"Petro-Canada",amenity:"fuel"},name:"Petro-Canada",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petrochina":{tags:{name:"Petrochina",amenity:"fuel"},name:"Petrochina",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petroecuador":{tags:{name:"Petroecuador",amenity:"fuel"},name:"Petroecuador",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petrol Ofisi":{tags:{name:"Petrol Ofisi",amenity:"fuel"},name:"Petrol Ofisi",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petrolimex":{tags:{name:"Petrolimex",amenity:"fuel"},name:"Petrolimex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petrom":{tags:{name:"Petrom",amenity:"fuel"},name:"Petrom",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petron":{tags:{name:"Petron",amenity:"fuel"},name:"Petron",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petronas":{tags:{name:"Petronas",amenity:"fuel"},name:"Petronas",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Petroperu":{tags:{name:"Petroperu",amenity:"fuel"},name:"Petroperu",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Phillips 66":{tags:{name:"Phillips 66",amenity:"fuel"},name:"Phillips 66",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Phoenix":{tags:{name:"Phoenix",amenity:"fuel"},name:"Phoenix",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pilot":{tags:{name:"Pilot",amenity:"fuel"},name:"Pilot",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Pioneer":{tags:{name:"Pioneer",amenity:"fuel"},name:"Pioneer",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Posto":{tags:{name:"Posto",amenity:"fuel"},name:"Posto",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Posto Atem":{tags:{name:"Posto Atem",amenity:"fuel"},name:"Posto Atem",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Posto Ipiranga":{tags:{name:"Posto Ipiranga",amenity:"fuel"},name:"Posto Ipiranga",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Posto Shell":{tags:{name:"Posto Shell",amenity:"fuel"},name:"Posto Shell",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Primax":{tags:{name:"Primax",amenity:"fuel"},name:"Primax",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Prio":{tags:{name:"Prio",amenity:"fuel"},name:"Prio",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Puma":{tags:{name:"Puma",amenity:"fuel"},name:"Puma",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Q1":{tags:{name:"Q1",amenity:"fuel"},name:"Q1",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Q8":{tags:{name:"Q8",amenity:"fuel"},name:"Q8",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Q8 Easy":{tags:{name:"Q8 Easy",amenity:"fuel"},name:"Q8 Easy",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/QuikTrip":{tags:{name:"QuikTrip",amenity:"fuel"},name:"QuikTrip",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/REPSOL":{tags:{name:"REPSOL",amenity:"fuel"},name:"REPSOL",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/RaceTrac":{tags:{name:"RaceTrac",amenity:"fuel"},name:"RaceTrac",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Repsol":{tags:{name:"Repsol",amenity:"fuel"},name:"Repsol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Rompetrol":{tags:{name:"Rompetrol",amenity:"fuel"},name:"Rompetrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Rubis":{tags:{name:"Rubis",amenity:"fuel"},name:"Rubis",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/SB Tank":{tags:{name:"SB Tank",amenity:"fuel"},name:"SB Tank",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/SPBU":{tags:{name:"SPBU",amenity:"fuel"},name:"SPBU",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sasol":{tags:{name:"Sasol",amenity:"fuel"},name:"Sasol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sea Oil":{tags:{name:"Sea Oil",amenity:"fuel"},name:"Sea Oil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sheetz":{tags:{name:"Sheetz",amenity:"fuel"},name:"Sheetz",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Shell":{tags:{name:"Shell",amenity:"fuel"},name:"Shell",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Shell Express":{tags:{name:"Shell Express",amenity:"fuel"},name:"Shell Express",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sinclair":{tags:{name:"Sinclair",amenity:"fuel"},name:"Sinclair",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sinopec":{tags:{name:"Sinopec",amenity:"fuel"},name:"Sinopec",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sinopec Fuel":{tags:{name:"Sinopec Fuel",amenity:"fuel"},name:"Sinopec Fuel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Slovnaft":{tags:{name:"Slovnaft",amenity:"fuel"},name:"Slovnaft",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Socar":{tags:{name:"Socar",amenity:"fuel"},name:"Socar",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sokimex":{tags:{name:"Sokimex",amenity:"fuel"},name:"Sokimex",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Speedway":{tags:{name:"Speedway",amenity:"fuel"},name:"Speedway",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/St1":{tags:{name:"St1",amenity:"fuel"},name:"St1",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Star":{tags:{name:"Star",amenity:"fuel"},name:"Star",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Star Oil":{tags:{name:"Star Oil",amenity:"fuel"},name:"Star Oil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Station Service E. Leclerc":{tags:{name:"Station Service E. Leclerc",amenity:"fuel"},name:"Station Service E. Leclerc",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Statoil":{tags:{name:"Statoil",amenity:"fuel"},name:"Statoil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Sunoco":{tags:{name:"Sunoco",amenity:"fuel"},name:"Sunoco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Tamoil":{tags:{name:"Tamoil",amenity:"fuel"},name:"Tamoil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Tango":{tags:{name:"Tango",amenity:"fuel"},name:"Tango",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Teboil":{tags:{name:"Teboil",amenity:"fuel"},name:"Teboil",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Tela":{tags:{name:"Tela",amenity:"fuel"},name:"Tela",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Terpel":{tags:{name:"Terpel",amenity:"fuel"},name:"Terpel",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Texaco":{tags:{name:"Texaco",amenity:"fuel"},name:"Texaco",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Tinq":{tags:{name:"Tinq",amenity:"fuel"},name:"Tinq",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Topaz":{tags:{name:"Topaz",amenity:"fuel"},name:"Topaz",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Total":{tags:{name:"Total",amenity:"fuel"},name:"Total",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Total Access":{tags:{name:"Total Access",amenity:"fuel"},name:"Total Access",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Total Erg":{tags:{name:"Total Erg",amenity:"fuel"},name:"Total Erg",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/TotalErg":{tags:{name:"TotalErg",amenity:"fuel"},name:"TotalErg",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Turkey Hill":{tags:{name:"Turkey Hill",amenity:"fuel"},name:"Turkey Hill",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Turmöl":{tags:{name:"Turmöl",amenity:"fuel"},name:"Turmöl",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Ultramar":{tags:{name:"Ultramar",amenity:"fuel"},name:"Ultramar",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/United":{tags:{name:"United",amenity:"fuel"},name:"United",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Uno":{tags:{name:"Uno",amenity:"fuel"},name:"Uno",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Uno-X":{tags:{name:"Uno-X",amenity:"fuel"},name:"Uno-X",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Valero":{tags:{name:"Valero",amenity:"fuel"},name:"Valero",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Vito":{tags:{name:"Vito",amenity:"fuel"},name:"Vito",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/WOG":{tags:{name:"WOG",amenity:"fuel"},name:"WOG",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Westfalen":{tags:{name:"Westfalen",amenity:"fuel"},name:"Westfalen",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Woolworths Petrol":{tags:{name:"Woolworths Petrol",amenity:"fuel"},name:"Woolworths Petrol",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Z":{tags:{name:"Z",amenity:"fuel"},name:"Z",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/bft":{tags:{name:"bft",amenity:"fuel"},name:"bft",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/eni":{tags:{name:"eni",amenity:"fuel"},name:"eni",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ΕΚΟ":{tags:{name:"ΕΚΟ",amenity:"fuel"},name:"ΕΚΟ",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/АГЗС":{tags:{name:"АГЗС",amenity:"fuel"},name:"АГЗС",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/АЗС":{tags:{name:"АЗС",amenity:"fuel"},name:"АЗС",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Авіас":{tags:{name:"Авіас",amenity:"fuel"},name:"Авіас",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/БРСМ-Нафта":{tags:{name:"БРСМ-Нафта",amenity:"fuel"},name:"БРСМ-Нафта",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Башнефть":{tags:{name:"Башнефть",amenity:"fuel"},name:"Башнефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Белоруснефть":{tags:{name:"Белоруснефть",amenity:"fuel"},name:"Белоруснефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Газовая заправка":{tags:{name:"Газовая заправка",amenity:"fuel"},name:"Газовая заправка",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Газпромнефть":{tags:{name:"Газпромнефть",amenity:"fuel"},name:"Газпромнефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Гелиос":{tags:{name:"Гелиос",amenity:"fuel"},name:"Гелиос",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ЕКА":{tags:{name:"ЕКА",amenity:"fuel"},name:"ЕКА",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Заправка":{tags:{name:"Заправка",amenity:"fuel"},name:"Заправка",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/КазМунайГаз":{tags:{name:"КазМунайГаз",amenity:"fuel"},name:"КазМунайГаз",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Лукойл":{tags:{name:"Лукойл",amenity:"fuel"},name:"Лукойл",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Макпетрол":{tags:{name:"Макпетрол",amenity:"fuel"},name:"Макпетрол",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/НК Альянс":{tags:{name:"НК Альянс",amenity:"fuel"},name:"НК Альянс",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Нефтьмагистраль":{tags:{name:"Нефтьмагистраль",amenity:"fuel"},name:"Нефтьмагистраль",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ОККО":{tags:{name:"ОККО",amenity:"fuel"},name:"ОККО",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ОМВ":{tags:{name:"ОМВ",amenity:"fuel"},name:"ОМВ",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Октан":{tags:{name:"Октан",amenity:"fuel"},name:"Октан",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ПТК":{tags:{name:"ПТК",amenity:"fuel"},name:"ПТК",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Петрол":{tags:{name:"Петрол",amenity:"fuel"},name:"Петрол",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Пропан":{tags:{name:"Пропан",amenity:"fuel"},name:"Пропан",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Роснефть":{tags:{name:"Роснефть",amenity:"fuel"},name:"Роснефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Сибнефть":{tags:{name:"Сибнефть",amenity:"fuel"},name:"Сибнефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Сургутнефтегаз":{tags:{name:"Сургутнефтегаз",amenity:"fuel"},name:"Сургутнефтегаз",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ТНК":{tags:{name:"ТНК",amenity:"fuel"},name:"ТНК",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Татнефтепродукт":{tags:{name:"Татнефтепродукт",amenity:"fuel"},name:"Татнефтепродукт",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Татнефть":{tags:{name:"Татнефть",amenity:"fuel"},name:"Татнефть",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/Укрнафта":{tags:{name:"Укрнафта",amenity:"fuel"},name:"Укрнафта",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/דור אלון":{tags:{name:"דור אלון",amenity:"fuel"},name:"דור אלון",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/דלק":{tags:{name:"דלק",amenity:"fuel"},name:"דלק",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/סונול":{tags:{name:"סונול",amenity:"fuel"},name:"סונול",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/פז":{tags:{name:"פז",amenity:"fuel"},name:"פז",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/محطة وقود":{tags:{name:"محطة وقود",amenity:"fuel"},name:"محطة وقود",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/محطه وقود":{tags:{name:"محطه وقود",amenity:"fuel"},name:"محطه وقود",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/پمپ بنزین":{tags:{name:"پمپ بنزین",amenity:"fuel"},name:"پمپ بنزین",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/پمپ گاز":{tags:{name:"پمپ گاز",amenity:"fuel"},name:"پمپ گاز",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/บางจาก":{tags:{name:"บางจาก",amenity:"fuel"},name:"บางจาก",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ป.ต.ท.":{tags:{name:"ป.ต.ท.",amenity:"fuel"},name:"ป.ต.ท.",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/เชลล์":{tags:{name:"เชลล์",amenity:"fuel"},name:"เชลล์",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/เอสโซ่":{tags:{name:"เอสโซ่",amenity:"fuel"},name:"เอสโซ่",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/エッソ":{tags:{name:"エッソ",amenity:"fuel"},name:"エッソ",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/エネオス":{tags:{name:"エネオス",amenity:"fuel"},name:"エネオス",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/コスモ石油":{tags:{name:"コスモ石油",amenity:"fuel"},name:"コスモ石油",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/ゼネラル":{tags:{name:"ゼネラル",amenity:"fuel"},name:"ゼネラル",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/中国石化":{tags:{name:"中国石化",amenity:"fuel"},name:"中国石化",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/中国石化 Sinopec":{tags:{name:"中国石化 Sinopec",amenity:"fuel"},name:"中国石化 Sinopec",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/中国石油":{tags:{name:"中国石油",amenity:"fuel"},name:"中国石油",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/中油":{tags:{name:"中油",amenity:"fuel"},name:"中油",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/出光":{tags:{name:"出光","name:en":"Idemitsu",amenity:"fuel"},name:"出光",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/加油站":{tags:{name:"加油站",amenity:"fuel"},name:"加油站",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/台灣中油":{tags:{name:"台灣中油",amenity:"fuel"},name:"台灣中油",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/fuel/昭和シェル":{tags:{name:"昭和シェル",amenity:"fuel"},name:"昭和シェル",icon:"maki-fuel",geometry:["point","area"],fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],suggestion:true},"amenity/hospital/Cruz Roja":{tags:{name:"Cruz Roja",healthcare:"hospital",amenity:"hospital"},name:"Cruz Roja",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/IMSS":{tags:{name:"IMSS",healthcare:"hospital",amenity:"hospital"},name:"IMSS",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Инфекционное отделение":{tags:{name:"Инфекционное отделение",healthcare:"hospital",amenity:"hospital"},name:"Инфекционное отделение",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Кожно-венерологический диспансер":{tags:{name:"Кожно-венерологический диспансер",healthcare:"hospital",amenity:"hospital"},name:"Кожно-венерологический диспансер",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Районная больница":{tags:{name:"Районная больница",healthcare:"hospital",amenity:"hospital"},name:"Районная больница",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Роддом":{tags:{name:"Роддом",healthcare:"hospital",amenity:"hospital"},name:"Роддом",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Родильный дом":{tags:{name:"Родильный дом",healthcare:"hospital",amenity:"hospital"},name:"Родильный дом",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Скорая помощь":{tags:{name:"Скорая помощь",healthcare:"hospital",amenity:"hospital"},name:"Скорая помощь",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/ЦРБ":{tags:{name:"ЦРБ",healthcare:"hospital",amenity:"hospital"},name:"ЦРБ",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/Центральная районная больница":{tags:{name:"Центральная районная больница",healthcare:"hospital",amenity:"hospital"},name:"Центральная районная больница",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/hospital/โรงพยาบาลส่งเสริมสุขภาพตำบล":{tags:{name:"โรงพยาบาลส่งเสริมสุขภาพตำบล",healthcare:"hospital",amenity:"hospital"},name:"โรงพยาบาลส่งเสริมสุขภาพตำบล",icon:"maki-hospital",geometry:["point","area"],fields:["name","operator","healthcare/speciality","address","emergency"],suggestion:true},"amenity/ice_cream/Grido":{tags:{name:"Grido",amenity:"ice_cream"},name:"Grido",icon:"maki-ice-cream",geometry:["point","area"],fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],suggestion:true},"amenity/kindergarten/Anganwadi":{tags:{name:"Anganwadi",amenity:"kindergarten"},name:"Anganwadi",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Arche Noah":{tags:{name:"Arche Noah",amenity:"kindergarten"},name:"Arche Noah",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/CONAFE Preescolar":{tags:{name:"CONAFE Preescolar",amenity:"kindergarten"},name:"CONAFE Preescolar",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Educacion Inicial de CONAFE No Escolarizado":{tags:{name:"Educacion Inicial de CONAFE No Escolarizado",amenity:"kindergarten"},name:"Educacion Inicial de CONAFE No Escolarizado",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Estefania Casta�eda":{tags:{name:"Estefania Casta�eda",amenity:"kindergarten"},name:"Estefania Casta�eda",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Evangelischer Kindergarten":{tags:{name:"Evangelischer Kindergarten",amenity:"kindergarten"},name:"Evangelischer Kindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Federico Froebel":{tags:{name:"Federico Froebel",amenity:"kindergarten"},name:"Federico Froebel",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Gabriela Mistral":{tags:{name:"Gabriela Mistral",amenity:"kindergarten"},name:"Gabriela Mistral",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Jean Piaget":{tags:{name:"Jean Piaget",amenity:"kindergarten"},name:"Jean Piaget",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Katholischer Kindergarten":{tags:{name:"Katholischer Kindergarten",amenity:"kindergarten"},name:"Katholischer Kindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Kindergarten Regenbogen":{tags:{name:"Kindergarten Regenbogen",amenity:"kindergarten"},name:"Kindergarten Regenbogen",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Kindergarten St. Josef":{tags:{name:"Kindergarten St. Josef",amenity:"kindergarten"},name:"Kindergarten St. Josef",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Kindergarten St. Martin":{tags:{name:"Kindergarten St. Martin",amenity:"kindergarten"},name:"Kindergarten St. Martin",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Maria Montessori":{tags:{name:"Maria Montessori",amenity:"kindergarten"},name:"Maria Montessori",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/PAUD":{tags:{name:"PAUD",amenity:"kindergarten"},name:"PAUD",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Pusteblume":{tags:{name:"Pusteblume",amenity:"kindergarten"},name:"Pusteblume",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Rosaura Zapata":{tags:{name:"Rosaura Zapata",amenity:"kindergarten"},name:"Rosaura Zapata",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Sor Juana Ines De La Cruz":{tags:{name:"Sor Juana Ines De La Cruz",amenity:"kindergarten"},name:"Sor Juana Ines De La Cruz",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Spatzennest":{tags:{name:"Spatzennest",amenity:"kindergarten"},name:"Spatzennest",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Städtischer Kindergarten":{tags:{name:"Städtischer Kindergarten",amenity:"kindergarten"},name:"Städtischer Kindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Villa Kunterbunt":{tags:{name:"Villa Kunterbunt",amenity:"kindergarten"},name:"Villa Kunterbunt",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Waldkindergarten":{tags:{name:"Waldkindergarten",amenity:"kindergarten"},name:"Waldkindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Waldorfkindergarten":{tags:{name:"Waldorfkindergarten",amenity:"kindergarten"},name:"Waldorfkindergarten",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Óvoda":{tags:{name:"Óvoda",amenity:"kindergarten"},name:"Óvoda",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детсад":{tags:{name:"Детсад",amenity:"kindergarten"},name:"Детсад",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад Солнышко":{tags:{name:"Детский сад Солнышко",amenity:"kindergarten"},name:"Детский сад Солнышко",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад № 1":{tags:{name:"Детский сад № 1",amenity:"kindergarten"},name:"Детский сад № 1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №1":{tags:{name:"Детский сад №1",amenity:"kindergarten"},name:"Детский сад №1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №10":{tags:{name:"Детский сад №10",amenity:"kindergarten"},name:"Детский сад №10",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №11":{tags:{name:"Детский сад №11",amenity:"kindergarten"},name:"Детский сад №11",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №12":{tags:{name:"Детский сад №12",amenity:"kindergarten"},name:"Детский сад №12",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №13":{tags:{name:"Детский сад №13",amenity:"kindergarten"},name:"Детский сад №13",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №14":{tags:{name:"Детский сад №14",amenity:"kindergarten"},name:"Детский сад №14",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №15":{tags:{name:"Детский сад №15",amenity:"kindergarten"},name:"Детский сад №15",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №16":{tags:{name:"Детский сад №16",amenity:"kindergarten"},name:"Детский сад №16",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №17":{tags:{name:"Детский сад №17",amenity:"kindergarten"},name:"Детский сад №17",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №18":{tags:{name:"Детский сад №18",amenity:"kindergarten"},name:"Детский сад №18",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №19":{tags:{name:"Детский сад №19",amenity:"kindergarten"},name:"Детский сад №19",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №2":{tags:{name:"Детский сад №2",amenity:"kindergarten"},name:"Детский сад №2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №22":{tags:{name:"Детский сад №22",amenity:"kindergarten"},name:"Детский сад №22",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №24":{tags:{name:"Детский сад №24",amenity:"kindergarten"},name:"Детский сад №24",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №25":{tags:{name:"Детский сад №25",amenity:"kindergarten"},name:"Детский сад №25",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №27":{tags:{name:"Детский сад №27",amenity:"kindergarten"},name:"Детский сад №27",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №29":{tags:{name:"Детский сад №29",amenity:"kindergarten"},name:"Детский сад №29",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №3":{tags:{name:"Детский сад №3",amenity:"kindergarten"},name:"Детский сад №3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №33":{tags:{name:"Детский сад №33",amenity:"kindergarten"},name:"Детский сад №33",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №4":{tags:{name:"Детский сад №4",amenity:"kindergarten"},name:"Детский сад №4",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №5":{tags:{name:"Детский сад №5",amenity:"kindergarten"},name:"Детский сад №5",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №6":{tags:{name:"Детский сад №6",amenity:"kindergarten"},name:"Детский сад №6",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №7":{tags:{name:"Детский сад №7",amenity:"kindergarten"},name:"Детский сад №7",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №8":{tags:{name:"Детский сад №8",amenity:"kindergarten"},name:"Детский сад №8",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Детский сад №9":{tags:{name:"Детский сад №9",amenity:"kindergarten"},name:"Детский сад №9",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Дитячий садок":{tags:{name:"Дитячий садок",amenity:"kindergarten"},name:"Дитячий садок",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/Солнышко":{tags:{name:"Солнышко",amenity:"kindergarten"},name:"Солнышко",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/საბავშვო ბაღი":{tags:{name:"საბავშვო ბაღი",amenity:"kindergarten"},name:"საბავშვო ბაღი",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/kindergarten/中央保育所":{tags:{name:"中央保育所",amenity:"kindergarten"},name:"中央保育所",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address"],suggestion:true},"amenity/library/Biblioteca Comunale":{tags:{name:"Biblioteca Comunale",amenity:"library"},name:"Biblioteca Comunale",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Biblioteca comunale":{tags:{name:"Biblioteca comunale",amenity:"library"},name:"Biblioteca comunale",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Biblioteka Publiczna":{tags:{name:"Biblioteka Publiczna",amenity:"library"},name:"Biblioteka Publiczna",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Bibliothèque Municipale":{tags:{name:"Bibliothèque Municipale",amenity:"library"},name:"Bibliothèque Municipale",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Bibliothèque municipale":{tags:{name:"Bibliothèque municipale",amenity:"library"},name:"Bibliothèque municipale",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Bücherei":{tags:{name:"Bücherei",amenity:"library"},name:"Bücherei",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Central Library":{tags:{name:"Central Library",amenity:"library"},name:"Central Library",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Gemeindebücherei":{tags:{name:"Gemeindebücherei",amenity:"library"},name:"Gemeindebücherei",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Gminna Biblioteka Publiczna":{tags:{name:"Gminna Biblioteka Publiczna",amenity:"library"},name:"Gminna Biblioteka Publiczna",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Miejska Biblioteka Publiczna":{tags:{name:"Miejska Biblioteka Publiczna",amenity:"library"},name:"Miejska Biblioteka Publiczna",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Médiathèque":{tags:{name:"Médiathèque",amenity:"library"},name:"Médiathèque",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Městská knihovna":{tags:{name:"Městská knihovna",amenity:"library"},name:"Městská knihovna",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Public Library":{tags:{name:"Public Library",amenity:"library"},name:"Public Library",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Stadtbibliothek":{tags:{name:"Stadtbibliothek",amenity:"library"},name:"Stadtbibliothek",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Stadtbücherei":{tags:{name:"Stadtbücherei",amenity:"library"},name:"Stadtbücherei",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Городская библиотека":{tags:{name:"Городская библиотека",amenity:"library"},name:"Городская библиотека",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Детская библиотека":{tags:{name:"Детская библиотека",amenity:"library"},name:"Детская библиотека",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Центральная библиотека":{tags:{name:"Центральная библиотека",amenity:"library"},name:"Центральная библиотека",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/Центральная городская библиотека":{tags:{name:"Центральная городская библиотека",amenity:"library"},name:"Центральная городская библиотека",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/library/图书馆":{tags:{name:"图书馆",amenity:"library"},name:"图书馆",icon:"maki-library",geometry:["point","area"],fields:["name","operator","building_area","address","opening_hours","internet_access","internet_access/fee","internet_access/ssid","ref/isil"],suggestion:true},"amenity/pharmacy/36.6":{tags:{name:"36.6",healthcare:"pharmacy",amenity:"pharmacy"},name:"36.6",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Adler-Apotheke":{tags:{name:"Adler-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Adler-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Alte Apotheke":{tags:{name:"Alte Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Alte Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Apollo Pharmacy":{tags:{name:"Apollo Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Apollo Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Apotek":{tags:{name:"Apotek",healthcare:"pharmacy",amenity:"pharmacy"},name:"Apotek",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Apotek Hjärtat":{tags:{name:"Apotek Hjärtat",healthcare:"pharmacy",amenity:"pharmacy"},name:"Apotek Hjärtat",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Apotheke am Markt":{tags:{name:"Apotheke am Markt",healthcare:"pharmacy",amenity:"pharmacy"},name:"Apotheke am Markt",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Bahnhof Apotheke":{tags:{name:"Bahnhof Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Bahnhof Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Bahnhof-Apotheke":{tags:{name:"Bahnhof-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Bahnhof-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Bartell Drugs":{tags:{name:"Bartell Drugs",healthcare:"pharmacy",amenity:"pharmacy"},name:"Bartell Drugs",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Benavides":{tags:{name:"Benavides",healthcare:"pharmacy",amenity:"pharmacy"},name:"Benavides",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Benu":{tags:{name:"Benu",healthcare:"pharmacy",amenity:"pharmacy"},name:"Benu",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Boots":{tags:{name:"Boots",healthcare:"pharmacy",amenity:"pharmacy"},name:"Boots",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Botica":{tags:{name:"Botica",healthcare:"pharmacy",amenity:"pharmacy"},name:"Botica",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Brunnen-Apotheke":{tags:{name:"Brunnen-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Brunnen-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Burg-Apotheke":{tags:{name:"Burg-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Burg-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Bären-Apotheke":{tags:{name:"Bären-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Bären-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/CVS":{tags:{name:"CVS",healthcare:"pharmacy",amenity:"pharmacy"},name:"CVS",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Camelia":{tags:{name:"Camelia",healthcare:"pharmacy",amenity:"pharmacy"},name:"Camelia",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Catena":{tags:{name:"Catena",healthcare:"pharmacy",amenity:"pharmacy"},name:"Catena",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Chemist Warehouse":{tags:{name:"Chemist Warehouse",healthcare:"pharmacy",amenity:"pharmacy"},name:"Chemist Warehouse",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Clicks":{tags:{name:"Clicks",healthcare:"pharmacy",amenity:"pharmacy"},name:"Clicks",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Cruz Azul":{tags:{name:"Cruz Azul",healthcare:"pharmacy",amenity:"pharmacy"},name:"Cruz Azul",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Cruz Verde":{tags:{name:"Cruz Verde",healthcare:"pharmacy",amenity:"pharmacy"},name:"Cruz Verde",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Dbam o Zdrowie":{tags:{name:"Dbam o Zdrowie",healthcare:"pharmacy",amenity:"pharmacy"},name:"Dbam o Zdrowie",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Dr. Max":{tags:{name:"Dr. Max",healthcare:"pharmacy",amenity:"pharmacy"},name:"Dr. Max",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Droga Raia":{tags:{name:"Droga Raia",healthcare:"pharmacy",amenity:"pharmacy"},name:"Droga Raia",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Drogaria São Paulo":{tags:{name:"Drogaria São Paulo",healthcare:"pharmacy",amenity:"pharmacy"},name:"Drogaria São Paulo",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Drogasil":{tags:{name:"Drogasil",healthcare:"pharmacy",amenity:"pharmacy"},name:"Drogasil",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Duane Reade":{tags:{name:"Duane Reade",healthcare:"pharmacy",amenity:"pharmacy"},name:"Duane Reade",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Eczane":{tags:{name:"Eczane",healthcare:"pharmacy",amenity:"pharmacy"},name:"Eczane",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Engel-Apotheke":{tags:{name:"Engel-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Engel-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Eurovaistinė":{tags:{name:"Eurovaistinė",healthcare:"pharmacy",amenity:"pharmacy"},name:"Eurovaistinė",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Familiprix":{tags:{name:"Familiprix",healthcare:"pharmacy",amenity:"pharmacy"},name:"Familiprix",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacenter":{tags:{name:"Farmacenter",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacenter",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacia Centrale":{tags:{name:"Farmacia Centrale",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacia Centrale",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacia Comunale":{tags:{name:"Farmacia Comunale",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacia Comunale",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacia Guadalajara":{tags:{name:"Farmacia Guadalajara",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacia Guadalajara",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacia del Ahorro":{tags:{name:"Farmacia del Ahorro",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacia del Ahorro",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Ahumada":{tags:{name:"Farmacias Ahumada",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Ahumada",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Cruz Azul":{tags:{name:"Farmacias Cruz Azul",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Cruz Azul",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Cruz Verde":{tags:{name:"Farmacias Cruz Verde",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Cruz Verde",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Económicas":{tags:{name:"Farmacias Económicas",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Económicas",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Guadalajara":{tags:{name:"Farmacias Guadalajara",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Guadalajara",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias SalcoBrand":{tags:{name:"Farmacias SalcoBrand",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias SalcoBrand",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Sana Sana":{tags:{name:"Farmacias Sana Sana",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Sana Sana",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias Similares":{tags:{name:"Farmacias Similares",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias Similares",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacias del Ahorro":{tags:{name:"Farmacias del Ahorro",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacias del Ahorro",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmacity":{tags:{name:"Farmacity",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmacity",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmahorro":{tags:{name:"Farmahorro",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmahorro",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Farmatodo":{tags:{name:"Farmatodo",healthcare:"pharmacy",amenity:"pharmacy"},name:"Farmatodo",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Felicia":{tags:{name:"Felicia",healthcare:"pharmacy",amenity:"pharmacy"},name:"Felicia",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Fybeca":{tags:{name:"Fybeca",healthcare:"pharmacy",amenity:"pharmacy"},name:"Fybeca",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Generika Drugstore":{tags:{name:"Generika Drugstore",healthcare:"pharmacy",amenity:"pharmacy"},name:"Generika Drugstore",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Gintarinė vaistinė":{tags:{name:"Gintarinė vaistinė",healthcare:"pharmacy",amenity:"pharmacy"},name:"Gintarinė vaistinė",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Guardian":{tags:{name:"Guardian",healthcare:"pharmacy",amenity:"pharmacy"},name:"Guardian",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Gyógyszertár":{tags:{name:"Gyógyszertár",healthcare:"pharmacy",amenity:"pharmacy"},name:"Gyógyszertár",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/H-E-B Pharmacy":{tags:{name:"H-E-B Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"H-E-B Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Hirsch-Apotheke":{tags:{name:"Hirsch-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Hirsch-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Hubertus Apotheke":{tags:{name:"Hubertus Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Hubertus Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Inkafarma":{tags:{name:"Inkafarma",healthcare:"pharmacy",amenity:"pharmacy"},name:"Inkafarma",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Jean Coutu":{tags:{name:"Jean Coutu",healthcare:"pharmacy",amenity:"pharmacy"},name:"Jean Coutu",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Kinney Drugs":{tags:{name:"Kinney Drugs",healthcare:"pharmacy",amenity:"pharmacy"},name:"Kinney Drugs",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Kur-Apotheke":{tags:{name:"Kur-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Kur-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Linden-Apotheke":{tags:{name:"Linden-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Linden-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Ljekarna":{tags:{name:"Ljekarna",healthcare:"pharmacy",amenity:"pharmacy"},name:"Ljekarna",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Lloyds Pharmacy":{tags:{name:"Lloyds Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Lloyds Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Lékárna":{tags:{name:"Lékárna",healthcare:"pharmacy",amenity:"pharmacy"},name:"Lékárna",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Löwen-Apotheke":{tags:{name:"Löwen-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Löwen-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Marien-Apotheke":{tags:{name:"Marien-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Marien-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Markt-Apotheke":{tags:{name:"Markt-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Markt-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Mercury Drug":{tags:{name:"Mercury Drug",healthcare:"pharmacy",amenity:"pharmacy"},name:"Mercury Drug",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Mifarma":{tags:{name:"Mifarma",healthcare:"pharmacy",amenity:"pharmacy"},name:"Mifarma",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Mēness aptieka":{tags:{name:"Mēness aptieka",healthcare:"pharmacy",amenity:"pharmacy"},name:"Mēness aptieka",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Neue Apotheke":{tags:{name:"Neue Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Neue Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pague Menos":{tags:{name:"Pague Menos",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pague Menos",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Panvel":{tags:{name:"Panvel",healthcare:"pharmacy",amenity:"pharmacy"},name:"Panvel",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Park-Apotheke":{tags:{name:"Park-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Park-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie Centrale":{tags:{name:"Pharmacie Centrale",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie Centrale",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie Principale":{tags:{name:"Pharmacie Principale",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie Principale",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie de l'Hôtel de Ville":{tags:{name:"Pharmacie de l'Hôtel de Ville",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie de l'Hôtel de Ville",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie de la Gare":{tags:{name:"Pharmacie de la Gare",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie de la Gare",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie de la Mairie":{tags:{name:"Pharmacie de la Mairie",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie de la Mairie",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie de la Poste":{tags:{name:"Pharmacie de la Poste",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie de la Poste",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie du Centre":{tags:{name:"Pharmacie du Centre",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie du Centre",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie du Marché":{tags:{name:"Pharmacie du Marché",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie du Marché",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmacie du Parc":{tags:{name:"Pharmacie du Parc",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmacie du Parc",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmaprix":{tags:{name:"Pharmaprix",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmaprix",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Pharmasave":{tags:{name:"Pharmasave",healthcare:"pharmacy",amenity:"pharmacy"},name:"Pharmasave",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Punkt Apteczny":{tags:{name:"Punkt Apteczny",healthcare:"pharmacy",amenity:"pharmacy"},name:"Punkt Apteczny",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rathaus-Apotheke":{tags:{name:"Rathaus-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rathaus-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rats-Apotheke":{tags:{name:"Rats-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rats-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rexall":{tags:{name:"Rexall",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rexall",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rite Aid":{tags:{name:"Rite Aid",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rite Aid",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rose Pharmacy":{tags:{name:"Rose Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rose Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rosen-Apotheke":{tags:{name:"Rosen-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rosen-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Rowlands Pharmacy":{tags:{name:"Rowlands Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Rowlands Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/SalcoBrand":{tags:{name:"SalcoBrand",healthcare:"pharmacy",amenity:"pharmacy"},name:"SalcoBrand",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Sana Sana":{tags:{name:"Sana Sana",healthcare:"pharmacy",amenity:"pharmacy"},name:"Sana Sana",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Schloss-Apotheke":{tags:{name:"Schloss-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Schloss-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Sensiblu":{tags:{name:"Sensiblu",healthcare:"pharmacy",amenity:"pharmacy"},name:"Sensiblu",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Shoppers Drug Mart":{tags:{name:"Shoppers Drug Mart",healthcare:"pharmacy",amenity:"pharmacy"},name:"Shoppers Drug Mart",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Sonnen-Apotheke":{tags:{name:"Sonnen-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Sonnen-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/South Star Drug":{tags:{name:"South Star Drug",healthcare:"pharmacy",amenity:"pharmacy"},name:"South Star Drug",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Stadt-Apotheke":{tags:{name:"Stadt-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Stadt-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Stern-Apotheke":{tags:{name:"Stern-Apotheke",healthcare:"pharmacy",amenity:"pharmacy"},name:"Stern-Apotheke",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Superdrug":{tags:{name:"Superdrug",healthcare:"pharmacy",amenity:"pharmacy"},name:"Superdrug",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/São João":{tags:{name:"São João",healthcare:"pharmacy",amenity:"pharmacy"},name:"São João",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/The Generics Pharmacy":{tags:{name:"The Generics Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"The Generics Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Uniprix":{tags:{name:"Uniprix",healthcare:"pharmacy",amenity:"pharmacy"},name:"Uniprix",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Walgreens":{tags:{name:"Walgreens",healthcare:"pharmacy",amenity:"pharmacy"},name:"Walgreens",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Walgreens Pharmacy":{tags:{name:"Walgreens Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Walgreens Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Walmart Pharmacy":{tags:{name:"Walmart Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Walmart Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Well Pharmacy":{tags:{name:"Well Pharmacy",healthcare:"pharmacy",amenity:"pharmacy"},name:"Well Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/centro naturista":{tags:{name:"centro naturista",healthcare:"pharmacy",amenity:"pharmacy"},name:"centro naturista",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/А5":{tags:{name:"А5",healthcare:"pharmacy",amenity:"pharmacy"},name:"А5",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Айболит":{tags:{name:"Айболит",healthcare:"pharmacy",amenity:"pharmacy"},name:"Айболит",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Аптека 36,6":{tags:{name:"Аптека 36,6",healthcare:"pharmacy",amenity:"pharmacy"},name:"Аптека 36,6",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Аптека низких цен":{tags:{name:"Аптека низких цен",healthcare:"pharmacy",amenity:"pharmacy"},name:"Аптека низких цен",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Аптека низьких цін":{tags:{name:"Аптека низьких цін",healthcare:"pharmacy",amenity:"pharmacy"},name:"Аптека низьких цін",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Аптека от склада":{tags:{name:"Аптека от склада",healthcare:"pharmacy",amenity:"pharmacy"},name:"Аптека от склада",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Аптека №1":{tags:{name:"Аптека №1",healthcare:"pharmacy",amenity:"pharmacy"},name:"Аптека №1",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Аптечный пункт":{tags:{name:"Аптечный пункт",healthcare:"pharmacy",amenity:"pharmacy"},name:"Аптечный пункт",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Арніка":{tags:{name:"Арніка",healthcare:"pharmacy",amenity:"pharmacy"},name:"Арніка",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Бережная аптека":{tags:{name:"Бережная аптека",healthcare:"pharmacy",amenity:"pharmacy"},name:"Бережная аптека",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Будь здоров":{tags:{name:"Будь здоров",healthcare:"pharmacy",amenity:"pharmacy"},name:"Будь здоров",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Вита":{tags:{name:"Вита",healthcare:"pharmacy",amenity:"pharmacy"},name:"Вита",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Горздрав":{tags:{name:"Горздрав",healthcare:"pharmacy",amenity:"pharmacy"},name:"Горздрав",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Живика":{tags:{name:"Живика",healthcare:"pharmacy",amenity:"pharmacy"},name:"Живика",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Здоровье":{tags:{name:"Здоровье",healthcare:"pharmacy",amenity:"pharmacy"},name:"Здоровье",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Имплозия":{tags:{name:"Имплозия",healthcare:"pharmacy",amenity:"pharmacy"},name:"Имплозия",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Классика":{tags:{name:"Классика",healthcare:"pharmacy",amenity:"pharmacy"},name:"Классика",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Ладушка":{tags:{name:"Ладушка",healthcare:"pharmacy",amenity:"pharmacy"},name:"Ладушка",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Мед-сервіс":{tags:{name:"Мед-сервіс",healthcare:"pharmacy",amenity:"pharmacy"},name:"Мед-сервіс",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Мелодия здоровья":{tags:{name:"Мелодия здоровья",healthcare:"pharmacy",amenity:"pharmacy"},name:"Мелодия здоровья",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Невис":{tags:{name:"Невис",healthcare:"pharmacy",amenity:"pharmacy"},name:"Невис",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Норма":{tags:{name:"Норма",healthcare:"pharmacy",amenity:"pharmacy"},name:"Норма",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Озерки":{tags:{name:"Озерки",healthcare:"pharmacy",amenity:"pharmacy"},name:"Озерки",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Панацея":{tags:{name:"Панацея",healthcare:"pharmacy",amenity:"pharmacy"},name:"Панацея",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Первая помощь":{tags:{name:"Первая помощь",healthcare:"pharmacy",amenity:"pharmacy"},name:"Первая помощь",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Планета здоровья":{tags:{name:"Планета здоровья",healthcare:"pharmacy",amenity:"pharmacy"},name:"Планета здоровья",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Ригла":{tags:{name:"Ригла",healthcare:"pharmacy",amenity:"pharmacy"},name:"Ригла",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Семейная":{tags:{name:"Семейная",healthcare:"pharmacy",amenity:"pharmacy"},name:"Семейная",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Социальная аптека":{tags:{name:"Социальная аптека",healthcare:"pharmacy",amenity:"pharmacy"},name:"Социальная аптека",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Столички":{tags:{name:"Столички",healthcare:"pharmacy",amenity:"pharmacy"},name:"Столички",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Фармакопейка":{tags:{name:"Фармакопейка",healthcare:"pharmacy",amenity:"pharmacy"},name:"Фармакопейка",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Фармакор":{tags:{name:"Фармакор",healthcare:"pharmacy",amenity:"pharmacy"},name:"Фармакор",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Фармация":{tags:{name:"Фармация",healthcare:"pharmacy",amenity:"pharmacy"},name:"Фармация",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Фармленд":{tags:{name:"Фармленд",healthcare:"pharmacy",amenity:"pharmacy"},name:"Фармленд",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/Центральная аптека":{tags:{name:"Центральная аптека",healthcare:"pharmacy",amenity:"pharmacy"},name:"Центральная аптека",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/סופר-פארם":{tags:{name:"סופר-פארם",healthcare:"pharmacy",amenity:"pharmacy"},name:"סופר-פארם",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/داروخانه":{tags:{name:"داروخانه",healthcare:"pharmacy",amenity:"pharmacy"},name:"داروخانه",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/داروخانه شبانه روزی":{tags:{name:"داروخانه شبانه روزی",healthcare:"pharmacy",amenity:"pharmacy"},name:"داروخانه شبانه روزی",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/صيدلية":{tags:{name:"صيدلية",healthcare:"pharmacy",amenity:"pharmacy"},name:"صيدلية",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/くすりの福太郎":{tags:{name:"くすりの福太郎",healthcare:"pharmacy",amenity:"pharmacy"},name:"くすりの福太郎",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/さくら薬局":{tags:{name:"さくら薬局",healthcare:"pharmacy",amenity:"pharmacy"},name:"さくら薬局",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/ウエルシア":{tags:{name:"ウエルシア",healthcare:"pharmacy",amenity:"pharmacy"},name:"ウエルシア",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/カワチ薬品":{tags:{name:"カワチ薬品",healthcare:"pharmacy",amenity:"pharmacy"},name:"カワチ薬品",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/クリエイト":{tags:{name:"クリエイト",healthcare:"pharmacy",amenity:"pharmacy"},name:"クリエイト",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/サンドラッグ":{tags:{name:"サンドラッグ",healthcare:"pharmacy",amenity:"pharmacy"},name:"サンドラッグ",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/スギ薬局":{tags:{name:"スギ薬局",healthcare:"pharmacy",amenity:"pharmacy"},name:"スギ薬局",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/セイジョー":{tags:{name:"セイジョー",healthcare:"pharmacy",amenity:"pharmacy"},name:"セイジョー",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/ツルハドラッグ":{tags:{name:"ツルハドラッグ",healthcare:"pharmacy",amenity:"pharmacy"},name:"ツルハドラッグ",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/ドラッグてらしま (Drug Terashima)":{tags:{name:"ドラッグてらしま (Drug Terashima)",healthcare:"pharmacy",amenity:"pharmacy"},name:"ドラッグてらしま (Drug Terashima)",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/マツモトキヨシ":{tags:{name:"マツモトキヨシ",healthcare:"pharmacy",amenity:"pharmacy"},name:"マツモトキヨシ",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pharmacy/丁丁藥局":{tags:{name:"丁丁藥局",healthcare:"pharmacy",amenity:"pharmacy"},name:"丁丁藥局",icon:"maki-pharmacy",geometry:["point","area"],fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],suggestion:true},"amenity/pub/Black Bull":{tags:{name:"Black Bull",amenity:"pub"},name:"Black Bull",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Commercial Hotel":{tags:{name:"Commercial Hotel",amenity:"pub"},name:"Commercial Hotel",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Cross Keys":{tags:{name:"Cross Keys",amenity:"pub"},name:"Cross Keys",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Irish Pub":{tags:{name:"Irish Pub",amenity:"pub"},name:"Irish Pub",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Kings Arms":{tags:{name:"Kings Arms",amenity:"pub"},name:"Kings Arms",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Kings Head":{tags:{name:"Kings Head",amenity:"pub"},name:"Kings Head",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/New Inn":{tags:{name:"New Inn",amenity:"pub"},name:"New Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Prince of Wales":{tags:{name:"Prince of Wales",amenity:"pub"},name:"Prince of Wales",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Queens Head":{tags:{name:"Queens Head",amenity:"pub"},name:"Queens Head",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Red Lion":{tags:{name:"Red Lion",amenity:"pub"},name:"Red Lion",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Rose & Crown":{tags:{name:"Rose & Crown",amenity:"pub"},name:"Rose & Crown",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Rose and Crown":{tags:{name:"Rose and Crown",amenity:"pub"},name:"Rose and Crown",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/Royal Oak":{tags:{name:"Royal Oak",amenity:"pub"},name:"Royal Oak",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Albion":{tags:{name:"The Albion",amenity:"pub"},name:"The Albion",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Anchor":{tags:{name:"The Anchor",amenity:"pub"},name:"The Anchor",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Angel":{tags:{name:"The Angel",amenity:"pub"},name:"The Angel",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Beehive":{tags:{name:"The Beehive",amenity:"pub"},name:"The Beehive",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Bell":{tags:{name:"The Bell",amenity:"pub"},name:"The Bell",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Bell Inn":{tags:{name:"The Bell Inn",amenity:"pub"},name:"The Bell Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Black Horse":{tags:{name:"The Black Horse",amenity:"pub"},name:"The Black Horse",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Bull":{tags:{name:"The Bull",amenity:"pub"},name:"The Bull",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Castle":{tags:{name:"The Castle",amenity:"pub"},name:"The Castle",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Chequers":{tags:{name:"The Chequers",amenity:"pub"},name:"The Chequers",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Cricketers":{tags:{name:"The Cricketers",amenity:"pub"},name:"The Cricketers",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Cross Keys":{tags:{name:"The Cross Keys",amenity:"pub"},name:"The Cross Keys",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Crown":{tags:{name:"The Crown",amenity:"pub"},name:"The Crown",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Crown Inn":{tags:{name:"The Crown Inn",amenity:"pub"},name:"The Crown Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Fox":{tags:{name:"The Fox",amenity:"pub"},name:"The Fox",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The George":{tags:{name:"The George",amenity:"pub"},name:"The George",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Green Man":{tags:{name:"The Green Man",amenity:"pub"},name:"The Green Man",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Greyhound":{tags:{name:"The Greyhound",amenity:"pub"},name:"The Greyhound",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Kings Arms":{tags:{name:"The Kings Arms",amenity:"pub"},name:"The Kings Arms",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Kings Head":{tags:{name:"The Kings Head",amenity:"pub"},name:"The Kings Head",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The New Inn":{tags:{name:"The New Inn",amenity:"pub"},name:"The New Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Plough":{tags:{name:"The Plough",amenity:"pub"},name:"The Plough",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Plough Inn":{tags:{name:"The Plough Inn",amenity:"pub"},name:"The Plough Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Queens Head":{tags:{name:"The Queens Head",amenity:"pub"},name:"The Queens Head",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Railway":{tags:{name:"The Railway",amenity:"pub"},name:"The Railway",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Red Lion":{tags:{name:"The Red Lion",amenity:"pub"},name:"The Red Lion",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Rising Sun":{tags:{name:"The Rising Sun",amenity:"pub"},name:"The Rising Sun",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Royal Oak":{tags:{name:"The Royal Oak",amenity:"pub"},name:"The Royal Oak",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Ship":{tags:{name:"The Ship",amenity:"pub"},name:"The Ship",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Ship Inn":{tags:{name:"The Ship Inn",amenity:"pub"},name:"The Ship Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Star":{tags:{name:"The Star",amenity:"pub"},name:"The Star",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Star Inn":{tags:{name:"The Star Inn",amenity:"pub"},name:"The Star Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Sun Inn":{tags:{name:"The Sun Inn",amenity:"pub"},name:"The Sun Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Swan":{tags:{name:"The Swan",amenity:"pub"},name:"The Swan",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Swan Inn":{tags:{name:"The Swan Inn",amenity:"pub"},name:"The Swan Inn",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Victoria":{tags:{name:"The Victoria",amenity:"pub"},name:"The Victoria",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The Wheatsheaf":{tags:{name:"The Wheatsheaf",amenity:"pub"},name:"The Wheatsheaf",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The White Hart":{tags:{name:"The White Hart",amenity:"pub"},name:"The White Hart",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The White Horse":{tags:{name:"The White Horse",amenity:"pub"},name:"The White Horse",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The White Lion":{tags:{name:"The White Lion",amenity:"pub"},name:"The White Lion",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/The White Swan":{tags:{name:"The White Swan",amenity:"pub"},name:"The White Swan",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/魚民":{tags:{name:"魚民",amenity:"pub"},name:"魚民",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/pub/鳥貴族":{tags:{name:"鳥貴族",amenity:"pub"},name:"鳥貴族",icon:"maki-beer",geometry:["point","area"],fields:["name","address","building_area","opening_hours","smoking","outdoor_seating","brewery"],suggestion:true},"amenity/restaurant/Adler":{tags:{name:"Adler",amenity:"restaurant"},name:"Adler",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Adria":{tags:{name:"Adria",amenity:"restaurant"},name:"Adria",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Adyar Ananda Bhavan":{tags:{name:"Adyar Ananda Bhavan",amenity:"restaurant"},name:"Adyar Ananda Bhavan",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Akropolis":{tags:{name:"Akropolis",amenity:"restaurant"},name:"Akropolis",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Alte Post":{tags:{name:"Alte Post",amenity:"restaurant"},name:"Alte Post",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Applebee's":{tags:{name:"Applebee's",amenity:"restaurant"},name:"Applebee's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Asia":{tags:{name:"Asia",amenity:"restaurant"},name:"Asia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Athen":{tags:{name:"Athen",amenity:"restaurant"},name:"Athen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Athos":{tags:{name:"Athos",amenity:"restaurant"},name:"Athos",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Autogrill":{tags:{name:"Autogrill",amenity:"restaurant"},name:"Autogrill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Bahnhof":{tags:{name:"Bahnhof",amenity:"restaurant"},name:"Bahnhof",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Bella Italia":{tags:{name:"Bella Italia",amenity:"restaurant"},name:"Bella Italia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Bella Napoli":{tags:{name:"Bella Napoli",amenity:"restaurant"},name:"Bella Napoli",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Big Boy":{tags:{name:"Big Boy",amenity:"restaurant"},name:"Big Boy",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Bob Evans":{tags:{name:"Bob Evans",amenity:"restaurant"},name:"Bob Evans",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Bonefish Grill":{tags:{name:"Bonefish Grill",amenity:"restaurant"},name:"Bonefish Grill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Boston Pizza":{tags:{name:"Boston Pizza",amenity:"restaurant"},name:"Boston Pizza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Buffalo Grill":{tags:{name:"Buffalo Grill",amenity:"restaurant"},name:"Buffalo Grill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Buffalo Wild Wings":{tags:{name:"Buffalo Wild Wings",amenity:"restaurant"},name:"Buffalo Wild Wings",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Bären":{tags:{name:"Bären",amenity:"restaurant"},name:"Bären",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/California Pizza Kitchen":{tags:{name:"California Pizza Kitchen",amenity:"restaurant"},name:"California Pizza Kitchen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Canteen":{tags:{name:"Canteen",amenity:"restaurant"},name:"Canteen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Capri":{tags:{name:"Capri",amenity:"restaurant"},name:"Capri",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Carluccio's":{tags:{name:"Carluccio's",amenity:"restaurant"},name:"Carluccio's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Carpe Diem":{tags:{name:"Carpe Diem",amenity:"restaurant"},name:"Carpe Diem",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Carrabba's Italian Grill":{tags:{name:"Carrabba's Italian Grill",amenity:"restaurant"},name:"Carrabba's Italian Grill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Casa Mia":{tags:{name:"Casa Mia",amenity:"restaurant"},name:"Casa Mia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Casablanca":{tags:{name:"Casablanca",amenity:"restaurant"},name:"Casablanca",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Cheesecake Factory":{tags:{name:"Cheesecake Factory",amenity:"restaurant"},name:"Cheesecake Factory",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Chifa":{tags:{name:"Chifa",amenity:"restaurant"},name:"Chifa",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Chili's":{tags:{name:"Chili's",amenity:"restaurant"},name:"Chili's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/China Buffet":{tags:{name:"China Buffet",amenity:"restaurant"},name:"China Buffet",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/China Garden":{tags:{name:"China Garden",amenity:"restaurant"},name:"China Garden",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/China House":{tags:{name:"China House",amenity:"restaurant"},name:"China House",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/China Town":{tags:{name:"China Town",amenity:"restaurant"},name:"China Town",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/China Wok":{tags:{name:"China Wok",amenity:"restaurant"},name:"China Wok",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Chiquito":{tags:{name:"Chiquito",amenity:"restaurant"},name:"Chiquito",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Chuck E. Cheese's":{tags:{name:"Chuck E. Cheese's",amenity:"restaurant"},name:"Chuck E. Cheese's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Cici's Pizza":{tags:{name:"Cici's Pizza",amenity:"restaurant"},name:"Cici's Pizza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Comedor":{tags:{name:"Comedor",amenity:"restaurant"},name:"Comedor",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Comida China":{tags:{name:"Comida China",amenity:"restaurant"},name:"Comida China",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Courtepaille":{tags:{name:"Courtepaille",amenity:"restaurant"},name:"Courtepaille",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Cracker Barrel":{tags:{name:"Cracker Barrel",amenity:"restaurant"},name:"Cracker Barrel",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Da Grasso":{tags:{name:"Da Grasso",amenity:"restaurant"},name:"Da Grasso",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Da Vinci":{tags:{name:"Da Vinci",amenity:"restaurant"},name:"Da Vinci",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Delphi":{tags:{name:"Delphi",amenity:"restaurant"},name:"Delphi",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Denny's":{tags:{name:"Denny's",amenity:"restaurant"},name:"Denny's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Deutsches Haus":{tags:{name:"Deutsches Haus",amenity:"restaurant"},name:"Deutsches Haus",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Dionysos":{tags:{name:"Dionysos",amenity:"restaurant"},name:"Dionysos",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Dolce Vita":{tags:{name:"Dolce Vita",amenity:"restaurant"},name:"Dolce Vita",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Dorfkrug":{tags:{name:"Dorfkrug",amenity:"restaurant"},name:"Dorfkrug",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/East Side Mario's":{tags:{name:"East Side Mario's",amenity:"restaurant"},name:"East Side Mario's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/El Greco":{tags:{name:"El Greco",amenity:"restaurant"},name:"El Greco",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/El Paso":{tags:{name:"El Paso",amenity:"restaurant"},name:"El Paso",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/El Rancho":{tags:{name:"El Rancho",amenity:"restaurant"},name:"El Rancho",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Europa":{tags:{name:"Europa",amenity:"restaurant"},name:"Europa",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Famous Dave's":{tags:{name:"Famous Dave's",amenity:"restaurant"},name:"Famous Dave's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Flunch":{tags:{name:"Flunch",amenity:"restaurant"},name:"Flunch",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Frankie & Benny's":{tags:{name:"Frankie & Benny's",amenity:"restaurant"},name:"Frankie & Benny's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Friendly's":{tags:{name:"Friendly's",amenity:"restaurant"},name:"Friendly's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Gasthaus Krone":{tags:{name:"Gasthaus Krone",amenity:"restaurant"},name:"Gasthaus Krone",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Gasthaus zur Linde":{tags:{name:"Gasthaus zur Linde",amenity:"restaurant"},name:"Gasthaus zur Linde",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Gasthof zur Post":{tags:{name:"Gasthof zur Post",amenity:"restaurant"},name:"Gasthof zur Post",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Golden Corral":{tags:{name:"Golden Corral",amenity:"restaurant"},name:"Golden Corral",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Golden Dragon":{tags:{name:"Golden Dragon",amenity:"restaurant"},name:"Golden Dragon",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Great Wall":{tags:{name:"Great Wall",amenity:"restaurant"},name:"Great Wall",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Grüner Baum":{tags:{name:"Grüner Baum",amenity:"restaurant"},name:"Grüner Baum",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Gusto":{tags:{name:"Gusto",amenity:"restaurant"},name:"Gusto",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hard Rock Cafe":{tags:{name:"Hard Rock Cafe",amenity:"restaurant"},name:"Hard Rock Cafe",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Harvester":{tags:{name:"Harvester",amenity:"restaurant"},name:"Harvester",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hellas":{tags:{name:"Hellas",amenity:"restaurant"},name:"Hellas",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hippopotamus":{tags:{name:"Hippopotamus",amenity:"restaurant"},name:"Hippopotamus",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hirsch":{tags:{name:"Hirsch",amenity:"restaurant"},name:"Hirsch",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hirschen":{tags:{name:"Hirschen",amenity:"restaurant"},name:"Hirschen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hong Kong":{tags:{name:"Hong Kong",amenity:"restaurant"},name:"Hong Kong",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Hooters":{tags:{name:"Hooters",amenity:"restaurant"},name:"Hooters",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/IHOP":{tags:{name:"IHOP",amenity:"restaurant"},name:"IHOP",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/IL Патио":{tags:{name:"IL Патио",amenity:"restaurant"},name:"IL Патио",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Jason's Deli":{tags:{name:"Jason's Deli",amenity:"restaurant"},name:"Jason's Deli",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Joe's Crab Shack":{tags:{name:"Joe's Crab Shack",amenity:"restaurant"},name:"Joe's Crab Shack",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Jägerhof":{tags:{name:"Jägerhof",amenity:"restaurant"},name:"Jägerhof",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Kantine":{tags:{name:"Kantine",amenity:"restaurant"},name:"Kantine",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Kelsey's":{tags:{name:"Kelsey's",amenity:"restaurant"},name:"Kelsey's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Kirchenwirt":{tags:{name:"Kirchenwirt",amenity:"restaurant"},name:"Kirchenwirt",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Kreta":{tags:{name:"Kreta",amenity:"restaurant"},name:"Kreta",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Kreuz":{tags:{name:"Kreuz",amenity:"restaurant"},name:"Kreuz",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Krone":{tags:{name:"Krone",amenity:"restaurant"},name:"Krone",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Kudu":{tags:{name:"Kudu",amenity:"restaurant"},name:"Kudu",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/L'Escale":{tags:{name:"L'Escale",amenity:"restaurant"},name:"L'Escale",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/L'Osteria":{tags:{name:"L'Osteria",amenity:"restaurant"},name:"L'Osteria",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Bodega":{tags:{name:"La Bodega",amenity:"restaurant"},name:"La Bodega",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Boucherie":{tags:{name:"La Boucherie",amenity:"restaurant"},name:"La Boucherie",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Cantina":{tags:{name:"La Cantina",amenity:"restaurant"},name:"La Cantina",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Casa":{tags:{name:"La Casa",amenity:"restaurant"},name:"La Casa",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Casona":{tags:{name:"La Casona",amenity:"restaurant"},name:"La Casona",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Dolce Vita":{tags:{name:"La Dolce Vita",amenity:"restaurant"},name:"La Dolce Vita",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Fontana":{tags:{name:"La Fontana",amenity:"restaurant"},name:"La Fontana",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Gondola":{tags:{name:"La Gondola",amenity:"restaurant"},name:"La Gondola",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Hacienda":{tags:{name:"La Hacienda",amenity:"restaurant"},name:"La Hacienda",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Pataterie":{tags:{name:"La Pataterie",amenity:"restaurant"},name:"La Pataterie",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Pergola":{tags:{name:"La Pergola",amenity:"restaurant"},name:"La Pergola",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Perla":{tags:{name:"La Perla",amenity:"restaurant"},name:"La Perla",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Piazza":{tags:{name:"La Piazza",amenity:"restaurant"},name:"La Piazza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Piazzetta":{tags:{name:"La Piazzetta",amenity:"restaurant"},name:"La Piazzetta",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Place":{tags:{name:"La Place",amenity:"restaurant"},name:"La Place",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Scala":{tags:{name:"La Scala",amenity:"restaurant"},name:"La Scala",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Strada":{tags:{name:"La Strada",amenity:"restaurant"},name:"La Strada",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Tagliatella":{tags:{name:"La Tagliatella",amenity:"restaurant"},name:"La Tagliatella",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Tasca":{tags:{name:"La Tasca",amenity:"restaurant"},name:"La Tasca",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Taverna":{tags:{name:"La Taverna",amenity:"restaurant"},name:"La Taverna",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Terrasse":{tags:{name:"La Terrasse",amenity:"restaurant"},name:"La Terrasse",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Terraza":{tags:{name:"La Terraza",amenity:"restaurant"},name:"La Terraza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Terrazza":{tags:{name:"La Terrazza",amenity:"restaurant"},name:"La Terrazza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/La Trattoria":{tags:{name:"La Trattoria",amenity:"restaurant"},name:"La Trattoria",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Lamm":{tags:{name:"Lamm",amenity:"restaurant"},name:"Lamm",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Linde":{tags:{name:"Linde",amenity:"restaurant"},name:"Linde",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Lindenhof":{tags:{name:"Lindenhof",amenity:"restaurant"},name:"Lindenhof",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Little Chef":{tags:{name:"Little Chef",amenity:"restaurant"},name:"Little Chef",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Little Italy":{tags:{name:"Little Italy",amenity:"restaurant"},name:"Little Italy",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Logan's Roadhouse":{tags:{name:"Logan's Roadhouse",amenity:"restaurant"},name:"Logan's Roadhouse",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/LongHorn Steakhouse":{tags:{name:"LongHorn Steakhouse",amenity:"restaurant"},name:"LongHorn Steakhouse",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Lotus":{tags:{name:"Lotus",amenity:"restaurant"},name:"Lotus",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Léon de Bruxelles":{tags:{name:"Léon de Bruxelles",amenity:"restaurant"},name:"Léon de Bruxelles",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Löwen":{tags:{name:"Löwen",amenity:"restaurant"},name:"Löwen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/MK Restaurants":{tags:{name:"MK Restaurants",amenity:"restaurant"},name:"MK Restaurants",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Maharaja":{tags:{name:"Maharaja",amenity:"restaurant"},name:"Maharaja",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mamma Mia":{tags:{name:"Mamma Mia",amenity:"restaurant"},name:"Mamma Mia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mandarin":{tags:{name:"Mandarin",amenity:"restaurant"},name:"Mandarin",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mang Inasal":{tags:{name:"Mang Inasal",amenity:"restaurant"},name:"Mang Inasal",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Marco Polo":{tags:{name:"Marco Polo",amenity:"restaurant"},name:"Marco Polo",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Marco's Pizza":{tags:{name:"Marco's Pizza",amenity:"restaurant"},name:"Marco's Pizza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/McAlister's Deli":{tags:{name:"McAlister's Deli",amenity:"restaurant"},name:"McAlister's Deli",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mediterraneo":{tags:{name:"Mediterraneo",amenity:"restaurant"},name:"Mediterraneo",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mellow Mushroom":{tags:{name:"Mellow Mushroom",amenity:"restaurant"},name:"Mellow Mushroom",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mensa":{tags:{name:"Mensa",amenity:"restaurant"},name:"Mensa",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Milano":{tags:{name:"Milano",amenity:"restaurant"},name:"Milano",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mimi's Cafe":{tags:{name:"Mimi's Cafe",amenity:"restaurant"},name:"Mimi's Cafe",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Moe's Southwest Grill":{tags:{name:"Moe's Southwest Grill",amenity:"restaurant"},name:"Moe's Southwest Grill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mykonos":{tags:{name:"Mykonos",amenity:"restaurant"},name:"Mykonos",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Mythos":{tags:{name:"Mythos",amenity:"restaurant"},name:"Mythos",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Nando's":{tags:{name:"Nando's",amenity:"restaurant"},name:"Nando's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Noodles & Company":{tags:{name:"Noodles & Company",amenity:"restaurant"},name:"Noodles & Company",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/O'Charley's":{tags:{name:"O'Charley's",amenity:"restaurant"},name:"O'Charley's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Oasis":{tags:{name:"Oasis",amenity:"restaurant"},name:"Oasis",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Ocean Basket":{tags:{name:"Ocean Basket",amenity:"restaurant"},name:"Ocean Basket",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Ochsen":{tags:{name:"Ochsen",amenity:"restaurant"},name:"Ochsen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Old Chicago":{tags:{name:"Old Chicago",amenity:"restaurant"},name:"Old Chicago",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Olive Garden":{tags:{name:"Olive Garden",amenity:"restaurant"},name:"Olive Garden",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Olympia":{tags:{name:"Olympia",amenity:"restaurant"},name:"Olympia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Osaka":{tags:{name:"Osaka",amenity:"restaurant"},name:"Osaka",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Outback Steakhouse":{tags:{name:"Outback Steakhouse",amenity:"restaurant"},name:"Outback Steakhouse",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/P.F. Chang's":{tags:{name:"P.F. Chang's",amenity:"restaurant"},name:"P.F. Chang's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pancake House":{tags:{name:"Pancake House",amenity:"restaurant"},name:"Pancake House",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Panda":{tags:{name:"Panda",amenity:"restaurant"},name:"Panda",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Panera Bread":{tags:{name:"Panera Bread",amenity:"restaurant"},name:"Panera Bread",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Panorama":{tags:{name:"Panorama",amenity:"restaurant"},name:"Panorama",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Parrilla":{tags:{name:"Parrilla",amenity:"restaurant"},name:"Parrilla",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Peking":{tags:{name:"Peking",amenity:"restaurant"},name:"Peking",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Perkins":{tags:{name:"Perkins",amenity:"restaurant"},name:"Perkins",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pinocchio":{tags:{name:"Pinocchio",amenity:"restaurant"},name:"Pinocchio",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizza Express":{tags:{name:"Pizza Express",amenity:"restaurant"},name:"Pizza Express",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizza Factory":{tags:{name:"Pizza Factory",amenity:"restaurant"},name:"Pizza Factory",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizza House":{tags:{name:"Pizza House",amenity:"restaurant"},name:"Pizza House",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizza Hut":{tags:{name:"Pizza Hut",cuisine:"pizza",amenity:"restaurant"},name:"Pizza Hut",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizza Ranch":{tags:{name:"Pizza Ranch",amenity:"restaurant"},name:"Pizza Ranch",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizzeria Italia":{tags:{name:"Pizzeria Italia",amenity:"restaurant"},name:"Pizzeria Italia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizzeria Milano":{tags:{name:"Pizzeria Milano",amenity:"restaurant"},name:"Pizzeria Milano",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizzeria Napoli":{tags:{name:"Pizzeria Napoli",amenity:"restaurant"},name:"Pizzeria Napoli",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizzeria Roma":{tags:{name:"Pizzeria Roma",amenity:"restaurant"},name:"Pizzeria Roma",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pizzeria Venezia":{tags:{name:"Pizzeria Venezia",amenity:"restaurant"},name:"Pizzeria Venezia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Poivre Rouge":{tags:{name:"Poivre Rouge",amenity:"restaurant"},name:"Poivre Rouge",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Pomodoro":{tags:{name:"Pomodoro",amenity:"restaurant"},name:"Pomodoro",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Portofino":{tags:{name:"Portofino",amenity:"restaurant"},name:"Portofino",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Poseidon":{tags:{name:"Poseidon",amenity:"restaurant"},name:"Poseidon",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Prezzo":{tags:{name:"Prezzo",amenity:"restaurant"},name:"Prezzo",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Qdoba Mexican Grill":{tags:{name:"Qdoba Mexican Grill",amenity:"restaurant"},name:"Qdoba Mexican Grill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Ratskeller":{tags:{name:"Ratskeller",amenity:"restaurant"},name:"Ratskeller",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Red Lobster":{tags:{name:"Red Lobster",amenity:"restaurant"},name:"Red Lobster",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Red Robin":{tags:{name:"Red Robin",amenity:"restaurant"},name:"Red Robin",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Restaurante Universitário":{tags:{name:"Restaurante Universitário",amenity:"restaurant"},name:"Restaurante Universitário",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Rhodos":{tags:{name:"Rhodos",amenity:"restaurant"},name:"Rhodos",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Ristorante Del Arte":{tags:{name:"Ristorante Del Arte",amenity:"restaurant"},name:"Ristorante Del Arte",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Roma":{tags:{name:"Roma",amenity:"restaurant"},name:"Roma",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Rose":{tags:{name:"Rose",amenity:"restaurant"},name:"Rose",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Round Table Pizza":{tags:{name:"Round Table Pizza",amenity:"restaurant"},name:"Round Table Pizza",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Ruby Tuesday":{tags:{name:"Ruby Tuesday",amenity:"restaurant"},name:"Ruby Tuesday",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Rössle":{tags:{name:"Rössle",amenity:"restaurant"},name:"Rössle",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Rössli":{tags:{name:"Rössli",amenity:"restaurant"},name:"Rössli",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Saigon":{tags:{name:"Saigon",amenity:"restaurant"},name:"Saigon",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sakura":{tags:{name:"Sakura",amenity:"restaurant"},name:"Sakura",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/San Marco":{tags:{name:"San Marco",amenity:"restaurant"},name:"San Marco",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Santorini":{tags:{name:"Santorini",amenity:"restaurant"},name:"Santorini",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Schwarzer Adler":{tags:{name:"Schwarzer Adler",amenity:"restaurant"},name:"Schwarzer Adler",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Schützenhaus":{tags:{name:"Schützenhaus",amenity:"restaurant"},name:"Schützenhaus",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Shakey's":{tags:{name:"Shakey's",amenity:"restaurant"},name:"Shakey's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Shalimar":{tags:{name:"Shalimar",amenity:"restaurant"},name:"Shalimar",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Shanghai":{tags:{name:"Shanghai",amenity:"restaurant"},name:"Shanghai",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Shari's":{tags:{name:"Shari's",amenity:"restaurant"},name:"Shari's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Shoney's":{tags:{name:"Shoney's",amenity:"restaurant"},name:"Shoney's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sizzler":{tags:{name:"Sizzler",amenity:"restaurant"},name:"Sizzler",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sonne":{tags:{name:"Sonne",amenity:"restaurant"},name:"Sonne",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sphinx":{tags:{name:"Sphinx",amenity:"restaurant"},name:"Sphinx",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sportheim":{tags:{name:"Sportheim",amenity:"restaurant"},name:"Sportheim",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Spur":{tags:{name:"Spur",amenity:"restaurant"},name:"Spur",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Steak 'n Shake":{tags:{name:"Steak 'n Shake",cuisine:"burger",amenity:"restaurant"},name:"Steak 'n Shake",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sternen":{tags:{name:"Sternen",amenity:"restaurant"},name:"Sternen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sunset Grill":{tags:{name:"Sunset Grill",amenity:"restaurant"},name:"Sunset Grill",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sushi":{tags:{name:"Sushi",amenity:"restaurant"},name:"Sushi",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Sushi Bar":{tags:{name:"Sushi Bar",amenity:"restaurant"},name:"Sushi Bar",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Swiss Chalet":{tags:{name:"Swiss Chalet",amenity:"restaurant"},name:"Swiss Chalet",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Syrtaki":{tags:{name:"Syrtaki",amenity:"restaurant"},name:"Syrtaki",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/TGI Friday's":{tags:{name:"TGI Friday's",amenity:"restaurant"},name:"TGI Friday's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Taj Mahal":{tags:{name:"Taj Mahal",amenity:"restaurant"},name:"Taj Mahal",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Taste of India":{tags:{name:"Taste of India",amenity:"restaurant"},name:"Taste of India",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Taverna":{tags:{name:"Taverna",amenity:"restaurant"},name:"Taverna",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Texas Roadhouse":{tags:{name:"Texas Roadhouse",amenity:"restaurant"},name:"Texas Roadhouse",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/The Cheesecake Factory":{tags:{name:"The Cheesecake Factory",amenity:"restaurant"},name:"The Cheesecake Factory",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Toby Carvery":{tags:{name:"Toby Carvery",amenity:"restaurant"},name:"Toby Carvery",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Tony Roma's":{tags:{name:"Tony Roma's",amenity:"restaurant"},name:"Tony Roma's",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Toscana":{tags:{name:"Toscana",amenity:"restaurant"},name:"Toscana",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Trattoria":{tags:{name:"Trattoria",amenity:"restaurant"},name:"Trattoria",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Traube":{tags:{name:"Traube",amenity:"restaurant"},name:"Traube",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Vapiano":{tags:{name:"Vapiano",amenity:"restaurant"},name:"Vapiano",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Venezia":{tags:{name:"Venezia",amenity:"restaurant"},name:"Venezia",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Village Inn":{tags:{name:"Village Inn",amenity:"restaurant"},name:"Village Inn",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Vips":{tags:{name:"Vips",amenity:"restaurant"},name:"Vips",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Waffle House":{tags:{name:"Waffle House",amenity:"restaurant"},name:"Waffle House",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Wagamama":{tags:{name:"Wagamama",amenity:"restaurant"},name:"Wagamama",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Waldschänke":{tags:{name:"Waldschänke",amenity:"restaurant"},name:"Waldschänke",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Warung":{tags:{name:"Warung",amenity:"restaurant"},name:"Warung",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Wasabi":{tags:{name:"Wasabi",amenity:"restaurant"},name:"Wasabi",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zizzi":{tags:{name:"Zizzi",amenity:"restaurant"},name:"Zizzi",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zorbas":{tags:{name:"Zorbas",amenity:"restaurant"},name:"Zorbas",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zum Hirschen":{tags:{name:"Zum Hirschen",amenity:"restaurant"},name:"Zum Hirschen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zum Löwen":{tags:{name:"Zum Löwen",amenity:"restaurant"},name:"Zum Löwen",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zur Krone":{tags:{name:"Zur Krone",amenity:"restaurant"},name:"Zur Krone",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zur Linde":{tags:{name:"Zur Linde",amenity:"restaurant"},name:"Zur Linde",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zur Post":{tags:{name:"Zur Post",amenity:"restaurant"},name:"Zur Post",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Zur Sonne":{tags:{name:"Zur Sonne",amenity:"restaurant"},name:"Zur Sonne",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Евразия":{tags:{name:"Евразия",amenity:"restaurant"},name:"Евразия",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Ресторан":{tags:{name:"Ресторан",amenity:"restaurant"},name:"Ресторан",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Тануки":{tags:{name:"Тануки",amenity:"restaurant"},name:"Тануки",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/Якитория":{tags:{name:"Якитория",amenity:"restaurant"},name:"Якитория",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/رستوران":{tags:{name:"رستوران",amenity:"restaurant"},name:"رستوران",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/مطعم":{tags:{name:"مطعم",amenity:"restaurant"},name:"مطعم",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/はま寿司":{tags:{name:"はま寿司",amenity:"restaurant"},name:"はま寿司",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/びっくりドンキー":{tags:{name:"びっくりドンキー",amenity:"restaurant"},name:"びっくりドンキー",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/やよい軒":{tags:{name:"やよい軒",amenity:"restaurant"},name:"やよい軒",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/ガスト":{tags:{name:"ガスト","name:en":"Gusto",amenity:"restaurant"},name:"ガスト",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/ココス":{tags:{name:"ココス",amenity:"restaurant"},name:"ココス",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/サイゼリア":{tags:{name:"サイゼリア",amenity:"restaurant"},name:"サイゼリア",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/サイゼリヤ":{tags:{name:"サイゼリヤ",amenity:"restaurant"},name:"サイゼリヤ",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/ジョイフル":{tags:{name:"ジョイフル",amenity:"restaurant"},name:"ジョイフル",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/ジョナサン":{tags:{name:"ジョナサン",amenity:"restaurant"},name:"ジョナサン",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/ジョリーパスタ":{tags:{name:"ジョリーパスタ",amenity:"restaurant"},name:"ジョリーパスタ",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/デニーズ":{tags:{name:"デニーズ",amenity:"restaurant"},name:"デニーズ",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/バーミヤン":{tags:{name:"バーミヤン",amenity:"restaurant"},name:"バーミヤン",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/ロイヤルホスト":{tags:{name:"ロイヤルホスト",amenity:"restaurant"},name:"ロイヤルホスト",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/丸亀製麺":{tags:{name:"丸亀製麺",amenity:"restaurant"},name:"丸亀製麺",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/八方雲集":{tags:{name:"八方雲集",amenity:"restaurant"},name:"八方雲集",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/夢庵":{tags:{name:"夢庵",amenity:"restaurant"},name:"夢庵",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/大戸屋":{tags:{name:"大戸屋",amenity:"restaurant"},name:"大戸屋",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/大阪王将":{tags:{name:"大阪王将",amenity:"restaurant"},name:"大阪王将",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/天下一品":{tags:{name:"天下一品",amenity:"restaurant"},name:"天下一品",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/安楽亭":{tags:{name:"安楽亭",amenity:"restaurant"},name:"安楽亭",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/牛角":{tags:{name:"牛角",amenity:"restaurant"},name:"牛角",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/食堂":{tags:{name:"食堂",amenity:"restaurant"},name:"食堂",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/餃子の王将":{tags:{name:"餃子の王将",amenity:"restaurant"},name:"餃子の王将",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/restaurant/바다횟집 (Bada Fish Restaurant)":{tags:{name:"바다횟집 (Bada Fish Restaurant)",amenity:"restaurant"},name:"바다횟집 (Bada Fish Restaurant)",icon:"maki-restaurant",geometry:["point","area"],fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],suggestion:true},"amenity/school/Adolfo Lopez Mateos":{tags:{name:"Adolfo Lopez Mateos",amenity:"school"},name:"Adolfo Lopez Mateos",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Agustin Ya�ez":{tags:{name:"Agustin Ya�ez",amenity:"school"},name:"Agustin Ya�ez",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Albert-Schweitzer-Schule":{tags:{name:"Albert-Schweitzer-Schule",amenity:"school"},name:"Albert-Schweitzer-Schule",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Amado Nervo":{tags:{name:"Amado Nervo",amenity:"school"},name:"Amado Nervo",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Astrid-Lindgren-Schule":{tags:{name:"Astrid-Lindgren-Schule",amenity:"school"},name:"Astrid-Lindgren-Schule",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Benito Juarez":{tags:{name:"Benito Juarez",amenity:"school"},name:"Benito Juarez",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Brown School":{tags:{name:"Brown School",amenity:"school"},name:"Brown School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/CEM":{tags:{name:"CEM",amenity:"school"},name:"CEM",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Center School":{tags:{name:"Center School",amenity:"school"},name:"Center School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Central Elementary School":{tags:{name:"Central Elementary School",amenity:"school"},name:"Central Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Central High School":{tags:{name:"Central High School",amenity:"school"},name:"Central High School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Central School":{tags:{name:"Central School",amenity:"school"},name:"Central School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Colegio San José":{tags:{name:"Colegio San José",amenity:"school"},name:"Colegio San José",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Collège Jean Moulin":{tags:{name:"Collège Jean Moulin",amenity:"school"},name:"Collège Jean Moulin",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Collège privé Saint-Joseph":{tags:{name:"Collège privé Saint-Joseph",amenity:"school"},name:"Collège privé Saint-Joseph",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Cuauhtemoc":{tags:{name:"Cuauhtemoc",amenity:"school"},name:"Cuauhtemoc",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Curso Comunitario":{tags:{name:"Curso Comunitario",amenity:"school"},name:"Curso Comunitario",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Cursos Comunitarios":{tags:{name:"Cursos Comunitarios",amenity:"school"},name:"Cursos Comunitarios",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/EPP":{tags:{name:"EPP",amenity:"school"},name:"EPP",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Emiliano Zapata":{tags:{name:"Emiliano Zapata",amenity:"school"},name:"Emiliano Zapata",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Fairview Elementary School":{tags:{name:"Fairview Elementary School",amenity:"school"},name:"Fairview Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Fairview School":{tags:{name:"Fairview School",amenity:"school"},name:"Fairview School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Francisco I Madero":{tags:{name:"Francisco I Madero",amenity:"school"},name:"Francisco I Madero",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Francisco I. Madero":{tags:{name:"Francisco I. Madero",amenity:"school"},name:"Francisco I. Madero",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Francisco Villa":{tags:{name:"Francisco Villa",amenity:"school"},name:"Francisco Villa",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Franklin Elementary School":{tags:{name:"Franklin Elementary School",amenity:"school"},name:"Franklin Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Franklin School":{tags:{name:"Franklin School",amenity:"school"},name:"Franklin School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Garfield Elementary School":{tags:{name:"Garfield Elementary School",amenity:"school"},name:"Garfield Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Garfield School":{tags:{name:"Garfield School",amenity:"school"},name:"Garfield School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Gimnazjum nr 1":{tags:{name:"Gimnazjum nr 1",amenity:"school"},name:"Gimnazjum nr 1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Government School":{tags:{name:"Government School",amenity:"school"},name:"Government School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Gregorio Torres Quintero":{tags:{name:"Gregorio Torres Quintero",amenity:"school"},name:"Gregorio Torres Quintero",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Groupe Scolaire":{tags:{name:"Groupe Scolaire",amenity:"school"},name:"Groupe Scolaire",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Guadalupe Victoria":{tags:{name:"Guadalupe Victoria",amenity:"school"},name:"Guadalupe Victoria",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Highland School":{tags:{name:"Highland School",amenity:"school"},name:"Highland School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Hillcrest Elementary School":{tags:{name:"Hillcrest Elementary School",amenity:"school"},name:"Hillcrest Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Holy Cross School":{tags:{name:"Holy Cross School",amenity:"school"},name:"Holy Cross School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Holy Family School":{tags:{name:"Holy Family School",amenity:"school"},name:"Holy Family School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Holy Trinity School":{tags:{name:"Holy Trinity School",amenity:"school"},name:"Holy Trinity School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Ignacio Allende":{tags:{name:"Ignacio Allende",amenity:"school"},name:"Ignacio Allende",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Ignacio Zaragoza":{tags:{name:"Ignacio Zaragoza",amenity:"school"},name:"Ignacio Zaragoza",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Immaculate Conception School":{tags:{name:"Immaculate Conception School",amenity:"school"},name:"Immaculate Conception School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jackson Elementary School":{tags:{name:"Jackson Elementary School",amenity:"school"},name:"Jackson Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jackson School":{tags:{name:"Jackson School",amenity:"school"},name:"Jackson School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jefferson Elementary School":{tags:{name:"Jefferson Elementary School",amenity:"school"},name:"Jefferson Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jefferson School":{tags:{name:"Jefferson School",amenity:"school"},name:"Jefferson School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jose Clemente Orozco":{tags:{name:"Jose Clemente Orozco",amenity:"school"},name:"Jose Clemente Orozco",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jose Ma Morelos Y Pavon":{tags:{name:"Jose Ma Morelos Y Pavon",amenity:"school"},name:"Jose Ma Morelos Y Pavon",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Jose Vasconcelos":{tags:{name:"Jose Vasconcelos",amenity:"school"},name:"Jose Vasconcelos",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Josefa Ortiz De Dominguez":{tags:{name:"Josefa Ortiz De Dominguez",amenity:"school"},name:"Josefa Ortiz De Dominguez",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Juan Escutia":{tags:{name:"Juan Escutia",amenity:"school"},name:"Juan Escutia",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Justo Sierra":{tags:{name:"Justo Sierra",amenity:"school"},name:"Justo Sierra",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Kumon":{tags:{name:"Kumon",amenity:"school"},name:"Kumon",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Lazaro Cardenas":{tags:{name:"Lazaro Cardenas",amenity:"school"},name:"Lazaro Cardenas",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Lazaro Cardenas Del Rio":{tags:{name:"Lazaro Cardenas Del Rio",amenity:"school"},name:"Lazaro Cardenas Del Rio",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Leona Vicario":{tags:{name:"Leona Vicario",amenity:"school"},name:"Leona Vicario",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Liberty Elementary School":{tags:{name:"Liberty Elementary School",amenity:"school"},name:"Liberty Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Liberty School":{tags:{name:"Liberty School",amenity:"school"},name:"Liberty School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Lincoln Elementary School":{tags:{name:"Lincoln Elementary School",amenity:"school"},name:"Lincoln Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Lincoln School":{tags:{name:"Lincoln School",amenity:"school"},name:"Lincoln School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Longfellow Elementary School":{tags:{name:"Longfellow Elementary School",amenity:"school"},name:"Longfellow Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Longfellow School":{tags:{name:"Longfellow School",amenity:"school"},name:"Longfellow School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Madison Elementary School":{tags:{name:"Madison Elementary School",amenity:"school"},name:"Madison Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Manuel Lopez Cotilla":{tags:{name:"Manuel Lopez Cotilla",amenity:"school"},name:"Manuel Lopez Cotilla",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Maple Grove School":{tags:{name:"Maple Grove School",amenity:"school"},name:"Maple Grove School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/McKinley Elementary School":{tags:{name:"McKinley Elementary School",amenity:"school"},name:"McKinley Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/McKinley School":{tags:{name:"McKinley School",amenity:"school"},name:"McKinley School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Miguel Hidalgo":{tags:{name:"Miguel Hidalgo",amenity:"school"},name:"Miguel Hidalgo",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Miguel Hidalgo Y Costilla":{tags:{name:"Miguel Hidalgo Y Costilla",amenity:"school"},name:"Miguel Hidalgo Y Costilla",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Miller School":{tags:{name:"Miller School",amenity:"school"},name:"Miller School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Mount Pleasant School":{tags:{name:"Mount Pleasant School",amenity:"school"},name:"Mount Pleasant School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Mount Zion School":{tags:{name:"Mount Zion School",amenity:"school"},name:"Mount Zion School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Mountain View Elementary School":{tags:{name:"Mountain View Elementary School",amenity:"school"},name:"Mountain View Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/New Hope School":{tags:{name:"New Hope School",amenity:"school"},name:"New Hope School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Nicolas Bravo":{tags:{name:"Nicolas Bravo",amenity:"school"},name:"Nicolas Bravo",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Ni�os Heroes":{tags:{name:"Ni�os Heroes",amenity:"school"},name:"Ni�os Heroes",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Nombre En Tramite":{tags:{name:"Nombre En Tramite",amenity:"school"},name:"Nombre En Tramite",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/North Elementary School":{tags:{name:"North Elementary School",amenity:"school"},name:"North Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Oak Grove School":{tags:{name:"Oak Grove School",amenity:"school"},name:"Oak Grove School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Pedro Moreno":{tags:{name:"Pedro Moreno",amenity:"school"},name:"Pedro Moreno",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Pestalozzischule":{tags:{name:"Pestalozzischule",amenity:"school"},name:"Pestalozzischule",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Pine Grove School":{tags:{name:"Pine Grove School",amenity:"school"},name:"Pine Grove School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Pleasant Hill School":{tags:{name:"Pleasant Hill School",amenity:"school"},name:"Pleasant Hill School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Pleasant Valley School":{tags:{name:"Pleasant Valley School",amenity:"school"},name:"Pleasant Valley School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Pleasant View School":{tags:{name:"Pleasant View School",amenity:"school"},name:"Pleasant View School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Primaria Comunitaria":{tags:{name:"Primaria Comunitaria",amenity:"school"},name:"Primaria Comunitaria",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Ramon Corona":{tags:{name:"Ramon Corona",amenity:"school"},name:"Ramon Corona",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Ricardo Flores Magon":{tags:{name:"Ricardo Flores Magon",amenity:"school"},name:"Ricardo Flores Magon",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Riverside School":{tags:{name:"Riverside School",amenity:"school"},name:"Riverside School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Roosevelt Elementary School":{tags:{name:"Roosevelt Elementary School",amenity:"school"},name:"Roosevelt Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Roosevelt School":{tags:{name:"Roosevelt School",amenity:"school"},name:"Roosevelt School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/SD":{tags:{name:"SD",amenity:"school"},name:"SD",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/SDN":{tags:{name:"SDN",amenity:"school"},name:"SDN",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Sacred Heart School":{tags:{name:"Sacred Heart School",amenity:"school"},name:"Sacred Heart School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Francis School":{tags:{name:"Saint Francis School",amenity:"school"},name:"Saint Francis School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint James School":{tags:{name:"Saint James School",amenity:"school"},name:"Saint James School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Johns School":{tags:{name:"Saint Johns School",amenity:"school"},name:"Saint Johns School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Joseph School":{tags:{name:"Saint Joseph School",amenity:"school"},name:"Saint Joseph School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Josephs School":{tags:{name:"Saint Josephs School",amenity:"school"},name:"Saint Josephs School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Kizito Primary School":{tags:{name:"Saint Kizito Primary School",amenity:"school"},name:"Saint Kizito Primary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Mary School":{tags:{name:"Saint Mary School",amenity:"school"},name:"Saint Mary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Marys School":{tags:{name:"Saint Marys School",amenity:"school"},name:"Saint Marys School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Patricks School":{tags:{name:"Saint Patricks School",amenity:"school"},name:"Saint Patricks School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Paul School":{tags:{name:"Saint Paul School",amenity:"school"},name:"Saint Paul School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Pauls School":{tags:{name:"Saint Pauls School",amenity:"school"},name:"Saint Pauls School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Saint Peters School":{tags:{name:"Saint Peters School",amenity:"school"},name:"Saint Peters School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Schillerschule":{tags:{name:"Schillerschule",amenity:"school"},name:"Schillerschule",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/School Number 1":{tags:{name:"School Number 1",amenity:"school"},name:"School Number 1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/School Number 2":{tags:{name:"School Number 2",amenity:"school"},name:"School Number 2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/School Number 3":{tags:{name:"School Number 3",amenity:"school"},name:"School Number 3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/School Number 4":{tags:{name:"School Number 4",amenity:"school"},name:"School Number 4",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Smith School":{tags:{name:"Smith School",amenity:"school"},name:"Smith School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/South Elementary School":{tags:{name:"South Elementary School",amenity:"school"},name:"South Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Sunnyside School":{tags:{name:"Sunnyside School",amenity:"school"},name:"Sunnyside School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Szkoła Podstawowa nr 1":{tags:{name:"Szkoła Podstawowa nr 1",amenity:"school"},name:"Szkoła Podstawowa nr 1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Szkoła Podstawowa nr 2":{tags:{name:"Szkoła Podstawowa nr 2",amenity:"school"},name:"Szkoła Podstawowa nr 2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Szkoła Podstawowa nr 3":{tags:{name:"Szkoła Podstawowa nr 3",amenity:"school"},name:"Szkoła Podstawowa nr 3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Trinity School":{tags:{name:"Trinity School",amenity:"school"},name:"Trinity School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/UNIDAD EDUCATIVA":{tags:{name:"UNIDAD EDUCATIVA",amenity:"school"},name:"UNIDAD EDUCATIVA",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Union School":{tags:{name:"Union School",amenity:"school"},name:"Union School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Valentin Gomez Farias":{tags:{name:"Valentin Gomez Farias",amenity:"school"},name:"Valentin Gomez Farias",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Venustiano Carranza":{tags:{name:"Venustiano Carranza",amenity:"school"},name:"Venustiano Carranza",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Vicente Guerrero":{tags:{name:"Vicente Guerrero",amenity:"school"},name:"Vicente Guerrero",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Volkshochschule":{tags:{name:"Volkshochschule",amenity:"school"},name:"Volkshochschule",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Volksschule":{tags:{name:"Volksschule",amenity:"school"},name:"Volksschule",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Washington Elementary School":{tags:{name:"Washington Elementary School",amenity:"school"},name:"Washington Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Washington School":{tags:{name:"Washington School",amenity:"school"},name:"Washington School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/West Elementary School":{tags:{name:"West Elementary School",amenity:"school"},name:"West Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/White School":{tags:{name:"White School",amenity:"school"},name:"White School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Wilson Elementary School":{tags:{name:"Wilson Elementary School",amenity:"school"},name:"Wilson Elementary School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Wilson School":{tags:{name:"Wilson School",amenity:"school"},name:"Wilson School",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Általános iskola":{tags:{name:"Általános iskola",amenity:"school"},name:"Általános iskola",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École Jules Ferry":{tags:{name:"École Jules Ferry",amenity:"school"},name:"École Jules Ferry",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École Notre-Dame":{tags:{name:"École Notre-Dame",amenity:"school"},name:"École Notre-Dame",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École Saint-Joseph":{tags:{name:"École Saint-Joseph",amenity:"school"},name:"École Saint-Joseph",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École primaire Jean Jaurès":{tags:{name:"École primaire Jean Jaurès",amenity:"school"},name:"École primaire Jean Jaurès",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École primaire Jules Ferry":{tags:{name:"École primaire Jules Ferry",amenity:"school"},name:"École primaire Jules Ferry",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École primaire privée Notre-Dame":{tags:{name:"École primaire privée Notre-Dame",amenity:"school"},name:"École primaire privée Notre-Dame",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École primaire privée Saint-Joseph":{tags:{name:"École primaire privée Saint-Joseph",amenity:"school"},name:"École primaire privée Saint-Joseph",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École primaire privée Sainte-Marie":{tags:{name:"École primaire privée Sainte-Marie",amenity:"school"},name:"École primaire privée Sainte-Marie",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/École élémentaire Jules Ferry":{tags:{name:"École élémentaire Jules Ferry",amenity:"school"},name:"École élémentaire Jules Ferry",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Școala Generală":{tags:{name:"Școala Generală",amenity:"school"},name:"Școala Generală",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Școală":{tags:{name:"Școală",amenity:"school"},name:"Școală",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Вечерняя школа":{tags:{name:"Вечерняя школа",amenity:"school"},name:"Вечерняя школа",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Гимназия №1":{tags:{name:"Гимназия №1",amenity:"school"},name:"Гимназия №1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Средняя школа №1":{tags:{name:"Средняя школа №1",amenity:"school"},name:"Средняя школа №1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Средняя школа №2":{tags:{name:"Средняя школа №2",amenity:"school"},name:"Средняя школа №2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Средняя школа №3":{tags:{name:"Средняя школа №3",amenity:"school"},name:"Средняя школа №3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 1":{tags:{name:"Школа № 1",amenity:"school"},name:"Школа № 1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 2":{tags:{name:"Школа № 2",amenity:"school"},name:"Школа № 2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 3":{tags:{name:"Школа № 3",amenity:"school"},name:"Школа № 3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 4":{tags:{name:"Школа № 4",amenity:"school"},name:"Школа № 4",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа № 5":{tags:{name:"Школа № 5",amenity:"school"},name:"Школа № 5",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №1":{tags:{name:"Школа №1",amenity:"school"},name:"Школа №1",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №10":{tags:{name:"Школа №10",amenity:"school"},name:"Школа №10",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №11":{tags:{name:"Школа №11",amenity:"school"},name:"Школа №11",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №12":{tags:{name:"Школа №12",amenity:"school"},name:"Школа №12",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №13":{tags:{name:"Школа №13",amenity:"school"},name:"Школа №13",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №14":{tags:{name:"Школа №14",amenity:"school"},name:"Школа №14",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №15":{tags:{name:"Школа №15",amenity:"school"},name:"Школа №15",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №16":{tags:{name:"Школа №16",amenity:"school"},name:"Школа №16",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №17":{tags:{name:"Школа №17",amenity:"school"},name:"Школа №17",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №18":{tags:{name:"Школа №18",amenity:"school"},name:"Школа №18",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №19":{tags:{name:"Школа №19",amenity:"school"},name:"Школа №19",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №2":{tags:{name:"Школа №2",amenity:"school"},name:"Школа №2",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №20":{tags:{name:"Школа №20",amenity:"school"},name:"Школа №20",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №21":{tags:{name:"Школа №21",amenity:"school"},name:"Школа №21",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №22":{tags:{name:"Школа №22",amenity:"school"},name:"Школа №22",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №23":{tags:{name:"Школа №23",amenity:"school"},name:"Школа №23",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №24":{tags:{name:"Школа №24",amenity:"school"},name:"Школа №24",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №25":{tags:{name:"Школа №25",amenity:"school"},name:"Школа №25",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №26":{tags:{name:"Школа №26",amenity:"school"},name:"Школа №26",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №27":{tags:{name:"Школа №27",amenity:"school"},name:"Школа №27",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №28":{tags:{name:"Школа №28",amenity:"school"},name:"Школа №28",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №3":{tags:{name:"Школа №3",amenity:"school"},name:"Школа №3",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №31":{tags:{name:"Школа №31",amenity:"school"},name:"Школа №31",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №35":{tags:{name:"Школа №35",amenity:"school"},name:"Школа №35",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №4":{tags:{name:"Школа №4",amenity:"school"},name:"Школа №4",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №5":{tags:{name:"Школа №5",amenity:"school"},name:"Школа №5",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №6":{tags:{name:"Школа №6",amenity:"school"},name:"Школа №6",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №7":{tags:{name:"Школа №7",amenity:"school"},name:"Школа №7",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №8":{tags:{name:"Школа №8",amenity:"school"},name:"Школа №8",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/Школа №9":{tags:{name:"Школа №9",amenity:"school"},name:"Школа №9",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/مدرسة":{tags:{name:"مدرسة",amenity:"school"},name:"مدرسة",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/مدرسه":{tags:{name:"مدرسه",amenity:"school"},name:"مدرسه",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/市立南中学校":{tags:{name:"市立南中学校",amenity:"school"},name:"市立南中学校",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/市立南小学校":{tags:{name:"市立南小学校",amenity:"school"},name:"市立南小学校",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/school/市立東中学校":{tags:{name:"市立東中学校",amenity:"school"},name:"市立東中学校",icon:"maki-school",geometry:["point","area"],fields:["name","operator","address","religion","denomination"],suggestion:true},"amenity/social_facility/Safe Haven":{tags:{name:"Safe Haven",amenity:"social_facility"},name:"Safe Haven",icon:"temaki-social_facility",geometry:["point","area"],fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],suggestion:true},"amenity/social_facility/Детский дом":{tags:{name:"Детский дом",amenity:"social_facility"},name:"Детский дом",icon:"temaki-social_facility",geometry:["point","area"],fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],suggestion:true},"amenity/social_facility/Социальный участковый":{tags:{name:"Социальный участковый",amenity:"social_facility"},name:"Социальный участковый",icon:"temaki-social_facility",geometry:["point","area"],fields:["name","operator","address","building_area","social_facility","social_facility_for","opening_hours","wheelchair"],suggestion:true},"amenity/theatre/Amfiteatr":{tags:{name:"Amfiteatr",amenity:"theatre"},name:"Amfiteatr",icon:"maki-theatre",geometry:["point","area"],fields:["name","operator","address","building_area"],suggestion:true},"amenity/theatre/Amphitheater":{tags:{name:"Amphitheater",amenity:"theatre"},name:"Amphitheater",icon:"maki-theatre",geometry:["point","area"],fields:["name","operator","address","building_area"],suggestion:true},"amenity/theatre/Amphitheatre":{tags:{name:"Amphitheatre",amenity:"theatre"},name:"Amphitheatre",icon:"maki-theatre",geometry:["point","area"],fields:["name","operator","address","building_area"],suggestion:true},"amenity/theatre/Freilichtbühne":{tags:{name:"Freilichtbühne",amenity:"theatre"},name:"Freilichtbühne",icon:"maki-theatre",geometry:["point","area"],fields:["name","operator","address","building_area"],suggestion:true},"amenity/theatre/Teatro Comunale":{tags:{name:"Teatro Comunale",amenity:"theatre"},name:"Teatro Comunale",icon:"maki-theatre",geometry:["point","area"],fields:["name","operator","address","building_area"],suggestion:true},"leisure/fitness_centre/LA Fitness":{tags:{name:"LA Fitness",leisure:"fitness_centre"},name:"LA Fitness",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","address","building_area","opening_hours"],suggestion:true},"leisure/fitness_centre/Planet Fitness":{tags:{name:"Planet Fitness",leisure:"fitness_centre"},name:"Planet Fitness",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","address","building_area","opening_hours"],suggestion:true},"leisure/fitness_centre/Snap Fitness":{tags:{name:"Snap Fitness",leisure:"fitness_centre"},name:"Snap Fitness",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","address","building_area","opening_hours"],suggestion:true},"leisure/playground/Çocuk Parkı":{tags:{name:"Çocuk Parkı",leisure:"playground"},name:"Çocuk Parkı",icon:"maki-playground",geometry:["point","area"],fields:["name","operator","surface","playground/max_age","playground/min_age","access_simple"],suggestion:true},"leisure/playground/놀이터":{tags:{name:"놀이터",leisure:"playground"},name:"놀이터",icon:"maki-playground",geometry:["point","area"],fields:["name","operator","surface","playground/max_age","playground/min_age","access_simple"],suggestion:true},"leisure/sports_centre/Anytime Fitness":{tags:{name:"Anytime Fitness",leisure:"sports_centre"},name:"Anytime Fitness",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Complejo Municipal de Deportes":{tags:{name:"Complejo Municipal de Deportes",leisure:"sports_centre"},name:"Complejo Municipal de Deportes",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Complexe Sportif":{tags:{name:"Complexe Sportif",leisure:"sports_centre"},name:"Complexe Sportif",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Curves":{tags:{name:"Curves",leisure:"sports_centre"},name:"Curves",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Fitness First":{tags:{name:"Fitness First",leisure:"sports_centre"},name:"Fitness First",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Gold's Gym":{tags:{name:"Gold's Gym",leisure:"sports_centre"},name:"Gold's Gym",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Kieser Training":{tags:{name:"Kieser Training",leisure:"sports_centre"},name:"Kieser Training",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Life Time Fitness":{tags:{name:"Life Time Fitness",leisure:"sports_centre"},name:"Life Time Fitness",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/McFit":{tags:{name:"McFit",leisure:"sports_centre"},name:"McFit",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Mrs. Sporty":{tags:{name:"Mrs. Sporty",leisure:"sports_centre"},name:"Mrs. Sporty",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Orlik":{tags:{name:"Orlik",leisure:"sports_centre"},name:"Orlik",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Pabellón Municipal de Deportes":{tags:{name:"Pabellón Municipal de Deportes",leisure:"sports_centre"},name:"Pabellón Municipal de Deportes",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Palestra Comunale":{tags:{name:"Palestra Comunale",leisure:"sports_centre"},name:"Palestra Comunale",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Salle Omnisport":{tags:{name:"Salle Omnisport",leisure:"sports_centre"},name:"Salle Omnisport",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Virgin Active":{tags:{name:"Virgin Active",leisure:"sports_centre"},name:"Virgin Active",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/YMCA":{tags:{name:"YMCA",leisure:"sports_centre"},name:"YMCA",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/ДЮСШ":{tags:{name:"ДЮСШ",leisure:"sports_centre"},name:"ДЮСШ",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/Ледовый дворец":{tags:{name:"Ледовый дворец",leisure:"sports_centre"},name:"Ледовый дворец",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/sports_centre/体育館":{tags:{name:"体育館",leisure:"sports_centre"},name:"体育館",icon:"maki-pitch",geometry:["point","area"],fields:["name","sport","building","address","opening_hours"],suggestion:true},"leisure/swimming_pool/Schwimmerbecken":{tags:{name:"Schwimmerbecken",leisure:"swimming_pool"},name:"Schwimmerbecken",icon:"maki-swimming",geometry:["point","area"],fields:["name","access_simple","operator","address"],suggestion:true},"leisure/swimming_pool/Yüzme Havuzu":{tags:{name:"Yüzme Havuzu",leisure:"swimming_pool"},name:"Yüzme Havuzu",icon:"maki-swimming",geometry:["point","area"],fields:["name","access_simple","operator","address"],suggestion:true},"leisure/swimming_pool/プール":{tags:{name:"プール",leisure:"swimming_pool"},name:"プール",icon:"maki-swimming",geometry:["point","area"],fields:["name","access_simple","operator","address"],suggestion:true},"leisure/swimming_pool/游泳池":{tags:{name:"游泳池",leisure:"swimming_pool"},name:"游泳池",icon:"maki-swimming",geometry:["point","area"],fields:["name","access_simple","operator","address"],suggestion:true},"man_made/windmill/De Hoop":{tags:{name:"De Hoop",man_made:"windmill"},name:"De Hoop",icon:"temaki-windmill",geometry:["point","area"],fields:["building_area"],suggestion:true},"shop/alcohol/Alko":{tags:{name:"Alko",shop:"alcohol"},name:"Alko",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/BC Liquor Store":{tags:{name:"BC Liquor Store",shop:"alcohol"},name:"BC Liquor Store",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/BWS":{tags:{name:"BWS",shop:"alcohol"},name:"BWS",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Bargain Booze":{tags:{name:"Bargain Booze",shop:"alcohol"},name:"Bargain Booze",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Beer Store":{tags:{name:"Beer Store",shop:"alcohol"},name:"Beer Store",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Botilleria":{tags:{name:"Botilleria",shop:"alcohol"},name:"Botilleria",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Dan Murphy's":{tags:{name:"Dan Murphy's",shop:"alcohol"},name:"Dan Murphy's",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Gall & Gall":{tags:{name:"Gall & Gall",shop:"alcohol"},name:"Gall & Gall",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/LCBO":{tags:{name:"LCBO",shop:"alcohol"},name:"LCBO",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Liquor Depot":{tags:{name:"Liquor Depot",shop:"alcohol"},name:"Liquor Depot",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Liquor Store":{tags:{name:"Liquor Store",shop:"alcohol"},name:"Liquor Store",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Liquorland":{tags:{name:"Liquorland",shop:"alcohol"},name:"Liquorland",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Mitra":{tags:{name:"Mitra",shop:"alcohol"},name:"Mitra",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Nicolas":{tags:{name:"Nicolas",shop:"alcohol"},name:"Nicolas",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/SAQ":{tags:{name:"SAQ",shop:"alcohol"},name:"SAQ",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Systembolaget":{tags:{name:"Systembolaget",shop:"alcohol"},name:"Systembolaget",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/The Beer Store":{tags:{name:"The Beer Store",shop:"alcohol"},name:"The Beer Store",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Vinmonopolet":{tags:{name:"Vinmonopolet",shop:"alcohol"},name:"Vinmonopolet",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Алкомаркет":{tags:{name:"Алкомаркет",shop:"alcohol"},name:"Алкомаркет",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Ароматный мир":{tags:{name:"Ароматный мир",shop:"alcohol"},name:"Ароматный мир",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Бристоль":{tags:{name:"Бристоль",shop:"alcohol"},name:"Бристоль",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Градус":{tags:{name:"Градус",shop:"alcohol"},name:"Градус",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Живое пиво":{tags:{name:"Живое пиво",shop:"alcohol"},name:"Живое пиво",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Красное & Белое":{tags:{name:"Красное & Белое",shop:"alcohol"},name:"Красное & Белое",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Норман":{tags:{name:"Норман",shop:"alcohol"},name:"Норман",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Отдохни":{tags:{name:"Отдохни",shop:"alcohol"},name:"Отдохни",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Пиво":{tags:{name:"Пиво",shop:"alcohol"},name:"Пиво",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/alcohol/Разливное пиво":{tags:{name:"Разливное пиво",shop:"alcohol"},name:"Разливное пиво",icon:"maki-alcohol-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],suggestion:true},"shop/baby_goods/Aubert":{tags:{name:"Aubert",shop:"baby_goods"},name:"Aubert",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/baby_goods/Babies R Us":{tags:{name:"Babies R Us",shop:"baby_goods"},name:"Babies R Us",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/baby_goods/BabyOne":{tags:{name:"BabyOne",shop:"baby_goods"},name:"BabyOne",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/AILI":{tags:{name:"AILI",shop:"bakery"},name:"AILI",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Anker":{tags:{name:"Anker",shop:"bakery"},name:"Anker",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Awiteks":{tags:{name:"Awiteks",shop:"bakery"},name:"Awiteks",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Backshop":{tags:{name:"Backshop",shop:"bakery"},name:"Backshop",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Backwerk":{tags:{name:"Backwerk",shop:"bakery"},name:"Backwerk",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Baguette":{tags:{name:"Baguette",shop:"bakery"},name:"Baguette",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bakers Delight":{tags:{name:"Bakers Delight",shop:"bakery"},name:"Bakers Delight",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bakker Bart":{tags:{name:"Bakker Bart",shop:"bakery"},name:"Bakker Bart",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Banette":{tags:{name:"Banette",shop:"bakery"},name:"Banette",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bäckerei Fuchs":{tags:{name:"Bäckerei Fuchs",shop:"bakery"},name:"Bäckerei Fuchs",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bäckerei Grimminger":{tags:{name:"Bäckerei Grimminger",shop:"bakery"},name:"Bäckerei Grimminger",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bäckerei Müller":{tags:{name:"Bäckerei Müller",shop:"bakery"},name:"Bäckerei Müller",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bäckerei Schmidt":{tags:{name:"Bäckerei Schmidt",shop:"bakery"},name:"Bäckerei Schmidt",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Bäckerei Schneider":{tags:{name:"Bäckerei Schneider",shop:"bakery"},name:"Bäckerei Schneider",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Cooplands":{tags:{name:"Cooplands",shop:"bakery"},name:"Cooplands",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Dat Backhus":{tags:{name:"Dat Backhus",shop:"bakery"},name:"Dat Backhus",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Der Beck":{tags:{name:"Der Beck",shop:"bakery"},name:"Der Beck",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Der Mann":{tags:{name:"Der Mann",shop:"bakery"},name:"Der Mann",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Ditsch":{tags:{name:"Ditsch",shop:"bakery"},name:"Ditsch",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Fornetti":{tags:{name:"Fornetti",shop:"bakery"},name:"Fornetti",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Goeken backen":{tags:{name:"Goeken backen",shop:"bakery"},name:"Goeken backen",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Goldilocks":{tags:{name:"Goldilocks",shop:"bakery"},name:"Goldilocks",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Greggs":{tags:{name:"Greggs",shop:"bakery"},name:"Greggs",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Hofpfisterei":{tags:{name:"Hofpfisterei",shop:"bakery"},name:"Hofpfisterei",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Ihle":{tags:{name:"Ihle",shop:"bakery"},name:"Ihle",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Julie's Bakeshop":{tags:{name:"Julie's Bakeshop",shop:"bakery"},name:"Julie's Bakeshop",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/K&U":{tags:{name:"K&U",shop:"bakery"},name:"K&U",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/K&U Bäckerei":{tags:{name:"K&U Bäckerei",shop:"bakery"},name:"K&U Bäckerei",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Kamps":{tags:{name:"Kamps",shop:"bakery"},name:"Kamps",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/La Mie Câline":{tags:{name:"La Mie Câline",shop:"bakery"},name:"La Mie Câline",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Le Crobag":{tags:{name:"Le Crobag",shop:"bakery"},name:"Le Crobag",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Le Fournil":{tags:{name:"Le Fournil",shop:"bakery"},name:"Le Fournil",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Lila Bäcker":{tags:{name:"Lila Bäcker",shop:"bakery"},name:"Lila Bäcker",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Lipóti Pékség":{tags:{name:"Lipóti Pékség",shop:"bakery"},name:"Lipóti Pékség",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Marie Blachère":{tags:{name:"Marie Blachère",shop:"bakery"},name:"Marie Blachère",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Mlinar":{tags:{name:"Mlinar",shop:"bakery"},name:"Mlinar",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Musmanni":{tags:{name:"Musmanni",shop:"bakery"},name:"Musmanni",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Oebel":{tags:{name:"Oebel",shop:"bakery"},name:"Oebel",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Paul":{tags:{name:"Paul",shop:"bakery"},name:"Paul",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Red Ribbon":{tags:{name:"Red Ribbon",shop:"bakery"},name:"Red Ribbon",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Schäfer's":{tags:{name:"Schäfer's",shop:"bakery"},name:"Schäfer's",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Sehne":{tags:{name:"Sehne",shop:"bakery"},name:"Sehne",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Stadtbäckerei":{tags:{name:"Stadtbäckerei",shop:"bakery"},name:"Stadtbäckerei",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Steinecke":{tags:{name:"Steinecke",shop:"bakery"},name:"Steinecke",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Sternenbäck":{tags:{name:"Sternenbäck",shop:"bakery"},name:"Sternenbäck",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Ströck":{tags:{name:"Ströck",shop:"bakery"},name:"Ströck",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Wiener Feinbäcker":{tags:{name:"Wiener Feinbäcker",shop:"bakery"},name:"Wiener Feinbäcker",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/von Allwörden":{tags:{name:"von Allwörden",shop:"bakery"},name:"von Allwörden",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Булочная":{tags:{name:"Булочная",shop:"bakery"},name:"Булочная",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Горячий хлеб":{tags:{name:"Горячий хлеб",shop:"bakery"},name:"Горячий хлеб",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Каравай":{tags:{name:"Каравай",shop:"bakery"},name:"Каравай",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Кулиничи":{tags:{name:"Кулиничи",shop:"bakery"},name:"Кулиничи",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Кулиничі":{tags:{name:"Кулиничі",shop:"bakery"},name:"Кулиничі",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Свежий хлеб":{tags:{name:"Свежий хлеб",shop:"bakery"},name:"Свежий хлеб",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/Хлеб":{tags:{name:"Хлеб",shop:"bakery"},name:"Хлеб",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/مخبز":{tags:{name:"مخبز",shop:"bakery"},name:"مخبز",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/مخبزة":{tags:{name:"مخبزة",shop:"bakery"},name:"مخبزة",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نان لواش":{tags:{name:"نان لواش",shop:"bakery"},name:"نان لواش",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی":{tags:{name:"نانوایی",shop:"bakery"},name:"نانوایی",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی بربری":{tags:{name:"نانوایی بربری",shop:"bakery"},name:"نانوایی بربری",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی سنگک":{tags:{name:"نانوایی سنگک",shop:"bakery"},name:"نانوایی سنگک",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی سنگکی":{tags:{name:"نانوایی سنگکی",shop:"bakery"},name:"نانوایی سنگکی",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bakery/نانوایی لواش":{tags:{name:"نانوایی لواش",shop:"bakery"},name:"نانوایی لواش",icon:"maki-bakery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beauty/Sally Beauty Supply":{tags:{name:"Sally Beauty Supply",shop:"beauty"},name:"Sally Beauty Supply",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],suggestion:true},"shop/beauty/Yves Rocher":{tags:{name:"Yves Rocher",shop:"beauty"},name:"Yves Rocher",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],suggestion:true},"shop/bed/Matratzen Concord":{tags:{name:"Matratzen Concord",shop:"bed"},name:"Matratzen Concord",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bed/Mattress Firm":{tags:{name:"Mattress Firm",shop:"bed"},name:"Mattress Firm",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bed/Sleepy's":{tags:{name:"Sleepy's",shop:"bed"},name:"Sleepy's",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/50嵐":{tags:{name:"50嵐",shop:"beverages"},name:"50嵐",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Dursty":{tags:{name:"Dursty",shop:"beverages"},name:"Dursty",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Edeka Getränkemarkt":{tags:{name:"Edeka Getränkemarkt",shop:"beverages"},name:"Edeka Getränkemarkt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Fristo":{tags:{name:"Fristo",shop:"beverages"},name:"Fristo",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Getränke Hoffmann":{tags:{name:"Getränke Hoffmann",shop:"beverages"},name:"Getränke Hoffmann",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Getränkeland":{tags:{name:"Getränkeland",shop:"beverages"},name:"Getränkeland",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Getränkemarkt":{tags:{name:"Getränkemarkt",shop:"beverages"},name:"Getränkemarkt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Orterer Getränkemarkt":{tags:{name:"Orterer Getränkemarkt",shop:"beverages"},name:"Orterer Getränkemarkt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Rewe Getränkemarkt":{tags:{name:"Rewe Getränkemarkt",shop:"beverages"},name:"Rewe Getränkemarkt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/Trinkgut":{tags:{name:"Trinkgut",shop:"beverages"},name:"Trinkgut",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/beverages/茶湯會":{tags:{name:"茶湯會",shop:"beverages"},name:"茶湯會",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bicycle/Halfords":{tags:{name:"Halfords",shop:"bicycle"},name:"Halfords",icon:"maki-bicycle",geometry:["point","area"],fields:["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],suggestion:true},"shop/bicycle/Веломарка":{tags:{name:"Веломарка",shop:"bicycle"},name:"Веломарка",icon:"maki-bicycle",geometry:["point","area"],fields:["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],suggestion:true},"shop/bicycle/サイクルベースあさひ":{tags:{name:"サイクルベースあさひ",shop:"bicycle"},name:"サイクルベースあさひ",icon:"maki-bicycle",geometry:["point","area"],fields:["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],suggestion:true},"shop/bookmaker/Betfred":{tags:{name:"Betfred",shop:"bookmaker"},name:"Betfred",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bookmaker/Coral":{tags:{name:"Coral",shop:"bookmaker"},name:"Coral",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bookmaker/Ladbrokes":{tags:{name:"Ladbrokes",shop:"bookmaker"},name:"Ladbrokes",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bookmaker/Paddy Power":{tags:{name:"Paddy Power",shop:"bookmaker"},name:"Paddy Power",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bookmaker/William Hill":{tags:{name:"William Hill",shop:"bookmaker"},name:"William Hill",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/bookmaker/ΟΠΑΠ":{tags:{name:"ΟΠΑΠ",shop:"bookmaker"},name:"ΟΠΑΠ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Boucherie Charcuterie":{tags:{name:"Boucherie Charcuterie",shop:"butcher"},name:"Boucherie Charcuterie",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Carnicería":{tags:{name:"Carnicería",shop:"butcher"},name:"Carnicería",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Fleischerei Richter":{tags:{name:"Fleischerei Richter",shop:"butcher"},name:"Fleischerei Richter",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Húsbolt":{tags:{name:"Húsbolt",shop:"butcher"},name:"Húsbolt",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Macelleria":{tags:{name:"Macelleria",shop:"butcher"},name:"Macelleria",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Vinzenzmurr":{tags:{name:"Vinzenzmurr",shop:"butcher"},name:"Vinzenzmurr",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Ариант":{tags:{name:"Ариант",shop:"butcher"},name:"Ариант",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Великолукский мясокомбинат":{tags:{name:"Великолукский мясокомбинат",shop:"butcher"},name:"Великолукский мясокомбинат",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Мясная лавка":{tags:{name:"Мясная лавка",shop:"butcher"},name:"Мясная лавка",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Мясницкий ряд":{tags:{name:"Мясницкий ряд",shop:"butcher"},name:"Мясницкий ряд",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Мясной":{tags:{name:"Мясной",shop:"butcher"},name:"Мясной",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Мясо":{tags:{name:"Мясо",shop:"butcher"},name:"Мясо",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Наша Ряба":{tags:{name:"Наша Ряба",shop:"butcher"},name:"Наша Ряба",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/butcher/Свежее мясо":{tags:{name:"Свежее мясо",shop:"butcher"},name:"Свежее мясо",icon:"maki-slaughterhouse",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car/Audi":{tags:{name:"Audi",shop:"car"},name:"Audi",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/BMW":{tags:{name:"BMW",shop:"car"},name:"BMW",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Chevrolet":{tags:{name:"Chevrolet",shop:"car"},name:"Chevrolet",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Citroën":{tags:{name:"Citroën",shop:"car"},name:"Citroën",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Dacia":{tags:{name:"Dacia",shop:"car"},name:"Dacia",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Fiat":{tags:{name:"Fiat",shop:"car"},name:"Fiat",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Ford":{tags:{name:"Ford",shop:"car"},name:"Ford",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Honda":{tags:{name:"Honda",shop:"car"},name:"Honda",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Hyundai":{tags:{name:"Hyundai",shop:"car"},name:"Hyundai",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Isuzu":{tags:{name:"Isuzu",shop:"car"},name:"Isuzu",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Kia":{tags:{name:"Kia",shop:"car"},name:"Kia",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Land Rover":{tags:{name:"Land Rover",shop:"car"},name:"Land Rover",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Lexus":{tags:{name:"Lexus",shop:"car"},name:"Lexus",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Mazda":{tags:{name:"Mazda",shop:"car"},name:"Mazda",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Mercedes-Benz":{tags:{name:"Mercedes-Benz",shop:"car"},name:"Mercedes-Benz",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Mitsubishi":{tags:{name:"Mitsubishi",shop:"car"},name:"Mitsubishi",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Mitsubishi Motors":{tags:{name:"Mitsubishi Motors",shop:"car"},name:"Mitsubishi Motors",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/NISSAN":{tags:{name:"NISSAN",shop:"car"},name:"NISSAN",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Nissan":{tags:{name:"Nissan",shop:"car"},name:"Nissan",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Opel":{tags:{name:"Opel",shop:"car"},name:"Opel",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Peugeot":{tags:{name:"Peugeot",shop:"car"},name:"Peugeot",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Porsche":{tags:{name:"Porsche",shop:"car"},name:"Porsche",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Renault":{tags:{name:"Renault",shop:"car"},name:"Renault",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Seat":{tags:{name:"Seat",shop:"car"},name:"Seat",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Skoda":{tags:{name:"Skoda",shop:"car"},name:"Skoda",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Subaru":{tags:{name:"Subaru",shop:"car"},name:"Subaru",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Suzuki":{tags:{name:"Suzuki",shop:"car"},name:"Suzuki",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Toyota":{tags:{name:"Toyota",shop:"car"},name:"Toyota",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Volkswagen":{tags:{name:"Volkswagen",shop:"car"},name:"Volkswagen",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car/Volvo":{tags:{name:"Volvo",shop:"car"},name:"Volvo",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","brand","second_hand","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Advance Auto Parts":{tags:{name:"Advance Auto Parts",shop:"car_parts"},name:"Advance Auto Parts",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/AutoZone":{tags:{name:"AutoZone",shop:"car_parts"},name:"AutoZone",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Brezan":{tags:{name:"Brezan",shop:"car_parts"},name:"Brezan",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/NAPA Auto Parts":{tags:{name:"NAPA Auto Parts",shop:"car_parts"},name:"NAPA Auto Parts",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Napa Auto Parts":{tags:{name:"Napa Auto Parts",shop:"car_parts"},name:"Napa Auto Parts",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/O'Reilly Auto Parts":{tags:{name:"O'Reilly Auto Parts",shop:"car_parts"},name:"O'Reilly Auto Parts",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Repco":{tags:{name:"Repco",shop:"car_parts"},name:"Repco",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Tokić":{tags:{name:"Tokić",shop:"car_parts"},name:"Tokić",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/repuestos automotrices":{tags:{name:"repuestos automotrices",shop:"car_parts"},name:"repuestos automotrices",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Автозапчастини":{tags:{name:"Автозапчастини",shop:"car_parts"},name:"Автозапчастини",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/Автомир":{tags:{name:"Автомир",shop:"car_parts"},name:"Автомир",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/イエローハット":{tags:{name:"イエローハット",shop:"car_parts"},name:"イエローハット",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/オートバックス":{tags:{name:"オートバックス",shop:"car_parts"},name:"オートバックス",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_parts/タイヤ館":{tags:{name:"タイヤ館",shop:"car_parts"},name:"タイヤ館",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/A.T.U":{tags:{name:"A.T.U",shop:"car_repair"},name:"A.T.U",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Bosch Car Service":{tags:{name:"Bosch Car Service",shop:"car_repair"},name:"Bosch Car Service",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Carglass":{tags:{name:"Carglass",shop:"car_repair"},name:"Carglass",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Euromaster":{tags:{name:"Euromaster",shop:"car_repair"},name:"Euromaster",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Feu Vert":{tags:{name:"Feu Vert",shop:"car_repair"},name:"Feu Vert",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Firestone":{tags:{name:"Firestone",shop:"car_repair"},name:"Firestone",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Firestone Complete Auto Care":{tags:{name:"Firestone Complete Auto Care",shop:"car_repair"},name:"Firestone Complete Auto Care",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Garage Renault":{tags:{name:"Garage Renault",shop:"car_repair"},name:"Garage Renault",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Gomeria":{tags:{name:"Gomeria",shop:"car_repair"},name:"Gomeria",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Gomería":{tags:{name:"Gomería",shop:"car_repair"},name:"Gomería",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Goodyear":{tags:{name:"Goodyear",shop:"car_repair"},name:"Goodyear",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Grease Monkey":{tags:{name:"Grease Monkey",shop:"car_repair"},name:"Grease Monkey",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Jiffy Lube":{tags:{name:"Jiffy Lube",shop:"car_repair"},name:"Jiffy Lube",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Kwik Fit":{tags:{name:"Kwik Fit",shop:"car_repair"},name:"Kwik Fit",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Lubricentro":{tags:{name:"Lubricentro",shop:"car_repair"},name:"Lubricentro",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Meineke":{tags:{name:"Meineke",shop:"car_repair"},name:"Meineke",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Mekonomen":{tags:{name:"Mekonomen",shop:"car_repair"},name:"Mekonomen",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Midas":{tags:{name:"Midas",shop:"car_repair"},name:"Midas",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Mr. Lube":{tags:{name:"Mr. Lube",shop:"car_repair"},name:"Mr. Lube",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Norauto":{tags:{name:"Norauto",shop:"car_repair"},name:"Norauto",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Pep Boys":{tags:{name:"Pep Boys",shop:"car_repair"},name:"Pep Boys",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Pit Stop":{tags:{name:"Pit Stop",shop:"car_repair"},name:"Pit Stop",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Point S":{tags:{name:"Point S",shop:"car_repair"},name:"Point S",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Roady":{tags:{name:"Roady",shop:"car_repair"},name:"Roady",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Sears Auto Center":{tags:{name:"Sears Auto Center",shop:"car_repair"},name:"Sears Auto Center",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Speedy":{tags:{name:"Speedy",shop:"car_repair"},name:"Speedy",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Stacja Kontroli Pojazdów":{tags:{name:"Stacja Kontroli Pojazdów",shop:"car_repair"},name:"Stacja Kontroli Pojazdów",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Taller":{tags:{name:"Taller",shop:"car_repair"},name:"Taller",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Valvoline":{tags:{name:"Valvoline",shop:"car_repair"},name:"Valvoline",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Valvoline Instant Oil Change":{tags:{name:"Valvoline Instant Oil Change",shop:"car_repair"},name:"Valvoline Instant Oil Change",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Wulkanizacja":{tags:{name:"Wulkanizacja",shop:"car_repair"},name:"Wulkanizacja",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/ÖAMTC":{tags:{name:"ÖAMTC",shop:"car_repair"},name:"ÖAMTC",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Автомастерская":{tags:{name:"Автомастерская",shop:"car_repair"},name:"Автомастерская",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Авторемонт":{tags:{name:"Авторемонт",shop:"car_repair"},name:"Авторемонт",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Автосервис":{tags:{name:"Автосервис",shop:"car_repair"},name:"Автосервис",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Автосервис+шиномонтаж":{tags:{name:"Автосервис+шиномонтаж",shop:"car_repair"},name:"Автосервис+шиномонтаж",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Замена масла":{tags:{name:"Замена масла",shop:"car_repair"},name:"Замена масла",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/СТО":{tags:{name:"СТО",shop:"car_repair"},name:"СТО",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/Шиномонтаж":{tags:{name:"Шиномонтаж",shop:"car_repair"},name:"Шиномонтаж",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/car_repair/шиномонтаж":{tags:{name:"шиномонтаж",shop:"car_repair"},name:"шиномонтаж",icon:"maki-car",geometry:["point","area"],fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],suggestion:true},"shop/carpet/Carpet Right":{tags:{name:"Carpet Right",shop:"carpet"},name:"Carpet Right",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/carpet/Carpetright":{tags:{name:"Carpetright",shop:"carpet"},name:"Carpetright",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/charity/Age UK":{tags:{name:"Age UK",shop:"charity"},name:"Age UK",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/Barnardo's":{tags:{name:"Barnardo's",shop:"charity"},name:"Barnardo's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/British Heart Foundation":{tags:{name:"British Heart Foundation",shop:"charity"},name:"British Heart Foundation",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/Cancer Research UK":{tags:{name:"Cancer Research UK",shop:"charity"},name:"Cancer Research UK",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/Oxfam":{tags:{name:"Oxfam",shop:"charity"},name:"Oxfam",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/Salvation Army":{tags:{name:"Salvation Army",shop:"charity"},name:"Salvation Army",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/Scope":{tags:{name:"Scope",shop:"charity"},name:"Scope",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/charity/Sue Ryder":{tags:{name:"Sue Ryder",shop:"charity"},name:"Sue Ryder",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/chemist/7 Дней":{tags:{name:"7 Дней",shop:"chemist"},name:"7 Дней",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Bipa":{tags:{name:"Bipa",shop:"chemist"},name:"Bipa",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Budnikowsky":{tags:{name:"Budnikowsky",shop:"chemist"},name:"Budnikowsky",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Etos":{tags:{name:"Etos",shop:"chemist"},name:"Etos",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Kruidvat":{tags:{name:"Kruidvat",shop:"chemist"},name:"Kruidvat",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Matas":{tags:{name:"Matas",shop:"chemist"},name:"Matas",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Müller":{tags:{name:"Müller",shop:"chemist"},name:"Müller",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Rossmann":{tags:{name:"Rossmann",shop:"chemist"},name:"Rossmann",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Schlecker":{tags:{name:"Schlecker",shop:"chemist"},name:"Schlecker",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Teta":{tags:{name:"Teta",shop:"chemist"},name:"Teta",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Trekpleister":{tags:{name:"Trekpleister",shop:"chemist"},name:"Trekpleister",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Watsons":{tags:{name:"Watsons",shop:"chemist"},name:"Watsons",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/dm":{tags:{name:"dm",shop:"chemist"},name:"dm",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Бытовая химия":{tags:{name:"Бытовая химия",shop:"chemist"},name:"Бытовая химия",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Магнит Косметик":{tags:{name:"Магнит Косметик",shop:"chemist"},name:"Магнит Косметик",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Мила":{tags:{name:"Мила",shop:"chemist"},name:"Мила",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Остров чистоты":{tags:{name:"Остров чистоты",shop:"chemist"},name:"Остров чистоты",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Рубль Бум":{tags:{name:"Рубль Бум",shop:"chemist"},name:"Рубль Бум",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/Улыбка радуги":{tags:{name:"Улыбка радуги",shop:"chemist"},name:"Улыбка радуги",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/屈臣氏":{tags:{name:"屈臣氏",shop:"chemist"},name:"屈臣氏",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/chemist/康是美":{tags:{name:"康是美",shop:"chemist"},name:"康是美",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/AOKI":{tags:{name:"AOKI",shop:"clothes"},name:"AOKI",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/AWG":{tags:{name:"AWG",shop:"clothes"},name:"AWG",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Ackermans":{tags:{name:"Ackermans",shop:"clothes"},name:"Ackermans",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Adidas":{tags:{name:"Adidas",shop:"clothes"},name:"Adidas",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/American Apparel":{tags:{name:"American Apparel",shop:"clothes"},name:"American Apparel",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/American Eagle Outfitters":{tags:{name:"American Eagle Outfitters",shop:"clothes"},name:"American Eagle Outfitters",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Anthropologie":{tags:{name:"Anthropologie",shop:"clothes"},name:"Anthropologie",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Ardene":{tags:{name:"Ardene",shop:"clothes"},name:"Ardene",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Armand Thiery":{tags:{name:"Armand Thiery",shop:"clothes"},name:"Armand Thiery",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Banana Republic":{tags:{name:"Banana Republic",shop:"clothes"},name:"Banana Republic",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Benetton":{tags:{name:"Benetton",shop:"clothes"},name:"Benetton",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Bershka":{tags:{name:"Bershka",shop:"clothes"},name:"Bershka",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Bonita":{tags:{name:"Bonita",shop:"clothes"},name:"Bonita",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Bonobo":{tags:{name:"Bonobo",shop:"clothes"},name:"Bonobo",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Brooks Brothers":{tags:{name:"Brooks Brothers",shop:"clothes"},name:"Brooks Brothers",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Burberry":{tags:{name:"Burberry",shop:"clothes"},name:"Burberry",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Burlington Coat Factory":{tags:{name:"Burlington Coat Factory",shop:"clothes"},name:"Burlington Coat Factory",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Burton":{tags:{name:"Burton",shop:"clothes"},name:"Burton",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/C&A":{tags:{name:"C&A",shop:"clothes"},name:"C&A",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Cache Cache":{tags:{name:"Cache Cache",shop:"clothes"},name:"Cache Cache",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Calvin Klein":{tags:{name:"Calvin Klein",shop:"clothes"},name:"Calvin Klein",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Calzedonia":{tags:{name:"Calzedonia",shop:"clothes"},name:"Calzedonia",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Camaïeu":{tags:{name:"Camaïeu",shop:"clothes"},name:"Camaïeu",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Caroll":{tags:{name:"Caroll",shop:"clothes"},name:"Caroll",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Carter's":{tags:{name:"Carter's",shop:"clothes"},name:"Carter's",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Cecil":{tags:{name:"Cecil",shop:"clothes"},name:"Cecil",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Celio":{tags:{name:"Celio",shop:"clothes"},name:"Celio",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Charles Vögele":{tags:{name:"Charles Vögele",shop:"clothes"},name:"Charles Vögele",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Chico's":{tags:{name:"Chico's",shop:"clothes"},name:"Chico's",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Cropp":{tags:{name:"Cropp",shop:"clothes"},name:"Cropp",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Cubus":{tags:{name:"Cubus",shop:"clothes"},name:"Cubus",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Desigual":{tags:{name:"Desigual",shop:"clothes"},name:"Desigual",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Devred":{tags:{name:"Devred",shop:"clothes"},name:"Devred",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Didi":{tags:{name:"Didi",shop:"clothes"},name:"Didi",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Diesel":{tags:{name:"Diesel",shop:"clothes"},name:"Diesel",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Dorothy Perkins":{tags:{name:"Dorothy Perkins",shop:"clothes"},name:"Dorothy Perkins",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Dress Barn":{tags:{name:"Dress Barn",shop:"clothes"},name:"Dress Barn",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Dressmann":{tags:{name:"Dressmann",shop:"clothes"},name:"Dressmann",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Eddie Bauer":{tags:{name:"Eddie Bauer",shop:"clothes"},name:"Eddie Bauer",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Edgars":{tags:{name:"Edgars",shop:"clothes"},name:"Edgars",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Engbers":{tags:{name:"Engbers",shop:"clothes"},name:"Engbers",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Ernsting's family":{tags:{name:"Ernsting's family",shop:"clothes"},name:"Ernsting's family",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Esprit":{tags:{name:"Esprit",shop:"clothes"},name:"Esprit",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Etam":{tags:{name:"Etam",shop:"clothes"},name:"Etam",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Express":{tags:{name:"Express",shop:"clothes"},name:"Express",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Fat Face":{tags:{name:"Fat Face",shop:"clothes"},name:"Fat Face",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Forever 21":{tags:{name:"Forever 21",shop:"clothes"},name:"Forever 21",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Gant":{tags:{name:"Gant",shop:"clothes"},name:"Gant",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Gap":{tags:{name:"Gap",shop:"clothes"},name:"Gap",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Gerry Weber":{tags:{name:"Gerry Weber",shop:"clothes"},name:"Gerry Weber",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Gina Laura":{tags:{name:"Gina Laura",shop:"clothes"},name:"Gina Laura",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Guess":{tags:{name:"Guess",shop:"clothes"},name:"Guess",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Gymboree":{tags:{name:"Gymboree",shop:"clothes"},name:"Gymboree",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Gémo":{tags:{name:"Gémo",shop:"clothes"},name:"Gémo",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/H&M":{tags:{name:"H&M",shop:"clothes"},name:"H&M",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Hallhuber":{tags:{name:"Hallhuber",shop:"clothes"},name:"Hallhuber",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/House":{tags:{name:"House",shop:"clothes"},name:"House",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Hugo Boss":{tags:{name:"Hugo Boss",shop:"clothes"},name:"Hugo Boss",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Humana":{tags:{name:"Humana",shop:"clothes"},name:"Humana",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Hunkemöller":{tags:{name:"Hunkemöller",shop:"clothes"},name:"Hunkemöller",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Intimissimi":{tags:{name:"Intimissimi",shop:"clothes"},name:"Intimissimi",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/JBC":{tags:{name:"JBC",shop:"clothes"},name:"JBC",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Jack & Jones":{tags:{name:"Jack & Jones",shop:"clothes"},name:"Jack & Jones",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Jack Wolfskin":{tags:{name:"Jack Wolfskin",shop:"clothes"},name:"Jack Wolfskin",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Jeans Fritz":{tags:{name:"Jeans Fritz",shop:"clothes"},name:"Jeans Fritz",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Jennyfer":{tags:{name:"Jennyfer",shop:"clothes"},name:"Jennyfer",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Jigsaw":{tags:{name:"Jigsaw",shop:"clothes"},name:"Jigsaw",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Jules":{tags:{name:"Jules",shop:"clothes"},name:"Jules",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Justice":{tags:{name:"Justice",shop:"clothes"},name:"Justice",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/KappAhl":{tags:{name:"KappAhl",shop:"clothes"},name:"KappAhl",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/KiK":{tags:{name:"KiK",shop:"clothes"},name:"KiK",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Kiabi":{tags:{name:"Kiabi",shop:"clothes"},name:"Kiabi",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/La Halle":{tags:{name:"La Halle",shop:"clothes"},name:"La Halle",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Lacoste":{tags:{name:"Lacoste",shop:"clothes"},name:"Lacoste",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Lane Bryant":{tags:{name:"Lane Bryant",shop:"clothes"},name:"Lane Bryant",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Levi's":{tags:{name:"Levi's",shop:"clothes"},name:"Levi's",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Lindex":{tags:{name:"Lindex",shop:"clothes"},name:"Lindex",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Loft":{tags:{name:"Loft",shop:"clothes"},name:"Loft",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Mango":{tags:{name:"Mango",shop:"clothes"},name:"Mango",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Marc O'Polo":{tags:{name:"Marc O'Polo",shop:"clothes"},name:"Marc O'Polo",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Mark's":{tags:{name:"Mark's",shop:"clothes"},name:"Mark's",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Marshalls":{tags:{name:"Marshalls",shop:"clothes"},name:"Marshalls",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Massimo Dutti":{tags:{name:"Massimo Dutti",shop:"clothes"},name:"Massimo Dutti",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Matalan":{tags:{name:"Matalan",shop:"clothes"},name:"Matalan",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Maurices":{tags:{name:"Maurices",shop:"clothes"},name:"Maurices",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Max Mara":{tags:{name:"Max Mara",shop:"clothes"},name:"Max Mara",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Men's Wearhouse":{tags:{name:"Men's Wearhouse",shop:"clothes"},name:"Men's Wearhouse",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Mexx":{tags:{name:"Mexx",shop:"clothes"},name:"Mexx",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Michael Kors":{tags:{name:"Michael Kors",shop:"clothes"},name:"Michael Kors",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Mim":{tags:{name:"Mim",shop:"clothes"},name:"Mim",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Monsoon":{tags:{name:"Monsoon",shop:"clothes"},name:"Monsoon",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Mr Price":{tags:{name:"Mr Price",shop:"clothes"},name:"Mr Price",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/NKD":{tags:{name:"NKD",shop:"clothes"},name:"NKD",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/New Look":{tags:{name:"New Look",shop:"clothes"},name:"New Look",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/New Yorker":{tags:{name:"New Yorker",shop:"clothes"},name:"New Yorker",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/NewYorker":{tags:{name:"NewYorker",shop:"clothes"},name:"NewYorker",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Next":{tags:{name:"Next",shop:"clothes"},name:"Next",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Nike":{tags:{name:"Nike",shop:"clothes"},name:"Nike",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Nordstrom Rack":{tags:{name:"Nordstrom Rack",shop:"clothes"},name:"Nordstrom Rack",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/OVS":{tags:{name:"OVS",shop:"clothes"},name:"OVS",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Okaïdi":{tags:{name:"Okaïdi",shop:"clothes"},name:"Okaïdi",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Old Navy":{tags:{name:"Old Navy",shop:"clothes"},name:"Old Navy",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Only":{tags:{name:"Only",shop:"clothes"},name:"Only",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Orchestra":{tags:{name:"Orchestra",shop:"clothes"},name:"Orchestra",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Original Marines":{tags:{name:"Original Marines",shop:"clothes"},name:"Original Marines",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Orsay":{tags:{name:"Orsay",shop:"clothes"},name:"Orsay",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Outfit":{tags:{name:"Outfit",shop:"clothes"},name:"Outfit",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Outlet":{tags:{name:"Outlet",shop:"clothes"},name:"Outlet",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Palmers":{tags:{name:"Palmers",shop:"clothes"},name:"Palmers",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Peacocks":{tags:{name:"Peacocks",shop:"clothes"},name:"Peacocks",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Peek & Cloppenburg":{tags:{name:"Peek & Cloppenburg",shop:"clothes"},name:"Peek & Cloppenburg",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Pep":{tags:{name:"Pep",shop:"clothes"},name:"Pep",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Pepco":{tags:{name:"Pepco",shop:"clothes"},name:"Pepco",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Petit Bateau":{tags:{name:"Petit Bateau",shop:"clothes"},name:"Petit Bateau",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Pimkie":{tags:{name:"Pimkie",shop:"clothes"},name:"Pimkie",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Plato's Closet":{tags:{name:"Plato's Closet",shop:"clothes"},name:"Plato's Closet",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Primark":{tags:{name:"Primark",shop:"clothes"},name:"Primark",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Promod":{tags:{name:"Promod",shop:"clothes"},name:"Promod",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Pull & Bear":{tags:{name:"Pull & Bear",shop:"clothes"},name:"Pull & Bear",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Reitmans":{tags:{name:"Reitmans",shop:"clothes"},name:"Reitmans",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Reserved":{tags:{name:"Reserved",shop:"clothes"},name:"Reserved",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/River Island":{tags:{name:"River Island",shop:"clothes"},name:"River Island",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Ross":{tags:{name:"Ross",shop:"clothes"},name:"Ross",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Sela":{tags:{name:"Sela",shop:"clothes"},name:"Sela",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Sergent Major":{tags:{name:"Sergent Major",shop:"clothes"},name:"Sergent Major",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Shoeby":{tags:{name:"Shoeby",shop:"clothes"},name:"Shoeby",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Sisley":{tags:{name:"Sisley",shop:"clothes"},name:"Sisley",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Springfield":{tags:{name:"Springfield",shop:"clothes"},name:"Springfield",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Stefanel":{tags:{name:"Stefanel",shop:"clothes"},name:"Stefanel",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Steps":{tags:{name:"Steps",shop:"clothes"},name:"Steps",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Stradivarius":{tags:{name:"Stradivarius",shop:"clothes"},name:"Stradivarius",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Street One":{tags:{name:"Street One",shop:"clothes"},name:"Street One",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Superdry":{tags:{name:"Superdry",shop:"clothes"},name:"Superdry",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/TJ Maxx":{tags:{name:"TJ Maxx",shop:"clothes"},name:"TJ Maxx",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/TK Maxx":{tags:{name:"TK Maxx",shop:"clothes"},name:"TK Maxx",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Takko":{tags:{name:"Takko",shop:"clothes"},name:"Takko",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Talbots":{tags:{name:"Talbots",shop:"clothes"},name:"Talbots",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Tally Weijl":{tags:{name:"Tally Weijl",shop:"clothes"},name:"Tally Weijl",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Tati":{tags:{name:"Tati",shop:"clothes"},name:"Tati",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Terranova":{tags:{name:"Terranova",shop:"clothes"},name:"Terranova",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Tesha":{tags:{name:"Tesha",shop:"clothes"},name:"Tesha",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Tezenis":{tags:{name:"Tezenis",shop:"clothes"},name:"Tezenis",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/The Children's Place":{tags:{name:"The Children's Place",shop:"clothes"},name:"The Children's Place",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/The North Face":{tags:{name:"The North Face",shop:"clothes"},name:"The North Face",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/The Sting":{tags:{name:"The Sting",shop:"clothes"},name:"The Sting",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Timberland":{tags:{name:"Timberland",shop:"clothes"},name:"Timberland",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Toko Pakaian":{tags:{name:"Toko Pakaian",shop:"clothes"},name:"Toko Pakaian",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Tom Tailor":{tags:{name:"Tom Tailor",shop:"clothes"},name:"Tom Tailor",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Tommy Hilfiger":{tags:{name:"Tommy Hilfiger",shop:"clothes"},name:"Tommy Hilfiger",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Topshop":{tags:{name:"Topshop",shop:"clothes"},name:"Topshop",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Triumph":{tags:{name:"Triumph",shop:"clothes"},name:"Triumph",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Truworths":{tags:{name:"Truworths",shop:"clothes"},name:"Truworths",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Ulla Popken":{tags:{name:"Ulla Popken",shop:"clothes"},name:"Ulla Popken",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Uniqlo":{tags:{name:"Uniqlo",shop:"clothes"},name:"Uniqlo",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/United Colors of Benetton":{tags:{name:"United Colors of Benetton",shop:"clothes"},name:"United Colors of Benetton",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Urban Outfitters":{tags:{name:"Urban Outfitters",shop:"clothes"},name:"Urban Outfitters",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Vero Moda":{tags:{name:"Vero Moda",shop:"clothes"},name:"Vero Moda",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Victoria's Secret":{tags:{name:"Victoria's Secret",shop:"clothes"},name:"Victoria's Secret",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Vögele":{tags:{name:"Vögele",shop:"clothes"},name:"Vögele",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/WE":{tags:{name:"WE",shop:"clothes"},name:"WE",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Wibra":{tags:{name:"Wibra",shop:"clothes"},name:"Wibra",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Winners":{tags:{name:"Winners",shop:"clothes"},name:"Winners",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Yamamay":{tags:{name:"Yamamay",shop:"clothes"},name:"Yamamay",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Zara":{tags:{name:"Zara",shop:"clothes"},name:"Zara",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Zeeman":{tags:{name:"Zeeman",shop:"clothes"},name:"Zeeman",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/mister*lady":{tags:{name:"mister*lady",shop:"clothes"},name:"mister*lady",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/s.Oliver":{tags:{name:"s.Oliver",shop:"clothes"},name:"s.Oliver",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Детская одежда":{tags:{name:"Детская одежда",shop:"clothes"},name:"Детская одежда",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Женская одежда":{tags:{name:"Женская одежда",shop:"clothes"},name:"Женская одежда",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Липненски":{tags:{name:"Липненски",shop:"clothes"},name:"Липненски",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Московская ярмарка":{tags:{name:"Московская ярмарка",shop:"clothes"},name:"Московская ярмарка",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Одежда":{tags:{name:"Одежда",shop:"clothes"},name:"Одежда",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Смешные цены":{tags:{name:"Смешные цены",shop:"clothes"},name:"Смешные цены",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/Спецодежда":{tags:{name:"Спецодежда",shop:"clothes"},name:"Спецодежда",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/しまむら":{tags:{name:"しまむら",shop:"clothes"},name:"しまむら",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/ユニクロ":{tags:{name:"ユニクロ",shop:"clothes"},name:"ユニクロ",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/ワークマン":{tags:{name:"ワークマン",shop:"clothes"},name:"ワークマン",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/洋服の青山":{tags:{name:"洋服の青山",shop:"clothes"},name:"洋服の青山",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/clothes/西松屋":{tags:{name:"西松屋",shop:"clothes"},name:"西松屋",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/coffee/Nespresso":{tags:{name:"Nespresso",shop:"coffee"},name:"Nespresso",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/coffee/Tchibo":{tags:{name:"Tchibo",shop:"coffee"},name:"Tchibo",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/computer/Apple Store":{tags:{name:"Apple Store",shop:"computer"},name:"Apple Store",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/computer/DNS":{tags:{name:"DNS",shop:"computer"},name:"DNS",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/computer/PC World":{tags:{name:"PC World",shop:"computer"},name:"PC World",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/computer/ДНС":{tags:{name:"ДНС",shop:"computer"},name:"ДНС",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/confectionery/Fagyizó":{tags:{name:"Fagyizó",shop:"confectionery"},name:"Fagyizó",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/confectionery/Hussel":{tags:{name:"Hussel",shop:"confectionery"},name:"Hussel",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/confectionery/Leonidas":{tags:{name:"Leonidas",shop:"confectionery"},name:"Leonidas",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/confectionery/T. SN":{tags:{name:"T. SN",shop:"confectionery"},name:"T. SN",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/confectionery/Thorntons":{tags:{name:"Thorntons",shop:"confectionery"},name:"Thorntons",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/711":{tags:{name:"711",shop:"convenience"},name:"711",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/777":{tags:{name:"777",shop:"convenience"},name:"777",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/24 часа":{tags:{name:"24 часа",shop:"convenience"},name:"24 часа",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/7-Eleven":{tags:{name:"7-Eleven",shop:"convenience"},name:"7-Eleven",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/8 à Huit":{tags:{name:"8 à Huit",shop:"convenience"},name:"8 à Huit",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/99 Speedmart":{tags:{name:"99 Speedmart",shop:"convenience"},name:"99 Speedmart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ABC":{tags:{name:"ABC",shop:"convenience"},name:"ABC",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/AMPM":{tags:{name:"AMPM",shop:"convenience"},name:"AMPM",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Aibė":{tags:{name:"Aibė",shop:"convenience"},name:"Aibė",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Alepa":{tags:{name:"Alepa",shop:"convenience"},name:"Alepa",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Alfamart":{tags:{name:"Alfamart",shop:"convenience"},name:"Alfamart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Alimentara":{tags:{name:"Alimentara",shop:"convenience"},name:"Alimentara",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Almacen":{tags:{name:"Almacen",shop:"convenience"},name:"Almacen",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Almacén":{tags:{name:"Almacén",shop:"convenience"},name:"Almacén",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/BP Shop":{tags:{name:"BP Shop",shop:"convenience"},name:"BP Shop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Baqala":{tags:{name:"Baqala",shop:"convenience"},name:"Baqala",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Best One":{tags:{name:"Best One",shop:"convenience"},name:"Best One",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Best-One":{tags:{name:"Best-One",shop:"convenience"},name:"Best-One",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Bodega":{tags:{name:"Bodega",shop:"convenience"},name:"Bodega",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Bonjour":{tags:{name:"Bonjour",shop:"convenience"},name:"Bonjour",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/CBA":{tags:{name:"CBA",shop:"convenience"},name:"CBA",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/COOP":{tags:{name:"COOP",shop:"convenience"},name:"COOP",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/COOP Jednota":{tags:{name:"COOP Jednota",shop:"convenience"},name:"COOP Jednota",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/CU":{tags:{name:"CU",shop:"convenience"},name:"CU",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Casino Shop":{tags:{name:"Casino Shop",shop:"convenience"},name:"Casino Shop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Centra":{tags:{name:"Centra",shop:"convenience"},name:"Centra",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Central Convenience Store":{tags:{name:"Central Convenience Store",shop:"convenience"},name:"Central Convenience Store",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Circle K":{tags:{name:"Circle K",shop:"convenience"},name:"Circle K",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Coop Jednota":{tags:{name:"Coop Jednota",shop:"convenience"},name:"Coop Jednota",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Corner Store":{tags:{name:"Corner Store",shop:"convenience"},name:"Corner Store",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Costcutter":{tags:{name:"Costcutter",shop:"convenience"},name:"Costcutter",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Couche-Tard":{tags:{name:"Couche-Tard",shop:"convenience"},name:"Couche-Tard",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Cumberland Farms":{tags:{name:"Cumberland Farms",shop:"convenience"},name:"Cumberland Farms",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Daisy Mart":{tags:{name:"Daisy Mart",shop:"convenience"},name:"Daisy Mart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Delikatesy":{tags:{name:"Delikatesy",shop:"convenience"},name:"Delikatesy",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Dollar General":{tags:{name:"Dollar General",shop:"convenience"},name:"Dollar General",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Dépanneur":{tags:{name:"Dépanneur",shop:"convenience"},name:"Dépanneur",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/FamilyMart":{tags:{name:"FamilyMart",shop:"convenience"},name:"FamilyMart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Food Mart":{tags:{name:"Food Mart",shop:"convenience"},name:"Food Mart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Four Square":{tags:{name:"Four Square",shop:"convenience"},name:"Four Square",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Fresh":{tags:{name:"Fresh",shop:"convenience"},name:"Fresh",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Freshmarket":{tags:{name:"Freshmarket",shop:"convenience"},name:"Freshmarket",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/GS25":{tags:{name:"GS25",shop:"convenience"},name:"GS25",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Groszek":{tags:{name:"Groszek",shop:"convenience"},name:"Groszek",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Hasty Market":{tags:{name:"Hasty Market",shop:"convenience"},name:"Hasty Market",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Hruška":{tags:{name:"Hruška",shop:"convenience"},name:"Hruška",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Indomaret":{tags:{name:"Indomaret",shop:"convenience"},name:"Indomaret",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Jednota":{tags:{name:"Jednota",shop:"convenience"},name:"Jednota",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Joker":{tags:{name:"Joker",shop:"convenience"},name:"Joker",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/K-Market":{tags:{name:"K-Market",shop:"convenience"},name:"K-Market",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Kangaroo Express":{tags:{name:"Kangaroo Express",shop:"convenience"},name:"Kangaroo Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Kisbolt":{tags:{name:"Kisbolt",shop:"convenience"},name:"Kisbolt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Lawson":{tags:{name:"Lawson",shop:"convenience"},name:"Lawson",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Lewiatan":{tags:{name:"Lewiatan",shop:"convenience"},name:"Lewiatan",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Lifestyle Express":{tags:{name:"Lifestyle Express",shop:"convenience"},name:"Lifestyle Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Londis":{tags:{name:"Londis",shop:"convenience"},name:"Londis",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/M&S Simply Food":{tags:{name:"M&S Simply Food",shop:"convenience"},name:"M&S Simply Food",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mac's":{tags:{name:"Mac's",shop:"convenience"},name:"Mac's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mace":{tags:{name:"Mace",shop:"convenience"},name:"Mace",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Magazin":{tags:{name:"Magazin",shop:"convenience"},name:"Magazin",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Magazin Mixt":{tags:{name:"Magazin Mixt",shop:"convenience"},name:"Magazin Mixt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Magazin Non-Stop":{tags:{name:"Magazin Non-Stop",shop:"convenience"},name:"Magazin Non-Stop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Magazin mixt":{tags:{name:"Magazin mixt",shop:"convenience"},name:"Magazin mixt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Maxikiosco":{tags:{name:"Maxikiosco",shop:"convenience"},name:"Maxikiosco",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Małpka Express":{tags:{name:"Małpka Express",shop:"convenience"},name:"Małpka Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/McColl's":{tags:{name:"McColl's",shop:"convenience"},name:"McColl's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Migrolino":{tags:{name:"Migrolino",shop:"convenience"},name:"Migrolino",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mini ABC":{tags:{name:"Mini ABC",shop:"convenience"},name:"Mini ABC",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mini Market":{tags:{name:"Mini Market",shop:"convenience"},name:"Mini Market",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mini Market Non-Stop":{tags:{name:"Mini Market Non-Stop",shop:"convenience"},name:"Mini Market Non-Stop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mini Mart":{tags:{name:"Mini Mart",shop:"convenience"},name:"Mini Mart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mini Stop":{tags:{name:"Mini Stop",shop:"convenience"},name:"Mini Stop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Minimercado":{tags:{name:"Minimercado",shop:"convenience"},name:"Minimercado",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Mlin i pekare":{tags:{name:"Mlin i pekare",shop:"convenience"},name:"Mlin i pekare",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Nasz Sklep":{tags:{name:"Nasz Sklep",shop:"convenience"},name:"Nasz Sklep",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Nisa":{tags:{name:"Nisa",shop:"convenience"},name:"Nisa",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Nisa Local":{tags:{name:"Nisa Local",shop:"convenience"},name:"Nisa Local",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/OK-Mart":{tags:{name:"OK-Mart",shop:"convenience"},name:"OK-Mart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/OK便利商店":{tags:{name:"OK便利商店",shop:"convenience"},name:"OK便利商店",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/OK便利店 Circle K":{tags:{name:"OK便利店 Circle K",shop:"convenience"},name:"OK便利店 Circle K",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Odido":{tags:{name:"Odido",shop:"convenience"},name:"Odido",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/On The Run":{tags:{name:"On The Run",shop:"convenience"},name:"On The Run",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/On the Run":{tags:{name:"On the Run",shop:"convenience"},name:"On the Run",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/One Stop":{tags:{name:"One Stop",shop:"convenience"},name:"One Stop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Oxxo":{tags:{name:"Oxxo",shop:"convenience"},name:"Oxxo",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Parduotuvė":{tags:{name:"Parduotuvė",shop:"convenience"},name:"Parduotuvė",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Petit Casino":{tags:{name:"Petit Casino",shop:"convenience"},name:"Petit Casino",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Plaid Pantry":{tags:{name:"Plaid Pantry",shop:"convenience"},name:"Plaid Pantry",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Potraviny":{tags:{name:"Potraviny",shop:"convenience"},name:"Potraviny",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Prehrana":{tags:{name:"Prehrana",shop:"convenience"},name:"Prehrana",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Premier":{tags:{name:"Premier",shop:"convenience"},name:"Premier",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Proxi":{tags:{name:"Proxi",shop:"convenience"},name:"Proxi",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Proxy":{tags:{name:"Proxy",shop:"convenience"},name:"Proxy",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Pulperia":{tags:{name:"Pulperia",shop:"convenience"},name:"Pulperia",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Royal Farms":{tags:{name:"Royal Farms",shop:"convenience"},name:"Royal Farms",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Sale":{tags:{name:"Sale",shop:"convenience"},name:"Sale",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Sari-sari Store":{tags:{name:"Sari-sari Store",shop:"convenience"},name:"Sari-sari Store",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Select":{tags:{name:"Select",shop:"convenience"},name:"Select",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Shell Select":{tags:{name:"Shell Select",shop:"convenience"},name:"Shell Select",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Shop & Go":{tags:{name:"Shop & Go",shop:"convenience"},name:"Shop & Go",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Siwa":{tags:{name:"Siwa",shop:"convenience"},name:"Siwa",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Sklep spożywczy":{tags:{name:"Sklep spożywczy",shop:"convenience"},name:"Sklep spożywczy",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Smíšené zboží":{tags:{name:"Smíšené zboží",shop:"convenience"},name:"Smíšené zboží",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Społem":{tags:{name:"Społem",shop:"convenience"},name:"Społem",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Spätkauf":{tags:{name:"Spätkauf",shop:"convenience"},name:"Spätkauf",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Stewart's":{tags:{name:"Stewart's",shop:"convenience"},name:"Stewart's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Stores":{tags:{name:"Stores",shop:"convenience"},name:"Stores",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Stripes":{tags:{name:"Stripes",shop:"convenience"},name:"Stripes",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Studenac":{tags:{name:"Studenac",shop:"convenience"},name:"Studenac",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Sunkus":{tags:{name:"Sunkus",shop:"convenience"},name:"Sunkus",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Słoneczko":{tags:{name:"Słoneczko",shop:"convenience"},name:"Słoneczko",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/TESCO Lotus Express":{tags:{name:"TESCO Lotus Express",shop:"convenience"},name:"TESCO Lotus Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Tesco Express":{tags:{name:"Tesco Express",shop:"convenience"},name:"Tesco Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Tesco Lotus Express":{tags:{name:"Tesco Lotus Express",shop:"convenience"},name:"Tesco Lotus Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Tom Market 89":{tags:{name:"Tom Market 89",shop:"convenience"},name:"Tom Market 89",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/United Dairy Farmers":{tags:{name:"United Dairy Farmers",shop:"convenience"},name:"United Dairy Farmers",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Vegyesbolt":{tags:{name:"Vegyesbolt",shop:"convenience"},name:"Vegyesbolt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Večerka":{tags:{name:"Večerka",shop:"convenience"},name:"Večerka",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Vival":{tags:{name:"Vival",shop:"convenience"},name:"Vival",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Wawa":{tags:{name:"Wawa",shop:"convenience"},name:"Wawa",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Weltladen":{tags:{name:"Weltladen",shop:"convenience"},name:"Weltladen",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/abc":{tags:{name:"abc",shop:"convenience"},name:"abc",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ampm":{tags:{name:"ampm",shop:"convenience"},name:"ampm",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/best-one":{tags:{name:"best-one",shop:"convenience"},name:"best-one",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/odido":{tags:{name:"odido",shop:"convenience"},name:"odido",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Élelmiszer":{tags:{name:"Élelmiszer",shop:"convenience"},name:"Élelmiszer",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Élelmiszerbolt":{tags:{name:"Élelmiszerbolt",shop:"convenience"},name:"Élelmiszerbolt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Żabka":{tags:{name:"Żabka",shop:"convenience"},name:"Żabka",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Žabka":{tags:{name:"Žabka",shop:"convenience"},name:"Žabka",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Августина":{tags:{name:"Августина",shop:"convenience"},name:"Августина",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Авоська":{tags:{name:"Авоська",shop:"convenience"},name:"Авоська",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Агрокомплекс":{tags:{name:"Агрокомплекс",shop:"convenience"},name:"Агрокомплекс",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Альянс":{tags:{name:"Альянс",shop:"convenience"},name:"Альянс",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Апельсин":{tags:{name:"Апельсин",shop:"convenience"},name:"Апельсин",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ассорти":{tags:{name:"Ассорти",shop:"convenience"},name:"Ассорти",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Белорусские продукты":{tags:{name:"Белорусские продукты",shop:"convenience"},name:"Белорусские продукты",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Берёзка":{tags:{name:"Берёзка",shop:"convenience"},name:"Берёзка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Везунчик":{tags:{name:"Везунчик",shop:"convenience"},name:"Везунчик",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Весна":{tags:{name:"Весна",shop:"convenience"},name:"Весна",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ветеран":{tags:{name:"Ветеран",shop:"convenience"},name:"Ветеран",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Визит":{tags:{name:"Визит",shop:"convenience"},name:"Визит",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Виктория":{tags:{name:"Виктория",shop:"convenience"},name:"Виктория",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ВкусВилл":{tags:{name:"ВкусВилл",shop:"convenience"},name:"ВкусВилл",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Гастроном":{tags:{name:"Гастроном",shop:"convenience"},name:"Гастроном",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Гермес":{tags:{name:"Гермес",shop:"convenience"},name:"Гермес",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Гурман":{tags:{name:"Гурман",shop:"convenience"},name:"Гурман",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Домашний":{tags:{name:"Домашний",shop:"convenience"},name:"Домашний",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Елена":{tags:{name:"Елена",shop:"convenience"},name:"Елена",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ермолино":{tags:{name:"Ермолино",shop:"convenience"},name:"Ермолино",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Калинка":{tags:{name:"Калинка",shop:"convenience"},name:"Калинка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Кировский":{tags:{name:"Кировский",shop:"convenience"},name:"Кировский",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Колобок":{tags:{name:"Колобок",shop:"convenience"},name:"Колобок",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Колосок":{tags:{name:"Колосок",shop:"convenience"},name:"Колосок",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Копеечка":{tags:{name:"Копеечка",shop:"convenience"},name:"Копеечка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Копейка":{tags:{name:"Копейка",shop:"convenience"},name:"Копейка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Корзинка":{tags:{name:"Корзинка",shop:"convenience"},name:"Корзинка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Крамниця":{tags:{name:"Крамниця",shop:"convenience"},name:"Крамниця",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Кристалл":{tags:{name:"Кристалл",shop:"convenience"},name:"Кристалл",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Кулинария":{tags:{name:"Кулинария",shop:"convenience"},name:"Кулинария",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Купец":{tags:{name:"Купец",shop:"convenience"},name:"Купец",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ласточка":{tags:{name:"Ласточка",shop:"convenience"},name:"Ласточка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Лидер":{tags:{name:"Лидер",shop:"convenience"},name:"Лидер",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Любимый":{tags:{name:"Любимый",shop:"convenience"},name:"Любимый",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Люкс":{tags:{name:"Люкс",shop:"convenience"},name:"Люкс",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Магазин при АЗС":{tags:{name:"Магазин при АЗС",shop:"convenience"},name:"Магазин при АЗС",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Мария-Ра":{tags:{name:"Мария-Ра",shop:"convenience"},name:"Мария-Ра",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Маяк":{tags:{name:"Маяк",shop:"convenience"},name:"Маяк",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Меркурий":{tags:{name:"Меркурий",shop:"convenience"},name:"Меркурий",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Мечта":{tags:{name:"Мечта",shop:"convenience"},name:"Мечта",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Минимаркет":{tags:{name:"Минимаркет",shop:"convenience"},name:"Минимаркет",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Мираж":{tags:{name:"Мираж",shop:"convenience"},name:"Мираж",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Надежда":{tags:{name:"Надежда",shop:"convenience"},name:"Надежда",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ника":{tags:{name:"Ника",shop:"convenience"},name:"Ника",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Оазис":{tags:{name:"Оазис",shop:"convenience"},name:"Оазис",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Олимп":{tags:{name:"Олимп",shop:"convenience"},name:"Олимп",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Подсолнух":{tags:{name:"Подсолнух",shop:"convenience"},name:"Подсолнух",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Престиж":{tags:{name:"Престиж",shop:"convenience"},name:"Престиж",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продукти":{tags:{name:"Продукти",shop:"convenience"},name:"Продукти",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продуктовый":{tags:{name:"Продуктовый",shop:"convenience"},name:"Продуктовый",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продуктовый магазин":{tags:{name:"Продуктовый магазин",shop:"convenience"},name:"Продуктовый магазин",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продукты":{tags:{name:"Продукты",shop:"convenience"},name:"Продукты",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Продукты 24":{tags:{name:"Продукты 24",shop:"convenience"},name:"Продукты 24",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Радуга":{tags:{name:"Радуга",shop:"convenience"},name:"Радуга",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Родны кут":{tags:{name:"Родны кут",shop:"convenience"},name:"Родны кут",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Ромашка":{tags:{name:"Ромашка",shop:"convenience"},name:"Ромашка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Русь":{tags:{name:"Русь",shop:"convenience"},name:"Русь",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Светлана":{tags:{name:"Светлана",shop:"convenience"},name:"Светлана",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Смак":{tags:{name:"Смак",shop:"convenience"},name:"Смак",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Солнечный":{tags:{name:"Солнечный",shop:"convenience"},name:"Солнечный",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Татьяна":{tags:{name:"Татьяна",shop:"convenience"},name:"Татьяна",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Тройка":{tags:{name:"Тройка",shop:"convenience"},name:"Тройка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/У Палыча":{tags:{name:"У Палыча",shop:"convenience"},name:"У Палыча",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Универсам":{tags:{name:"Универсам",shop:"convenience"},name:"Универсам",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Фортуна":{tags:{name:"Фортуна",shop:"convenience"},name:"Фортуна",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Хороший":{tags:{name:"Хороший",shop:"convenience"},name:"Хороший",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Центральный":{tags:{name:"Центральный",shop:"convenience"},name:"Центральный",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Чайка":{tags:{name:"Чайка",shop:"convenience"},name:"Чайка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Шанс":{tags:{name:"Шанс",shop:"convenience"},name:"Шанс",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Эконом":{tags:{name:"Эконом",shop:"convenience"},name:"Эконом",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Юбилейный":{tags:{name:"Юбилейный",shop:"convenience"},name:"Юбилейный",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/Юлия":{tags:{name:"Юлия",shop:"convenience"},name:"Юлия",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/продукты":{tags:{name:"продукты",shop:"convenience"},name:"продукты",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/მარკეტი":{tags:{name:"მარკეტი",shop:"convenience"},name:"მარკეტი",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/サンクス":{tags:{name:"サンクス","name:en":"Sunkus",shop:"convenience"},name:"サンクス",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/サークルK":{tags:{name:"サークルK","name:en":"Circle K",shop:"convenience"},name:"サークルK",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/スリーエフ":{tags:{name:"スリーエフ",shop:"convenience"},name:"スリーエフ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/セイコーマート":{tags:{name:"セイコーマート",shop:"convenience"},name:"セイコーマート",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/セブン-イレブン":{tags:{name:"セブン-イレブン","name:en":"7-Eleven",shop:"convenience"},name:"セブン-イレブン",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/セブンイレブン(Seven-Eleven)":{tags:{name:"セブンイレブン(Seven-Eleven)",shop:"convenience"},name:"セブンイレブン(Seven-Eleven)",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/セーブオン":{tags:{name:"セーブオン",shop:"convenience"},name:"セーブオン",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/デイリーヤマザキ":{tags:{name:"デイリーヤマザキ",shop:"convenience"},name:"デイリーヤマザキ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ファミリーマート":{tags:{name:"ファミリーマート","name:en":"FamilyMart",shop:"convenience"},name:"ファミリーマート",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ポプラ":{tags:{name:"ポプラ",shop:"convenience"},name:"ポプラ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ミニストップ":{tags:{name:"ミニストップ","name:en":"MINISTOP",shop:"convenience"},name:"ミニストップ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ヤマザキショップ":{tags:{name:"ヤマザキショップ",shop:"convenience"},name:"ヤマザキショップ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ローソン":{tags:{name:"ローソン","name:en":"Lawson",shop:"convenience"},name:"ローソン",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/ローソンストア100":{tags:{name:"ローソンストア100",shop:"convenience"},name:"ローソンストア100",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/全家":{tags:{name:"全家",shop:"convenience"},name:"全家",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/全家便利商店":{tags:{name:"全家便利商店",shop:"convenience"},name:"全家便利商店",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/萊爾富":{tags:{name:"萊爾富",shop:"convenience"},name:"萊爾富",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/convenience/세븐일레븐":{tags:{name:"세븐일레븐",shop:"convenience"},name:"세븐일레븐",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/copyshop/FedEx Office":{tags:{name:"FedEx Office",shop:"copyshop"},name:"FedEx Office",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/copyshop/FedEx Office Print and Ship Center":{tags:{name:"FedEx Office Print and Ship Center",shop:"copyshop"},name:"FedEx Office Print and Ship Center",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Douglas":{tags:{name:"Douglas",shop:"cosmetics"},name:"Douglas",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Lush":{tags:{name:"Lush",shop:"cosmetics"},name:"Lush",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Marionnaud":{tags:{name:"Marionnaud",shop:"cosmetics"},name:"Marionnaud",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Sephora":{tags:{name:"Sephora",shop:"cosmetics"},name:"Sephora",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/The Body Shop":{tags:{name:"The Body Shop",shop:"cosmetics"},name:"The Body Shop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Л'Этуаль":{tags:{name:"Л'Этуаль",shop:"cosmetics"},name:"Л'Этуаль",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Магнит косметик":{tags:{name:"Магнит косметик",shop:"cosmetics"},name:"Магнит косметик",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Магнит-Косметик":{tags:{name:"Магнит-Косметик",shop:"cosmetics"},name:"Магнит-Косметик",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/cosmetics/Подружка":{tags:{name:"Подружка",shop:"cosmetics"},name:"Подружка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/craft/Hobby Lobby":{tags:{name:"Hobby Lobby",shop:"craft"},name:"Hobby Lobby",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/craft/Michaels":{tags:{name:"Michaels",shop:"craft"},name:"Michaels",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Argos":{tags:{name:"Argos",shop:"department_store"},name:"Argos",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Bed Bath & Beyond":{tags:{name:"Bed Bath & Beyond",shop:"department_store"},name:"Bed Bath & Beyond",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Big Lots":{tags:{name:"Big Lots",shop:"department_store"},name:"Big Lots",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Big W":{tags:{name:"Big W",shop:"department_store"},name:"Big W",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Canadian Tire":{tags:{name:"Canadian Tire",shop:"department_store"},name:"Canadian Tire",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Coppel":{tags:{name:"Coppel",shop:"department_store"},name:"Coppel",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Debenhams":{tags:{name:"Debenhams",shop:"department_store"},name:"Debenhams",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Dillard's":{tags:{name:"Dillard's",shop:"department_store"},name:"Dillard's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/El Corte Inglés":{tags:{name:"El Corte Inglés",shop:"department_store"},name:"El Corte Inglés",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Galeria Kaufhof":{tags:{name:"Galeria Kaufhof",shop:"department_store"},name:"Galeria Kaufhof",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/HEMA":{tags:{name:"HEMA",shop:"department_store"},name:"HEMA",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Harvey Norman":{tags:{name:"Harvey Norman",shop:"department_store"},name:"Harvey Norman",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/JCPenney":{tags:{name:"JCPenney",shop:"department_store"},name:"JCPenney",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Karstadt":{tags:{name:"Karstadt",shop:"department_store"},name:"Karstadt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Kmart":{tags:{name:"Kmart",shop:"department_store"},name:"Kmart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Kohl's":{tags:{name:"Kohl's",shop:"department_store"},name:"Kohl's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Lojas Americanas":{tags:{name:"Lojas Americanas",shop:"department_store"},name:"Lojas Americanas",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Macy's":{tags:{name:"Macy's",shop:"department_store"},name:"Macy's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Marks & Spencer":{tags:{name:"Marks & Spencer",shop:"department_store"},name:"Marks & Spencer",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Myer":{tags:{name:"Myer",shop:"department_store"},name:"Myer",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Nordstrom":{tags:{name:"Nordstrom",shop:"department_store"},name:"Nordstrom",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Sears":{tags:{name:"Sears",shop:"department_store"},name:"Sears",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Shopko":{tags:{name:"Shopko",shop:"department_store"},name:"Shopko",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Target":{tags:{name:"Target",shop:"department_store"},name:"Target",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/The Warehouse":{tags:{name:"The Warehouse",shop:"department_store"},name:"The Warehouse",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Woolworth":{tags:{name:"Woolworth",shop:"department_store"},name:"Woolworth",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/department_store/Универмаг":{tags:{name:"Универмаг",shop:"department_store"},name:"Универмаг",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Ace Hardware":{tags:{name:"Ace Hardware",shop:"doityourself"},name:"Ace Hardware",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/B&Q":{tags:{name:"B&Q",shop:"doityourself"},name:"B&Q",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Bauhaus":{tags:{name:"Bauhaus",shop:"doityourself"},name:"Bauhaus",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Biltema":{tags:{name:"Biltema",shop:"doityourself"},name:"Biltema",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Brico":{tags:{name:"Brico",shop:"doityourself"},name:"Brico",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Bricomarché":{tags:{name:"Bricomarché",shop:"doityourself"},name:"Bricomarché",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Bricorama":{tags:{name:"Bricorama",shop:"doityourself"},name:"Bricorama",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Bunnings Warehouse":{tags:{name:"Bunnings Warehouse",shop:"doityourself"},name:"Bunnings Warehouse",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Castorama":{tags:{name:"Castorama",shop:"doityourself"},name:"Castorama",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Easy":{tags:{name:"Easy",shop:"doityourself"},name:"Easy",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Gamma":{tags:{name:"Gamma",shop:"doityourself"},name:"Gamma",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Globus Baumarkt":{tags:{name:"Globus Baumarkt",shop:"doityourself"},name:"Globus Baumarkt",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Hagebaumarkt":{tags:{name:"Hagebaumarkt",shop:"doityourself"},name:"Hagebaumarkt",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Hellweg":{tags:{name:"Hellweg",shop:"doityourself"},name:"Hellweg",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Home Depot":{tags:{name:"Home Depot",shop:"doityourself"},name:"Home Depot",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Home Hardware":{tags:{name:"Home Hardware",shop:"doityourself"},name:"Home Hardware",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Homebase":{tags:{name:"Homebase",shop:"doityourself"},name:"Homebase",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Hornbach":{tags:{name:"Hornbach",shop:"doityourself"},name:"Hornbach",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Hubo":{tags:{name:"Hubo",shop:"doityourself"},name:"Hubo",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Karwei":{tags:{name:"Karwei",shop:"doityourself"},name:"Karwei",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Lagerhaus":{tags:{name:"Lagerhaus",shop:"doityourself"},name:"Lagerhaus",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Leroy Merlin":{tags:{name:"Leroy Merlin",shop:"doityourself"},name:"Leroy Merlin",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Lowe's":{tags:{name:"Lowe's",shop:"doityourself"},name:"Lowe's",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Lowes":{tags:{name:"Lowes",shop:"doityourself"},name:"Lowes",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Menards":{tags:{name:"Menards",shop:"doityourself"},name:"Menards",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Mr Bricolage":{tags:{name:"Mr Bricolage",shop:"doityourself"},name:"Mr Bricolage",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Mr.Bricolage":{tags:{name:"Mr.Bricolage",shop:"doityourself"},name:"Mr.Bricolage",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/OBI":{tags:{name:"OBI",shop:"doityourself"},name:"OBI",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Point P":{tags:{name:"Point P",shop:"doityourself"},name:"Point P",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Praktiker":{tags:{name:"Praktiker",shop:"doityourself"},name:"Praktiker",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Praxis":{tags:{name:"Praxis",shop:"doityourself"},name:"Praxis",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Rona":{tags:{name:"Rona",shop:"doityourself"},name:"Rona",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Screwfix":{tags:{name:"Screwfix",shop:"doityourself"},name:"Screwfix",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Sonderpreis Baumarkt":{tags:{name:"Sonderpreis Baumarkt",shop:"doityourself"},name:"Sonderpreis Baumarkt",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Tekzen":{tags:{name:"Tekzen",shop:"doityourself"},name:"Tekzen",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Toom Baumarkt":{tags:{name:"Toom Baumarkt",shop:"doityourself"},name:"Toom Baumarkt",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Weldom":{tags:{name:"Weldom",shop:"doityourself"},name:"Weldom",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Wickes":{tags:{name:"Wickes",shop:"doityourself"},name:"Wickes",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Леруа Мерлен":{tags:{name:"Леруа Мерлен",shop:"doityourself"},name:"Леруа Мерлен",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Мастер":{tags:{name:"Мастер",shop:"doityourself"},name:"Мастер",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Строитель":{tags:{name:"Строитель",shop:"doityourself"},name:"Строитель",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/Стройматериалы":{tags:{name:"Стройматериалы",shop:"doityourself"},name:"Стройматериалы",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/カインズホーム":{tags:{name:"カインズホーム",shop:"doityourself"},name:"カインズホーム",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/コメリ":{tags:{name:"コメリ",shop:"doityourself"},name:"コメリ",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/doityourself/コーナン":{tags:{name:"コーナン",shop:"doityourself"},name:"コーナン",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/dry_cleaning/Cleaners":{tags:{name:"Cleaners",shop:"dry_cleaning"},name:"Cleaners",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/dry_cleaning/Pressing":{tags:{name:"Pressing",shop:"dry_cleaning"},name:"Pressing",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/dry_cleaning/Диана":{tags:{name:"Диана",shop:"dry_cleaning"},name:"Диана",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/dry_cleaning/Химчистка":{tags:{name:"Химчистка",shop:"dry_cleaning"},name:"Химчистка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/dry_cleaning/ホワイト急便":{tags:{name:"ホワイト急便",shop:"dry_cleaning"},name:"ホワイト急便",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/BCC":{tags:{name:"BCC",shop:"electronics"},name:"BCC",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Batteries Plus Bulbs":{tags:{name:"Batteries Plus Bulbs",shop:"electronics"},name:"Batteries Plus Bulbs",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Best Buy":{tags:{name:"Best Buy",shop:"electronics"},name:"Best Buy",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Boulanger":{tags:{name:"Boulanger",shop:"electronics"},name:"Boulanger",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Currys":{tags:{name:"Currys",shop:"electronics"},name:"Currys",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Currys PC World":{tags:{name:"Currys PC World",shop:"electronics"},name:"Currys PC World",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Darty":{tags:{name:"Darty",shop:"electronics"},name:"Darty",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Elektra":{tags:{name:"Elektra",shop:"electronics"},name:"Elektra",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Elgiganten":{tags:{name:"Elgiganten",shop:"electronics"},name:"Elgiganten",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Euronics":{tags:{name:"Euronics",shop:"electronics"},name:"Euronics",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Expert":{tags:{name:"Expert",shop:"electronics"},name:"Expert",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Hartlauer":{tags:{name:"Hartlauer",shop:"electronics"},name:"Hartlauer",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Interdiscount":{tags:{name:"Interdiscount",shop:"electronics"},name:"Interdiscount",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/La Curacao":{tags:{name:"La Curacao",shop:"electronics"},name:"La Curacao",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Maplin":{tags:{name:"Maplin",shop:"electronics"},name:"Maplin",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Media Expert":{tags:{name:"Media Expert",shop:"electronics"},name:"Media Expert",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Media Markt":{tags:{name:"Media Markt",shop:"electronics"},name:"Media Markt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Musimundo":{tags:{name:"Musimundo",shop:"electronics"},name:"Musimundo",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Neonet":{tags:{name:"Neonet",shop:"electronics"},name:"Neonet",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/RTV Euro AGD":{tags:{name:"RTV Euro AGD",shop:"electronics"},name:"RTV Euro AGD",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Radio Shack":{tags:{name:"Radio Shack",shop:"electronics"},name:"Radio Shack",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Rogers":{tags:{name:"Rogers",shop:"electronics"},name:"Rogers",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Samsung":{tags:{name:"Samsung",shop:"electronics"},name:"Samsung",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Saturn":{tags:{name:"Saturn",shop:"electronics"},name:"Saturn",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Sony":{tags:{name:"Sony",shop:"electronics"},name:"Sony",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/The Source":{tags:{name:"The Source",shop:"electronics"},name:"The Source",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Unieuro":{tags:{name:"Unieuro",shop:"electronics"},name:"Unieuro",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/М.Видео":{tags:{name:"М.Видео",shop:"electronics"},name:"М.Видео",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Фокстрот":{tags:{name:"Фокстрот",shop:"electronics"},name:"Фокстрот",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Эксперт":{tags:{name:"Эксперт",shop:"electronics"},name:"Эксперт",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/Эльдорадо":{tags:{name:"Эльдорадо",shop:"electronics"},name:"Эльдорадо",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/エディオン":{tags:{name:"エディオン",shop:"electronics"},name:"エディオン",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/ケーズデンキ":{tags:{name:"ケーズデンキ",shop:"electronics"},name:"ケーズデンキ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/コジマ":{tags:{name:"コジマ",shop:"electronics"},name:"コジマ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/ヤマダ電機":{tags:{name:"ヤマダ電機",shop:"electronics"},name:"ヤマダ電機",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/全國電子":{tags:{name:"全國電子",shop:"electronics"},name:"全國電子",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/electronics/燦坤3C":{tags:{name:"燦坤3C",shop:"electronics"},name:"燦坤3C",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/erotic/Orion":{tags:{name:"Orion",shop:"erotic"},name:"Orion",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/fabric/Ткани":{tags:{name:"Ткани",shop:"fabric"},name:"Ткани",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/farm/Hofladen":{tags:{name:"Hofladen",shop:"farm"},name:"Hofladen",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Blume 2000":{tags:{name:"Blume 2000",shop:"florist"},name:"Blume 2000",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Blumen Risse":{tags:{name:"Blumen Risse",shop:"florist"},name:"Blumen Risse",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Fleuriste":{tags:{name:"Fleuriste",shop:"florist"},name:"Fleuriste",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Interflora":{tags:{name:"Interflora",shop:"florist"},name:"Interflora",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Monceau Fleurs":{tags:{name:"Monceau Fleurs",shop:"florist"},name:"Monceau Fleurs",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Virágbolt":{tags:{name:"Virágbolt",shop:"florist"},name:"Virágbolt",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Квіти":{tags:{name:"Квіти",shop:"florist"},name:"Квіти",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Цветочный магазин":{tags:{name:"Цветочный магазин",shop:"florist"},name:"Цветочный магазин",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/florist/Цветы":{tags:{name:"Цветы",shop:"florist"},name:"Цветы",icon:"maki-florist",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/frame/rumah penduduk":{tags:{name:"rumah penduduk",shop:"frame"},name:"rumah penduduk",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/funeral_directors/The Co-operative Funeralcare":{tags:{name:"The Co-operative Funeralcare",shop:"funeral_directors"},name:"The Co-operative Funeralcare",icon:"maki-cemetery",geometry:["point","area"],fields:["name","operator","address","building_area","religion","denomination"],suggestion:true},"shop/funeral_directors/Ритуальные услуги":{tags:{name:"Ритуальные услуги",shop:"funeral_directors"},name:"Ритуальные услуги",icon:"maki-cemetery",geometry:["point","area"],fields:["name","operator","address","building_area","religion","denomination"],suggestion:true},"shop/furniture/Aaron's":{tags:{name:"Aaron's",shop:"furniture"},name:"Aaron's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Black Red White":{tags:{name:"Black Red White",shop:"furniture"},name:"Black Red White",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Bodzio":{tags:{name:"Bodzio",shop:"furniture"},name:"Bodzio",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/But":{tags:{name:"But",shop:"furniture"},name:"But",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Conforama":{tags:{name:"Conforama",shop:"furniture"},name:"Conforama",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/DFS":{tags:{name:"DFS",shop:"furniture"},name:"DFS",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Dänisches Bettenlager":{tags:{name:"Dänisches Bettenlager",shop:"furniture"},name:"Dänisches Bettenlager",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Fly":{tags:{name:"Fly",shop:"furniture"},name:"Fly",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Harveys":{tags:{name:"Harveys",shop:"furniture"},name:"Harveys",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/IKEA":{tags:{name:"IKEA",shop:"furniture"},name:"IKEA",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/JYSK":{tags:{name:"JYSK",shop:"furniture"},name:"JYSK",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Kwantum":{tags:{name:"Kwantum",shop:"furniture"},name:"Kwantum",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Leen Bakker":{tags:{name:"Leen Bakker",shop:"furniture"},name:"Leen Bakker",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Pier 1 Imports":{tags:{name:"Pier 1 Imports",shop:"furniture"},name:"Pier 1 Imports",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Roller":{tags:{name:"Roller",shop:"furniture"},name:"Roller",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/The Brick":{tags:{name:"The Brick",shop:"furniture"},name:"The Brick",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/Меблі":{tags:{name:"Меблі",shop:"furniture"},name:"Меблі",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/furniture/ニトリ":{tags:{name:"ニトリ",shop:"furniture"},name:"ニトリ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/garden_centre/Dehner":{tags:{name:"Dehner",shop:"garden_centre"},name:"Dehner",icon:"maki-garden-center",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/garden_centre/Gamm Vert":{tags:{name:"Gamm Vert",shop:"garden_centre"},name:"Gamm Vert",icon:"maki-garden-center",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/garden_centre/Jardiland":{tags:{name:"Jardiland",shop:"garden_centre"},name:"Jardiland",icon:"maki-garden-center",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/garden_centre/Point Vert":{tags:{name:"Point Vert",shop:"garden_centre"},name:"Point Vert",icon:"maki-garden-center",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/garden_centre/Welkoop":{tags:{name:"Welkoop",shop:"garden_centre"},name:"Welkoop",icon:"maki-garden-center",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/garden_centre/Семена":{tags:{name:"Семена",shop:"garden_centre"},name:"Семена",icon:"maki-garden-center",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/gift/Card Factory":{tags:{name:"Card Factory",shop:"gift"},name:"Card Factory",icon:"maki-gift",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/gift/Hallmark":{tags:{name:"Hallmark",shop:"gift"},name:"Hallmark",icon:"maki-gift",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/gift/Подарки":{tags:{name:"Подарки",shop:"gift"},name:"Подарки",icon:"maki-gift",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/greengrocer/Frutería":{tags:{name:"Frutería",shop:"greengrocer"},name:"Frutería",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/greengrocer/Овощи и фрукты":{tags:{name:"Овощи и фрукты",shop:"greengrocer"},name:"Овощи и фрукты",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Berber":{tags:{name:"Berber",shop:"hairdresser"},name:"Berber",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Cost Cutters":{tags:{name:"Cost Cutters",shop:"hairdresser"},name:"Cost Cutters",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Fantastic Sams":{tags:{name:"Fantastic Sams",shop:"hairdresser"},name:"Fantastic Sams",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Figaro":{tags:{name:"Figaro",shop:"hairdresser"},name:"Figaro",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/First Choice Haircutters":{tags:{name:"First Choice Haircutters",shop:"hairdresser"},name:"First Choice Haircutters",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Franck Provost":{tags:{name:"Franck Provost",shop:"hairdresser"},name:"Franck Provost",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Frizerie":{tags:{name:"Frizerie",shop:"hairdresser"},name:"Frizerie",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Great Clips":{tags:{name:"Great Clips",shop:"hairdresser"},name:"Great Clips",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Haarmonie":{tags:{name:"Haarmonie",shop:"hairdresser"},name:"Haarmonie",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Haarscharf":{tags:{name:"Haarscharf",shop:"hairdresser"},name:"Haarscharf",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Hair Cuttery":{tags:{name:"Hair Cuttery",shop:"hairdresser"},name:"Hair Cuttery",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Hairkiller":{tags:{name:"Hairkiller",shop:"hairdresser"},name:"Hairkiller",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Jean Louis David":{tags:{name:"Jean Louis David",shop:"hairdresser"},name:"Jean Louis David",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Jean-Louis David":{tags:{name:"Jean-Louis David",shop:"hairdresser"},name:"Jean-Louis David",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Klier":{tags:{name:"Klier",shop:"hairdresser"},name:"Klier",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Klipp":{tags:{name:"Klipp",shop:"hairdresser"},name:"Klipp",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Le Salon":{tags:{name:"Le Salon",shop:"hairdresser"},name:"Le Salon",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Marco Aldany":{tags:{name:"Marco Aldany",shop:"hairdresser"},name:"Marco Aldany",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Peluquería":{tags:{name:"Peluquería",shop:"hairdresser"},name:"Peluquería",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Salon fryzjerski":{tags:{name:"Salon fryzjerski",shop:"hairdresser"},name:"Salon fryzjerski",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Sport Clips":{tags:{name:"Sport Clips",shop:"hairdresser"},name:"Sport Clips",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Super Cuts":{tags:{name:"Super Cuts",shop:"hairdresser"},name:"Super Cuts",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Supercuts":{tags:{name:"Supercuts",shop:"hairdresser"},name:"Supercuts",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Tchip":{tags:{name:"Tchip",shop:"hairdresser"},name:"Tchip",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/The Barber Shop":{tags:{name:"The Barber Shop",shop:"hairdresser"},name:"The Barber Shop",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Toni & Guy":{tags:{name:"Toni & Guy",shop:"hairdresser"},name:"Toni & Guy",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Top Hair":{tags:{name:"Top Hair",shop:"hairdresser"},name:"Top Hair",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Локон":{tags:{name:"Локон",shop:"hairdresser"},name:"Локон",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Парикмахерская":{tags:{name:"Парикмахерская",shop:"hairdresser"},name:"Парикмахерская",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Перукарня":{tags:{name:"Перукарня",shop:"hairdresser"},name:"Перукарня",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Салон красоты":{tags:{name:"Салон красоты",shop:"hairdresser"},name:"Салон красоты",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Стиль":{tags:{name:"Стиль",shop:"hairdresser"},name:"Стиль",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/Шарм":{tags:{name:"Шарм",shop:"hairdresser"},name:"Шарм",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hairdresser/حلاق":{tags:{name:"حلاق",shop:"hairdresser"},name:"حلاق",icon:"maki-hairdresser",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/1000 мелочей":{tags:{name:"1000 мелочей",shop:"hardware"},name:"1000 мелочей",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Ferretería":{tags:{name:"Ferretería",shop:"hardware"},name:"Ferretería",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Harbor Freight Tools":{tags:{name:"Harbor Freight Tools",shop:"hardware"},name:"Harbor Freight Tools",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Quincaillerie":{tags:{name:"Quincaillerie",shop:"hardware"},name:"Quincaillerie",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/True Value":{tags:{name:"True Value",shop:"hardware"},name:"True Value",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Würth":{tags:{name:"Würth",shop:"hardware"},name:"Würth",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Промтовары":{tags:{name:"Промтовары",shop:"hardware"},name:"Промтовары",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Сантехника":{tags:{name:"Сантехника",shop:"hardware"},name:"Сантехника",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Товары для дома":{tags:{name:"Товары для дома",shop:"hardware"},name:"Товары для дома",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hardware/Хозтовары":{tags:{name:"Хозтовары",shop:"hardware"},name:"Хозтовары",icon:"temaki-tools",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hearing_aids/Amplifon":{tags:{name:"Amplifon",shop:"hearing_aids"},name:"Amplifon",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hearing_aids/Geers":{tags:{name:"Geers",shop:"hearing_aids"},name:"Geers",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hearing_aids/Kind Hörgeräte":{tags:{name:"Kind Hörgeräte",shop:"hearing_aids"},name:"Kind Hörgeräte",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hearing_aids/amplifon":{tags:{name:"amplifon",shop:"hearing_aids"},name:"amplifon",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/hifi/Bang & Olufsen":{tags:{name:"Bang & Olufsen",shop:"hifi"},name:"Bang & Olufsen",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/houseware/Blokker":{tags:{name:"Blokker",shop:"houseware"},name:"Blokker",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/houseware/Marskramer":{tags:{name:"Marskramer",shop:"houseware"},name:"Marskramer",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/houseware/Xenos":{tags:{name:"Xenos",shop:"houseware"},name:"Xenos",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/interior_decoration/Casa":{tags:{name:"Casa",shop:"interior_decoration"},name:"Casa",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/interior_decoration/Depot":{tags:{name:"Depot",shop:"interior_decoration"},name:"Depot",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/585":{tags:{name:"585",shop:"jewelry"},name:"585",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Apart":{tags:{name:"Apart",shop:"jewelry"},name:"Apart",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Bijou Brigitte":{tags:{name:"Bijou Brigitte",shop:"jewelry"},name:"Bijou Brigitte",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Christ":{tags:{name:"Christ",shop:"jewelry"},name:"Christ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Claire's":{tags:{name:"Claire's",shop:"jewelry"},name:"Claire's",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Ernest Jones":{tags:{name:"Ernest Jones",shop:"jewelry"},name:"Ernest Jones",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/H Samuel":{tags:{name:"H Samuel",shop:"jewelry"},name:"H Samuel",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/James Avery Jewelry":{tags:{name:"James Avery Jewelry",shop:"jewelry"},name:"James Avery Jewelry",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Julien d'Orcel":{tags:{name:"Julien d'Orcel",shop:"jewelry"},name:"Julien d'Orcel",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Kay Jewelers":{tags:{name:"Kay Jewelers",shop:"jewelry"},name:"Kay Jewelers",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Pandora":{tags:{name:"Pandora",shop:"jewelry"},name:"Pandora",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Swarovski":{tags:{name:"Swarovski",shop:"jewelry"},name:"Swarovski",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Адамас":{tags:{name:"Адамас",shop:"jewelry"},name:"Адамас",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/jewelry/Золото":{tags:{name:"Золото",shop:"jewelry"},name:"Золото",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/kiosk/KIOS":{tags:{name:"KIOS",shop:"kiosk"},name:"KIOS",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Kiosko":{tags:{name:"Kiosko",shop:"kiosk"},name:"Kiosko",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Kiosque":{tags:{name:"Kiosque",shop:"kiosk"},name:"Kiosque",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Kolporter":{tags:{name:"Kolporter",shop:"kiosk"},name:"Kolporter",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Lietuvos spauda":{tags:{name:"Lietuvos spauda",shop:"kiosk"},name:"Lietuvos spauda",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Narvesen":{tags:{name:"Narvesen",shop:"kiosk"},name:"Narvesen",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Pressbyrån":{tags:{name:"Pressbyrån",shop:"kiosk"},name:"Pressbyrån",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Pulpería":{tags:{name:"Pulpería",shop:"kiosk"},name:"Pulpería",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/R-Kioski":{tags:{name:"R-Kioski",shop:"kiosk"},name:"R-Kioski",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Ruch":{tags:{name:"Ruch",shop:"kiosk"},name:"Ruch",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Tabak Trafik":{tags:{name:"Tabak Trafik",shop:"kiosk"},name:"Tabak Trafik",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Tisak":{tags:{name:"Tisak",shop:"kiosk"},name:"Tisak",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Trafik":{tags:{name:"Trafik",shop:"kiosk"},name:"Trafik",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Trafika":{tags:{name:"Trafika",shop:"kiosk"},name:"Trafika",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Trinkhalle":{tags:{name:"Trinkhalle",shop:"kiosk"},name:"Trinkhalle",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Белсоюзпечать":{tags:{name:"Белсоюзпечать",shop:"kiosk"},name:"Белсоюзпечать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/Киоск":{tags:{name:"Киоск",shop:"kiosk"},name:"Киоск",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kiosk/მარკეტი (Market)":{tags:{name:"მარკეტი (Market)",shop:"kiosk"},name:"მარკეტი (Market)",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],suggestion:true},"shop/kitchen/Cuisinella":{tags:{name:"Cuisinella",shop:"kitchen"},name:"Cuisinella",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/kitchen/Home Utensils":{tags:{name:"Home Utensils",shop:"kitchen"},name:"Home Utensils",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/laundry/Launderette":{tags:{name:"Launderette",shop:"laundry"},name:"Launderette",icon:"maki-laundry",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/laundry/Lavandería":{tags:{name:"Lavandería",shop:"laundry"},name:"Lavandería",icon:"maki-laundry",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/laundry/コインランドリー":{tags:{name:"コインランドリー",shop:"laundry"},name:"コインランドリー",icon:"maki-laundry",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/lottery/Loteria de la Provincia":{tags:{name:"Loteria de la Provincia",shop:"lottery"},name:"Loteria de la Provincia",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/lottery/Lotería Nacional":{tags:{name:"Lotería Nacional",shop:"lottery"},name:"Lotería Nacional",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/lottery/Lotería de la Provincia":{tags:{name:"Lotería de la Provincia",shop:"lottery"},name:"Lotería de la Provincia",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/lottery/Lotto":{tags:{name:"Lotto",shop:"lottery"},name:"Lotto",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/lottery/Lottózó":{tags:{name:"Lottózó",shop:"lottery"},name:"Lottózó",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/lottery/ONCE":{tags:{name:"ONCE",shop:"lottery"},name:"ONCE",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mall/Торговый центр":{tags:{name:"Торговый центр",shop:"mall"},name:"Торговый центр",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true},"shop/massage/Massage Envy":{tags:{name:"Massage Envy",shop:"massage"},name:"Massage Envy",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/medical_supply/Pofam-Poznań":{tags:{name:"Pofam-Poznań",shop:"medical_supply"},name:"Pofam-Poznań",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/3 Store":{tags:{name:"3 Store",shop:"mobile_phone"},name:"3 Store",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/AT&T":{tags:{name:"AT&T",shop:"mobile_phone"},name:"AT&T",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Bell":{tags:{name:"Bell",shop:"mobile_phone"},name:"Bell",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Bitė":{tags:{name:"Bitė",shop:"mobile_phone"},name:"Bitė",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Boost Mobile":{tags:{name:"Boost Mobile",shop:"mobile_phone"},name:"Boost Mobile",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Carphone Warehouse":{tags:{name:"Carphone Warehouse",shop:"mobile_phone"},name:"Carphone Warehouse",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Claro":{tags:{name:"Claro",shop:"mobile_phone"},name:"Claro",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Cricket Wireless":{tags:{name:"Cricket Wireless",shop:"mobile_phone"},name:"Cricket Wireless",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Digicel":{tags:{name:"Digicel",shop:"mobile_phone"},name:"Digicel",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/EE":{tags:{name:"EE",shop:"mobile_phone"},name:"EE",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/MetroPCS":{tags:{name:"MetroPCS",shop:"mobile_phone"},name:"MetroPCS",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Movistar":{tags:{name:"Movistar",shop:"mobile_phone"},name:"Movistar",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/O2":{tags:{name:"O2",shop:"mobile_phone"},name:"O2",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Orange":{tags:{name:"Orange",shop:"mobile_phone"},name:"Orange",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Personal":{tags:{name:"Personal",shop:"mobile_phone"},name:"Personal",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Play":{tags:{name:"Play",shop:"mobile_phone"},name:"Play",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Plus":{tags:{name:"Plus",shop:"mobile_phone"},name:"Plus",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/SFR":{tags:{name:"SFR",shop:"mobile_phone"},name:"SFR",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Sprint":{tags:{name:"Sprint",shop:"mobile_phone"},name:"Sprint",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/T-Mobile":{tags:{name:"T-Mobile",shop:"mobile_phone"},name:"T-Mobile",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/TIM":{tags:{name:"TIM",shop:"mobile_phone"},name:"TIM",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Telcel":{tags:{name:"Telcel",shop:"mobile_phone"},name:"Telcel",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Tele2":{tags:{name:"Tele2",shop:"mobile_phone"},name:"Tele2",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Telekom":{tags:{name:"Telekom",shop:"mobile_phone"},name:"Telekom",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Telekom Shop":{tags:{name:"Telekom Shop",shop:"mobile_phone"},name:"Telekom Shop",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Telenor":{tags:{name:"Telenor",shop:"mobile_phone"},name:"Telenor",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Telus":{tags:{name:"Telus",shop:"mobile_phone"},name:"Telus",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/The Phone House":{tags:{name:"The Phone House",shop:"mobile_phone"},name:"The Phone House",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Three":{tags:{name:"Three",shop:"mobile_phone"},name:"Three",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Tim":{tags:{name:"Tim",shop:"mobile_phone"},name:"Tim",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Télécentre":{tags:{name:"Télécentre",shop:"mobile_phone"},name:"Télécentre",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Verizon":{tags:{name:"Verizon",shop:"mobile_phone"},name:"Verizon",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Verizon Wireless":{tags:{name:"Verizon Wireless",shop:"mobile_phone"},name:"Verizon Wireless",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Vodafone":{tags:{name:"Vodafone",shop:"mobile_phone"},name:"Vodafone",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Vodafone Shop":{tags:{name:"Vodafone Shop",shop:"mobile_phone"},name:"Vodafone Shop",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Wind":{tags:{name:"Wind",shop:"mobile_phone"},name:"Wind",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Yoigo":{tags:{name:"Yoigo",shop:"mobile_phone"},name:"Yoigo",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/au":{tags:{name:"au",shop:"mobile_phone"},name:"au",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/auショップ":{tags:{name:"auショップ",shop:"mobile_phone"},name:"auショップ",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/mobilcom debitel":{tags:{name:"mobilcom debitel",shop:"mobile_phone"},name:"mobilcom debitel",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Алло":{tags:{name:"Алло",shop:"mobile_phone"},name:"Алло",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Билайн":{tags:{name:"Билайн",shop:"mobile_phone"},name:"Билайн",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Евросеть":{tags:{name:"Евросеть",shop:"mobile_phone"},name:"Евросеть",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Київстар":{tags:{name:"Київстар",shop:"mobile_phone"},name:"Київстар",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/МТС":{tags:{name:"МТС",shop:"mobile_phone"},name:"МТС",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Мегафон":{tags:{name:"Мегафон",shop:"mobile_phone"},name:"Мегафон",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Связной":{tags:{name:"Связной",shop:"mobile_phone"},name:"Связной",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/Теле2":{tags:{name:"Теле2",shop:"mobile_phone"},name:"Теле2",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/ソフトバンクショップ":{tags:{name:"ソフトバンクショップ",shop:"mobile_phone"},name:"ソフトバンクショップ",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/mobile_phone/ドコモショップ":{tags:{name:"ドコモショップ",shop:"mobile_phone"},name:"ドコモショップ",icon:"maki-mobile-phone",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/money_lender/Money Mart":{tags:{name:"Money Mart",shop:"money_lender"},name:"Money Mart",icon:"maki-bank",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","currency_multi"],suggestion:true},"shop/motorcycle/Harley Davidson":{tags:{name:"Harley Davidson",shop:"motorcycle"},name:"Harley Davidson",icon:"fas-motorcycle",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/motorcycle/Yamaha":{tags:{name:"Yamaha",shop:"motorcycle"},name:"Yamaha",icon:"fas-motorcycle",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/music/HMV":{tags:{name:"HMV",shop:"music"},name:"HMV",icon:"maki-music",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/musical_instrument/Guitar Center":{tags:{name:"Guitar Center",shop:"musical_instrument"},name:"Guitar Center",icon:"maki-music",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Edicola":{tags:{name:"Edicola",shop:"newsagent"},name:"Edicola",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Maison de la Presse":{tags:{name:"Maison de la Presse",shop:"newsagent"},name:"Maison de la Presse",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Relay":{tags:{name:"Relay",shop:"newsagent"},name:"Relay",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Tabac Presse":{tags:{name:"Tabac Presse",shop:"newsagent"},name:"Tabac Presse",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/WHSmith":{tags:{name:"WHSmith",shop:"newsagent"},name:"WHSmith",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Витебскоблсоюзпечать":{tags:{name:"Витебскоблсоюзпечать",shop:"newsagent"},name:"Витебскоблсоюзпечать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Первая полоса":{tags:{name:"Первая полоса",shop:"newsagent"},name:"Первая полоса",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Печать":{tags:{name:"Печать",shop:"newsagent"},name:"Печать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Роспечать":{tags:{name:"Роспечать",shop:"newsagent"},name:"Роспечать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/newsagent/Союзпечать":{tags:{name:"Союзпечать",shop:"newsagent"},name:"Союзпечать",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Alain Afflelou":{tags:{name:"Alain Afflelou",shop:"optician"},name:"Alain Afflelou",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Apollo":{tags:{name:"Apollo",shop:"optician"},name:"Apollo",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Atol":{tags:{name:"Atol",shop:"optician"},name:"Atol",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Boots Opticians":{tags:{name:"Boots Opticians",shop:"optician"},name:"Boots Opticians",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Fielmann":{tags:{name:"Fielmann",shop:"optician"},name:"Fielmann",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/General Óptica":{tags:{name:"General Óptica",shop:"optician"},name:"General Óptica",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Grand Optical":{tags:{name:"Grand Optical",shop:"optician"},name:"Grand Optical",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Générale d'Optique":{tags:{name:"Générale d'Optique",shop:"optician"},name:"Générale d'Optique",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Hakim Optical":{tags:{name:"Hakim Optical",shop:"optician"},name:"Hakim Optical",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Hans Anders":{tags:{name:"Hans Anders",shop:"optician"},name:"Hans Anders",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Krys":{tags:{name:"Krys",shop:"optician"},name:"Krys",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Les Opticiens Mutualistes":{tags:{name:"Les Opticiens Mutualistes",shop:"optician"},name:"Les Opticiens Mutualistes",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Optic 2000":{tags:{name:"Optic 2000",shop:"optician"},name:"Optic 2000",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Optical Center":{tags:{name:"Optical Center",shop:"optician"},name:"Optical Center",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Pearle":{tags:{name:"Pearle",shop:"optician"},name:"Pearle",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Pearle Vision":{tags:{name:"Pearle Vision",shop:"optician"},name:"Pearle Vision",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Specsavers":{tags:{name:"Specsavers",shop:"optician"},name:"Specsavers",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Sunglass Hut":{tags:{name:"Sunglass Hut",shop:"optician"},name:"Sunglass Hut",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Synoptik":{tags:{name:"Synoptik",shop:"optician"},name:"Synoptik",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/Vision Express":{tags:{name:"Vision Express",shop:"optician"},name:"Vision Express",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/แว่นท็อปเจริญ":{tags:{name:"แว่นท็อปเจริญ",shop:"optician"},name:"แว่นท็อปเจริญ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/メガネスーパー":{tags:{name:"メガネスーパー",shop:"optician"},name:"メガネスーパー",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/optician/眼鏡市場":{tags:{name:"眼鏡市場",shop:"optician"},name:"眼鏡市場",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/outdoor/Mountain Warehouse":{tags:{name:"Mountain Warehouse",shop:"outdoor"},name:"Mountain Warehouse",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/outdoor/REI":{tags:{name:"REI",shop:"outdoor"},name:"REI",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/outdoor/Рыболов":{tags:{name:"Рыболов",shop:"outdoor"},name:"Рыболов",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/paint/Benjamin Moore":{tags:{name:"Benjamin Moore",shop:"paint"},name:"Benjamin Moore",icon:"maki-water",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/paint/Comex":{tags:{name:"Comex",shop:"paint"},name:"Comex",icon:"maki-water",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/paint/Jotun":{tags:{name:"Jotun",shop:"paint"},name:"Jotun",icon:"maki-water",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/paint/National Paints":{tags:{name:"National Paints",shop:"paint"},name:"National Paints",icon:"maki-water",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/paint/Sherwin Williams":{tags:{name:"Sherwin Williams",shop:"paint"},name:"Sherwin Williams",icon:"maki-water",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/paint/Sherwin-Williams Paints":{tags:{name:"Sherwin-Williams Paints",shop:"paint"},name:"Sherwin-Williams Paints",icon:"maki-water",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pawnbroker/Cash Converters":{tags:{name:"Cash Converters",shop:"pawnbroker"},name:"Cash Converters",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pawnbroker/Lombard":{tags:{name:"Lombard",shop:"pawnbroker"},name:"Lombard",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pawnbroker/Palawan Pawnshop":{tags:{name:"Palawan Pawnshop",shop:"pawnbroker"},name:"Palawan Pawnshop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Das Futterhaus":{tags:{name:"Das Futterhaus",shop:"pet"},name:"Das Futterhaus",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Fressnapf":{tags:{name:"Fressnapf",shop:"pet"},name:"Fressnapf",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Global Pet Foods":{tags:{name:"Global Pet Foods",shop:"pet"},name:"Global Pet Foods",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Maxi Zoo":{tags:{name:"Maxi Zoo",shop:"pet"},name:"Maxi Zoo",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Pet Valu":{tags:{name:"Pet Valu",shop:"pet"},name:"Pet Valu",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/PetSmart":{tags:{name:"PetSmart",shop:"pet"},name:"PetSmart",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Petco":{tags:{name:"Petco",shop:"pet"},name:"Petco",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Pets at Home":{tags:{name:"Pets at Home",shop:"pet"},name:"Pets at Home",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Бетховен":{tags:{name:"Бетховен",shop:"pet"},name:"Бетховен",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Зоотовары":{tags:{name:"Зоотовары",shop:"pet"},name:"Зоотовары",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/pet/Четыре лапы":{tags:{name:"Четыре лапы",shop:"pet"},name:"Четыре лапы",icon:"maki-dog-park",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/second_hand/Goodwill":{tags:{name:"Goodwill",shop:"second_hand"},name:"Goodwill",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/second_hand/Value Village":{tags:{name:"Value Village",shop:"second_hand"},name:"Value Village",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Aldo":{tags:{name:"Aldo",shop:"shoes"},name:"Aldo",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Bata":{tags:{name:"Bata",shop:"shoes"},name:"Bata",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Besson Chaussures":{tags:{name:"Besson Chaussures",shop:"shoes"},name:"Besson Chaussures",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Brantano":{tags:{name:"Brantano",shop:"shoes"},name:"Brantano",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/CCC":{tags:{name:"CCC",shop:"shoes"},name:"CCC",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Camper":{tags:{name:"Camper",shop:"shoes"},name:"Camper",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Chaussea":{tags:{name:"Chaussea",shop:"shoes"},name:"Chaussea",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Clarks":{tags:{name:"Clarks",shop:"shoes"},name:"Clarks",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Converse":{tags:{name:"Converse",shop:"shoes"},name:"Converse",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Crocs":{tags:{name:"Crocs",shop:"shoes"},name:"Crocs",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/DSW":{tags:{name:"DSW",shop:"shoes"},name:"DSW",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Deichmann":{tags:{name:"Deichmann",shop:"shoes"},name:"Deichmann",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Dosenbach":{tags:{name:"Dosenbach",shop:"shoes"},name:"Dosenbach",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Ecco":{tags:{name:"Ecco",shop:"shoes"},name:"Ecco",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Famous Footwear":{tags:{name:"Famous Footwear",shop:"shoes"},name:"Famous Footwear",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Foot Locker":{tags:{name:"Foot Locker",shop:"shoes"},name:"Foot Locker",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Geox":{tags:{name:"Geox",shop:"shoes"},name:"Geox",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Kari":{tags:{name:"Kari",shop:"shoes"},name:"Kari",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/La Halle aux Chaussures":{tags:{name:"La Halle aux Chaussures",shop:"shoes"},name:"La Halle aux Chaussures",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Mephisto":{tags:{name:"Mephisto",shop:"shoes"},name:"Mephisto",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Minelli":{tags:{name:"Minelli",shop:"shoes"},name:"Minelli",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/New Balance":{tags:{name:"New Balance",shop:"shoes"},name:"New Balance",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Payless":{tags:{name:"Payless",shop:"shoes"},name:"Payless",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Payless Shoe Source":{tags:{name:"Payless Shoe Source",shop:"shoes"},name:"Payless Shoe Source",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Payless ShoeSource":{tags:{name:"Payless ShoeSource",shop:"shoes"},name:"Payless ShoeSource",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Quick Schuh":{tags:{name:"Quick Schuh",shop:"shoes"},name:"Quick Schuh",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Rack Room Shoes":{tags:{name:"Rack Room Shoes",shop:"shoes"},name:"Rack Room Shoes",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Reno":{tags:{name:"Reno",shop:"shoes"},name:"Reno",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Rieker":{tags:{name:"Rieker",shop:"shoes"},name:"Rieker",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Salamander":{tags:{name:"Salamander",shop:"shoes"},name:"Salamander",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/San Marina":{tags:{name:"San Marina",shop:"shoes"},name:"San Marina",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Scapino":{tags:{name:"Scapino",shop:"shoes"},name:"Scapino",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Shoe Carnival":{tags:{name:"Shoe Carnival",shop:"shoes"},name:"Shoe Carnival",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Shoe Zone":{tags:{name:"Shoe Zone",shop:"shoes"},name:"Shoe Zone",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Siemes Schuhcenter":{tags:{name:"Siemes Schuhcenter",shop:"shoes"},name:"Siemes Schuhcenter",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Skechers":{tags:{name:"Skechers",shop:"shoes"},name:"Skechers",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Tamaris":{tags:{name:"Tamaris",shop:"shoes"},name:"Tamaris",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/vanHaren":{tags:{name:"vanHaren",shop:"shoes"},name:"vanHaren",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Éram":{tags:{name:"Éram",shop:"shoes"},name:"Éram",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Ремонт обуви":{tags:{name:"Ремонт обуви",shop:"shoes"},name:"Ремонт обуви",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/ЦентрОбувь":{tags:{name:"ЦентрОбувь",shop:"shoes"},name:"ЦентрОбувь",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/Юничел":{tags:{name:"Юничел",shop:"shoes"},name:"Юничел",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/shoes/東京靴流通センター":{tags:{name:"東京靴流通センター",shop:"shoes"},name:"東京靴流通センター",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Aktiesport":{tags:{name:"Aktiesport",shop:"sports"},name:"Aktiesport",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Big 5 Sporting Goods":{tags:{name:"Big 5 Sporting Goods",shop:"sports"},name:"Big 5 Sporting Goods",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Decathlon":{tags:{name:"Decathlon",shop:"sports"},name:"Decathlon",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Dick's Sporting Goods":{tags:{name:"Dick's Sporting Goods",shop:"sports"},name:"Dick's Sporting Goods",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Hervis":{tags:{name:"Hervis",shop:"sports"},name:"Hervis",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Intersport":{tags:{name:"Intersport",shop:"sports"},name:"Intersport",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/JD Sports":{tags:{name:"JD Sports",shop:"sports"},name:"JD Sports",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Sport 2000":{tags:{name:"Sport 2000",shop:"sports"},name:"Sport 2000",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Sports Authority":{tags:{name:"Sports Authority",shop:"sports"},name:"Sports Authority",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Sports Direct":{tags:{name:"Sports Direct",shop:"sports"},name:"Sports Direct",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Спортмастер":{tags:{name:"Спортмастер",shop:"sports"},name:"Спортмастер",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/sports/Спорттовары":{tags:{name:"Спорттовары",shop:"sports"},name:"Спорттовары",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Bureau Vallée":{tags:{name:"Bureau Vallée",shop:"stationery"},name:"Bureau Vallée",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Libro":{tags:{name:"Libro",shop:"stationery"},name:"Libro",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/McPaper":{tags:{name:"McPaper",shop:"stationery"},name:"McPaper",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Office Depot":{tags:{name:"Office Depot",shop:"stationery"},name:"Office Depot",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Office Max":{tags:{name:"Office Max",shop:"stationery"},name:"Office Max",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Officeworks":{tags:{name:"Officeworks",shop:"stationery"},name:"Officeworks",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Pagro":{tags:{name:"Pagro",shop:"stationery"},name:"Pagro",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Paperchase":{tags:{name:"Paperchase",shop:"stationery"},name:"Paperchase",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Ryman":{tags:{name:"Ryman",shop:"stationery"},name:"Ryman",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Staples":{tags:{name:"Staples",shop:"stationery"},name:"Staples",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/stationery/Канцтовары":{tags:{name:"Канцтовары",shop:"stationery"},name:"Канцтовары",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/A&O":{tags:{name:"A&O",shop:"supermarket"},name:"A&O",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/A101":{tags:{name:"A101",shop:"supermarket"},name:"A101",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/AD Delhaize":{tags:{name:"AD Delhaize",shop:"supermarket"},name:"AD Delhaize",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ADEG":{tags:{name:"ADEG",shop:"supermarket"},name:"ADEG",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Ahorramás":{tags:{name:"Ahorramás",shop:"supermarket"},name:"Ahorramás",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Albert":{tags:{name:"Albert",shop:"supermarket"},name:"Albert",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Albert Heijn":{tags:{name:"Albert Heijn",shop:"supermarket"},name:"Albert Heijn",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Albertsons":{tags:{name:"Albertsons",shop:"supermarket"},name:"Albertsons",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Aldi":{tags:{name:"Aldi",shop:"supermarket"},name:"Aldi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Aldi Nord":{tags:{name:"Aldi Nord",shop:"supermarket"},name:"Aldi Nord",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Aldi Süd":{tags:{name:"Aldi Süd",shop:"supermarket"},name:"Aldi Süd",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Alimerka":{tags:{name:"Alimerka",shop:"supermarket"},name:"Alimerka",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Alnatura":{tags:{name:"Alnatura",shop:"supermarket"},name:"Alnatura",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Asda":{tags:{name:"Asda",shop:"supermarket"},name:"Asda",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Atac":{tags:{name:"Atac",shop:"supermarket"},name:"Atac",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Atacadão":{tags:{name:"Atacadão",shop:"supermarket"},name:"Atacadão",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Auchan":{tags:{name:"Auchan",shop:"supermarket"},name:"Auchan",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/BM":{tags:{name:"BM",shop:"supermarket"},name:"BM",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Biedronka":{tags:{name:"Biedronka",shop:"supermarket"},name:"Biedronka",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Big C":{tags:{name:"Big C",shop:"supermarket"},name:"Big C",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Billa":{tags:{name:"Billa",shop:"supermarket"},name:"Billa",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Bim":{tags:{name:"Bim",shop:"supermarket"},name:"Bim",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Biocoop":{tags:{name:"Biocoop",shop:"supermarket"},name:"Biocoop",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Bodega Aurrera":{tags:{name:"Bodega Aurrera",shop:"supermarket"},name:"Bodega Aurrera",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Budgens":{tags:{name:"Budgens",shop:"supermarket"},name:"Budgens",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Bulk Barn":{tags:{name:"Bulk Barn",shop:"supermarket"},name:"Bulk Barn",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Bunnpris":{tags:{name:"Bunnpris",shop:"supermarket"},name:"Bunnpris",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/CONAD":{tags:{name:"CONAD",shop:"supermarket"},name:"CONAD",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/CRAI":{tags:{name:"CRAI",shop:"supermarket"},name:"CRAI",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Caprabo":{tags:{name:"Caprabo",shop:"supermarket"},name:"Caprabo",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Cargills Food City":{tags:{name:"Cargills Food City",shop:"supermarket"},name:"Cargills Food City",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Carrefour":{tags:{name:"Carrefour",shop:"supermarket"},name:"Carrefour",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Carrefour City":{tags:{name:"Carrefour City",shop:"supermarket"},name:"Carrefour City",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Carrefour Contact":{tags:{name:"Carrefour Contact",shop:"supermarket"},name:"Carrefour Contact",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Carrefour Express":{tags:{name:"Carrefour Express",shop:"supermarket"},name:"Carrefour Express",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Centre Commercial E. Leclerc":{tags:{name:"Centre Commercial E. Leclerc",shop:"supermarket"},name:"Centre Commercial E. Leclerc",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Checkers":{tags:{name:"Checkers",shop:"supermarket"},name:"Checkers",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Chedraui":{tags:{name:"Chedraui",shop:"supermarket"},name:"Chedraui",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Co-Op":{tags:{name:"Co-Op",shop:"supermarket"},name:"Co-Op",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Co-op":{tags:{name:"Co-op",shop:"supermarket"},name:"Co-op",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Co-operative":{tags:{name:"Co-operative",shop:"supermarket"},name:"Co-operative",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Coles":{tags:{name:"Coles",shop:"supermarket"},name:"Coles",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Colmado":{tags:{name:"Colmado",shop:"supermarket"},name:"Colmado",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Colruyt":{tags:{name:"Colruyt",shop:"supermarket"},name:"Colruyt",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Combi":{tags:{name:"Combi",shop:"supermarket"},name:"Combi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Comercial Mexicana":{tags:{name:"Comercial Mexicana",shop:"supermarket"},name:"Comercial Mexicana",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Conad":{tags:{name:"Conad",shop:"supermarket"},name:"Conad",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Conad City":{tags:{name:"Conad City",shop:"supermarket"},name:"Conad City",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Condis":{tags:{name:"Condis",shop:"supermarket"},name:"Condis",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Consum":{tags:{name:"Consum",shop:"supermarket"},name:"Consum",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Continente":{tags:{name:"Continente",shop:"supermarket"},name:"Continente",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Coop":{tags:{name:"Coop",shop:"supermarket"},name:"Coop",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Coop Extra":{tags:{name:"Coop Extra",shop:"supermarket"},name:"Coop Extra",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Coop Konsum":{tags:{name:"Coop Konsum",shop:"supermarket"},name:"Coop Konsum",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Costco Gasoline":{tags:{name:"Costco Gasoline",shop:"supermarket"},name:"Costco Gasoline",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Coto":{tags:{name:"Coto",shop:"supermarket"},name:"Coto",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Countdown":{tags:{name:"Countdown",shop:"supermarket"},name:"Countdown",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Coviran":{tags:{name:"Coviran",shop:"supermarket"},name:"Coviran",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Covirán":{tags:{name:"Covirán",shop:"supermarket"},name:"Covirán",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Crai":{tags:{name:"Crai",shop:"supermarket"},name:"Crai",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Cub Foods":{tags:{name:"Cub Foods",shop:"supermarket"},name:"Cub Foods",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dagli'Brugsen":{tags:{name:"Dagli'Brugsen",shop:"supermarket"},name:"Dagli'Brugsen",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Deen":{tags:{name:"Deen",shop:"supermarket"},name:"Deen",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Delhaize":{tags:{name:"Delhaize",shop:"supermarket"},name:"Delhaize",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Delikatesy Centrum":{tags:{name:"Delikatesy Centrum",shop:"supermarket"},name:"Delikatesy Centrum",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Denner":{tags:{name:"Denner",shop:"supermarket"},name:"Denner",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Despar":{tags:{name:"Despar",shop:"supermarket"},name:"Despar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Despensa Familiar":{tags:{name:"Despensa Familiar",shop:"supermarket"},name:"Despensa Familiar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dia":{tags:{name:"Dia",shop:"supermarket"},name:"Dia",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dia %":{tags:{name:"Dia %",shop:"supermarket"},name:"Dia %",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dia Market":{tags:{name:"Dia Market",shop:"supermarket"},name:"Dia Market",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dino":{tags:{name:"Dino",shop:"supermarket"},name:"Dino",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dirk van den Broek":{tags:{name:"Dirk van den Broek",shop:"supermarket"},name:"Dirk van den Broek",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Disco":{tags:{name:"Disco",shop:"supermarket"},name:"Disco",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Diska":{tags:{name:"Diska",shop:"supermarket"},name:"Diska",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Dunnes Stores":{tags:{name:"Dunnes Stores",shop:"supermarket"},name:"Dunnes Stores",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/E-Center":{tags:{name:"E-Center",shop:"supermarket"},name:"E-Center",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/E. Leclerc":{tags:{name:"E. Leclerc",shop:"supermarket"},name:"E. Leclerc",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/E. Leclerc Drive":{tags:{name:"E. Leclerc Drive",shop:"supermarket"},name:"E. Leclerc Drive",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/EMTÉ":{tags:{name:"EMTÉ",shop:"supermarket"},name:"EMTÉ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Edeka":{tags:{name:"Edeka",shop:"supermarket"},name:"Edeka",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Ekom":{tags:{name:"Ekom",shop:"supermarket"},name:"Ekom",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Ekono":{tags:{name:"Ekono",shop:"supermarket"},name:"Ekono",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/El Árbol":{tags:{name:"El Árbol",shop:"supermarket"},name:"El Árbol",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Eroski":{tags:{name:"Eroski",shop:"supermarket"},name:"Eroski",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Esselunga":{tags:{name:"Esselunga",shop:"supermarket"},name:"Esselunga",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/EuroSpin":{tags:{name:"EuroSpin",shop:"supermarket"},name:"EuroSpin",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Eurospar":{tags:{name:"Eurospar",shop:"supermarket"},name:"Eurospar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Eurospin":{tags:{name:"Eurospin",shop:"supermarket"},name:"Eurospin",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Extra":{tags:{name:"Extra",shop:"supermarket"},name:"Extra",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Famiglia Cooperativa":{tags:{name:"Famiglia Cooperativa",shop:"supermarket"},name:"Famiglia Cooperativa",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Famila":{tags:{name:"Famila",shop:"supermarket"},name:"Famila",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Fareway":{tags:{name:"Fareway",shop:"supermarket"},name:"Fareway",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Farmfoods":{tags:{name:"Farmfoods",shop:"supermarket"},name:"Farmfoods",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Feneberg":{tags:{name:"Feneberg",shop:"supermarket"},name:"Feneberg",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Food Basics":{tags:{name:"Food Basics",shop:"supermarket"},name:"Food Basics",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Food Lion":{tags:{name:"Food Lion",shop:"supermarket"},name:"Food Lion",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Foodland":{tags:{name:"Foodland",shop:"supermarket"},name:"Foodland",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Foodworks":{tags:{name:"Foodworks",shop:"supermarket"},name:"Foodworks",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Franprix":{tags:{name:"Franprix",shop:"supermarket"},name:"Franprix",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Fred Meyer":{tags:{name:"Fred Meyer",shop:"supermarket"},name:"Fred Meyer",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Froiz":{tags:{name:"Froiz",shop:"supermarket"},name:"Froiz",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Føtex":{tags:{name:"Føtex",shop:"supermarket"},name:"Føtex",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/G20":{tags:{name:"G20",shop:"supermarket"},name:"G20",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Gadis":{tags:{name:"Gadis",shop:"supermarket"},name:"Gadis",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Giant":{tags:{name:"Giant",shop:"supermarket"},name:"Giant",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Giant Eagle":{tags:{name:"Giant Eagle",shop:"supermarket"},name:"Giant Eagle",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Grand Frais":{tags:{name:"Grand Frais",shop:"supermarket"},name:"Grand Frais",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Grocery Outlet":{tags:{name:"Grocery Outlet",shop:"supermarket"},name:"Grocery Outlet",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Géant Casino":{tags:{name:"Géant Casino",shop:"supermarket"},name:"Géant Casino",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/H-E-B":{tags:{name:"H-E-B",shop:"supermarket"},name:"H-E-B",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/HIT":{tags:{name:"HIT",shop:"supermarket"},name:"HIT",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Hannaford":{tags:{name:"Hannaford",shop:"supermarket"},name:"Hannaford",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Harris Teeter":{tags:{name:"Harris Teeter",shop:"supermarket"},name:"Harris Teeter",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Hemköp":{tags:{name:"Hemköp",shop:"supermarket"},name:"Hemköp",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Heron Foods":{tags:{name:"Heron Foods",shop:"supermarket"},name:"Heron Foods",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Hofer":{tags:{name:"Hofer",shop:"supermarket"},name:"Hofer",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Hoogvliet":{tags:{name:"Hoogvliet",shop:"supermarket"},name:"Hoogvliet",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Hy-Vee":{tags:{name:"Hy-Vee",shop:"supermarket"},name:"Hy-Vee",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ICA":{tags:{name:"ICA",shop:"supermarket"},name:"ICA",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ICA Kvantum":{tags:{name:"ICA Kvantum",shop:"supermarket"},name:"ICA Kvantum",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/IDEA":{tags:{name:"IDEA",shop:"supermarket"},name:"IDEA",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/IGA":{tags:{name:"IGA",shop:"supermarket"},name:"IGA",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Iceland":{tags:{name:"Iceland",shop:"supermarket"},name:"Iceland",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Intermarché":{tags:{name:"Intermarché",shop:"supermarket"},name:"Intermarché",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Intermarché Contact":{tags:{name:"Intermarché Contact",shop:"supermarket"},name:"Intermarché Contact",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Intermarché Super":{tags:{name:"Intermarché Super",shop:"supermarket"},name:"Intermarché Super",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Interspar":{tags:{name:"Interspar",shop:"supermarket"},name:"Interspar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Irma":{tags:{name:"Irma",shop:"supermarket"},name:"Irma",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Jewel-Osco":{tags:{name:"Jewel-Osco",shop:"supermarket"},name:"Jewel-Osco",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Jumbo":{tags:{name:"Jumbo",shop:"supermarket"},name:"Jumbo",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/K+K":{tags:{name:"K+K",shop:"supermarket"},name:"K+K",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Kaufland":{tags:{name:"Kaufland",shop:"supermarket"},name:"Kaufland",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/King Soopers":{tags:{name:"King Soopers",shop:"supermarket"},name:"King Soopers",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Kiwi":{tags:{name:"Kiwi",shop:"supermarket"},name:"Kiwi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Konsum":{tags:{name:"Konsum",shop:"supermarket"},name:"Konsum",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Konzum":{tags:{name:"Konzum",shop:"supermarket"},name:"Konzum",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Kroger":{tags:{name:"Kroger",shop:"supermarket"},name:"Kroger",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Kvickly":{tags:{name:"Kvickly",shop:"supermarket"},name:"Kvickly",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/La Vie Claire":{tags:{name:"La Vie Claire",shop:"supermarket"},name:"La Vie Claire",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Landi":{tags:{name:"Landi",shop:"supermarket"},name:"Landi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Leader Price":{tags:{name:"Leader Price",shop:"supermarket"},name:"Leader Price",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Leclerc Drive":{tags:{name:"Leclerc Drive",shop:"supermarket"},name:"Leclerc Drive",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Lider":{tags:{name:"Lider",shop:"supermarket"},name:"Lider",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Lidl":{tags:{name:"Lidl",shop:"supermarket"},name:"Lidl",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Lupa":{tags:{name:"Lupa",shop:"supermarket"},name:"Lupa",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/MPREIS":{tags:{name:"MPREIS",shop:"supermarket"},name:"MPREIS",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Makro":{tags:{name:"Makro",shop:"supermarket"},name:"Makro",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Markant":{tags:{name:"Markant",shop:"supermarket"},name:"Markant",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Market Basket":{tags:{name:"Market Basket",shop:"supermarket"},name:"Market Basket",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Marktkauf":{tags:{name:"Marktkauf",shop:"supermarket"},name:"Marktkauf",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Match":{tags:{name:"Match",shop:"supermarket"},name:"Match",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Maxi":{tags:{name:"Maxi",shop:"supermarket"},name:"Maxi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Maxi Dia":{tags:{name:"Maxi Dia",shop:"supermarket"},name:"Maxi Dia",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Maxima":{tags:{name:"Maxima",shop:"supermarket"},name:"Maxima",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Maxima X":{tags:{name:"Maxima X",shop:"supermarket"},name:"Maxima X",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Maxima XX":{tags:{name:"Maxima XX",shop:"supermarket"},name:"Maxima XX",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mega Image":{tags:{name:"Mega Image",shop:"supermarket"},name:"Mega Image",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mego":{tags:{name:"Mego",shop:"supermarket"},name:"Mego",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Meijer":{tags:{name:"Meijer",shop:"supermarket"},name:"Meijer",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Meny":{tags:{name:"Meny",shop:"supermarket"},name:"Meny",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mercado Municipal":{tags:{name:"Mercado Municipal",shop:"supermarket"},name:"Mercado Municipal",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mercado de Abastos":{tags:{name:"Mercado de Abastos",shop:"supermarket"},name:"Mercado de Abastos",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mercadona":{tags:{name:"Mercadona",shop:"supermarket"},name:"Mercadona",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mercator":{tags:{name:"Mercator",shop:"supermarket"},name:"Mercator",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Merkur":{tags:{name:"Merkur",shop:"supermarket"},name:"Merkur",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Metro":{tags:{name:"Metro",shop:"supermarket"},name:"Metro",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Migros":{tags:{name:"Migros",shop:"supermarket"},name:"Migros",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mila":{tags:{name:"Mila",shop:"supermarket"},name:"Mila",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Minipreço":{tags:{name:"Minipreço",shop:"supermarket"},name:"Minipreço",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Mix Markt":{tags:{name:"Mix Markt",shop:"supermarket"},name:"Mix Markt",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Monoprix":{tags:{name:"Monoprix",shop:"supermarket"},name:"Monoprix",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/More":{tags:{name:"More",shop:"supermarket"},name:"More",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Morrisons":{tags:{name:"Morrisons",shop:"supermarket"},name:"Morrisons",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/NORMA":{tags:{name:"NORMA",shop:"supermarket"},name:"NORMA",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/NP":{tags:{name:"NP",shop:"supermarket"},name:"NP",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Nah & Frisch":{tags:{name:"Nah & Frisch",shop:"supermarket"},name:"Nah & Frisch",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Nahkauf":{tags:{name:"Nahkauf",shop:"supermarket"},name:"Nahkauf",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Netto":{tags:{name:"Netto",shop:"supermarket"},name:"Netto",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Netto Marken-Discount":{tags:{name:"Netto Marken-Discount",shop:"supermarket"},name:"Netto Marken-Discount",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/New World":{tags:{name:"New World",shop:"supermarket"},name:"New World",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/No Frills":{tags:{name:"No Frills",shop:"supermarket"},name:"No Frills",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Norfa XL":{tags:{name:"Norfa XL",shop:"supermarket"},name:"Norfa XL",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Norma":{tags:{name:"Norma",shop:"supermarket"},name:"Norma",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/PENNY":{tags:{name:"PENNY",shop:"supermarket"},name:"PENNY",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/PLUS":{tags:{name:"PLUS",shop:"supermarket"},name:"PLUS",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/POLOmarket":{tags:{name:"POLOmarket",shop:"supermarket"},name:"POLOmarket",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Palí":{tags:{name:"Palí",shop:"supermarket"},name:"Palí",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Pam":{tags:{name:"Pam",shop:"supermarket"},name:"Pam",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Penny":{tags:{name:"Penny",shop:"supermarket"},name:"Penny",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Penny Markt":{tags:{name:"Penny Markt",shop:"supermarket"},name:"Penny Markt",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Pick n Pay":{tags:{name:"Pick n Pay",shop:"supermarket"},name:"Pick n Pay",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Piggly Wiggly":{tags:{name:"Piggly Wiggly",shop:"supermarket"},name:"Piggly Wiggly",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Pingo Doce":{tags:{name:"Pingo Doce",shop:"supermarket"},name:"Pingo Doce",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Piotr i Paweł":{tags:{name:"Piotr i Paweł",shop:"supermarket"},name:"Piotr i Paweł",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Plaza Vea":{tags:{name:"Plaza Vea",shop:"supermarket"},name:"Plaza Vea",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Plodine":{tags:{name:"Plodine",shop:"supermarket"},name:"Plodine",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Poiesz":{tags:{name:"Poiesz",shop:"supermarket"},name:"Poiesz",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Price Chopper":{tags:{name:"Price Chopper",shop:"supermarket"},name:"Price Chopper",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Prix":{tags:{name:"Prix",shop:"supermarket"},name:"Prix",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Profi":{tags:{name:"Profi",shop:"supermarket"},name:"Profi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Proxy Delhaize":{tags:{name:"Proxy Delhaize",shop:"supermarket"},name:"Proxy Delhaize",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Publix":{tags:{name:"Publix",shop:"supermarket"},name:"Publix",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Punto Simply":{tags:{name:"Punto Simply",shop:"supermarket"},name:"Punto Simply",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Puregold":{tags:{name:"Puregold",shop:"supermarket"},name:"Puregold",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Pão de Açúcar":{tags:{name:"Pão de Açúcar",shop:"supermarket"},name:"Pão de Açúcar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/QFC":{tags:{name:"QFC",shop:"supermarket"},name:"QFC",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/REMA 1000":{tags:{name:"REMA 1000",shop:"supermarket"},name:"REMA 1000",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Ralphs":{tags:{name:"Ralphs",shop:"supermarket"},name:"Ralphs",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Real":{tags:{name:"Real",shop:"supermarket"},name:"Real",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Real Canadian Superstore":{tags:{name:"Real Canadian Superstore",shop:"supermarket"},name:"Real Canadian Superstore",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Reliance Fresh":{tags:{name:"Reliance Fresh",shop:"supermarket"},name:"Reliance Fresh",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Rema 1000":{tags:{name:"Rema 1000",shop:"supermarket"},name:"Rema 1000",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Rewe":{tags:{name:"Rewe",shop:"supermarket"},name:"Rewe",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Rewe City":{tags:{name:"Rewe City",shop:"supermarket"},name:"Rewe City",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Rimi":{tags:{name:"Rimi",shop:"supermarket"},name:"Rimi",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/S-Market":{tags:{name:"S-Market",shop:"supermarket"},name:"S-Market",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Safeway":{tags:{name:"Safeway",shop:"supermarket"},name:"Safeway",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sainsbury's":{tags:{name:"Sainsbury's",shop:"supermarket"},name:"Sainsbury's",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sainsbury's Local":{tags:{name:"Sainsbury's Local",shop:"supermarket"},name:"Sainsbury's Local",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sam's Club":{tags:{name:"Sam's Club",shop:"supermarket"},name:"Sam's Club",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Santa Isabel":{tags:{name:"Santa Isabel",shop:"supermarket"},name:"Santa Isabel",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Save-A-Lot":{tags:{name:"Save-A-Lot",shop:"supermarket"},name:"Save-A-Lot",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ShopRite":{tags:{name:"ShopRite",shop:"supermarket"},name:"ShopRite",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Shoprite":{tags:{name:"Shoprite",shop:"supermarket"},name:"Shoprite",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sigma":{tags:{name:"Sigma",shop:"supermarket"},name:"Sigma",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Simply Market":{tags:{name:"Simply Market",shop:"supermarket"},name:"Simply Market",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sky":{tags:{name:"Sky",shop:"supermarket"},name:"Sky",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Smith's":{tags:{name:"Smith's",shop:"supermarket"},name:"Smith's",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sobeys":{tags:{name:"Sobeys",shop:"supermarket"},name:"Sobeys",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Soriana":{tags:{name:"Soriana",shop:"supermarket"},name:"Soriana",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Spar":{tags:{name:"Spar",shop:"supermarket"},name:"Spar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Sprouts Farmers Market":{tags:{name:"Sprouts Farmers Market",shop:"supermarket"},name:"Sprouts Farmers Market",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Stokrotka":{tags:{name:"Stokrotka",shop:"supermarket"},name:"Stokrotka",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Stop & Shop":{tags:{name:"Stop & Shop",shop:"supermarket"},name:"Stop & Shop",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Super C":{tags:{name:"Super C",shop:"supermarket"},name:"Super C",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Super U":{tags:{name:"Super U",shop:"supermarket"},name:"Super U",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/SuperBrugsen":{tags:{name:"SuperBrugsen",shop:"supermarket"},name:"SuperBrugsen",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/SuperValu":{tags:{name:"SuperValu",shop:"supermarket"},name:"SuperValu",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Superama":{tags:{name:"Superama",shop:"supermarket"},name:"Superama",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Supersol":{tags:{name:"Supersol",shop:"supermarket"},name:"Supersol",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Superspar":{tags:{name:"Superspar",shop:"supermarket"},name:"Superspar",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tegut":{tags:{name:"Tegut",shop:"supermarket"},name:"Tegut",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tengelmann":{tags:{name:"Tengelmann",shop:"supermarket"},name:"Tengelmann",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tesco":{tags:{name:"Tesco",shop:"supermarket"},name:"Tesco",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tesco Extra":{tags:{name:"Tesco Extra",shop:"supermarket"},name:"Tesco Extra",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tesco Lotus":{tags:{name:"Tesco Lotus",shop:"supermarket"},name:"Tesco Lotus",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tesco Metro":{tags:{name:"Tesco Metro",shop:"supermarket"},name:"Tesco Metro",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/The Co-operative":{tags:{name:"The Co-operative",shop:"supermarket"},name:"The Co-operative",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/The Co-operative Food":{tags:{name:"The Co-operative Food",shop:"supermarket"},name:"The Co-operative Food",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tommy":{tags:{name:"Tommy",shop:"supermarket"},name:"Tommy",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Tottus":{tags:{name:"Tottus",shop:"supermarket"},name:"Tottus",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Trader Joe's":{tags:{name:"Trader Joe's",shop:"supermarket"},name:"Trader Joe's",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Treff 3000":{tags:{name:"Treff 3000",shop:"supermarket"},name:"Treff 3000",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/U Express":{tags:{name:"U Express",shop:"supermarket"},name:"U Express",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Unimarc":{tags:{name:"Unimarc",shop:"supermarket"},name:"Unimarc",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Unimarkt":{tags:{name:"Unimarkt",shop:"supermarket"},name:"Unimarkt",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Utile":{tags:{name:"Utile",shop:"supermarket"},name:"Utile",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Vea":{tags:{name:"Vea",shop:"supermarket"},name:"Vea",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Volg":{tags:{name:"Volg",shop:"supermarket"},name:"Volg",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Waitrose":{tags:{name:"Waitrose",shop:"supermarket"},name:"Waitrose",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Walmart":{tags:{name:"Walmart",shop:"supermarket"},name:"Walmart",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Walmart Neighborhood Market":{tags:{name:"Walmart Neighborhood Market",shop:"supermarket"},name:"Walmart Neighborhood Market",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Walmart Supercenter":{tags:{name:"Walmart Supercenter",shop:"supermarket"},name:"Walmart Supercenter",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Wasgau":{tags:{name:"Wasgau",shop:"supermarket"},name:"Wasgau",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Wegmans":{tags:{name:"Wegmans",shop:"supermarket"},name:"Wegmans",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Wellcome":{tags:{name:"Wellcome",shop:"supermarket"},name:"Wellcome",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Whole Foods Market":{tags:{name:"Whole Foods Market",shop:"supermarket"},name:"Whole Foods Market",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Willys":{tags:{name:"Willys",shop:"supermarket"},name:"Willys",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/WinCo Foods":{tags:{name:"WinCo Foods",shop:"supermarket"},name:"WinCo Foods",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Winn Dixie":{tags:{name:"Winn Dixie",shop:"supermarket"},name:"Winn Dixie",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Woolworths":{tags:{name:"Woolworths",shop:"supermarket"},name:"Woolworths",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/denn's Biomarkt":{tags:{name:"denn's Biomarkt",shop:"supermarket"},name:"denn's Biomarkt",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/fakta":{tags:{name:"fakta",shop:"supermarket"},name:"fakta",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/real":{tags:{name:"real",shop:"supermarket"},name:"real",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/tegut":{tags:{name:"tegut",shop:"supermarket"},name:"tegut",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Şok":{tags:{name:"Şok",shop:"supermarket"},name:"Şok",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ΑΒ Βασιλόπουλος":{tags:{name:"ΑΒ Βασιλόπουλος",shop:"supermarket"},name:"ΑΒ Βασιλόπουλος",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Γαλαξίας":{tags:{name:"Γαλαξίας",shop:"supermarket"},name:"Γαλαξίας",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Μασούτης":{tags:{name:"Μασούτης",shop:"supermarket"},name:"Μασούτης",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Σκλαβενίτης":{tags:{name:"Σκλαβενίτης",shop:"supermarket"},name:"Σκλαβενίτης",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/АТБ":{tags:{name:"АТБ",shop:"supermarket"},name:"АТБ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Абсолют":{tags:{name:"Абсолют",shop:"supermarket"},name:"Абсолют",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Азбука Вкуса":{tags:{name:"Азбука Вкуса",shop:"supermarket"},name:"Азбука Вкуса",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Атак":{tags:{name:"Атак",shop:"supermarket"},name:"Атак",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Ашан":{tags:{name:"Ашан",shop:"supermarket"},name:"Ашан",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Верный":{tags:{name:"Верный",shop:"supermarket"},name:"Верный",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Вопак":{tags:{name:"Вопак",shop:"supermarket"},name:"Вопак",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Гроздь":{tags:{name:"Гроздь",shop:"supermarket"},name:"Гроздь",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Десяточка":{tags:{name:"Десяточка",shop:"supermarket"},name:"Десяточка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Дикси":{tags:{name:"Дикси",shop:"supermarket"},name:"Дикси",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Евроопт":{tags:{name:"Евроопт",shop:"supermarket"},name:"Евроопт",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Карусель":{tags:{name:"Карусель",shop:"supermarket"},name:"Карусель",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Квартал":{tags:{name:"Квартал",shop:"supermarket"},name:"Квартал",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Командор":{tags:{name:"Командор",shop:"supermarket"},name:"Командор",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Красный Яр":{tags:{name:"Красный Яр",shop:"supermarket"},name:"Красный Яр",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Лента":{tags:{name:"Лента",shop:"supermarket"},name:"Лента",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Магнит":{tags:{name:"Магнит",shop:"supermarket"},name:"Магнит",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Магнолия":{tags:{name:"Магнолия",shop:"supermarket"},name:"Магнолия",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Монетка":{tags:{name:"Монетка",shop:"supermarket"},name:"Монетка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Народная 7Я семьЯ":{tags:{name:"Народная 7Я семьЯ",shop:"supermarket"},name:"Народная 7Я семьЯ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Перекресток":{tags:{name:"Перекресток",shop:"supermarket"},name:"Перекресток",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Покупочка":{tags:{name:"Покупочка",shop:"supermarket"},name:"Покупочка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Полушка":{tags:{name:"Полушка",shop:"supermarket"},name:"Полушка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Пятёрочка":{tags:{name:"Пятёрочка",shop:"supermarket"},name:"Пятёрочка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Радеж":{tags:{name:"Радеж",shop:"supermarket"},name:"Радеж",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Рукавичка":{tags:{name:"Рукавичка",shop:"supermarket"},name:"Рукавичка",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Светофор":{tags:{name:"Светофор",shop:"supermarket"},name:"Светофор",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Седьмой континент":{tags:{name:"Седьмой континент",shop:"supermarket"},name:"Седьмой континент",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Семейный":{tags:{name:"Семейный",shop:"supermarket"},name:"Семейный",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Семья":{tags:{name:"Семья",shop:"supermarket"},name:"Семья",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Супермаркет":{tags:{name:"Супермаркет",shop:"supermarket"},name:"Супермаркет",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Сільпо":{tags:{name:"Сільпо",shop:"supermarket"},name:"Сільпо",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Таврія‑В":{tags:{name:"Таврія‑В",shop:"supermarket"},name:"Таврія‑В",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Фора":{tags:{name:"Фора",shop:"supermarket"},name:"Фора",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Фуршет":{tags:{name:"Фуршет",shop:"supermarket"},name:"Фуршет",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Хүнсний дэлгүүр":{tags:{name:"Хүнсний дэлгүүр",shop:"supermarket"},name:"Хүнсний дэлгүүр",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/Эдельвейс":{tags:{name:"Эдельвейс",shop:"supermarket"},name:"Эдельвейс",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/хүнсний дэлгүүр":{tags:{name:"хүнсний дэлгүүр",shop:"supermarket"},name:"хүнсний дэлгүүр",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/بقالة":{tags:{name:"بقالة",shop:"supermarket"},name:"بقالة",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/سوپر مارکت":{tags:{name:"سوپر مارکت",shop:"supermarket"},name:"سوپر مارکت",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/سوپرمارکت":{tags:{name:"سوپرمارکت",shop:"supermarket"},name:"سوپرمارکت",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/いなげや":{tags:{name:"いなげや",shop:"supermarket"},name:"いなげや",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/まいばすけっと":{tags:{name:"まいばすけっと",shop:"supermarket"},name:"まいばすけっと",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/イオン":{tags:{name:"イオン",shop:"supermarket"},name:"イオン",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/イトーヨーカドー":{tags:{name:"イトーヨーカドー",shop:"supermarket"},name:"イトーヨーカドー",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/カスミ":{tags:{name:"カスミ",shop:"supermarket"},name:"カスミ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/マックスバリュ":{tags:{name:"マックスバリュ",shop:"supermarket"},name:"マックスバリュ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/マルエツ":{tags:{name:"マルエツ",shop:"supermarket"},name:"マルエツ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/ライフ":{tags:{name:"ライフ",shop:"supermarket"},name:"ライフ",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/全聯":{tags:{name:"全聯",shop:"supermarket"},name:"全聯",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/全聯福利中心":{tags:{name:"全聯福利中心",shop:"supermarket"},name:"全聯福利中心",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/惠康 Wellcome":{tags:{name:"惠康 Wellcome",shop:"supermarket"},name:"惠康 Wellcome",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/業務スーパー":{tags:{name:"業務スーパー",shop:"supermarket"},name:"業務スーパー",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/美廉社":{tags:{name:"美廉社",shop:"supermarket"},name:"美廉社",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/supermarket/西友":{tags:{name:"西友",shop:"supermarket"},name:"西友",icon:"maki-grocery",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tailor/Atelier de couture":{tags:{name:"Atelier de couture",shop:"tailor"},name:"Atelier de couture",icon:"maki-clothing-store",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/ticket/Boutique Grandes Lignes":{tags:{name:"Boutique Grandes Lignes",shop:"ticket"},name:"Boutique Grandes Lignes",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/ticket/Guichet Transilien":{tags:{name:"Guichet Transilien",shop:"ticket"},name:"Guichet Transilien",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/ticket/Касса":{tags:{name:"Касса",shop:"ticket"},name:"Касса",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/ticket/Проездные билеты":{tags:{name:"Проездные билеты",shop:"ticket"},name:"Проездные билеты",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tobacco/Dohánybolt":{tags:{name:"Dohánybolt",shop:"tobacco"},name:"Dohánybolt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tobacco/Estanco":{tags:{name:"Estanco",shop:"tobacco"},name:"Estanco",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tobacco/Nemzeti Dohánybolt":{tags:{name:"Nemzeti Dohánybolt",shop:"tobacco"},name:"Nemzeti Dohánybolt",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tobacco/Tabacos":{tags:{name:"Tabacos",shop:"tobacco"},name:"Tabacos",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tobacco/Табакерка":{tags:{name:"Табакерка",shop:"tobacco"},name:"Табакерка",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Dráčik":{tags:{name:"Dráčik",shop:"toys"},name:"Dráčik",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Intertoys":{tags:{name:"Intertoys",shop:"toys"},name:"Intertoys",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/King Jouet":{tags:{name:"King Jouet",shop:"toys"},name:"King Jouet",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/La Grande Récré":{tags:{name:"La Grande Récré",shop:"toys"},name:"La Grande Récré",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Maxi Toys":{tags:{name:"Maxi Toys",shop:"toys"},name:"Maxi Toys",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Toys R Us":{tags:{name:"Toys R Us",shop:"toys"},name:"Toys R Us",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Детский мир":{tags:{name:"Детский мир",shop:"toys"},name:"Детский мир",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/toys/Игрушки":{tags:{name:"Игрушки",shop:"toys"},name:"Игрушки",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/D-reizen":{tags:{name:"D-reizen",shop:"travel_agency"},name:"D-reizen",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/DER Reisebüro":{tags:{name:"DER Reisebüro",shop:"travel_agency"},name:"DER Reisebüro",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/First Reisebüro":{tags:{name:"First Reisebüro",shop:"travel_agency"},name:"First Reisebüro",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/Flight Centre":{tags:{name:"Flight Centre",shop:"travel_agency"},name:"Flight Centre",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/Reiseland":{tags:{name:"Reiseland",shop:"travel_agency"},name:"Reiseland",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/TUI":{tags:{name:"TUI",shop:"travel_agency"},name:"TUI",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/The Co-operative Travel":{tags:{name:"The Co-operative Travel",shop:"travel_agency"},name:"The Co-operative Travel",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/Thomas Cook":{tags:{name:"Thomas Cook",shop:"travel_agency"},name:"Thomas Cook",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/travel_agency/Thomson":{tags:{name:"Thomson",shop:"travel_agency"},name:"Thomson",icon:"maki-suitcase",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tyres/Borracharia":{tags:{name:"Borracharia",shop:"tyres"},name:"Borracharia",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tyres/Bridgestone":{tags:{name:"Bridgestone",shop:"tyres"},name:"Bridgestone",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tyres/Discount Tire":{tags:{name:"Discount Tire",shop:"tyres"},name:"Discount Tire",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tyres/Les Schwab Tire Center":{tags:{name:"Les Schwab Tire Center",shop:"tyres"},name:"Les Schwab Tire Center",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tyres/Vianor":{tags:{name:"Vianor",shop:"tyres"},name:"Vianor",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/tyres/Вулканизация":{tags:{name:"Вулканизация",shop:"tyres"},name:"Вулканизация",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Action":{tags:{name:"Action",shop:"variety_store"},name:"Action",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Bazar":{tags:{name:"Bazar",shop:"variety_store"},name:"Bazar",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Big Bazar":{tags:{name:"Big Bazar",shop:"variety_store"},name:"Big Bazar",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Dollar Tree":{tags:{name:"Dollar Tree",shop:"variety_store"},name:"Dollar Tree",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Dollarama":{tags:{name:"Dollarama",shop:"variety_store"},name:"Dollarama",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/EuroShop":{tags:{name:"EuroShop",shop:"variety_store"},name:"EuroShop",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Family Dollar":{tags:{name:"Family Dollar",shop:"variety_store"},name:"Family Dollar",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Fix Price":{tags:{name:"Fix Price",shop:"variety_store"},name:"Fix Price",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Fix price":{tags:{name:"Fix price",shop:"variety_store"},name:"Fix price",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/FixPrice":{tags:{name:"FixPrice",shop:"variety_store"},name:"FixPrice",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/GiFi":{tags:{name:"GiFi",shop:"variety_store"},name:"GiFi",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Home Bargains":{tags:{name:"Home Bargains",shop:"variety_store"},name:"Home Bargains",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Mäc-Geiz":{tags:{name:"Mäc-Geiz",shop:"variety_store"},name:"Mäc-Geiz",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/NOZ":{tags:{name:"NOZ",shop:"variety_store"},name:"NOZ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Poundland":{tags:{name:"Poundland",shop:"variety_store"},name:"Poundland",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Poundworld":{tags:{name:"Poundworld",shop:"variety_store"},name:"Poundworld",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/Tedi":{tags:{name:"Tedi",shop:"variety_store"},name:"Tedi",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/variety_store/ダイソー":{tags:{name:"ダイソー",shop:"variety_store"},name:"ダイソー",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video/Blockbuster":{tags:{name:"Blockbuster",shop:"video"},name:"Blockbuster",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video/Family Video":{tags:{name:"Family Video",shop:"video"},name:"Family Video",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video/TSUTAYA":{tags:{name:"TSUTAYA",shop:"video"},name:"TSUTAYA",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video/World of Video":{tags:{name:"World of Video",shop:"video"},name:"World of Video",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video/ゲオ":{tags:{name:"ゲオ",shop:"video"},name:"ゲオ",icon:"maki-shop",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video_games/EB Games":{tags:{name:"EB Games",shop:"video_games"},name:"EB Games",icon:"maki-gaming",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video_games/Game":{tags:{name:"Game",shop:"video_games"},name:"Game",icon:"maki-gaming",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video_games/GameStop":{tags:{name:"GameStop",shop:"video_games"},name:"GameStop",icon:"maki-gaming",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"shop/video_games/Micromania":{tags:{name:"Micromania",shop:"video_games"},name:"Micromania",icon:"maki-gaming",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours","payment_multi"],suggestion:true},"tourism/alpine_hut/КОШ":{tags:{name:"КОШ",tourism:"alpine_hut"},name:"КОШ",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/apartment/Двухкомнатная квартира на сутки":{tags:{name:"Двухкомнатная квартира на сутки",tourism:"apartment"},name:"Двухкомнатная квартира на сутки",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/attraction/Arch":{tags:{name:"Arch",tourism:"attraction"},name:"Arch",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Kursächsische Postmeilensäule":{tags:{name:"Kursächsische Postmeilensäule",tourism:"attraction"},name:"Kursächsische Postmeilensäule",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Maibaum":{tags:{name:"Maibaum",tourism:"attraction"},name:"Maibaum",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Moab trail":{tags:{name:"Moab trail",tourism:"attraction"},name:"Moab trail",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Moai":{tags:{name:"Moai",tourism:"attraction"},name:"Moai",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/OWŚ":{tags:{name:"OWŚ",tourism:"attraction"},name:"OWŚ",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Sommerrodelbahn":{tags:{name:"Sommerrodelbahn",tourism:"attraction"},name:"Sommerrodelbahn",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/path contiunes":{tags:{name:"path contiunes",tourism:"attraction"},name:"path contiunes",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/white blaze":{tags:{name:"white blaze",tourism:"attraction"},name:"white blaze",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Кладбище еврейское":{tags:{name:"Кладбище еврейское",tourism:"attraction"},name:"Кладбище еврейское",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Колесо обозрения":{tags:{name:"Колесо обозрения",tourism:"attraction"},name:"Колесо обозрения",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Приусадебный парк":{tags:{name:"Приусадебный парк",tourism:"attraction"},name:"Приусадебный парк",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Усадьба":{tags:{name:"Усадьба",tourism:"attraction"},name:"Усадьба",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Хозяйственный двор":{tags:{name:"Хозяйственный двор",tourism:"attraction"},name:"Хозяйственный двор",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/Часовня":{tags:{name:"Часовня",tourism:"attraction"},name:"Часовня",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/attraction/дольмен":{tags:{name:"дольмен",tourism:"attraction"},name:"дольмен",icon:"maki-star",geometry:["point","vertex","area"],fields:["name","operator","address"],suggestion:true},"tourism/camp_site/Camping Municipal":{tags:{name:"Camping Municipal",tourism:"camp_site"},name:"Camping Municipal",icon:"maki-campsite",geometry:["point","vertex","area"],fields:["name","operator","address","access_simple","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/camp_site/Camping municipal":{tags:{name:"Camping municipal",tourism:"camp_site"},name:"Camping municipal",icon:"maki-campsite",geometry:["point","vertex","area"],fields:["name","operator","address","access_simple","capacity","fee","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/guest_house/Home":{tags:{name:"Home",tourism:"guest_house"},name:"Home",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/guest_house/OW Bielanka":{tags:{name:"OW Bielanka",tourism:"guest_house"},name:"OW Bielanka",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hostel/Albergue de Peregrinos":{tags:{name:"Albergue de Peregrinos",tourism:"hostel"},name:"Albergue de Peregrinos",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hostel/Hospedaje":{tags:{name:"Hospedaje",tourism:"hostel"},name:"Hospedaje",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hostel/Hostal":{tags:{name:"Hostal",tourism:"hostel"},name:"Hostal",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/B&B Hôtel":{tags:{name:"B&B Hôtel",tourism:"hotel"},name:"B&B Hôtel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/B&b Hôtel":{tags:{name:"B&b Hôtel",tourism:"hotel"},name:"B&b Hôtel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Best Western":{tags:{name:"Best Western",tourism:"hotel"},name:"Best Western",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Campanile":{tags:{name:"Campanile",tourism:"hotel"},name:"Campanile",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Central Hotel":{tags:{name:"Central Hotel",tourism:"hotel"},name:"Central Hotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/City Hotel":{tags:{name:"City Hotel",tourism:"hotel"},name:"City Hotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Comfort Inn":{tags:{name:"Comfort Inn",tourism:"hotel"},name:"Comfort Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Comfort Inn & Suites":{tags:{name:"Comfort Inn & Suites",tourism:"hotel"},name:"Comfort Inn & Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Comfort Suites":{tags:{name:"Comfort Suites",tourism:"hotel"},name:"Comfort Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Country Inn & Suites":{tags:{name:"Country Inn & Suites",tourism:"hotel"},name:"Country Inn & Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Courtyard by Marriott":{tags:{name:"Courtyard by Marriott",tourism:"hotel"},name:"Courtyard by Marriott",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Crowne Plaza":{tags:{name:"Crowne Plaza",tourism:"hotel"},name:"Crowne Plaza",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Days Inn":{tags:{name:"Days Inn",tourism:"hotel"},name:"Days Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Embassy Suites":{tags:{name:"Embassy Suites",tourism:"hotel"},name:"Embassy Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Extended Stay America":{tags:{name:"Extended Stay America",tourism:"hotel"},name:"Extended Stay America",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Fairfield Inn":{tags:{name:"Fairfield Inn",tourism:"hotel"},name:"Fairfield Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Fairfield Inn & Suites":{tags:{name:"Fairfield Inn & Suites",tourism:"hotel"},name:"Fairfield Inn & Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Formule 1":{tags:{name:"Formule 1",tourism:"hotel"},name:"Formule 1",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Grand Hotel":{tags:{name:"Grand Hotel",tourism:"hotel"},name:"Grand Hotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hampton Inn":{tags:{name:"Hampton Inn",tourism:"hotel"},name:"Hampton Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hampton Inn & Suites":{tags:{name:"Hampton Inn & Suites",tourism:"hotel"},name:"Hampton Inn & Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hilton Garden Inn":{tags:{name:"Hilton Garden Inn",tourism:"hotel"},name:"Hilton Garden Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Holiday Inn":{tags:{name:"Holiday Inn",tourism:"hotel"},name:"Holiday Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Holiday Inn Express":{tags:{name:"Holiday Inn Express",tourism:"hotel"},name:"Holiday Inn Express",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Holiday Inn Express & Suites":{tags:{name:"Holiday Inn Express & Suites",tourism:"hotel"},name:"Holiday Inn Express & Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Homewood Suites":{tags:{name:"Homewood Suites",tourism:"hotel"},name:"Homewood Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Central":{tags:{name:"Hotel Central",tourism:"hotel"},name:"Hotel Central",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Europa":{tags:{name:"Hotel Europa",tourism:"hotel"},name:"Hotel Europa",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Ibis":{tags:{name:"Hotel Ibis",tourism:"hotel"},name:"Hotel Ibis",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Krone":{tags:{name:"Hotel Krone",tourism:"hotel"},name:"Hotel Krone",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Panorama":{tags:{name:"Hotel Panorama",tourism:"hotel"},name:"Hotel Panorama",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Plaza":{tags:{name:"Hotel Plaza",tourism:"hotel"},name:"Hotel Plaza",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Post":{tags:{name:"Hotel Post",tourism:"hotel"},name:"Hotel Post",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Royal":{tags:{name:"Hotel Royal",tourism:"hotel"},name:"Hotel Royal",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel Victoria":{tags:{name:"Hotel Victoria",tourism:"hotel"},name:"Hotel Victoria",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hotel zur Post":{tags:{name:"Hotel zur Post",tourism:"hotel"},name:"Hotel zur Post",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hôtel Ibis":{tags:{name:"Hôtel Ibis",tourism:"hotel"},name:"Hôtel Ibis",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Hôtel de France":{tags:{name:"Hôtel de France",tourism:"hotel"},name:"Hôtel de France",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Ibis":{tags:{name:"Ibis",tourism:"hotel"},name:"Ibis",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Ibis Budget":{tags:{name:"Ibis Budget",tourism:"hotel"},name:"Ibis Budget",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Ibis Styles":{tags:{name:"Ibis Styles",tourism:"hotel"},name:"Ibis Styles",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Kyriad":{tags:{name:"Kyriad",tourism:"hotel"},name:"Kyriad",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/La Quinta":{tags:{name:"La Quinta",tourism:"hotel"},name:"La Quinta",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Marriott":{tags:{name:"Marriott",tourism:"hotel"},name:"Marriott",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Mercure":{tags:{name:"Mercure",tourism:"hotel"},name:"Mercure",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Novotel":{tags:{name:"Novotel",tourism:"hotel"},name:"Novotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Palace Hotel":{tags:{name:"Palace Hotel",tourism:"hotel"},name:"Palace Hotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Park Hotel":{tags:{name:"Park Hotel",tourism:"hotel"},name:"Park Hotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Parkhotel":{tags:{name:"Parkhotel",tourism:"hotel"},name:"Parkhotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Premier Inn":{tags:{name:"Premier Inn",tourism:"hotel"},name:"Premier Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Première Classe":{tags:{name:"Première Classe",tourism:"hotel"},name:"Première Classe",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Quality Inn":{tags:{name:"Quality Inn",tourism:"hotel"},name:"Quality Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Quality Inn & Suites":{tags:{name:"Quality Inn & Suites",tourism:"hotel"},name:"Quality Inn & Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Ramada":{tags:{name:"Ramada",tourism:"hotel"},name:"Ramada",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Residence Inn":{tags:{name:"Residence Inn",tourism:"hotel"},name:"Residence Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Royal Hotel":{tags:{name:"Royal Hotel",tourism:"hotel"},name:"Royal Hotel",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Sheraton":{tags:{name:"Sheraton",tourism:"hotel"},name:"Sheraton",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Sleep Inn":{tags:{name:"Sleep Inn",tourism:"hotel"},name:"Sleep Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Staybridge Suites":{tags:{name:"Staybridge Suites",tourism:"hotel"},name:"Staybridge Suites",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Super 8":{tags:{name:"Super 8",tourism:"hotel"},name:"Super 8",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Travelodge":{tags:{name:"Travelodge",tourism:"hotel"},name:"Travelodge",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/Гостиница":{tags:{name:"Гостиница",tourism:"hotel"},name:"Гостиница",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/hotel/東横イン":{tags:{name:"東横イン",tourism:"hotel"},name:"東横イン",icon:"maki-lodging",geometry:["point","area"],fields:["name","brand","operator","address","building_area","smoking","stars","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/motel/Budget Inn":{tags:{name:"Budget Inn",tourism:"motel"},name:"Budget Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/motel/Econo Lodge":{tags:{name:"Econo Lodge",tourism:"motel"},name:"Econo Lodge",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/motel/Motel 6":{tags:{name:"Motel 6",tourism:"motel"},name:"Motel 6",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/motel/Rodeway Inn":{tags:{name:"Rodeway Inn",tourism:"motel"},name:"Rodeway Inn",icon:"maki-lodging",geometry:["point","area"],fields:["name","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],suggestion:true},"tourism/museum/Heimatmuseum":{tags:{name:"Heimatmuseum",tourism:"museum"},name:"Heimatmuseum",icon:"maki-museum",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true},"tourism/museum/Stadtmuseum":{tags:{name:"Stadtmuseum",tourism:"museum"},name:"Stadtmuseum",icon:"maki-museum",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true},"tourism/museum/Tájház":{tags:{name:"Tájház",tourism:"museum"},name:"Tájház",icon:"maki-museum",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true},"tourism/museum/Краеведческий музей":{tags:{name:"Краеведческий музей",tourism:"museum"},name:"Краеведческий музей",icon:"maki-museum",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true},"tourism/museum/Музей":{tags:{name:"Музей",tourism:"museum"},name:"Музей",icon:"maki-museum",geometry:["point","area"],fields:["name","operator","address","building_area","opening_hours"],suggestion:true}};
23660 var defaults = {area:["category-landuse","category-building","category-water-area","category-natural-area","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","area"],line:["category-road","category-rail","category-path","category-water-line","category-barrier","category-natural-line","power/line","line"],point:["category-natural-point","leisure/park","amenity/hospital","amenity/place_of_worship","amenity/cafe","amenity/restaurant","amenity/fast_food","amenity/bar","amenity/bank","shop/supermarket","point"],vertex:["highway/crosswalk","highway/crossing","railway/level_crossing","highway/traffic_signals","highway/turning_circle","highway/turning_loop","traffic_calming","highway/mini_roundabout","highway/motorway_junction","vertex"],relation:["category-route","category-restriction","public_transport/stop_area","type/boundary","type/waterway","type/multipolygon","type/site","relation"]};
23662 var categories = {"category-barrier":{icon:"maki-roadblock",geometry:"line",name:"Barrier Features",members:["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier/kerb","barrier"]},"category-building":{icon:"maki-building",geometry:"area",name:"Building Features",members:["building","building/house","building/apartments","building/retail","building/commercial","building/industrial","building/residential"]},"category-golf":{icon:"maki-golf",geometry:"area",name:"Golf Features",members:["golf/fairway","golf/green","golf/lateral_water_hazard_area","golf/rough","golf/bunker","golf/tee","golf/water_hazard_area"]},"category-landuse":{icon:"maki-landuse",geometry:"area",name:"Land Use Features",members:["landuse/residential","landuse/industrial","landuse/commercial","landuse/retail","landuse/farmland","landuse/farmyard","landuse/forest","landuse/meadow","landuse/aquaculture","landuse/cemetery","landuse/military","landuse/religious"]},"category-natural-area":{icon:"maki-natural",geometry:"area",name:"Natural Features",members:["natural/water","natural/wood","natural/scrub","natural/wetland","natural/grassland","natural/heath","natural/bare_rock","natural/beach","natural/cave_entrance","natural/glacier"]},"category-natural-line":{icon:"maki-natural",geometry:"line",name:"Natural Features",members:["natural/coastline","natural/tree_row"]},"category-natural-point":{icon:"maki-natural",geometry:"point",name:"Natural Features",members:["natural/peak","natural/cliff","natural/beach","natural/cave_entrance"]},"category-path":{icon:"iD-category-path",geometry:"line",name:"Path Features",members:["footway/crosswalk","footway/sidewalk","highway/steps","highway/path","highway/footway","highway/cycleway","highway/bridleway","highway/pedestrian_line"]},"category-rail":{icon:"iD-category-rail",geometry:"line",name:"Rail Features",members:["railway/rail","railway/subway","railway/tram","railway/monorail","railway/disused","railway/abandoned"]},"category-restriction":{icon:"iD-restriction",geometry:"relation",name:"Restriction Features",members:["type/restriction/no_left_turn","type/restriction/no_right_turn","type/restriction/no_straight_on","type/restriction/no_u_turn","type/restriction/only_left_turn","type/restriction/only_right_turn","type/restriction/only_straight_on","type/restriction/only_u_turn","type/restriction"]},"category-road":{icon:"iD-category-roads",geometry:"line",name:"Road Features",members:["highway/residential","highway/motorway","highway/trunk","highway/primary","highway/secondary","highway/tertiary","highway/living_street","highway/unclassified","highway/service","highway/track","highway/motorway_link","highway/trunk_link","highway/primary_link","highway/secondary_link","highway/tertiary_link","highway/road"]},"category-route":{icon:"iD-route",geometry:"relation",name:"Route Features",members:["type/route/road","type/route/bicycle","type/route/foot","type/route/hiking","type/route/horse","type/route/piste","type/route/bus","type/route/train","type/route/light_rail","type/route/tram","type/route/subway","type/route/ferry","type/route/power","type/route/pipeline","type/route/detour","type/route_master","type/route"]},"category-water-area":{icon:"maki-water",geometry:"area",name:"Water Features",members:["natural/water/lake","natural/water/pond","natural/water/reservoir","natural/water"]},"category-water-line":{icon:"iD-category-water",geometry:"line",name:"Water Features",members:["waterway/river","waterway/stream","waterway/canal","waterway/ditch","waterway/drain"]}};
23664 var fields = {access_simple:{key:"access",type:"combo",label:"Allowed Access",options:["yes","permissive","private","customers","permit","no"]},access:{keys:["access","foot","motor_vehicle","bicycle","horse"],reference:{key:"access"},type:"access",label:"Allowed Access",placeholder:"Not Specified",strings:{types:{access:"All",foot:"Foot",motor_vehicle:"Motor Vehicles",bicycle:"Bicycles",horse:"Horses"},options:{yes:{title:"Allowed",description:"Access allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}}},address:{type:"address",keys:["addr:block_number","addr:city","addr:block_number","addr:conscriptionnumber","addr:county","addr:country","addr:county","addr:district","addr:floor","addr:hamlet","addr:housename","addr:housenumber","addr:neighbourhood","addr:place","addr:postcode","addr:province","addr:quarter","addr:state","addr:street","addr:subdistrict","addr:suburb","addr:unit"],reference:{key:"addr"},icon:"address",universal:true,label:"Address",strings:{placeholders:{block_number:"Block Number","block_number!jp":"Block No.",city:"City","city!jp":"City/Town/Village/Tokyo Special Ward","city!vn":"City/Town",conscriptionnumber:"123",country:"Country",county:"County","county!jp":"District",district:"District","district!vn":"Arrondissement/Town/District",floor:"Floor",hamlet:"Hamlet",housename:"Housename",housenumber:"123","housenumber!jp":"Building No./Lot No.",neighbourhood:"Neighbourhood","neighbourhood!jp":"Chōme/Aza/Koaza",place:"Place",postcode:"Postcode",province:"Province","province!jp":"Prefecture",quarter:"Quarter","quarter!jp":"Ōaza/Machi",state:"State",street:"Street",subdistrict:"Subdistrict","subdistrict!vn":"Ward/Commune/Townlet",suburb:"Suburb","suburb!jp":"Ward",unit:"Unit"}}},admin_level:{key:"admin_level",type:"number",minValue:1,label:"Admin Level"},aerialway:{key:"aerialway",type:"typeCombo",label:"Type"},"aerialway/access":{key:"aerialway:access",type:"combo",label:"Access",strings:{options:{entry:"Entry",exit:"Exit",both:"Both"}}},"aerialway/bubble":{key:"aerialway:bubble",type:"check",label:"Bubble"},"aerialway/capacity":{key:"aerialway:capacity",type:"number",minValue:0,label:"Capacity (per hour)",placeholder:"500, 2500, 5000..."},"aerialway/duration":{key:"aerialway:duration",type:"number",minValue:0,label:"Duration (minutes)",placeholder:"1, 2, 3..."},"aerialway/heating":{key:"aerialway:heating",type:"check",label:"Heated"},"aerialway/occupancy":{key:"aerialway:occupancy",type:"number",minValue:0,label:"Occupancy",placeholder:"2, 4, 8..."},"aerialway/summer/access":{key:"aerialway:summer:access",type:"combo",label:"Access (summer)",strings:{options:{entry:"Entry",exit:"Exit",both:"Both"}}},aeroway:{key:"aeroway",type:"typeCombo",label:"Type"},agrarian:{key:"agrarian",type:"semiCombo",label:"Products"},amenity:{key:"amenity",type:"typeCombo",label:"Type"},animal_boarding:{key:"animal_boarding",type:"semiCombo",label:"For Animals"},animal_breeding:{key:"animal_breeding",type:"semiCombo",label:"For Animals"},animal_shelter:{key:"animal_shelter",type:"semiCombo",label:"For Animals"},"area/highway":{key:"area:highway",type:"typeCombo",label:"Type"},artist:{key:"artist_name",type:"text",label:"Artist"},artwork_type:{key:"artwork_type",type:"combo",label:"Type"},atm:{key:"atm",type:"check",label:"ATM"},backrest:{key:"backrest",type:"check",label:"Backrest"},barrier:{key:"barrier",type:"typeCombo",label:"Type"},"bath/open_air":{key:"bath:open_air",label:"Open Air",type:"check"},"bath/sand_bath":{key:"bath:sand_bath",label:"Sand Bath",type:"check"},"bath/type":{key:"bath:type",type:"combo",label:"Specialty",strings:{options:{onsen:"Japanese Onsen",foot_bath:"Foot Bath",hot_spring:"Hot Spring"}}},beauty:{key:"beauty",type:"combo",label:"Shop Type"},bench:{key:"bench",type:"check",label:"Bench"},bicycle_parking:{key:"bicycle_parking",type:"combo",label:"Type"},bin:{key:"bin",type:"check",label:"Waste Bin"},blood_components:{key:"blood:",type:"multiCombo",label:"Blood Components",strings:{options:{whole:"whole blood",plasma:"plasma",platelets:"platelets",stemcells:"stem cell samples"}}},board_type:{key:"board_type",type:"typeCombo",label:"Type"},booth:{key:"booth",type:"combo",label:"Booth",caseSensitive:true},boules:{key:"boules",type:"typeCombo",label:"Type"},boundary:{key:"boundary",type:"combo",label:"Type"},brand:{key:"brand",type:"text",label:"Brand"},brewery:{key:"brewery",type:"semiCombo",label:"Draft Beers"},bridge:{key:"bridge",type:"typeCombo",label:"Type",placeholder:"Default"},building_area:{key:"building",type:"combo","default":"yes",geometry:"area",label:"Building"},building:{key:"building",type:"combo",label:"Building"},bunker_type:{key:"bunker_type",type:"combo",label:"Type"},cables:{key:"cables",type:"number",minValue:1,label:"Cables",placeholder:"1, 2, 3..."},"camera/direction":{key:"camera:direction",type:"number",label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},"camera/mount":{key:"camera:mount",type:"combo",label:"Camera Mount"},"camera/type":{key:"camera:type",type:"combo",label:"Camera Type",strings:{options:{fixed:"Fixed",panning:"Panning",dome:"Dome"}}},capacity:{key:"capacity",type:"number",minValue:0,label:"Capacity",placeholder:"50, 100, 200..."},cash_in:{key:"cash_in",type:"check",label:"Cash In"},castle_type:{key:"castle_type",type:"combo",label:"Type"},clothes:{key:"clothes",type:"semiCombo",label:"Clothes"},club:{key:"club",type:"typeCombo",label:"Type"},collection_times:{key:"collection_times",type:"text",label:"Collection Times"},comment:{key:"comment",type:"textarea",label:"Changeset Comment",placeholder:"Brief description of your contributions (required)"},communication_multi:{key:"communication:",type:"multiCombo",label:"Communication Types"},construction:{key:"construction",type:"combo",label:"Type"},"contact/webcam":{key:"contact:webcam",type:"url",icon:"website",label:"Webcam URL",placeholder:"http://example.com/"},content:{key:"content",type:"combo",label:"Content",options:["silage","water","oil","fuel","slurry","gas","manure","sewage"]},country:{key:"country",type:"combo",label:"Country"},covered:{key:"covered",type:"check",label:"Covered"},craft:{key:"craft",type:"typeCombo",label:"Type"},"crane/type":{key:"crane:type",type:"combo",label:"Crane Type",strings:{options:{portal_crane:"Portal Crane","floor-mounted_crane":"Floor-mounted Crane",travel_lift:"Travel Lift"}}},crop:{key:"crop",type:"semiCombo",label:"Crops"},crossing:{key:"crossing",type:"combo",label:"Type"},cuisine:{key:"cuisine",type:"semiCombo",label:"Cuisines"},currency_multi:{key:"currency:",type:"multiCombo",label:"Currency Types"},cutting:{key:"cutting",type:"typeCombo",label:"Type",placeholder:"Default"},cycle_network:{key:"cycle_network",type:"networkCombo",label:"Network"},cycleway:{keys:["cycleway:left","cycleway:right"],reference:{key:"cycleway"},type:"cycleway",label:"Bike Lanes",placeholder:"none",strings:{types:{"cycleway:left":"Left side","cycleway:right":"Right side"},options:{none:{title:"None",description:"No bike lane"},lane:{title:"Standard bike lane",description:"A bike lane separated from auto traffic by a painted line"},shared_lane:{title:"Shared bike lane",description:"A bike lane with no separation from auto traffic"},track:{title:"Bike track",description:"A bike lane separated from traffic by a physical barrier"},share_busway:{title:"Bike lane shared with bus",description:"A bike lane shared with a bus lane"},opposite_lane:{title:"Opposite bike lane",description:"A bike lane that travels in the opposite direction of traffic"},opposite:{title:"Contraflow bike lane",description:"A bike lane that travels in both directions on a one-way street"}}}},"dance/style":{key:"dance:style",type:"semiCombo",label:"Dance Styles"},date:{key:"date",type:"check",label:"Date"},delivery:{key:"delivery",type:"check",label:"Delivery"},denomination:{key:"denomination",type:"combo",label:"Denomination"},denotation:{key:"denotation",type:"combo",label:"Denotation"},description:{key:"description",type:"textarea",label:"Description",universal:true},devices:{key:"devices",type:"number",minValue:0,label:"Devices",placeholder:"1, 2, 3..."},diaper:{key:"diaper",type:"combo",label:"Diaper Changing Available",options:["yes","no","room","1","2","3","4","5"]},direction_cardinal:{key:"direction",type:"combo",label:"Direction",strings:{options:{N:"North",E:"East",S:"South",W:"West",NE:"Northeast",SE:"Southeast",SW:"Southwest",NW:"Northwest",NNE:"North-northeast",ENE:"East-northeast",ESE:"East-southeast",SSE:"South-southeast",SSW:"South-southwest",WSW:"West-southwest",WNW:"West-northwest",NNW:"North-northwest"}}},direction_clock:{key:"direction",type:"combo",label:"Direction",strings:{options:{clockwise:"Clockwise",anticlockwise:"Counterclockwise"}}},direction_vertex:{key:"direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},direction:{key:"direction",type:"number",label:"Direction (Degrees Clockwise)",placeholder:"45, 90, 180, 270"},dispensing:{key:"dispensing",type:"check",label:"Dispenses Prescriptions","default":"yes"},display:{key:"display",type:"combo",label:"Display",options:["analog","digital","sundial","unorthodox"]},distance:{key:"distance",type:"text",label:"Total Distance"},dock:{key:"dock",type:"combo",label:"Type"},drive_through:{key:"drive_through",type:"check",label:"Drive-Through"},duration:{key:"duration",type:"text",label:"Duration",placeholder:"00:00"},electrified:{key:"electrified",type:"combo",label:"Electrification",placeholder:"Contact Line, Electrified Rail...",strings:{options:{contact_line:"Contact Line",rail:"Electrified Rail",yes:"Yes (unspecified)",no:"No"}}},elevation:{key:"ele",type:"number",icon:"elevation",universal:true,label:"Elevation"},email:{key:"email",type:"email",placeholder:"example@example.com",universal:true,label:"Email"},embankment:{key:"embankment",type:"typeCombo",label:"Type",placeholder:"Default"},emergency:{key:"emergency",type:"check",label:"Emergency"},entrance:{key:"entrance",type:"typeCombo",label:"Type"},except:{key:"except",type:"combo",label:"Exceptions"},faces:{key:"faces",type:"number",minValue:0,label:"Faces"},fax:{key:"fax",type:"tel",label:"Fax",universal:true,placeholder:"+31 42 123 4567"},fee:{key:"fee",type:"check",label:"Fee"},fence_type:{key:"fence_type",type:"combo",label:"Type"},"fire_hydrant/position":{key:"fire_hydrant:position",type:"combo",label:"Position",strings:{options:{lane:"Lane",parking_lot:"Parking Lot",sidewalk:"Sidewalk",green:"Green"}}},"fire_hydrant/type":{key:"fire_hydrant:type",type:"combo",label:"Type",strings:{options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pond:"Pond"}}},fitness_station:{key:"fitness_station",type:"typeCombo",label:"Equipment Type"},fixme:{key:"fixme",type:"textarea",label:"Fix Me",universal:true},ford:{key:"ford",type:"typeCombo",label:"Type",placeholder:"Default"},frequency:{key:"frequency",type:"combo",label:"Operating Frequency"},fuel_multi:{key:"fuel:",type:"multiCombo",label:"Fuel Types"},fuel:{key:"fuel",type:"combo",label:"Fuel"},gauge:{key:"gauge",type:"combo",label:"Gauge"},gender:{type:"radio",keys:["male","female","unisex"],label:"Gender",placeholder:"Unknown",strings:{options:{male:"Male",female:"Female",unisex:"Unisex"}}},"generator/method":{key:"generator:method",type:"combo",label:"Method"},"generator/output/electricity":{key:"generator:output:electricity",type:"text",label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW..."},"generator/source":{key:"generator:source",type:"combo",label:"Source"},"generator/type":{key:"generator:type",type:"combo",label:"Type"},government:{key:"government",type:"typeCombo",label:"Type"},grape_variety:{key:"grape_variety",type:"semiCombo",label:"Grape Varieties"},handicap:{key:"handicap",type:"number",label:"Handicap",placeholder:"1-18"},handrail:{key:"handrail",type:"check",label:"Handrail"},hashtags:{key:"hashtags",type:"semiCombo",label:"Suggested Hashtags",placeholder:"#example"},healthcare:{key:"healthcare",type:"typeCombo",label:"Type"},"healthcare/speciality":{key:"healthcare:speciality",type:"semiCombo",reference:{key:"healthcare"},label:"Specialties"},height:{key:"height",minValue:0,type:"number",label:"Height (Meters)"},highway:{key:"highway",type:"typeCombo",label:"Type"},historic:{key:"historic",type:"typeCombo",label:"Type"},"historic/civilization":{key:"historic:civilization",type:"combo",label:"Historic Civilization"},hoops:{key:"hoops",type:"number",minValue:0,label:"Hoops",placeholder:"1, 2, 4..."},horse_dressage:{key:"sport",type:"check",label:"Dressage Riding",strings:{options:{"undefined":"No",equestrian:"Yes"}},reference:{key:"sport",value:"equestrian"}},horse_riding:{key:"leisure",type:"check",label:"Horseback Riding",strings:{options:{"undefined":"No",horse_riding:"Yes"}},reference:{key:"leisure",value:"horse_riding"}},horse_scale:{key:"horse_scale",type:"combo",label:"Horseback Riding Difficulty",placeholder:"Difficult, Dangerous...",strings:{options:{common:"Easy: No problems or difficulties. (default)",demanding:"Use with caution: Uneven way, occasional difficult passages.",difficult:"Difficult: Way narrow and exposed. May contain obstacles to step over and narrow passages.",critical:"Borderline: Passable only for experienced riders and horses. Major obstacles. Bridges should be examined carefully.",dangerous:"Dangerous: Passable only for very experienced riders and horses and only in good weather. Dismount.",impossible:"Impassable: Way or bridge not passable for horses. Too narrow, insuffient support, obstacles like ladders. Danger of life."}}},horse_stables:{key:"amenity",type:"check",label:"Riding Stable",strings:{options:{"undefined":"No",stables:"Yes"}},reference:{key:"amenity",value:"stables"}},iata:{key:"iata",type:"text",label:"IATA"},icao:{key:"icao",type:"text",label:"ICAO"},incline_steps:{key:"incline",type:"combo",label:"Incline",strings:{options:{up:"Up",down:"Down"}}},incline:{key:"incline",type:"combo",label:"Incline"},indoor:{key:"indoor",type:"check",label:"Indoor"},industrial:{key:"industrial",type:"combo",label:"Type"},information:{key:"information",type:"typeCombo",label:"Type"},inscription:{key:"inscription",type:"textarea",label:"Inscription"},intermittent:{key:"intermittent",type:"check",label:"Intermittent"},internet_access:{key:"internet_access",type:"combo",label:"Internet Access",strings:{options:{yes:"Yes",no:"No",wlan:"Wifi",wired:"Wired",terminal:"Terminal"}}},"internet_access/fee":{key:"internet_access:fee",type:"check",label:"Internet Access Fee"},"internet_access/ssid":{key:"internet_access:ssid",type:"text",label:"SSID (Network Name)"},kerb:{key:"kerb",type:"combo",label:"Curb"},label:{key:"label",type:"textarea",label:"Label"},lamp_type:{key:"lamp_type",type:"combo",label:"Type"},landuse:{key:"landuse",type:"typeCombo",label:"Type"},lanes:{key:"lanes",type:"number",minValue:0,label:"Lanes",placeholder:"1, 2, 3..."},layer:{key:"layer",type:"number",label:"Layer",placeholder:"0"},leaf_cycle_singular:{key:"leaf_cycle",type:"combo",label:"Leaf Cycle",strings:{options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous"}}},leaf_cycle:{key:"leaf_cycle",type:"combo",label:"Leaf Cycle",strings:{options:{evergreen:"Evergreen",deciduous:"Deciduous",semi_evergreen:"Semi-Evergreen",semi_deciduous:"Semi-Deciduous",mixed:"Mixed"}}},leaf_type_singular:{key:"leaf_type",type:"combo",label:"Leaf Type",strings:{options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",leafless:"Leafless"}}},leaf_type:{key:"leaf_type",type:"combo",label:"Leaf Type",strings:{options:{broadleaved:"Broadleaved",needleleaved:"Needleleaved",mixed:"Mixed",leafless:"Leafless"}}},leisure:{key:"leisure",type:"typeCombo",label:"Type"},length:{key:"length",type:"number",minValue:0,label:"Length (Meters)"},level:{key:"level",type:"combo",label:"Level",universal:true},levels:{key:"building:levels",type:"number",minValue:0,label:"Levels",placeholder:"2, 4, 6..."},lit:{key:"lit",type:"check",label:"Lit"},location:{key:"location",type:"combo",label:"Location"},man_made:{key:"man_made",type:"typeCombo",label:"Type"},manhole:{key:"manhole",type:"typeCombo",label:"Type"},map_size:{key:"map_size",type:"typeCombo",label:"Coverage"},map_type:{key:"map_type",type:"typeCombo",label:"Type"},maxheight:{key:"maxheight",type:"combo",label:"Max Height",placeholder:"4, 4.5, 5, 14'0\", 14'6\", 15'0\"",snake_case:false},maxspeed:{key:"maxspeed",type:"maxspeed",label:"Speed Limit",placeholder:"40, 50, 60..."},"maxspeed/advisory":{key:"maxspeed:advisory",type:"maxspeed",label:"Advisory Speed Limit",placeholder:"40, 50, 60..."},maxstay:{key:"maxstay",type:"combo",label:"Max Stay",options:["15 min","30 min","45 min","1 hr","1.5 hr","2 hr","2.5 hr","3 hr","4 hr","1 day","2 day"],snake_case:false},maxweight:{key:"maxweight",type:"combo",label:"Max Weight",snake_case:false},memorial:{key:"memorial",type:"typeCombo",label:"Type"},monitoring_multi:{key:"monitoring:",type:"multiCombo",label:"Monitoring"},"mtb/scale":{key:"mtb:scale",type:"combo",label:"Mountain Biking Difficulty",placeholder:"0, 1, 2, 3...",strings:{options:{"0":"0: Solid gravel/packed earth, no obstacles, wide curves","1":"1: Some loose surface, small obstacles, wide curves","2":"2: Much loose surface, large obstacles, easy hairpins","3":"3: Slippery surface, large obstacles, tight hairpins","4":"4: Loose surface or boulders, dangerous hairpins","5":"5: Maximum difficulty, boulder fields, landslides","6":"6: Not rideable except by the very best mountain bikers"}}},"mtb/scale/imba":{key:"mtb:scale:imba",type:"combo",label:"IMBA Trail Difficulty",placeholder:"Easy, Medium, Difficult...",strings:{options:{"0":"Easiest (white circle)","1":"Easy (green circle)","2":"Medium (blue square)","3":"Difficult (black diamond)","4":"Extremely Difficult (double black diamond)"}}},"mtb/scale/uphill":{key:"mtb:scale:uphill",type:"combo",label:"Mountain Biking Uphill Difficulty",placeholder:"0, 1, 2, 3...",strings:{options:{"0":"0: Avg. incline <10%, gravel/packed earth, no obstacles","1":"1: Avg. incline <15%, gravel/packed earth, few small objects","2":"2: Avg. incline <20%, stable surface, fistsize rocks/roots","3":"3: Avg. incline <25%, variable surface, fistsize rocks/branches","4":"4: Avg. incline <30%, poor condition, big rocks/branches","5":"5: Very steep, bike generally needs to be pushed or carried"}}},name:{key:"name",type:"localized",label:"Name",universal:true,placeholder:"Common name (if any)"},natural:{key:"natural",type:"typeCombo",label:"Natural"},network_bicycle:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lcn:"Local",rcn:"Regional",ncn:"National",icn:"International"}}},network_foot:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lwn:"Local",rwn:"Regional",nwn:"National",iwn:"International"}}},network_horse:{key:"network",type:"combo",label:"Network Type",placeholder:"Local, Regional, National, International",strings:{options:{lhn:"Local",rhn:"Regional",nhn:"National",ihn:"International"}}},network_road:{key:"network",type:"networkCombo",label:"Network"},network:{key:"network",type:"text",label:"Network"},note:{key:"note",type:"textarea",universal:true,icon:"note",label:"Note"},office:{key:"office",type:"typeCombo",label:"Type"},oneway_yes:{key:"oneway",type:"onewayCheck",label:"One Way",strings:{options:{"undefined":"Assumed to be Yes",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}}},oneway:{key:"oneway",type:"onewayCheck",label:"One Way",strings:{options:{"undefined":"Assumed to be No",yes:"Yes",no:"No",reversible:"Reversible",alternating:"Alternating"}}},opening_hours:{key:"opening_hours",type:"combo",label:"Hours",snake_case:false},operator:{key:"operator",type:"text",label:"Operator"},outdoor_seating:{key:"outdoor_seating",type:"check",label:"Outdoor Seating"},par:{key:"par",type:"number",minValue:1,label:"Par",placeholder:"3, 4, 5..."},park_ride:{key:"park_ride",type:"check",label:"Park and Ride"},parking:{key:"parking",type:"combo",label:"Type",strings:{options:{surface:"Surface","multi-storey":"Multilevel",underground:"Underground",sheds:"Sheds",carports:"Carports",garage_boxes:"Garage Boxes",lane:"Roadside Lane"}}},passenger_information_display:{key:"passenger_information_display",type:"check",label:"Passenger information display"},payment_multi:{key:"payment:",type:"multiCombo",label:"Payment Types",universal:true},phases:{key:"phases",type:"number",minValue:1,label:"Phases",placeholder:"1, 2, 3..."},phone:{key:"phone",type:"tel",icon:"maki-telephone",universal:true,label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice (instructional)",easy:"Easy (green circle)",intermediate:"Intermediate (blue square)",advanced:"Advanced (black diamond)",expert:"Expert (double black diamond)",freeride:"Freeride (off-piste)",extreme:"Extreme (climbing equipment required)"}}},"piste/grooming":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}}},"piste/type":{key:"piste:type",type:"typeCombo",label:"Type",strings:{options:{downhill:"Downhill",nordic:"Nordic",skitour:"Skitour",sled:"Sled",hike:"Hike",sleigh:"Sleigh",ice_skate:"Ice Skate",snow_park:"Snow Park",playground:"Playground"}}},place:{key:"place",type:"typeCombo",label:"Type"},plant:{key:"plant",type:"combo",label:"Plant"},"plant/output/electricity":{key:"plant:output:electricity",type:"text",label:"Power Output",placeholder:"500 MW, 1000 MW, 2000 MW..."},"playground/baby":{key:"baby",type:"check",label:"Baby Seat"},"playground/max_age":{key:"max_age",type:"number",minValue:0,label:"Maximum Age"},"playground/min_age":{key:"min_age",type:"number",minValue:0,label:"Minimum Age"},population:{key:"population",type:"text",label:"Population"},power_supply:{key:"power_supply",type:"check",label:"Power Supply"},power:{key:"power",type:"typeCombo",label:"Type"},produce:{key:"produce",type:"semiCombo",label:"Produce"},product:{key:"product",type:"semiCombo",label:"Products"},railway:{key:"railway",type:"typeCombo",label:"Type"},"railway/position":{key:"railway:position",type:"text",placeholder:"Distance to one decimal (123.4)",label:"Milestone Position"},"railway/signal/direction":{key:"railway:signal:direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},rating:{key:"rating",type:"combo",label:"Power Rating",snake_case:false},recycling_accepts:{key:"recycling:",type:"multiCombo",label:"Accepts"},ref_aeroway_gate:{key:"ref",type:"text",label:"Gate Number"},ref_golf_hole:{key:"ref",type:"text",label:"Hole Number",placeholder:"1-18"},ref_highway_junction:{key:"ref",type:"text",label:"Junction Number"},ref_platform:{key:"ref",type:"text",label:"Platform Number"},ref_road_number:{key:"ref",type:"text",label:"Road Number"},ref_route:{key:"ref",type:"text",label:"Route Number"},ref_runway:{key:"ref",type:"text",label:"Runway Number",placeholder:"e.g. 01L/19R"},ref_stop_position:{key:"ref",type:"text",label:"Stop Number"},ref_taxiway:{key:"ref",type:"text",label:"Taxiway Name",placeholder:"e.g. A5"},ref:{key:"ref",type:"text",label:"Reference Code"},"ref/isil":{key:"ref:isil",type:"text",label:"ISIL Code"},relation:{key:"type",type:"combo",label:"Type"},religion:{key:"religion",type:"combo",label:"Religion"},restriction:{key:"restriction",type:"combo",label:"Type"},restrictions:{type:"restrictions",geometry:"vertex",icon:"iD-restrictions",reference:{rtype:"restriction"},label:"Turn Restrictions"},rooms:{key:"rooms",type:"number",minValue:0,label:"Rooms"},route_master:{key:"route_master",type:"combo",label:"Type"},route:{key:"route",type:"combo",label:"Type"},sac_scale:{key:"sac_scale",type:"combo",label:"Hiking Difficulty",placeholder:"Mountain Hiking, Alpine Hiking...",strings:{options:{hiking:"T1: Hiking",mountain_hiking:"T2: Mountain Hiking",demanding_mountain_hiking:"T3: Demanding Mountain Hiking",alpine_hiking:"T4: Alpine Hiking",demanding_alpine_hiking:"T5: Demanding Alpine Hiking",difficult_alpine_hiking:"T6: Difficult Alpine Hiking"}}},sanitary_dump_station:{key:"sanitary_dump_station",type:"check",label:"Toilet Disposal"},seasonal:{key:"seasonal",type:"check",label:"Seasonal"},second_hand:{key:"second_hand",type:"combo",label:"Sells Used",placeholder:"Yes, No, Only",strings:{options:{yes:"Yes",no:"No",only:"Only"}}},service_rail:{key:"service",type:"combo",label:"Service Type",strings:{options:{spur:"Spur",yard:"Yard",siding:"Siding",crossover:"Crossover"}}},service_times:{key:"service_times",type:"text",label:"Service Times"},service:{key:"service",type:"combo",label:"Type",options:["parking_aisle","driveway","alley","emergency_access","drive-through"]},"service/bicycle":{key:"service:bicycle:",type:"multiCombo",label:"Services"},"service/vehicle":{key:"service:vehicle:",type:"multiCombo",label:"Services"},shelter_type:{key:"shelter_type",type:"combo",label:"Type"},shelter:{key:"shelter",type:"check",label:"Shelter"},shop:{key:"shop",type:"typeCombo",label:"Type"},"siren/purpose":{key:"siren:purpose",type:"combo",label:"Purpose"},"siren/type":{key:"siren:type",type:"combo",label:"Type",strings:{options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}}},site_type:{key:"site_type",type:"combo",label:"Site Type"},site:{key:"site",type:"combo",label:"Type"},smoking:{key:"smoking",type:"combo",label:"Smoking",placeholder:"No, Separated, Yes...",strings:{options:{no:"No smoking anywhere",separated:"In smoking areas, not physically isolated",isolated:"In smoking areas, physically isolated",outside:"Allowed outside",yes:"Allowed everywhere",dedicated:"Dedicated to smokers (e.g. smokers' club)"}}},smoothness:{key:"smoothness",type:"combo",label:"Smoothness",placeholder:"Thin Rollers, Wheels, Off-Road...",strings:{options:{excellent:"Thin Rollers: rollerblade, skateboard",good:"Thin Wheels: racing bike",intermediate:"Wheels: city bike, wheelchair, scooter",bad:"Robust Wheels: trekking bike, car, rickshaw",very_bad:"High Clearance: light duty off-road vehicle",horrible:"Off-Road: heavy duty off-road vehicle",very_horrible:"Specialized off-road: tractor, ATV",impassable:"Impassable / No wheeled vehicle"}}},social_facility_for:{key:"social_facility:for",type:"combo",label:"People Served"},social_facility:{key:"social_facility",type:"combo",label:"Type"},source:{key:"source",type:"semiCombo",icon:"source",universal:true,label:"Sources",snake_case:false,caseSensitive:true,options:["survey","local knowledge","gps","aerial imagery","streetlevel imagery"]},sport_ice:{key:"sport",type:"semiCombo",label:"Sports",options:["skating","hockey","multi","curling","ice_stock"]},sport_racing_motor:{key:"sport",type:"semiCombo",label:"Sports",options:["motor","karting","motocross"]},sport_racing_nonmotor:{key:"sport",type:"semiCombo",label:"Sports",options:["bmx","cycling","dog_racing","horse_racing","running"]},sport:{key:"sport",type:"semiCombo",label:"Sports"},stars:{key:"stars",type:"combo",label:"Stars"},start_date:{key:"start_date",type:"text",universal:true,label:"Start Date"},step_count:{key:"step_count",type:"number",minValue:0,label:"Number of Steps"},stop:{key:"stop",type:"combo",label:"Stop Type",strings:{options:{all:"All Ways",minor:"Minor Road"}}},structure_waterway:{type:"structureRadio",keys:["tunnel"],label:"Structure",placeholder:"Unknown",strings:{options:{tunnel:"Tunnel"}}},structure:{type:"structureRadio",keys:["bridge","tunnel","embankment","cutting","ford"],label:"Structure",placeholder:"Unknown",strings:{options:{bridge:"Bridge",tunnel:"Tunnel",embankment:"Embankment",cutting:"Cutting",ford:"Ford"}}},studio:{key:"studio",type:"combo",label:"Type"},substance:{key:"substance",type:"combo",label:"Substance"},substation:{key:"substation",type:"typeCombo",label:"Type"},supervised:{key:"supervised",type:"check",label:"Supervised"},support:{key:"support",type:"combo",label:"Support"},surface:{key:"surface",type:"combo",label:"Surface"},surveillance:{key:"surveillance",type:"combo",label:"Surveillance Kind"},"surveillance/type":{key:"surveillance:type",type:"combo",label:"Surveillance Type",strings:{options:{camera:"Camera",guard:"Guard",ALPR:"Automatic License Plate Reader"}}},"surveillance/zone":{key:"surveillance:zone",type:"combo",label:"Surveillance Zone"},"switch":{key:"switch",type:"combo",label:"Type",strings:{options:{mechanical:"Mechanical",circuit_breaker:"Circuit Breaker",disconnector:"Disconnector",earthing:"Earthing"}}},tactile_paving:{key:"tactile_paving",type:"check",label:"Tactile Paving"},takeaway:{key:"takeaway",type:"combo",label:"Takeaway",placeholder:"Yes, No, Takeaway Only...",strings:{options:{yes:"Yes",no:"No",only:"Takeaway Only"}}},"toilets/disposal":{key:"toilets:disposal",type:"combo",label:"Disposal",strings:{options:{flush:"Flush",pitlatrine:"Pit/Latrine",chemical:"Chemical",bucket:"Bucket"}}},toll:{key:"toll",type:"check",label:"Toll"},tomb:{key:"tomb",type:"typeCombo",label:"Type"},tourism_attraction:{key:"tourism","default":"attraction",type:"typeCombo",universal:true,label:"Tourism"},tourism:{key:"tourism",type:"typeCombo",label:"Type"},"tower/construction":{key:"tower:construction",type:"combo",label:"Construction",placeholder:"Guyed, Lattice, Concealed, ..."},"tower/type":{key:"tower:type",type:"combo",label:"Type"},tracktype:{key:"tracktype",type:"combo",label:"Track Type",placeholder:"Solid, Mostly Solid, Soft...",strings:{options:{grade1:"Solid: paved or heavily compacted hardcore surface",grade2:"Mostly Solid: gravel/rock with some soft material mixed in",grade3:"Even mixture of hard and soft materials",grade4:"Mostly Soft: soil/sand/grass with some hard material mixed in",grade5:"Soft: soil/sand/grass"}}},trade:{key:"trade",type:"typeCombo",label:"Type"},traffic_calming:{key:"traffic_calming",type:"typeCombo",label:"Type"},traffic_signals:{key:"traffic_signals",type:"combo",label:"Type","default":"signal"},"traffic_signals/direction":{key:"traffic_signals:direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},trail_visibility:{key:"trail_visibility",type:"combo",label:"Trail Visibility",placeholder:"Excellent, Good, Bad...",strings:{options:{excellent:"Excellent: unambiguous path or markers everywhere",good:"Good: markers visible, sometimes require searching",intermediate:"Intermediate: few markers, path mostly visible",bad:"Bad: no markers, path sometimes invisible/pathless",horrible:"Horrible: often pathless, some orientation skills required",no:"No: pathless, excellent orientation skills required"}}},transformer:{key:"transformer",type:"combo",label:"Type",strings:{options:{distribution:"Distribution",generator:"Generator",converter:"Converter",traction:"Traction",auto:"Autotransformer",phase_angle_regulator:"Phase Angle Regulator",auxiliary:"Auxiliary",yes:"Unknown"}}},trees:{key:"trees",type:"semiCombo",label:"Trees"},tunnel:{key:"tunnel",type:"typeCombo",label:"Type",placeholder:"Default"},usage_rail:{key:"usage",type:"combo",label:"Usage Type",strings:{options:{main:"Main",branch:"Branch",industrial:"Industrial",military:"Military",test:"Test",tourism:"Tourism"}}},vending:{key:"vending",type:"semiCombo",label:"Types of Goods"},visibility:{key:"visibility",type:"combo",label:"Visibility",strings:{options:{house:"Up to 5m (16ft)",street:"5 to 20m (16 to 65ft)",area:"Over 20m (65ft)"}}},"volcano/status":{key:"volcano:status",type:"combo",label:"Volcano Status",strings:{options:{active:"Active",dormant:"Dormant",extinct:"Extinct"}}},"volcano/type":{key:"volcano:type",type:"combo",label:"Volcano Type",strings:{options:{stratovolcano:"Stratovolcano",shield:"Shield",scoria:"Scoria"}}},voltage:{key:"voltage",type:"combo",label:"Voltage"},"voltage/primary":{key:"voltage:primary",type:"combo",label:"Primary Voltage"},"voltage/secondary":{key:"voltage:secondary",type:"combo",label:"Secondary Voltage"},"voltage/tertiary":{key:"voltage:tertiary",type:"combo",label:"Tertiary Voltage"},wall:{key:"wall",type:"combo",label:"Type"},water_point:{key:"water_point",type:"check",label:"Water Point"},water:{key:"water",type:"combo",label:"Type"},waterway:{key:"waterway",type:"typeCombo",label:"Type"},website:{key:"website",type:"url",icon:"website",placeholder:"http://example.com/",universal:true,label:"Website"},wetland:{key:"wetland",type:"combo",label:"Type"},wheelchair:{key:"wheelchair",type:"radio",options:["yes","limited","no"],icon:"maki-wheelchair",universal:true,label:"Wheelchair Access"},wholesale:{key:"wholesale",type:"typeCombo",label:"Wholesale"},width:{key:"width",type:"number",minValue:0,label:"Width (Meters)"},wikipedia:{key:"wikipedia",keys:["wikipedia","wikidata"],type:"wikipedia",icon:"wikipedia",universal:true,label:"Wikipedia"},windings:{key:"windings",type:"number",minValue:1,label:"Windings",placeholder:"1, 2, 3..."},"windings/configuration":{key:"windings:configuration",type:"combo",label:"Windings Configuration",strings:{options:{star:"Star / Wye",delta:"Delta","open-delta":"Open Delta",zigzag:"Zig Zag",open:"Open",scott:"Scott",leblanc:"Leblanc"}}}};
23666 var quickselect_1 = quickselect;
23667 var default_1 = quickselect;
23669 function quickselect(arr, k, left, right, compare) {
23670 quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
23672 function quickselectStep(arr, k, left, right, compare) {
23674 while (right > left) {
23675 if (right - left > 600) {
23676 var n = right - left + 1;
23677 var m = k - left + 1;
23678 var z = Math.log(n);
23679 var s = 0.5 * Math.exp(2 * z / 3);
23680 var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
23681 var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
23682 var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
23683 quickselectStep(arr, k, newLeft, newRight, compare);
23690 swap(arr, left, k);
23691 if (compare(arr[right], t) > 0) swap(arr, left, right);
23697 while (compare(arr[i], t) < 0) i++;
23698 while (compare(arr[j], t) > 0) j--;
23701 if (compare(arr[left], t) === 0) swap(arr, left, j);
23704 swap(arr, j, right);
23707 if (j <= k) left = j + 1;
23708 if (k <= j) right = j - 1;
23712 function swap(arr, i, j) {
23718 function defaultCompare(a, b) {
23719 return a < b ? -1 : a > b ? 1 : 0;
23721 quickselect_1.default = default_1;
23723 var quickselect$1 = /*#__PURE__*/Object.freeze({
23724 default: quickselect_1,
23725 __moduleExports: quickselect_1
23728 var quickselect$2 = ( quickselect$1 && quickselect_1 ) || quickselect$1;
23730 var rbush_1 = rbush;
23731 var default_1$1 = rbush;
23735 function rbush(maxEntries, format) {
23736 if (!(this instanceof rbush)) return new rbush(maxEntries, format);
23738 // max entries in a node is 9 by default; min node fill is 40% for best performance
23739 this._maxEntries = Math.max(4, maxEntries || 9);
23740 this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
23743 this._initFormat(format);
23749 rbush.prototype = {
23752 return this._all(this.data, []);
23755 search: function (bbox) {
23757 var node = this.data,
23759 toBBox = this.toBBox;
23761 if (!intersects$1(bbox, node)) return result;
23763 var nodesToSearch = [],
23764 i, len, child, childBBox;
23767 for (i = 0, len = node.children.length; i < len; i++) {
23769 child = node.children[i];
23770 childBBox = node.leaf ? toBBox(child) : child;
23772 if (intersects$1(bbox, childBBox)) {
23773 if (node.leaf) result.push(child);
23774 else if (contains$2(bbox, childBBox)) this._all(child, result);
23775 else nodesToSearch.push(child);
23778 node = nodesToSearch.pop();
23784 collides: function (bbox) {
23786 var node = this.data,
23787 toBBox = this.toBBox;
23789 if (!intersects$1(bbox, node)) return false;
23791 var nodesToSearch = [],
23792 i, len, child, childBBox;
23795 for (i = 0, len = node.children.length; i < len; i++) {
23797 child = node.children[i];
23798 childBBox = node.leaf ? toBBox(child) : child;
23800 if (intersects$1(bbox, childBBox)) {
23801 if (node.leaf || contains$2(bbox, childBBox)) return true;
23802 nodesToSearch.push(child);
23805 node = nodesToSearch.pop();
23811 load: function (data) {
23812 if (!(data && data.length)) return this;
23814 if (data.length < this._minEntries) {
23815 for (var i = 0, len = data.length; i < len; i++) {
23816 this.insert(data[i]);
23821 // recursively build the tree with the given data from scratch using OMT algorithm
23822 var node = this._build(data.slice(), 0, data.length - 1, 0);
23824 if (!this.data.children.length) {
23825 // save as is if tree is empty
23828 } else if (this.data.height === node.height) {
23829 // split root if trees have the same height
23830 this._splitRoot(this.data, node);
23833 if (this.data.height < node.height) {
23834 // swap trees if inserted one is bigger
23835 var tmpNode = this.data;
23840 // insert the small tree into the large tree at appropriate level
23841 this._insert(node, this.data.height - node.height - 1, true);
23847 insert: function (item) {
23848 if (item) this._insert(item, this.data.height - 1);
23852 clear: function () {
23853 this.data = createNode([]);
23857 remove: function (item, equalsFn) {
23858 if (!item) return this;
23860 var node = this.data,
23861 bbox = this.toBBox(item),
23864 i, parent, index, goingUp;
23866 // depth-first iterative tree traversal
23867 while (node || path.length) {
23869 if (!node) { // go up
23871 parent = path[path.length - 1];
23876 if (node.leaf) { // check current node
23877 index = findItem(item, node.children, equalsFn);
23879 if (index !== -1) {
23880 // item found, remove the item and condense tree upwards
23881 node.children.splice(index, 1);
23883 this._condense(path);
23888 if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
23893 node = node.children[0];
23895 } else if (parent) { // go right
23897 node = parent.children[i];
23900 } else node = null; // nothing found
23906 toBBox: function (item) { return item; },
23908 compareMinX: compareNodeMinX,
23909 compareMinY: compareNodeMinY,
23911 toJSON: function () { return this.data; },
23913 fromJSON: function (data) {
23918 _all: function (node, result) {
23919 var nodesToSearch = [];
23921 if (node.leaf) result.push.apply(result, node.children);
23922 else nodesToSearch.push.apply(nodesToSearch, node.children);
23924 node = nodesToSearch.pop();
23929 _build: function (items, left, right, height) {
23931 var N = right - left + 1,
23932 M = this._maxEntries,
23936 // reached leaf level; return leaf
23937 node = createNode(items.slice(left, right + 1));
23938 calcBBox(node, this.toBBox);
23943 // target height of the bulk-loaded tree
23944 height = Math.ceil(Math.log(N) / Math.log(M));
23946 // target number of root entries to maximize storage utilization
23947 M = Math.ceil(N / Math.pow(M, height - 1));
23950 node = createNode([]);
23952 node.height = height;
23954 // split the items into M mostly square tiles
23956 var N2 = Math.ceil(N / M),
23957 N1 = N2 * Math.ceil(Math.sqrt(M)),
23958 i, j, right2, right3;
23960 multiSelect(items, left, right, N1, this.compareMinX);
23962 for (i = left; i <= right; i += N1) {
23964 right2 = Math.min(i + N1 - 1, right);
23966 multiSelect(items, i, right2, N2, this.compareMinY);
23968 for (j = i; j <= right2; j += N2) {
23970 right3 = Math.min(j + N2 - 1, right2);
23972 // pack each entry recursively
23973 node.children.push(this._build(items, j, right3, height - 1));
23977 calcBBox(node, this.toBBox);
23982 _chooseSubtree: function (bbox, node, level, path) {
23984 var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
23989 if (node.leaf || path.length - 1 === level) break;
23991 minArea = minEnlargement = Infinity;
23993 for (i = 0, len = node.children.length; i < len; i++) {
23994 child = node.children[i];
23995 area = bboxArea(child);
23996 enlargement = enlargedArea(bbox, child) - area;
23998 // choose entry with the least area enlargement
23999 if (enlargement < minEnlargement) {
24000 minEnlargement = enlargement;
24001 minArea = area < minArea ? area : minArea;
24002 targetNode = child;
24004 } else if (enlargement === minEnlargement) {
24005 // otherwise choose one with the smallest area
24006 if (area < minArea) {
24008 targetNode = child;
24013 node = targetNode || node.children[0];
24019 _insert: function (item, level, isNode) {
24021 var toBBox = this.toBBox,
24022 bbox = isNode ? item : toBBox(item),
24025 // find the best node for accommodating the item, saving all nodes along the path too
24026 var node = this._chooseSubtree(bbox, this.data, level, insertPath);
24028 // put the item into the node
24029 node.children.push(item);
24030 extend$1(node, bbox);
24032 // split on node overflow; propagate upwards if necessary
24033 while (level >= 0) {
24034 if (insertPath[level].children.length > this._maxEntries) {
24035 this._split(insertPath, level);
24040 // adjust bboxes along the insertion path
24041 this._adjustParentBBoxes(bbox, insertPath, level);
24044 // split overflowed node into two
24045 _split: function (insertPath, level) {
24047 var node = insertPath[level],
24048 M = node.children.length,
24049 m = this._minEntries;
24051 this._chooseSplitAxis(node, m, M);
24053 var splitIndex = this._chooseSplitIndex(node, m, M);
24055 var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
24056 newNode.height = node.height;
24057 newNode.leaf = node.leaf;
24059 calcBBox(node, this.toBBox);
24060 calcBBox(newNode, this.toBBox);
24062 if (level) insertPath[level - 1].children.push(newNode);
24063 else this._splitRoot(node, newNode);
24066 _splitRoot: function (node, newNode) {
24068 this.data = createNode([node, newNode]);
24069 this.data.height = node.height + 1;
24070 this.data.leaf = false;
24071 calcBBox(this.data, this.toBBox);
24074 _chooseSplitIndex: function (node, m, M) {
24076 var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
24078 minOverlap = minArea = Infinity;
24080 for (i = m; i <= M - m; i++) {
24081 bbox1 = distBBox(node, 0, i, this.toBBox);
24082 bbox2 = distBBox(node, i, M, this.toBBox);
24084 overlap = intersectionArea(bbox1, bbox2);
24085 area = bboxArea(bbox1) + bboxArea(bbox2);
24087 // choose distribution with minimum overlap
24088 if (overlap < minOverlap) {
24089 minOverlap = overlap;
24092 minArea = area < minArea ? area : minArea;
24094 } else if (overlap === minOverlap) {
24095 // otherwise choose distribution with minimum area
24096 if (area < minArea) {
24106 // sorts node children by the best axis for split
24107 _chooseSplitAxis: function (node, m, M) {
24109 var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
24110 compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
24111 xMargin = this._allDistMargin(node, m, M, compareMinX),
24112 yMargin = this._allDistMargin(node, m, M, compareMinY);
24114 // if total distributions margin value is minimal for x, sort by minX,
24115 // otherwise it's already sorted by minY
24116 if (xMargin < yMargin) node.children.sort(compareMinX);
24119 // total margin of all possible split distributions where each node is at least m full
24120 _allDistMargin: function (node, m, M, compare) {
24122 node.children.sort(compare);
24124 var toBBox = this.toBBox,
24125 leftBBox = distBBox(node, 0, m, toBBox),
24126 rightBBox = distBBox(node, M - m, M, toBBox),
24127 margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
24130 for (i = m; i < M - m; i++) {
24131 child = node.children[i];
24132 extend$1(leftBBox, node.leaf ? toBBox(child) : child);
24133 margin += bboxMargin(leftBBox);
24136 for (i = M - m - 1; i >= m; i--) {
24137 child = node.children[i];
24138 extend$1(rightBBox, node.leaf ? toBBox(child) : child);
24139 margin += bboxMargin(rightBBox);
24145 _adjustParentBBoxes: function (bbox, path, level) {
24146 // adjust bboxes along the given tree path
24147 for (var i = level; i >= 0; i--) {
24148 extend$1(path[i], bbox);
24152 _condense: function (path) {
24153 // go through the path, removing empty nodes and updating bboxes
24154 for (var i = path.length - 1, siblings; i >= 0; i--) {
24155 if (path[i].children.length === 0) {
24157 siblings = path[i - 1].children;
24158 siblings.splice(siblings.indexOf(path[i]), 1);
24160 } else this.clear();
24162 } else calcBBox(path[i], this.toBBox);
24166 _initFormat: function (format) {
24167 // data format (minX, minY, maxX, maxY accessors)
24169 // uses eval-type function compilation instead of just accepting a toBBox function
24170 // because the algorithms are very sensitive to sorting functions performance,
24171 // so they should be dead simple and without inner calls
24173 var compareArr = ['return a', ' - b', ';'];
24175 this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
24176 this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
24178 this.toBBox = new Function('a',
24179 'return {minX: a' + format[0] +
24180 ', minY: a' + format[1] +
24181 ', maxX: a' + format[2] +
24182 ', maxY: a' + format[3] + '};');
24186 function findItem(item, items, equalsFn) {
24187 if (!equalsFn) return items.indexOf(item);
24189 for (var i = 0; i < items.length; i++) {
24190 if (equalsFn(item, items[i])) return i;
24195 // calculate node's bbox from bboxes of its children
24196 function calcBBox(node, toBBox) {
24197 distBBox(node, 0, node.children.length, toBBox, node);
24200 // min bounding rectangle of node children from k to p-1
24201 function distBBox(node, k, p, toBBox, destNode) {
24202 if (!destNode) destNode = createNode(null);
24203 destNode.minX = Infinity;
24204 destNode.minY = Infinity;
24205 destNode.maxX = -Infinity;
24206 destNode.maxY = -Infinity;
24208 for (var i = k, child; i < p; i++) {
24209 child = node.children[i];
24210 extend$1(destNode, node.leaf ? toBBox(child) : child);
24216 function extend$1(a, b) {
24217 a.minX = Math.min(a.minX, b.minX);
24218 a.minY = Math.min(a.minY, b.minY);
24219 a.maxX = Math.max(a.maxX, b.maxX);
24220 a.maxY = Math.max(a.maxY, b.maxY);
24224 function compareNodeMinX(a, b) { return a.minX - b.minX; }
24225 function compareNodeMinY(a, b) { return a.minY - b.minY; }
24227 function bboxArea(a) { return (a.maxX - a.minX) * (a.maxY - a.minY); }
24228 function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
24230 function enlargedArea(a, b) {
24231 return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
24232 (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
24235 function intersectionArea(a, b) {
24236 var minX = Math.max(a.minX, b.minX),
24237 minY = Math.max(a.minY, b.minY),
24238 maxX = Math.min(a.maxX, b.maxX),
24239 maxY = Math.min(a.maxY, b.maxY);
24241 return Math.max(0, maxX - minX) *
24242 Math.max(0, maxY - minY);
24245 function contains$2(a, b) {
24246 return a.minX <= b.minX &&
24247 a.minY <= b.minY &&
24248 b.maxX <= a.maxX &&
24252 function intersects$1(a, b) {
24253 return b.minX <= a.maxX &&
24254 b.minY <= a.maxY &&
24255 b.maxX >= a.minX &&
24259 function createNode(children) {
24261 children: children,
24271 // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
24272 // combines selection algorithm with binary divide & conquer approach
24274 function multiSelect(arr, left, right, n, compare) {
24275 var stack = [left, right],
24278 while (stack.length) {
24279 right = stack.pop();
24280 left = stack.pop();
24282 if (right - left <= n) continue;
24284 mid = left + Math.ceil((right - left) / n / 2) * n;
24285 quickselect$2(arr, mid, left, right, compare);
24287 stack.push(left, mid, mid, right);
24290 rbush_1.default = default_1$1;
24292 var lineclip_1 = lineclip;
24294 lineclip.polyline = lineclip;
24295 lineclip.polygon = polygonclip;
24298 // Cohen-Sutherland line clippign algorithm, adapted to efficiently
24299 // handle polylines rather than just segments
24301 function lineclip(points, bbox, result) {
24303 var len = points.length,
24304 codeA = bitCode(points[0], bbox),
24306 i, a, b, codeB, lastCode;
24308 if (!result) result = [];
24310 for (i = 1; i < len; i++) {
24313 codeB = lastCode = bitCode(b, bbox);
24317 if (!(codeA | codeB)) { // accept
24320 if (codeB !== lastCode) { // segment went outside
24323 if (i < len - 1) { // start a new line
24327 } else if (i === len - 1) {
24332 } else if (codeA & codeB) { // trivial reject
24335 } else if (codeA) { // a outside, intersect with clip edge
24336 a = intersect$1(a, b, codeA, bbox);
24337 codeA = bitCode(a, bbox);
24339 } else { // b outside
24340 b = intersect$1(a, b, codeB, bbox);
24341 codeB = bitCode(b, bbox);
24348 if (part.length) result.push(part);
24353 // Sutherland-Hodgeman polygon clipping algorithm
24355 function polygonclip(points, bbox) {
24357 var result, edge, prev, prevInside, i, p, inside;
24359 // clip against each side of the clip rectangle
24360 for (edge = 1; edge <= 8; edge *= 2) {
24362 prev = points[points.length - 1];
24363 prevInside = !(bitCode(prev, bbox) & edge);
24365 for (i = 0; i < points.length; i++) {
24367 inside = !(bitCode(p, bbox) & edge);
24369 // if segment goes through the clip window, add an intersection
24370 if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
24372 if (inside) result.push(p); // add a point if it's inside
24375 prevInside = inside;
24380 if (!points.length) break;
24386 // intersect a segment against one of the 4 lines that make up the bbox
24388 function intersect$1(a, b, edge, bbox) {
24389 return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
24390 edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
24391 edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
24392 edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
24396 // bit code reflects the point position relative to the bbox:
24399 // top 1001 1000 1010
24400 // mid 0001 0000 0010
24401 // bottom 0101 0100 0110
24403 function bitCode(p, bbox) {
24406 if (p[0] < bbox[0]) code |= 1; // left
24407 else if (p[0] > bbox[2]) code |= 2; // right
24409 if (p[1] < bbox[1]) code |= 4; // bottom
24410 else if (p[1] > bbox[3]) code |= 8; // top
24415 var lineclip$1 = /*#__PURE__*/Object.freeze({
24416 default: lineclip_1,
24417 __moduleExports: lineclip_1
24420 var lineclip$2 = ( lineclip$1 && lineclip_1 ) || lineclip$1;
24422 var whichPolygon_1 = whichPolygon;
24424 function whichPolygon(data) {
24426 for (var i = 0; i < data.features.length; i++) {
24427 var feature = data.features[i];
24428 var coords = feature.geometry.coordinates;
24430 if (feature.geometry.type === 'Polygon') {
24431 bboxes.push(treeItem(coords, feature.properties));
24433 } else if (feature.geometry.type === 'MultiPolygon') {
24434 for (var j = 0; j < coords.length; j++) {
24435 bboxes.push(treeItem(coords[j], feature.properties));
24440 var tree = rbush_1().load(bboxes);
24442 function query(p, multi) {
24444 result = tree.search({
24450 for (var i = 0; i < result.length; i++) {
24451 if (insidePolygon(result[i].coords, p)) {
24453 output.push(result[i].props);
24455 return result[i].props;
24458 return multi && output.length ? output : null;
24462 query.bbox = function queryBBox(bbox) {
24464 var result = tree.search({
24470 for (var i = 0; i < result.length; i++) {
24471 if (polygonIntersectsBBox(result[i].coords, bbox)) {
24472 output.push(result[i].props);
24481 function polygonIntersectsBBox(polygon, bbox) {
24483 (bbox[0] + bbox[2]) / 2,
24484 (bbox[1] + bbox[3]) / 2
24486 if (insidePolygon(polygon, bboxCenter)) return true;
24487 for (var i = 0; i < polygon.length; i++) {
24488 if (lineclip$2(polygon[i], bbox).length > 0) return true;
24493 // ray casting algorithm for detecting if point is in polygon
24494 function insidePolygon(rings, p) {
24495 var inside = false;
24496 for (var i = 0, len = rings.length; i < len; i++) {
24497 var ring = rings[i];
24498 for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
24499 if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
24505 function rayIntersect(p, p1, p2) {
24506 return ((p1[1] > p[1]) !== (p2[1] > p[1])) && (p[0] < (p2[0] - p1[0]) * (p[1] - p1[1]) / (p2[1] - p1[1]) + p1[0]);
24509 function treeItem(coords, props) {
24519 for (var i = 0; i < coords[0].length; i++) {
24520 var p = coords[0][i];
24521 item.minX = Math.min(item.minX, p[0]);
24522 item.minY = Math.min(item.minY, p[1]);
24523 item.maxX = Math.max(item.maxX, p[0]);
24524 item.maxY = Math.max(item.maxY, p[1]);
24529 // index the osm-community-index
24530 var ociFeatureCollection = values$1(features$2).map(function(feature) {
24531 // workaround for which-polygon: only supports `properties`, not `id`
24532 // https://github.com/mapbox/which-polygon/pull/6
24533 feature.properties = {
24535 area: d3_geoArea(feature) // also precompute areas
24543 features: features$2,
24544 resources: resources,
24545 query: whichPolygon_1({
24546 type: 'FeatureCollection',
24547 features: ociFeatureCollection
24550 imagery: dataImagery, //legacy
24553 defaults: defaults,
24554 categories: categories,
24559 function osmEntity$$1(attrs) {
24560 // For prototypal inheritance.
24561 if (this instanceof osmEntity$$1) return;
24563 // Create the appropriate subtype.
24564 if (attrs && attrs.type) {
24565 return osmEntity$$1[attrs.type].apply(this, arguments);
24566 } else if (attrs && attrs.id) {
24567 return osmEntity$$1[osmEntity$$1.id.type(attrs.id)].apply(this, arguments);
24570 // Initialize a generic Entity (used only in tests).
24571 return (new osmEntity$$1()).initialize(arguments);
24575 osmEntity$$1.id = function(type) {
24576 return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
24580 osmEntity$$1.id.next = {
24581 changeset: -1, node: -1, way: -1, relation: -1
24585 osmEntity$$1.id.fromOSM = function(type, id) {
24586 return type[0] + id;
24590 osmEntity$$1.id.toOSM = function(id) {
24591 return id.slice(1);
24595 osmEntity$$1.id.type = function(id) {
24596 return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
24600 // A function suitable for use as the second argument to d3.selection#data().
24601 osmEntity$$1.key = function(entity) {
24602 return entity.id + 'v' + (entity.v || 0);
24606 osmEntity$$1.prototype = {
24611 initialize: function(sources) {
24612 for (var i = 0; i < sources.length; ++i) {
24613 var source = sources[i];
24614 for (var prop in source) {
24615 if (Object.prototype.hasOwnProperty.call(source, prop)) {
24616 if (source[prop] === undefined) {
24619 this[prop] = source[prop];
24625 if (!this.id && this.type) {
24626 this.id = osmEntity$$1.id(this.type);
24628 if (!this.hasOwnProperty('visible')) {
24629 this.visible = true;
24636 copy: function(resolver, copies) {
24637 if (copies[this.id])
24638 return copies[this.id];
24640 var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
24641 copies[this.id] = copy;
24647 osmId: function() {
24648 return osmEntity$$1.id.toOSM(this.id);
24652 isNew: function() {
24653 return this.osmId() < 0;
24657 update: function(attrs) {
24658 return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
24662 mergeTags: function(tags) {
24663 var merged = clone(this.tags), changed = false;
24664 for (var k in tags) {
24665 var t1 = merged[k],
24670 } else if (t1 !== t2) {
24672 merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
24675 return changed ? this.update({tags: merged}) : this;
24679 intersects: function(extent, resolver) {
24680 return this.extent(resolver).intersects(extent);
24684 isUsed: function(resolver) {
24685 return without(Object.keys(this.tags), 'area').length > 0 ||
24686 resolver.parentRelations(this).length > 0;
24690 hasInterestingTags: function() {
24691 return keys$1(this.tags).some(osmIsInterestingTag);
24695 isHighwayIntersection: function() {
24699 isDegenerate: function() {
24703 deprecatedTags: function() {
24704 var tags = toPairs(this.tags);
24705 var deprecated = {};
24707 dataDeprecated.forEach(function(d) {
24708 var match = toPairs(d.old)[0];
24709 tags.forEach(function(t) {
24710 if (t[0] === match[0] &&
24711 (t[1] === match[1] || match[1] === '*')) {
24712 deprecated[t[0]] = t[1];
24721 function geoExtent$$1(min, max) {
24722 if (!(this instanceof geoExtent$$1)) {
24723 return new geoExtent$$1(min, max);
24724 } else if (min instanceof geoExtent$$1) {
24726 } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
24730 this[0] = min || [ Infinity, Infinity];
24731 this[1] = max || min || [-Infinity, -Infinity];
24736 geoExtent$$1.prototype = new Array(2);
24738 assignIn(geoExtent$$1.prototype, {
24740 equals: function (obj) {
24741 return this[0][0] === obj[0][0] &&
24742 this[0][1] === obj[0][1] &&
24743 this[1][0] === obj[1][0] &&
24744 this[1][1] === obj[1][1];
24748 extend: function(obj) {
24749 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24750 return geoExtent$$1(
24751 [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
24752 [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
24757 _extend: function(extent) {
24758 this[0][0] = Math.min(extent[0][0], this[0][0]);
24759 this[0][1] = Math.min(extent[0][1], this[0][1]);
24760 this[1][0] = Math.max(extent[1][0], this[1][0]);
24761 this[1][1] = Math.max(extent[1][1], this[1][1]);
24766 return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
24770 center: function() {
24771 return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
24775 rectangle: function() {
24776 return [this[0][0], this[0][1], this[1][0], this[1][1]];
24781 return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
24785 polygon: function() {
24787 [this[0][0], this[0][1]],
24788 [this[0][0], this[1][1]],
24789 [this[1][0], this[1][1]],
24790 [this[1][0], this[0][1]],
24791 [this[0][0], this[0][1]]
24796 contains: function(obj) {
24797 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24798 return obj[0][0] >= this[0][0] &&
24799 obj[0][1] >= this[0][1] &&
24800 obj[1][0] <= this[1][0] &&
24801 obj[1][1] <= this[1][1];
24805 intersects: function(obj) {
24806 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24807 return obj[0][0] <= this[1][0] &&
24808 obj[0][1] <= this[1][1] &&
24809 obj[1][0] >= this[0][0] &&
24810 obj[1][1] >= this[0][1];
24814 intersection: function(obj) {
24815 if (!this.intersects(obj)) return new geoExtent$$1();
24816 return new geoExtent$$1(
24817 [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
24818 [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
24823 percentContainedIn: function(obj) {
24824 if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24825 var a1 = this.intersection(obj).area();
24826 var a2 = this.area();
24828 if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
24836 padByMeters: function(meters) {
24837 var dLat = geoMetersToLat(meters);
24838 var dLon = geoMetersToLon(meters, this.center()[1]);
24839 return geoExtent$$1(
24840 [this[0][0] - dLon, this[0][1] - dLat],
24841 [this[1][0] + dLon, this[1][1] + dLat]
24846 toParam: function() {
24847 return this.rectangle().join(',');
24853 var TAU = 2 * Math.PI;
24854 var EQUATORIAL_RADIUS = 6356752.314245179;
24855 var POLAR_RADIUS = 6378137.0;
24858 function geoLatToMeters(dLat) {
24859 return dLat * (TAU * POLAR_RADIUS / 360);
24863 function geoLonToMeters(dLon, atLat) {
24864 return Math.abs(atLat) >= 90 ? 0 :
24865 dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
24869 function geoMetersToLat(m) {
24870 return m / (TAU * POLAR_RADIUS / 360);
24874 function geoMetersToLon(m, atLat) {
24875 return Math.abs(atLat) >= 90 ? 0 :
24876 m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
24880 function geoMetersToOffset(meters, tileSize) {
24881 tileSize = tileSize || 256;
24883 meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
24884 -meters[1] * tileSize / (TAU * POLAR_RADIUS)
24889 function geoOffsetToMeters(offset, tileSize) {
24890 tileSize = tileSize || 256;
24892 offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
24893 -offset[1] * TAU * POLAR_RADIUS / tileSize
24898 // Equirectangular approximation of spherical distances on Earth
24899 function geoSphericalDistance(a, b) {
24900 var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
24901 var y = geoLatToMeters(a[1] - b[1]);
24902 return Math.sqrt((x * x) + (y * y));
24907 function geoScaleToZoom(k, tileSize) {
24908 tileSize = tileSize || 256;
24909 var log2ts = Math.log(tileSize) * Math.LOG2E;
24910 return Math.log(k * TAU) / Math.LN2 - log2ts;
24915 function geoZoomToScale(z, tileSize) {
24916 tileSize = tileSize || 256;
24917 return tileSize * Math.pow(2, z) / TAU;
24921 * A specialized version of `_.every` for arrays without support for
24922 * iteratee shorthands.
24925 * @param {Array} [array] The array to iterate over.
24926 * @param {Function} predicate The function invoked per iteration.
24927 * @returns {boolean} Returns `true` if all elements pass the predicate check,
24930 function arrayEvery(array, predicate) {
24932 length = array == null ? 0 : array.length;
24934 while (++index < length) {
24935 if (!predicate(array[index], index, array)) {
24943 * The base implementation of `_.every` without support for iteratee shorthands.
24946 * @param {Array|Object} collection The collection to iterate over.
24947 * @param {Function} predicate The function invoked per iteration.
24948 * @returns {boolean} Returns `true` if all elements pass the predicate check,
24951 function baseEvery(collection, predicate) {
24953 baseEach(collection, function(value, index, collection) {
24954 result = !!predicate(value, index, collection);
24961 * Checks if `predicate` returns truthy for **all** elements of `collection`.
24962 * Iteration is stopped once `predicate` returns falsey. The predicate is
24963 * invoked with three arguments: (value, index|key, collection).
24965 * **Note:** This method returns `true` for
24966 * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
24967 * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
24968 * elements of empty collections.
24973 * @category Collection
24974 * @param {Array|Object} collection The collection to iterate over.
24975 * @param {Function} [predicate=_.identity] The function invoked per iteration.
24976 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
24977 * @returns {boolean} Returns `true` if all elements pass the predicate check,
24981 * _.every([true, 1, null, 'yes'], Boolean);
24985 * { 'user': 'barney', 'age': 36, 'active': false },
24986 * { 'user': 'fred', 'age': 40, 'active': false }
24989 * // The `_.matches` iteratee shorthand.
24990 * _.every(users, { 'user': 'barney', 'active': false });
24993 * // The `_.matchesProperty` iteratee shorthand.
24994 * _.every(users, ['active', false]);
24997 * // The `_.property` iteratee shorthand.
24998 * _.every(users, 'active');
25001 function every(collection, predicate, guard) {
25002 var func = isArray(collection) ? arrayEvery : baseEvery;
25003 if (guard && isIterateeCall(collection, predicate, guard)) {
25004 predicate = undefined;
25006 return func(collection, baseIteratee(predicate, 3));
25010 * The base implementation of `_.some` without support for iteratee shorthands.
25013 * @param {Array|Object} collection The collection to iterate over.
25014 * @param {Function} predicate The function invoked per iteration.
25015 * @returns {boolean} Returns `true` if any element passes the predicate check,
25018 function baseSome(collection, predicate) {
25021 baseEach(collection, function(value, index, collection) {
25022 result = predicate(value, index, collection);
25029 * Checks if `predicate` returns truthy for **any** element of `collection`.
25030 * Iteration is stopped once `predicate` returns truthy. The predicate is
25031 * invoked with three arguments: (value, index|key, collection).
25036 * @category Collection
25037 * @param {Array|Object} collection The collection to iterate over.
25038 * @param {Function} [predicate=_.identity] The function invoked per iteration.
25039 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
25040 * @returns {boolean} Returns `true` if any element passes the predicate check,
25044 * _.some([null, 0, 'yes', false], Boolean);
25048 * { 'user': 'barney', 'active': true },
25049 * { 'user': 'fred', 'active': false }
25052 * // The `_.matches` iteratee shorthand.
25053 * _.some(users, { 'user': 'barney', 'active': false });
25056 * // The `_.matchesProperty` iteratee shorthand.
25057 * _.some(users, ['active', false]);
25060 * // The `_.property` iteratee shorthand.
25061 * _.some(users, 'active');
25064 function some(collection, predicate, guard) {
25065 var func = isArray(collection) ? arraySome : baseSome;
25066 if (guard && isIterateeCall(collection, predicate, guard)) {
25067 predicate = undefined;
25069 return func(collection, baseIteratee(predicate, 3));
25073 function geoVecEqual(a, b, epsilon) {
25075 return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
25077 return (a[0] === b[0]) && (a[1] === b[1]);
25082 function geoVecAdd(a, b) {
25083 return [ a[0] + b[0], a[1] + b[1] ];
25086 // vector subtraction
25087 function geoVecSubtract(a, b) {
25088 return [ a[0] - b[0], a[1] - b[1] ];
25092 function geoVecScale(a, mag) {
25093 return [ a[0] * mag, a[1] * mag ];
25096 // vector rounding (was: geoRoundCoordinates)
25097 function geoVecFloor(a) {
25098 return [ Math.floor(a[0]), Math.floor(a[1]) ];
25101 // linear interpolation
25102 function geoVecInterp(a, b, t) {
25104 a[0] + (b[0] - a[0]) * t,
25105 a[1] + (b[1] - a[1]) * t
25109 // http://jsperf.com/id-dist-optimization
25110 function geoVecLength(a, b) {
25111 var x = a[0] - b[0];
25112 var y = a[1] - b[1];
25113 return Math.sqrt((x * x) + (y * y));
25116 // Return the counterclockwise angle in the range (-pi, pi)
25117 // between the positive X axis and the line intersecting a and b.
25118 function geoVecAngle(a, b) {
25119 return Math.atan2(b[1] - a[1], b[0] - a[0]);
25123 function geoVecDot(a, b, origin) {
25124 origin = origin || [0, 0];
25125 return (a[0] - origin[0]) * (b[0] - origin[0]) +
25126 (a[1] - origin[1]) * (b[1] - origin[1]);
25129 // 2D cross product of OA and OB vectors, returns magnitude of Z vector
25130 // Returns a positive value, if OAB makes a counter-clockwise turn,
25131 // negative for clockwise turn, and zero if the points are collinear.
25132 function geoVecCross(a, b, origin) {
25133 origin = origin || [0, 0];
25134 return (a[0] - origin[0]) * (b[1] - origin[1]) -
25135 (a[1] - origin[1]) * (b[0] - origin[0]);
25138 // Return the counterclockwise angle in the range (-pi, pi)
25139 // between the positive X axis and the line intersecting a and b.
25140 function geoAngle(a, b, projection) {
25141 return geoVecAngle(projection(a.loc), projection(b.loc));
25144 function geoEdgeEqual(a, b) {
25145 return (a[0] === b[0] && a[1] === b[1]) ||
25146 (a[0] === b[1] && a[1] === b[0]);
25149 // Rotate all points counterclockwise around a pivot point by given angle
25150 function geoRotate(points, angle, around) {
25151 return points.map(function(point) {
25152 var radial = geoVecSubtract(point, around);
25154 radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
25155 radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
25161 // Choose the edge with the minimal distance from `point` to its orthogonal
25162 // projection onto that edge, if such a projection exists, or the distance to
25163 // the closest vertex on that edge. Returns an object with the `index` of the
25164 // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
25165 function geoChooseEdge(nodes, point, projection, activeID) {
25166 var dist = geoVecLength;
25167 var points = nodes.map(function(n) { return projection(n.loc); });
25168 var ids = nodes.map(function(n) { return n.id; });
25169 var min = Infinity;
25173 for (var i = 0; i < points.length - 1; i++) {
25174 if (ids[i] === activeID || ids[i + 1] === activeID) continue;
25177 var s = geoVecSubtract(points[i + 1], o);
25178 var v = geoVecSubtract(point, o);
25179 var proj = geoVecDot(v, s) / geoVecDot(s, s);
25184 } else if (proj > 1) {
25187 p = [o[0] + proj * s[0], o[1] + proj * s[1]];
25190 var d = dist(p, point);
25194 loc = projection.invert(p);
25198 if (idx !== undefined) {
25199 return { index: idx, distance: min, loc: loc };
25206 // Test active (dragged or drawing) segments against inactive segments
25207 // This is used to test e.g. multipolygon rings that cross
25208 // `activeNodes` is the ring containing the activeID being dragged.
25209 // `inactiveNodes` is the other ring to test against
25210 function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
25212 var inactives = [];
25213 var j, k, n1, n2, segment;
25215 // gather active segments (only segments in activeNodes that contain the activeID)
25216 for (j = 0; j < activeNodes.length - 1; j++) {
25217 n1 = activeNodes[j];
25218 n2 = activeNodes[j+1];
25219 segment = [n1.loc, n2.loc];
25220 if (n1.id === activeID || n2.id === activeID) {
25221 actives.push(segment);
25225 // gather inactive segments
25226 for (j = 0; j < inactiveNodes.length - 1; j++) {
25227 n1 = inactiveNodes[j];
25228 n2 = inactiveNodes[j+1];
25229 segment = [n1.loc, n2.loc];
25230 inactives.push(segment);
25234 for (j = 0; j < actives.length; j++) {
25235 for (k = 0; k < inactives.length; k++) {
25236 var p = actives[j];
25237 var q = inactives[k];
25238 var hit = geoLineIntersection(p, q);
25249 // Test active (dragged or drawing) segments against inactive segments
25250 // This is used to test whether a way intersects with itself.
25251 function geoHasSelfIntersections(nodes, activeID) {
25253 var inactives = [];
25256 // group active and passive segments along the nodes
25257 for (j = 0; j < nodes.length - 1; j++) {
25259 var n2 = nodes[j+1];
25260 var segment = [n1.loc, n2.loc];
25261 if (n1.id === activeID || n2.id === activeID) {
25262 actives.push(segment);
25264 inactives.push(segment);
25269 for (j = 0; j < actives.length; j++) {
25270 for (k = 0; k < inactives.length; k++) {
25271 var p = actives[j];
25272 var q = inactives[k];
25273 // skip if segments share an endpoint
25274 if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
25275 geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
25279 var hit = geoLineIntersection(p, q);
25281 var epsilon = 1e-8;
25282 // skip if the hit is at the segment's endpoint
25283 if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
25284 geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
25297 // Return the intersection point of 2 line segments.
25298 // From https://github.com/pgkelley4/line-segments-intersect
25299 // This uses the vector cross product approach described below:
25300 // http://stackoverflow.com/a/565282/786339
25301 function geoLineIntersection(a, b) {
25302 var p = [a[0][0], a[0][1]];
25303 var p2 = [a[1][0], a[1][1]];
25304 var q = [b[0][0], b[0][1]];
25305 var q2 = [b[1][0], b[1][1]];
25306 var r = geoVecSubtract(p2, p);
25307 var s = geoVecSubtract(q2, q);
25308 var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
25309 var denominator = geoVecCross(r, s);
25311 if (uNumerator && denominator) {
25312 var u = uNumerator / denominator;
25313 var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
25315 if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
25316 return geoVecInterp(p, p2, t);
25324 function geoPathIntersections(path1, path2) {
25325 var intersections = [];
25326 for (var i = 0; i < path1.length - 1; i++) {
25327 for (var j = 0; j < path2.length - 1; j++) {
25328 var a = [ path1[i], path1[i+1] ];
25329 var b = [ path2[j], path2[j+1] ];
25330 var hit = geoLineIntersection(a, b);
25332 intersections.push(hit);
25336 return intersections;
25339 function geoPathHasIntersections(path1, path2) {
25340 for (var i = 0; i < path1.length - 1; i++) {
25341 for (var j = 0; j < path2.length - 1; j++) {
25342 var a = [ path1[i], path1[i+1] ];
25343 var b = [ path2[j], path2[j+1] ];
25344 var hit = geoLineIntersection(a, b);
25354 // Return whether point is contained in polygon.
25356 // `point` should be a 2-item array of coordinates.
25357 // `polygon` should be an array of 2-item arrays of coordinates.
25359 // From https://github.com/substack/point-in-polygon.
25360 // ray-casting algorithm based on
25361 // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
25363 function geoPointInPolygon(point, polygon) {
25366 var inside = false;
25368 for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
25369 var xi = polygon[i][0];
25370 var yi = polygon[i][1];
25371 var xj = polygon[j][0];
25372 var yj = polygon[j][1];
25374 var intersect = ((yi > y) !== (yj > y)) &&
25375 (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
25376 if (intersect) inside = !inside;
25383 function geoPolygonContainsPolygon(outer, inner) {
25384 return every(inner, function(point) {
25385 return geoPointInPolygon(point, outer);
25390 function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
25391 function testPoints(outer, inner) {
25392 return some(inner, function(point) {
25393 return geoPointInPolygon(point, outer);
25397 return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
25401 function geoPathLength(path) {
25403 for (var i = 0; i < path.length - 1; i++) {
25404 length += geoVecLength(path[i], path[i + 1]);
25410 // If the given point is at the edge of the padded viewport,
25411 // return a vector that will nudge the viewport in that direction
25412 function geoViewportEdge(point, dimensions) {
25413 var pad = [80, 20, 50, 20]; // top, right, bottom, left
25417 if (point[0] > dimensions[0] - pad[1])
25419 if (point[0] < pad[3])
25421 if (point[1] > dimensions[1] - pad[2])
25423 if (point[1] < pad[0])
25434 Bypasses features of D3's default projection stream pipeline that are unnecessary:
25435 * Antimeridian clipping
25436 * Spherical rotation
25439 function geoRawMercator() {
25440 var project = mercatorRaw;
25441 var k = 512 / Math.PI; // scale
25443 var y = 0; // translate
25444 var clipExtent = [[0, 0], [0, 0]];
25447 function projection$$1(point) {
25448 point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
25449 return [point[0] * k + x, y - point[1] * k];
25453 projection$$1.invert = function(point) {
25454 point = project.invert((point[0] - x) / k, (y - point[1]) / k);
25455 return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
25459 projection$$1.scale = function(_) {
25460 if (!arguments.length) return k;
25462 return projection$$1;
25466 projection$$1.translate = function(_) {
25467 if (!arguments.length) return [x, y];
25470 return projection$$1;
25474 projection$$1.clipExtent = function(_) {
25475 if (!arguments.length) return clipExtent;
25477 return projection$$1;
25481 projection$$1.transform = function(obj) {
25482 if (!arguments.length) return identity$7.translate(x, y).scale(k);
25486 return projection$$1;
25490 projection$$1.stream = d3_geoTransform({
25491 point: function(x, y) {
25492 var vec = projection$$1([x, y]);
25493 this.stream.point(vec[0], vec[1]);
25498 return projection$$1;
25501 function osmChangeset() {
25502 if (!(this instanceof osmChangeset)) {
25503 return (new osmChangeset()).initialize(arguments);
25504 } else if (arguments.length) {
25505 this.initialize(arguments);
25510 osmEntity$$1.changeset = osmChangeset;
25512 osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
25514 assignIn(osmChangeset.prototype, {
25519 extent: function() {
25520 return new geoExtent$$1();
25524 geometry: function() {
25525 return 'changeset';
25529 asJXON: function() {
25533 tag: map$3(this.tags, function(value, key) {
25534 return { '@k': key, '@v': value };
25544 // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
25545 // XML. Returns a string.
25546 osmChangeJXON: function(changes) {
25547 var changeset_id = this.id;
25549 function nest(x, order) {
25551 for (var i = 0; i < x.length; i++) {
25552 var tagName = Object.keys(x[i])[0];
25553 if (!groups[tagName]) groups[tagName] = [];
25554 groups[tagName].push(x[i][tagName]);
25557 order.forEach(function(o) {
25558 if (groups[o]) ordered[o] = groups[o];
25564 // sort relations in a changeset by dependencies
25565 function sort(changes) {
25567 // find a referenced relation in the current changeset
25568 function resolve(item) {
25569 return find$1(relations, function(relation) {
25570 return item.keyAttributes.type === 'relation'
25571 && item.keyAttributes.ref === relation['@id'];
25575 // a new item is an item that has not been already processed
25576 function isNew(item) {
25577 return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
25578 return proc['@id'] === item['@id'];
25582 var processing = [],
25584 relations = changes.relation;
25586 if (!relations) return changes;
25588 for (var i = 0; i < relations.length; i++) {
25589 var relation = relations[i];
25591 // skip relation if already sorted
25592 if (!sorted[relation['@id']]) {
25593 processing.push(relation);
25596 while (processing.length > 0) {
25597 var next = processing[0],
25598 deps = filter(compact(next.member.map(resolve)), isNew);
25599 if (deps.length === 0) {
25600 sorted[next['@id']] = next;
25601 processing.shift();
25603 processing = deps.concat(processing);
25608 changes.relation = values$1(sorted);
25612 function rep(entity) {
25613 return entity.asJXON(changeset_id);
25619 '@generator': 'iD',
25620 'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
25621 'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
25622 'delete': assignIn(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
25628 asGeoJSON: function() {
25635 * Creates a duplicate-free version of an array, using
25636 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
25637 * for equality comparisons, in which only the first occurrence of each element
25638 * is kept. The order of result values is determined by the order they occur
25645 * @param {Array} array The array to inspect.
25646 * @returns {Array} Returns the new duplicate free array.
25649 * _.uniq([2, 1, 2]);
25652 function uniq(array) {
25653 return (array && array.length) ? baseUniq(array) : [];
25656 function osmNode() {
25657 if (!(this instanceof osmNode)) {
25658 return (new osmNode()).initialize(arguments);
25659 } else if (arguments.length) {
25660 this.initialize(arguments);
25664 osmEntity$$1.node = osmNode;
25666 osmNode.prototype = Object.create(osmEntity$$1.prototype);
25668 assignIn(osmNode.prototype, {
25673 extent: function() {
25674 return new geoExtent$$1(this.loc);
25678 geometry: function(graph) {
25679 return graph.transient(this, 'geometry', function() {
25680 return graph.isPoi(this) ? 'point' : 'vertex';
25685 move: function(loc) {
25686 return this.update({loc: loc});
25690 isDegenerate: function() {
25692 Array.isArray(this.loc) && this.loc.length === 2 &&
25693 this.loc[0] >= -180 && this.loc[0] <= 180 &&
25694 this.loc[1] >= -90 && this.loc[1] <= 90
25699 // Inspect tags and geometry to determine which direction(s) this node/vertex points
25700 directions: function(resolver, projection) {
25704 // which tag to use?
25705 if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
25706 // all-way stop tag on a highway intersection
25709 // generic direction tag
25710 val = (this.tags.direction || '').toLowerCase();
25712 // better suffix-style direction tag
25713 var re = /:direction$/i;
25714 var keys = Object.keys(this.tags);
25715 for (i = 0; i < keys.length; i++) {
25716 if (re.test(keys[i])) {
25717 val = this.tags[keys[i]].toLowerCase();
25723 if (val === '') return [];
25727 northnortheast: 22, nne: 22,
25728 northeast: 45, ne: 45,
25729 eastnortheast: 67, ene: 67,
25731 eastsoutheast: 112, ese: 112,
25732 southeast: 135, se: 135,
25733 southsoutheast: 157, sse: 157,
25734 south: 180, s: 180,
25735 southsouthwest: 202, ssw: 202,
25736 southwest: 225, sw: 225,
25737 westsouthwest: 247, wsw: 247,
25739 westnorthwest: 292, wnw: 292,
25740 northwest: 315, nw: 315,
25741 northnorthwest: 337, nnw: 337
25745 var values = val.split(';');
25748 values.forEach(function(v) {
25749 // swap cardinal for numeric directions
25750 if (cardinal[v] !== undefined) {
25754 // numeric direction - just add to results
25755 if (v !== '' && !isNaN(+v)) {
25760 // string direction - inspect parent ways
25762 (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
25764 (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
25766 if (!lookForward && !lookBackward) return;
25769 resolver.parentWays(this).forEach(function(parent) {
25770 var nodes = parent.nodes;
25771 for (i = 0; i < nodes.length; i++) {
25772 if (nodes[i] === this.id) { // match current entity
25773 if (lookForward && i > 0) {
25774 nodeIds[nodes[i - 1]] = true; // look back to prev node
25776 if (lookBackward && i < nodes.length - 1) {
25777 nodeIds[nodes[i + 1]] = true; // look ahead to next node
25783 Object.keys(nodeIds).forEach(function(nodeId) {
25784 // +90 because geoAngle returns angle from X axis, not Y (north)
25786 (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
25792 return uniq(results);
25796 isEndpoint: function(resolver) {
25797 return resolver.transient(this, 'isEndpoint', function() {
25799 return resolver.parentWays(this).filter(function(parent) {
25800 return !parent.isClosed() && !!parent.affix(id);
25806 isConnected: function(resolver) {
25807 return resolver.transient(this, 'isConnected', function() {
25808 var parents = resolver.parentWays(this);
25810 function isLine(entity) {
25811 return entity.geometry(resolver) === 'line' &&
25812 entity.hasInterestingTags();
25815 // vertex is connected to multiple parent lines
25816 if (parents.length > 1 && some(parents, isLine)) {
25819 } else if (parents.length === 1) {
25820 var way = parents[0],
25821 nodes = way.nodes.slice();
25822 if (way.isClosed()) { nodes.pop(); } // ignore connecting node if closed
25824 // return true if vertex appears multiple times (way is self intersecting)
25825 return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
25833 isIntersection: function(resolver) {
25834 return resolver.transient(this, 'isIntersection', function() {
25835 return resolver.parentWays(this).filter(function(parent) {
25836 return (parent.tags.highway ||
25837 parent.tags.waterway ||
25838 parent.tags.railway ||
25839 parent.tags.aeroway) &&
25840 parent.geometry(resolver) === 'line';
25846 isHighwayIntersection: function(resolver) {
25847 return resolver.transient(this, 'isHighwayIntersection', function() {
25848 return resolver.parentWays(this).filter(function(parent) {
25849 return parent.tags.highway && parent.geometry(resolver) === 'line';
25855 isOnAddressLine: function(resolver) {
25856 return resolver.transient(this, 'isOnAddressLine', function() {
25857 return resolver.parentWays(this).filter(function(parent) {
25858 return parent.tags.hasOwnProperty('addr:interpolation') &&
25859 parent.geometry(resolver) === 'line';
25865 asJXON: function(changeset_id) {
25868 '@id': this.osmId(),
25869 '@lon': this.loc[0],
25870 '@lat': this.loc[1],
25871 '@version': (this.version || 0),
25872 tag: map$3(this.tags, function(v, k) {
25873 return { keyAttributes: { k: k, v: v } };
25877 if (changeset_id) r.node['@changeset'] = changeset_id;
25882 asGeoJSON: function() {
25885 coordinates: this.loc
25890 function osmNote() {
25891 if (!(this instanceof osmNote)) {
25892 return (new osmNote()).initialize(arguments);
25893 } else if (arguments.length) {
25894 this.initialize(arguments);
25899 osmNote.id = function() {
25900 return osmNote.id.next--;
25904 osmNote.id.next = -1;
25907 assignIn(osmNote.prototype, {
25911 initialize: function(sources) {
25912 for (var i = 0; i < sources.length; ++i) {
25913 var source = sources[i];
25914 for (var prop in source) {
25915 if (Object.prototype.hasOwnProperty.call(source, prop)) {
25916 if (source[prop] === undefined) {
25919 this[prop] = source[prop];
25926 this.id = osmNote.id() + ''; // as string
25932 extent: function() {
25933 return new geoExtent$$1(this.loc);
25936 update: function(attrs) {
25937 return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
25940 isNew: function() {
25941 return this.id < 0;
25944 move: function(loc) {
25945 return this.update({ loc: loc });
25950 /** Error message constants. */
25951 var FUNC_ERROR_TEXT$1 = 'Expected a function';
25954 * Creates a function that negates the result of the predicate `func`. The
25955 * `func` predicate is invoked with the `this` binding and arguments of the
25956 * created function.
25961 * @category Function
25962 * @param {Function} predicate The predicate to negate.
25963 * @returns {Function} Returns the new negated function.
25966 * function isEven(n) {
25967 * return n % 2 == 0;
25970 * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
25973 function negate(predicate) {
25974 if (typeof predicate != 'function') {
25975 throw new TypeError(FUNC_ERROR_TEXT$1);
25977 return function() {
25978 var args = arguments;
25979 switch (args.length) {
25980 case 0: return !predicate.call(this);
25981 case 1: return !predicate.call(this, args[0]);
25982 case 2: return !predicate.call(this, args[0], args[1]);
25983 case 3: return !predicate.call(this, args[0], args[1], args[2]);
25985 return !predicate.apply(this, args);
25990 * The opposite of `_.filter`; this method returns the elements of `collection`
25991 * that `predicate` does **not** return truthy for.
25996 * @category Collection
25997 * @param {Array|Object} collection The collection to iterate over.
25998 * @param {Function} [predicate=_.identity] The function invoked per iteration.
25999 * @returns {Array} Returns the new filtered array.
26004 * { 'user': 'barney', 'age': 36, 'active': false },
26005 * { 'user': 'fred', 'age': 40, 'active': true }
26008 * _.reject(users, function(o) { return !o.active; });
26009 * // => objects for ['fred']
26011 * // The `_.matches` iteratee shorthand.
26012 * _.reject(users, { 'age': 40, 'active': true });
26013 * // => objects for ['barney']
26015 * // The `_.matchesProperty` iteratee shorthand.
26016 * _.reject(users, ['active', false]);
26017 * // => objects for ['fred']
26019 * // The `_.property` iteratee shorthand.
26020 * _.reject(users, 'active');
26021 * // => objects for ['barney']
26023 function reject(collection, predicate) {
26024 var func = isArray(collection) ? arrayFilter : baseFilter;
26025 return func(collection, negate(baseIteratee(predicate, 3)));
26029 Order the nodes of a way in reverse order and reverse any direction dependent tags
26030 other than `oneway`. (We assume that correcting a backwards oneway is the primary
26031 reason for reversing a way.)
26033 In addition, numeric-valued `incline` tags are negated.
26035 The JOSM implementation was used as a guide, but transformations that were of unclear benefit
26036 or adjusted tags that don't seem to be used in practice were omitted.
26039 http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
26040 http://wiki.openstreetmap.org/wiki/Key:direction#Steps
26041 http://wiki.openstreetmap.org/wiki/Key:incline
26042 http://wiki.openstreetmap.org/wiki/Route#Members
26043 http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
26044 http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
26045 http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
26047 function actionReverse(wayID, options) {
26048 var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
26049 var numeric = /^([+\-]?)(?=[\d.])/;
26050 var keyReplacements = [
26051 [/:right$/, ':left'],
26052 [/:left$/, ':right'],
26053 [/:forward$/, ':backward'],
26054 [/:backward$/, ':forward']
26056 var valueReplacements = {
26061 forward: 'backward',
26062 backward: 'forward',
26063 forwards: 'backward',
26064 backwards: 'forward',
26066 var roleReplacements = {
26067 forward: 'backward',
26068 backward: 'forward',
26069 forwards: 'backward',
26070 backwards: 'forward'
26072 var onewayReplacements = {
26079 function reverseKey(key) {
26080 for (var i = 0; i < keyReplacements.length; ++i) {
26081 var replacement = keyReplacements[i];
26082 if (replacement[0].test(key)) {
26083 return key.replace(replacement[0], replacement[1]);
26090 function reverseValue(key, value) {
26091 if (ignoreKey.test(key)) return value;
26093 if (key === 'incline' && numeric.test(value)) {
26094 return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
26095 } else if (options && options.reverseOneway && key === 'oneway') {
26096 return onewayReplacements[value] || value;
26098 return valueReplacements[value] || value;
26103 // Reverse the direction of tags attached to the nodes - #3076
26104 function reverseNodeTags(graph, nodeIDs) {
26105 for (var i = 0; i < nodeIDs.length; i++) {
26106 var node = graph.hasEntity(nodeIDs[i]);
26107 if (!node || !Object.keys(node.tags).length) continue;
26110 for (var key in node.tags) {
26111 tags[reverseKey(key)] = reverseValue(key, node.tags[key]);
26113 graph = graph.replace(node.update({tags: tags}));
26119 return function(graph) {
26120 var way = graph.entity(wayID);
26121 var nodes = way.nodes.slice().reverse();
26125 for (var key in way.tags) {
26126 tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
26129 graph.parentRelations(way).forEach(function(relation) {
26130 relation.members.forEach(function(member, index) {
26131 if (member.id === way.id && (role = roleReplacements[member.role])) {
26132 relation = relation.updateMember({role: role}, index);
26133 graph = graph.replace(relation);
26138 // Reverse any associated directions on nodes on the way and then replace
26139 // the way itself with the reversed node ids and updated way tags
26140 return reverseNodeTags(graph, nodes)
26141 .replace(way.update({nodes: nodes, tags: tags}));
26145 /** `Object#toString` result references. */
26146 var numberTag$4 = '[object Number]';
26149 * Checks if `value` is classified as a `Number` primitive or object.
26151 * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
26152 * classified as numbers, use the `_.isFinite` method.
26158 * @param {*} value The value to check.
26159 * @returns {boolean} Returns `true` if `value` is a number, else `false`.
26165 * _.isNumber(Number.MIN_VALUE);
26168 * _.isNumber(Infinity);
26174 function isNumber(value) {
26175 return typeof value == 'number' ||
26176 (isObjectLike(value) && baseGetTag(value) == numberTag$4);
26179 /** `Object#toString` result references. */
26180 var stringTag$4 = '[object String]';
26183 * Checks if `value` is classified as a `String` primitive or object.
26189 * @param {*} value The value to check.
26190 * @returns {boolean} Returns `true` if `value` is a string, else `false`.
26193 * _.isString('abc');
26199 function isString(value) {
26200 return typeof value == 'string' ||
26201 (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
26205 * Checks if `value` is `NaN`.
26207 * **Note:** This method is based on
26208 * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
26209 * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
26210 * `undefined` and other non-number values.
26216 * @param {*} value The value to check.
26217 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
26223 * _.isNaN(new Number(NaN));
26226 * isNaN(undefined);
26229 * _.isNaN(undefined);
26232 function isNaN$1(value) {
26233 // An `NaN` primitive is the only value that is not equal to itself.
26234 // Perform the `toStringTag` check first to avoid errors with some
26235 // ActiveX objects in IE.
26236 return isNumber(value) && value != +value;
26239 function osmLanes(entity) {
26240 if (entity.type !== 'way') return null;
26241 if (!entity.tags.highway) return null;
26243 var tags = entity.tags;
26244 var isOneWay = entity.isOneWay();
26245 var laneCount = getLaneCount(tags, isOneWay);
26246 var maxspeed = parseMaxspeed(tags);
26248 var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
26249 var forward = laneDirections.forward;
26250 var backward = laneDirections.backward;
26251 var bothways = laneDirections.bothways;
26253 // parse the piped string 'x|y|z' format
26254 var turnLanes = {};
26255 turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
26256 turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
26257 turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
26259 var maxspeedLanes = {};
26260 maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
26261 maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
26262 maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
26265 psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
26266 psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
26267 psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
26270 busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
26271 busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
26272 busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
26274 var taxiLanes = {};
26275 taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
26276 taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
26277 taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
26280 hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
26281 hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
26282 hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
26285 hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
26286 hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
26287 hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
26289 var bicyclewayLanes = {};
26290 bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
26291 bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
26292 bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
26300 // map forward/backward/unspecified of each lane type to lanesObj
26301 mapToLanesObj(lanesObj, turnLanes, 'turnLane');
26302 mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
26303 mapToLanesObj(lanesObj, psvLanes, 'psv');
26304 mapToLanesObj(lanesObj, busLanes, 'bus');
26305 mapToLanesObj(lanesObj, taxiLanes, 'taxi');
26306 mapToLanesObj(lanesObj, hovLanes, 'hov');
26307 mapToLanesObj(lanesObj, hgvLanes, 'hgv');
26308 mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
26315 backward: backward,
26316 bothways: bothways,
26317 turnLanes: turnLanes,
26318 maxspeed: maxspeed,
26319 maxspeedLanes: maxspeedLanes,
26320 psvLanes: psvLanes,
26321 busLanes: busLanes,
26322 taxiLanes: taxiLanes,
26323 hovLanes: hovLanes,
26324 hgvLanes: hgvLanes,
26325 bicyclewayLanes: bicyclewayLanes
26332 function getLaneCount(tags, isOneWay) {
26335 count = parseInt(tags.lanes, 10);
26342 switch (tags.highway) {
26345 count = isOneWay ? 2 : 4;
26348 count = isOneWay ? 1 : 2;
26356 function parseMaxspeed(tags) {
26357 var maxspeed = tags.maxspeed;
26358 if (isNumber(maxspeed)) return maxspeed;
26359 if (isString(maxspeed)) {
26360 maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
26361 if (!maxspeed) return;
26362 return parseInt(maxspeed, 10);
26367 function parseLaneDirections(tags, isOneWay, laneCount) {
26368 var forward = parseInt(tags['lanes:forward'], 10);
26369 var backward = parseInt(tags['lanes:backward'], 10);
26370 var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
26372 if (parseInt(tags.oneway, 10) === -1) {
26375 backward = laneCount;
26377 else if (isOneWay) {
26378 forward = laneCount;
26382 else if (isNaN$1(forward) && isNaN$1(backward)) {
26383 backward = Math.floor((laneCount - bothways) / 2);
26384 forward = laneCount - bothways - backward;
26386 else if (isNaN$1(forward)) {
26387 if (backward > laneCount - bothways) {
26388 backward = laneCount - bothways;
26390 forward = laneCount - bothways - backward;
26392 else if (isNaN$1(backward)) {
26393 if (forward > laneCount - bothways) {
26394 forward = laneCount - bothways;
26396 backward = laneCount - bothways - forward;
26400 backward: backward,
26406 function parseTurnLanes(tag){
26409 var validValues = [
26410 'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
26411 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
26414 return tag.split('|')
26415 .map(function (s) {
26416 if (s === '') s = 'none';
26417 return s.split(';')
26418 .map(function (d) {
26419 return validValues.indexOf(d) === -1 ? 'unknown': d;
26425 function parseMaxspeedLanes(tag, maxspeed) {
26428 return tag.split('|')
26429 .map(function (s) {
26430 if (s === 'none') return s;
26431 var m = parseInt(s, 10);
26432 if (s === '' || m === maxspeed) return null;
26433 return isNaN$1(m) ? 'unknown': m;
26438 function parseMiscLanes(tag) {
26441 var validValues = [
26442 'yes', 'no', 'designated'
26445 return tag.split('|')
26446 .map(function (s) {
26447 if (s === '') s = 'no';
26448 return validValues.indexOf(s) === -1 ? 'unknown': s;
26453 function parseBicycleWay(tag) {
26456 var validValues = [
26457 'yes', 'no', 'designated', 'lane'
26460 return tag.split('|')
26461 .map(function (s) {
26462 if (s === '') s = 'no';
26463 return validValues.indexOf(s) === -1 ? 'unknown': s;
26468 function mapToLanesObj(lanesObj, data, key) {
26469 if (data.forward) data.forward.forEach(function(l, i) {
26470 if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
26471 lanesObj.forward[i][key] = l;
26473 if (data.backward) data.backward.forEach(function(l, i) {
26474 if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
26475 lanesObj.backward[i][key] = l;
26477 if (data.unspecified) data.unspecified.forEach(function(l, i) {
26478 if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
26479 lanesObj.unspecified[i][key] = l;
26483 /** Used to compose bitmasks for cloning. */
26484 var CLONE_DEEP_FLAG$2 = 1,
26485 CLONE_SYMBOLS_FLAG$3 = 4;
26488 * This method is like `_.clone` except that it recursively clones `value`.
26494 * @param {*} value The value to recursively clone.
26495 * @returns {*} Returns the deep cloned value.
26499 * var objects = [{ 'a': 1 }, { 'b': 2 }];
26501 * var deep = _.cloneDeep(objects);
26502 * console.log(deep[0] === objects[0]);
26505 function cloneDeep(value) {
26506 return baseClone(value, CLONE_DEEP_FLAG$2 | CLONE_SYMBOLS_FLAG$3);
26510 * Gets the timestamp of the number of milliseconds that have elapsed since
26511 * the Unix epoch (1 January 1970 00:00:00 UTC).
26517 * @returns {number} Returns the timestamp.
26520 * _.defer(function(stamp) {
26521 * console.log(_.now() - stamp);
26523 * // => Logs the number of milliseconds it took for the deferred invocation.
26525 var now$1 = function() {
26526 return root$2.Date.now();
26529 /** Error message constants. */
26530 var FUNC_ERROR_TEXT$2 = 'Expected a function';
26532 /* Built-in method references for those with the same name as other `lodash` methods. */
26533 var nativeMax$2 = Math.max,
26534 nativeMin = Math.min;
26537 * Creates a debounced function that delays invoking `func` until after `wait`
26538 * milliseconds have elapsed since the last time the debounced function was
26539 * invoked. The debounced function comes with a `cancel` method to cancel
26540 * delayed `func` invocations and a `flush` method to immediately invoke them.
26541 * Provide `options` to indicate whether `func` should be invoked on the
26542 * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
26543 * with the last arguments provided to the debounced function. Subsequent
26544 * calls to the debounced function return the result of the last `func`
26547 * **Note:** If `leading` and `trailing` options are `true`, `func` is
26548 * invoked on the trailing edge of the timeout only if the debounced function
26549 * is invoked more than once during the `wait` timeout.
26551 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
26552 * until to the next tick, similar to `setTimeout` with a timeout of `0`.
26554 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
26555 * for details over the differences between `_.debounce` and `_.throttle`.
26560 * @category Function
26561 * @param {Function} func The function to debounce.
26562 * @param {number} [wait=0] The number of milliseconds to delay.
26563 * @param {Object} [options={}] The options object.
26564 * @param {boolean} [options.leading=false]
26565 * Specify invoking on the leading edge of the timeout.
26566 * @param {number} [options.maxWait]
26567 * The maximum time `func` is allowed to be delayed before it's invoked.
26568 * @param {boolean} [options.trailing=true]
26569 * Specify invoking on the trailing edge of the timeout.
26570 * @returns {Function} Returns the new debounced function.
26573 * // Avoid costly calculations while the window size is in flux.
26574 * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
26576 * // Invoke `sendMail` when clicked, debouncing subsequent calls.
26577 * jQuery(element).on('click', _.debounce(sendMail, 300, {
26579 * 'trailing': false
26582 * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
26583 * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
26584 * var source = new EventSource('/stream');
26585 * jQuery(source).on('message', debounced);
26587 * // Cancel the trailing debounced invocation.
26588 * jQuery(window).on('popstate', debounced.cancel);
26590 function debounce(func, wait, options) {
26597 lastInvokeTime = 0,
26602 if (typeof func != 'function') {
26603 throw new TypeError(FUNC_ERROR_TEXT$2);
26605 wait = toNumber(wait) || 0;
26606 if (isObject(options)) {
26607 leading = !!options.leading;
26608 maxing = 'maxWait' in options;
26609 maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
26610 trailing = 'trailing' in options ? !!options.trailing : trailing;
26613 function invokeFunc(time) {
26614 var args = lastArgs,
26615 thisArg = lastThis;
26617 lastArgs = lastThis = undefined;
26618 lastInvokeTime = time;
26619 result = func.apply(thisArg, args);
26623 function leadingEdge(time) {
26624 // Reset any `maxWait` timer.
26625 lastInvokeTime = time;
26626 // Start the timer for the trailing edge.
26627 timerId = setTimeout(timerExpired, wait);
26628 // Invoke the leading edge.
26629 return leading ? invokeFunc(time) : result;
26632 function remainingWait(time) {
26633 var timeSinceLastCall = time - lastCallTime,
26634 timeSinceLastInvoke = time - lastInvokeTime,
26635 timeWaiting = wait - timeSinceLastCall;
26638 ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
26642 function shouldInvoke(time) {
26643 var timeSinceLastCall = time - lastCallTime,
26644 timeSinceLastInvoke = time - lastInvokeTime;
26646 // Either this is the first call, activity has stopped and we're at the
26647 // trailing edge, the system time has gone backwards and we're treating
26648 // it as the trailing edge, or we've hit the `maxWait` limit.
26649 return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
26650 (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
26653 function timerExpired() {
26654 var time = now$1();
26655 if (shouldInvoke(time)) {
26656 return trailingEdge(time);
26658 // Restart the timer.
26659 timerId = setTimeout(timerExpired, remainingWait(time));
26662 function trailingEdge(time) {
26663 timerId = undefined;
26665 // Only invoke if we have `lastArgs` which means `func` has been
26666 // debounced at least once.
26667 if (trailing && lastArgs) {
26668 return invokeFunc(time);
26670 lastArgs = lastThis = undefined;
26674 function cancel() {
26675 if (timerId !== undefined) {
26676 clearTimeout(timerId);
26678 lastInvokeTime = 0;
26679 lastArgs = lastCallTime = lastThis = timerId = undefined;
26683 return timerId === undefined ? result : trailingEdge(now$1());
26686 function debounced() {
26687 var time = now$1(),
26688 isInvoking = shouldInvoke(time);
26690 lastArgs = arguments;
26692 lastCallTime = time;
26695 if (timerId === undefined) {
26696 return leadingEdge(lastCallTime);
26699 // Handle invocations in a tight loop.
26700 timerId = setTimeout(timerExpired, wait);
26701 return invokeFunc(lastCallTime);
26704 if (timerId === undefined) {
26705 timerId = setTimeout(timerExpired, wait);
26709 debounced.cancel = cancel;
26710 debounced.flush = flush;
26715 * Casts `value` to `identity` if it's not a function.
26718 * @param {*} value The value to inspect.
26719 * @returns {Function} Returns cast function.
26721 function castFunction(value) {
26722 return typeof value == 'function' ? value : identity$8;
26726 * Iterates over elements of `collection` and invokes `iteratee` for each element.
26727 * The iteratee is invoked with three arguments: (value, index|key, collection).
26728 * Iteratee functions may exit iteration early by explicitly returning `false`.
26730 * **Note:** As with other "Collections" methods, objects with a "length"
26731 * property are iterated like arrays. To avoid this behavior use `_.forIn`
26732 * or `_.forOwn` for object iteration.
26738 * @category Collection
26739 * @param {Array|Object} collection The collection to iterate over.
26740 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26741 * @returns {Array|Object} Returns `collection`.
26742 * @see _.forEachRight
26745 * _.forEach([1, 2], function(value) {
26746 * console.log(value);
26748 * // => Logs `1` then `2`.
26750 * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
26751 * console.log(key);
26753 * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26755 function forEach(collection, iteratee) {
26756 var func = isArray(collection) ? arrayEach : baseEach;
26757 return func(collection, castFunction(iteratee));
26761 * Iterates over own enumerable string keyed properties of an object and
26762 * invokes `iteratee` for each property. The iteratee is invoked with three
26763 * arguments: (value, key, object). Iteratee functions may exit iteration
26764 * early by explicitly returning `false`.
26770 * @param {Object} object The object to iterate over.
26771 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26772 * @returns {Object} Returns `object`.
26773 * @see _.forOwnRight
26781 * Foo.prototype.c = 3;
26783 * _.forOwn(new Foo, function(value, key) {
26784 * console.log(key);
26786 * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26788 function forOwn(object, iteratee) {
26789 return object && baseForOwn(object, castFunction(iteratee));
26792 var translations = Object.create(null);
26794 var currentLocale = 'en';
26795 var textDirection = 'ltr';
26797 function setLocale(_) {
26798 if (translations[_] !== undefined) {
26800 } else if (translations[_.split('-')[0]]) {
26801 currentLocale = _.split('-')[0];
26805 function addTranslation(id, value) {
26806 translations[id] = value;
26810 * Given a string identifier, try to find that string in the current
26811 * language, and return it. This function will be called recursively
26812 * with locale `en` if a string can not be found in the requested language.
26814 * @param {string} s string identifier
26815 * @param {object?} o object of token replacements and default string
26816 * @param {string?} loc locale to use
26817 * @returns {string?} locale string
26819 function t(s, o, loc) {
26820 loc = loc || currentLocale;
26824 .map(function (s) { return s.replace('<TX_DOT>', '.'); })
26827 var rep = translations[loc];
26829 while (rep !== undefined && path.length) {
26830 rep = rep[path.pop()];
26833 if (rep !== undefined) {
26836 rep = rep.replace('{' + k + '}', o[k]);
26842 if (loc !== 'en') {
26843 return t(s, o, 'en');
26846 if (o && 'default' in o) {
26850 var missing = 'Missing ' + loc + ' translation: ' + s;
26851 if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
26857 * Given string 'ltr' or 'rtl', save that setting
26859 * @param {string} dir ltr or rtl
26862 function setTextDirection(dir) {
26863 textDirection = dir;
26866 /** Used to compose bitmasks for cloning. */
26867 var CLONE_DEEP_FLAG$3 = 1,
26868 CLONE_SYMBOLS_FLAG$4 = 4;
26871 * This method is like `_.cloneWith` except that it recursively clones `value`.
26877 * @param {*} value The value to recursively clone.
26878 * @param {Function} [customizer] The function to customize cloning.
26879 * @returns {*} Returns the deep cloned value.
26883 * function customizer(value) {
26884 * if (_.isElement(value)) {
26885 * return value.cloneNode(true);
26889 * var el = _.cloneDeepWith(document.body, customizer);
26891 * console.log(el === document.body);
26893 * console.log(el.nodeName);
26895 * console.log(el.childNodes.length);
26898 function cloneDeepWith(value, customizer) {
26899 customizer = typeof customizer == 'function' ? customizer : undefined;
26900 return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$4, customizer);
26904 * Creates an array of `array` values not included in the other given arrays
26905 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
26906 * for equality comparisons. The order and references of result values are
26907 * determined by the first array.
26909 * **Note:** Unlike `_.pullAll`, this method returns a new array.
26915 * @param {Array} array The array to inspect.
26916 * @param {...Array} [values] The values to exclude.
26917 * @returns {Array} Returns the new array of filtered values.
26918 * @see _.without, _.xor
26921 * _.difference([2, 1], [2, 3]);
26924 var difference = baseRest(function(array, values) {
26925 return isArrayLikeObject(array)
26926 ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
26930 /** `Object#toString` result references. */
26931 var mapTag$7 = '[object Map]',
26932 setTag$7 = '[object Set]';
26934 /** Used for built-in method references. */
26935 var objectProto$h = Object.prototype;
26937 /** Used to check objects for own properties. */
26938 var hasOwnProperty$e = objectProto$h.hasOwnProperty;
26941 * Checks if `value` is an empty object, collection, map, or set.
26943 * Objects are considered empty if they have no own enumerable string keyed
26946 * Array-like values such as `arguments` objects, arrays, buffers, strings, or
26947 * jQuery-like collections are considered empty if they have a `length` of `0`.
26948 * Similarly, maps and sets are considered empty if they have a `size` of `0`.
26954 * @param {*} value The value to check.
26955 * @returns {boolean} Returns `true` if `value` is empty, else `false`.
26967 * _.isEmpty([1, 2, 3]);
26970 * _.isEmpty({ 'a': 1 });
26973 function isEmpty(value) {
26974 if (value == null) {
26977 if (isArrayLike(value) &&
26978 (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
26979 isBuffer(value) || isTypedArray(value) || isArguments(value))) {
26980 return !value.length;
26982 var tag = getTag$1(value);
26983 if (tag == mapTag$7 || tag == setTag$7) {
26984 return !value.size;
26986 if (isPrototype(value)) {
26987 return !baseKeys(value).length;
26989 for (var key in value) {
26990 if (hasOwnProperty$e.call(value, key)) {
26999 function utilDetect(force) {
27000 if (detected && !force) return detected;
27003 var ua = navigator.userAgent,
27006 m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i); // Edge
27008 detected.browser = m[1];
27009 detected.version = m[2];
27011 if (!detected.browser) {
27012 m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i); // IE11
27014 detected.browser = 'msie';
27015 detected.version = m[1];
27018 if (!detected.browser) {
27019 m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i); // Opera 15+
27021 detected.browser = 'Opera';
27022 detected.version = m[2];
27025 if (!detected.browser) {
27026 m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
27028 detected.browser = m[1];
27029 detected.version = m[2];
27030 m = ua.match(/version\/([\.\d]+)/i);
27031 if (m !== null) detected.version = m[1];
27034 if (!detected.browser) {
27035 detected.browser = navigator.appName;
27036 detected.version = navigator.appVersion;
27039 // keep major.minor version only..
27040 detected.version = detected.version.split(/\W/).slice(0,2).join('.');
27042 if (detected.browser.toLowerCase() === 'msie') {
27043 detected.ie = true;
27044 detected.browser = 'Internet Explorer';
27045 detected.support = parseFloat(detected.version) >= 11;
27047 detected.ie = false;
27048 detected.support = true;
27051 // Added due to incomplete svg style support. See #715
27052 detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
27054 detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
27055 detected.language = detected.locale.split('-')[0];
27057 // Search `navigator.languages` for a better locale.. Prefer the first language,
27058 // unless the second language is a culture-specific version of the first one, see #3842
27059 if (navigator.languages && navigator.languages.length > 0) {
27060 var code0 = navigator.languages[0],
27061 parts0 = code0.split('-');
27063 detected.locale = code0;
27064 detected.language = parts0[0];
27066 if (navigator.languages.length > 1 && parts0.length === 1) {
27067 var code1 = navigator.languages[1],
27068 parts1 = code1.split('-');
27070 if (parts1[0] === parts0[0]) {
27071 detected.locale = code1;
27076 // Loaded locale is stored in currentLocale
27077 // return that instead (except in the situation where 'en' might override 'en-US')
27078 var loadedLocale = currentLocale || 'en';
27079 if (loadedLocale !== 'en') {
27080 detected.locale = loadedLocale;
27081 detected.language = detected.locale.split('-')[0];
27084 // detect text direction
27085 var q = utilStringQs(window.location.hash.substring(1));
27086 var lang = dataLocales[detected.locale];
27087 if ((lang && lang.rtl) || (q.rtl === 'true')) {
27088 detected.textDirection = 'rtl';
27090 detected.textDirection = 'ltr';
27092 setTextDirection(detected.textDirection);
27095 var loc = window.top.location;
27096 var origin = loc.origin;
27097 if (!origin) { // for unpatched IE11
27098 origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
27101 detected.host = origin + loc.pathname;
27103 detected.filedrop = (window.FileReader && 'ondrop' in window);
27105 detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27107 detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27110 return navigator.userAgent.indexOf(x) !== -1;
27114 detected.os = 'win';
27115 detected.platform = 'Windows';
27117 else if (nav('Mac')) {
27118 detected.os = 'mac';
27119 detected.platform = 'Macintosh';
27121 else if (nav('X11') || nav('Linux')) {
27122 detected.os = 'linux';
27123 detected.platform = 'Linux';
27126 detected.os = 'win';
27127 detected.platform = 'Unknown';
27133 var remove$1 = removeDiacritics;
27135 var replacementList = [
27144 chars: "\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F",
27150 chars: "\u00C6\u01FC\u01E2",
27159 chars: "\uA738\uA73A",
27165 chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
27168 chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
27171 chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
27177 chars: "\u01F1\u01C4",
27180 chars: "\u01F2\u01C5",
27183 chars: "\u025B\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E\u1D07",
27186 chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
27189 chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
27192 chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
27195 chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
27198 chars: "\u24BF\uFF2A\u0134\u0248\u0237",
27201 chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
27204 chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
27213 chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
27216 chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
27225 chars: "\u24C4\uFF2F\xD2\xD3\xD4\u1ED2\u1ED0\u1ED6\u1ED4\xD5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\xD6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\xD8\u01FE\u0186\u019F\uA74A\uA74C",
27240 chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
27243 chars: "\u24C6\uFF31\uA756\uA758\u024A",
27246 chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
27249 chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
27252 chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
27261 chars: "\u24CA\uFF35\xD9\xDA\xDB\u0168\u1E78\u016A\u1E7A\u016C\xDC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244",
27264 chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
27270 chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
27273 chars: "\u24CD\uFF38\u1E8A\u1E8C",
27276 chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
27279 chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
27282 chars: "\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250\u0251",
27288 chars: "\u00E6\u01FD\u01E3",
27297 chars: "\uA739\uA73B",
27303 chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
27306 chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
27309 chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
27315 chars: "\u01F3\u01C6",
27318 chars: "\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u01DD",
27321 chars: "\u24D5\uFF46\u1E1F\u0192",
27339 chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
27342 chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
27348 chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
27351 chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
27354 chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
27357 chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
27363 chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
27366 chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
27372 chars: "\u24DE\uFF4F\xF2\xF3\xF4\u1ED3\u1ED1\u1ED7\u1ED5\xF5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\xF6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\xF8\u01FF\uA74B\uA74D\u0275\u0254\u1D11",
27387 chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
27390 chars: "\u24E0\uFF51\u024B\uA757\uA759",
27393 chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
27396 chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
27402 chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
27411 chars: "\u24E4\uFF55\xF9\xFA\xFB\u0169\u1E79\u016B\u1E7B\u016D\xFC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289",
27414 chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
27420 chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
27423 chars: "\u24E7\uFF58\u1E8B\u1E8D",
27426 chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
27429 chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
27433 var diacriticsMap = {};
27434 for (var i = 0; i < replacementList.length; i += 1) {
27435 var chars = replacementList[i].chars;
27436 for (var j = 0; j < chars.length; j += 1) {
27437 diacriticsMap[chars[j]] = replacementList[i].base;
27441 function removeDiacritics(str) {
27442 return str.replace(/[^\u0000-\u007e]/g, function(c) {
27443 return diacriticsMap[c] || c;
27447 // see https://github.com/openstreetmap/iD/pull/3707
27448 // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
27451 // madda above alef
27452 1570: { initial: 'آ', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
27454 // hamza above and below alef
27455 1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
27457 1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
27459 1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
27460 1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
27463 1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
27465 1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
27466 1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
27467 1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
27468 1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
27469 1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
27470 1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
27471 1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
27472 1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
27473 1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
27474 1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
27475 1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
27476 1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
27477 1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
27478 1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
27479 1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
27480 1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
27481 1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
27482 1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
27484 // 1595 ػ - may be very rare
27486 1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
27487 1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
27488 1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
27489 1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
27490 1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
27491 1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
27492 1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
27495 1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
27497 1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
27499 // short vowel sounds / tashkil markings
27501 1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
27503 1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
27504 1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
27505 1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
27506 1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
27507 1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
27508 5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
27511 var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
27513 function fixRTLTextForSvg(inputText) {
27514 var context = true;
27516 var rtlBuffer = [];
27517 var arabicRegex = /[\u0600-\u06FF]/g;
27518 var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
27519 var thaanaVowel = /[\u07A6-\u07B0]/;
27520 var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
27522 if (!arabicRegex.test(inputText)) {
27523 // Hebrew or Thaana RTL script
27524 for (var n = 0; n < inputText.length; n++) {
27525 var c = inputText[n];
27526 if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
27527 rtlBuffer[rtlBuffer.length - 1] += c;
27528 } else if (rtlRegex.test(c)) {
27530 } else if (c === ' ' && rtlBuffer.length) {
27531 // whitespace within RTL text
27532 rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27534 // non-RTL character
27535 ret += rtlBuffer.reverse().join('') + c;
27540 for (var i = 0, l = inputText.length; i < l; i++) {
27541 var code = inputText[i].charCodeAt(0);
27542 var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
27544 if (!chars$1[code]) {
27545 if (code === 32 && rtlBuffer.length) {
27547 rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27548 } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
27550 rtlBuffer[rtlBuffer.length - 1] += inputText[i];
27552 // non-RTL character
27553 ret += rtlBuffer.reverse().join('') + inputText[i];
27559 if (i === l - 1 || nextCode === 32) {
27560 rtlBuffer.push(chars$1[code].isolated);
27562 // special case for لا
27563 if (code === 1604 && nextCode === 1575) {
27564 rtlBuffer.push(chars$1[5000].initial);
27569 rtlBuffer.push(chars$1[code].initial);
27572 if (i === l - 1 || nextCode === 32){
27573 rtlBuffer.push(chars$1[code].final);
27575 // special case for ﻼ
27576 if (code === 1604 && nextCode === 1575){
27577 rtlBuffer.push(chars$1[5000].final);
27582 if (chars$1[code].medial === ''){
27583 rtlBuffer.push(chars$1[code].final);
27585 rtlBuffer.push(chars$1[code].medial);
27589 context = (chars$1[code].medial === '') || nextCode === 32;
27592 ret += rtlBuffer.reverse().join('');
27596 function utilTagText(entity) {
27597 return map$3(entity.tags, function(v, k) {
27598 return k + '=' + v;
27603 function utilEntitySelector(ids) {
27604 return ids.length ? '.' + ids.join(',.') : 'nothing';
27608 function utilEntityOrMemberSelector(ids, graph) {
27609 var s = utilEntitySelector(ids);
27611 ids.forEach(function(id) {
27612 var entity = graph.hasEntity(id);
27613 if (entity && entity.type === 'relation') {
27614 entity.members.forEach(function(member) {
27615 s += ',.' + member.id;
27624 function utilGetAllNodes(ids, graph) {
27627 ids.forEach(getNodes);
27630 function getNodes(id) {
27631 if (seen[id]) return;
27634 var entity = graph.hasEntity(id);
27635 if (!entity) return;
27637 if (entity.type === 'node') {
27638 nodes.push(entity);
27639 } else if (entity.type === 'way') {
27640 entity.nodes.forEach(getNodes);
27642 entity.members.map(function(member) { return member.id; }).forEach(getNodes);
27648 function utilDisplayName(entity) {
27649 var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0],
27650 name = entity.tags[localizedNameKey] || entity.tags.name || '',
27651 network = entity.tags.cycle_network || entity.tags.network;
27653 if (!name && entity.tags.ref) {
27654 name = entity.tags.ref;
27656 name = network + ' ' + name;
27664 function utilDisplayNameForPath(entity) {
27665 var name = utilDisplayName(entity);
27666 var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
27668 if (!isFirefox && name && rtlRegex.test(name)) {
27669 name = fixRTLTextForSvg(name);
27676 function utilDisplayType(id) {
27678 n: t('inspector.node'),
27679 w: t('inspector.way'),
27680 r: t('inspector.relation')
27685 function utilStringQs(str) {
27686 return str.split('&').reduce(function(obj, pair){
27687 var parts = pair.split('=');
27688 if (parts.length === 2) {
27689 obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
27691 if (parts[0] === 'mvt') {
27692 obj[parts[0]] = (parts[2] !== undefined) ? (decodeURIComponent(parts[1]) + '=' + decodeURIComponent(parts[2])) : (decodeURIComponent(parts[1]));
27699 function utilQsString(obj, noencode) {
27700 function softEncode(s) {
27701 // encode everything except special characters used in certain hash parameters:
27702 // "/" in map states, ":", ",", {" and "}" in background
27703 return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
27705 return Object.keys(obj).sort().map(function(key) {
27706 return encodeURIComponent(key) + '=' + (
27707 noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
27712 function utilPrefixDOMProperty(property) {
27713 var prefixes = ['webkit', 'ms', 'moz', 'o'],
27715 n = prefixes.length,
27721 property = property.substr(0, 1).toUpperCase() + property.substr(1);
27724 if (prefixes[i] + property in s)
27725 return prefixes[i] + property;
27731 function utilPrefixCSSProperty(property) {
27732 var prefixes = ['webkit', 'ms', 'Moz', 'O'],
27734 n = prefixes.length,
27735 s = document.body.style;
27737 if (property.toLowerCase() in s)
27738 return property.toLowerCase();
27741 if (prefixes[i] + property in s)
27742 return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
27748 var transformProperty;
27749 function utilSetTransform(el, x, y, scale) {
27750 var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'),
27751 translate = utilDetect().opera ?
27752 'translate(' + x + 'px,' + y + 'px)' :
27753 'translate3d(' + x + 'px,' + y + 'px,0)';
27754 return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
27758 // Calculates Levenshtein distance between two strings
27759 // see: https://en.wikipedia.org/wiki/Levenshtein_distance
27760 // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
27761 function utilEditDistance(a, b) {
27762 a = remove$1(a.toLowerCase());
27763 b = remove$1(b.toLowerCase());
27764 if (a.length === 0) return b.length;
27765 if (b.length === 0) return a.length;
27767 for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
27768 for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
27769 for (i = 1; i <= b.length; i++) {
27770 for (j = 1; j <= a.length; j++) {
27771 if (b.charAt(i-1) === a.charAt(j-1)) {
27772 matrix[i][j] = matrix[i-1][j-1];
27774 matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
27775 Math.min(matrix[i][j-1] + 1, // insertion
27776 matrix[i-1][j] + 1)); // deletion
27780 return matrix[b.length][a.length];
27784 // a d3.mouse-alike which
27785 // 1. Only works on HTML elements, not SVG
27786 // 2. Does not cause style recalculation
27787 function utilFastMouse(container) {
27788 var rect = container.getBoundingClientRect(),
27789 rectLeft = rect.left,
27790 rectTop = rect.top,
27791 clientLeft = +container.clientLeft,
27792 clientTop = +container.clientTop;
27793 if (textDirection === 'rtl') {
27796 return function(e) {
27798 e.clientX - rectLeft - clientLeft,
27799 e.clientY - rectTop - clientTop];
27804 /* eslint-disable no-proto */
27805 var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
27806 /* eslint-enable no-proto */
27809 function utilAsyncMap(inputs, func, callback) {
27810 var remaining = inputs.length,
27814 inputs.forEach(function(d, i) {
27815 func(d, function done(err, data) {
27819 if (!remaining) callback(errors, results);
27825 // wraps an index to an interval [0..length-1]
27826 function utilWrap(index, length) {
27828 index += Math.ceil(-index/length)*length;
27829 return index % length;
27834 * a replacement for functor
27836 * @param {*} value any value
27837 * @returns {Function} a function that returns that value or the value if it's a function
27839 function utilFunctor(value) {
27840 if (typeof value === 'function') return value;
27841 return function() {
27847 function utilNoAuto(selection) {
27848 var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
27851 .attr('autocomplete', 'off')
27852 .attr('autocorrect', 'off')
27853 .attr('autocapitalize', 'off')
27854 .attr('spellcheck', isText ? 'true' : 'false');
27858 // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
27859 // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
27860 function utilHashcode(str) {
27862 if (str.length === 0) {
27865 for (var i = 0; i < str.length; i++) {
27866 var char = str.charCodeAt(i);
27867 hash = ((hash << 5) - hash) + char;
27868 hash = hash & hash; // Convert to 32bit integer
27873 // note the function should be of low priority
27874 // and should not be returning a value.
27875 function utilCallWhenIdle(func, timeout) {
27876 return function() {
27877 var args = arguments;
27879 window.requestIdleCallback(function() {
27880 func.apply(that, args);
27881 }, {timeout: timeout});
27885 function utilCleanTags(tags) {
27887 for (var k in tags) {
27890 if (v !== undefined) {
27891 out[k] = cleanValue(k, v);
27898 function cleanValue(k, v) {
27899 function keepSpaces(k) {
27900 return /_hours|_times|:conditional$/.test(k);
27904 return /^(description|note|fixme)$/.test(k);
27907 if (skip(k)) return v;
27911 .map(function(s) { return s.trim(); })
27912 .join(keepSpaces(k) ? '; ' : ';');
27914 // The code below is not intended to validate websites and emails.
27915 // It is only intended to prevent obvious copy-paste errors. (#2323)
27916 // clean website- and email-like tags
27917 if (k.indexOf('website') !== -1 ||
27918 k.indexOf('email') !== -1 ||
27919 cleaned.indexOf('http') === 0) {
27921 .replace(/[\u200B-\u200F\uFEFF]/g, ''); // strip LRM and other zero width chars
27929 // Like selection.property('value', ...), but avoids no-op value sets,
27930 // which can result in layout/repaint thrashing in some situations.
27931 function utilGetSetValue(selection, value) {
27932 function d3_selection_value(value) {
27933 function valueNull() {
27937 function valueConstant() {
27938 if (this.value !== value) {
27939 this.value = value;
27943 function valueFunction() {
27944 var x = value.apply(this, arguments);
27947 } else if (this.value !== x) {
27952 return value == null
27953 ? valueNull : (typeof value === 'function'
27954 ? valueFunction : valueConstant);
27957 if (arguments.length === 1) {
27958 return selection.property('value');
27961 return selection.each(d3_selection_value(value));
27964 function utilIdleWorker(tasks, processor, callback) {
27965 var results = [], result;
27966 for (var i = 0; i < tasks.length; i++) {
27967 result = processor(tasks[i]);
27968 if (result) results.push(result);
27972 // var processed = [];
27973 // var currentPos = 0;
27974 // var totalTasks = tasks.length;
27976 // function worker(deadline) {
27977 // while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
27978 // var result = processor(tasks[currentPos]);
27980 // // if falsy dont add to the processed list
27981 // if (result) processed.push(result);
27985 // // more tasks are left, we might need more idleCallbacks
27986 // if (currentPos < totalTasks) {
27987 // return window.requestIdleCallback(function(deadline) {worker(deadline);});
27990 // // tasks are completed
27991 // return callback(processed);
27994 // window.requestIdleCallback(function(deadline) {worker(deadline);});
27998 window.requestIdleCallback =
27999 window.requestIdleCallback ||
28001 var start = Date.now();
28002 return setTimeout(function() {
28005 timeRemaining: function() {
28006 return Math.max(0, 50 - (Date.now() - start));
28012 window.cancelIdleCallback =
28013 window.cancelIdleCallback ||
28018 // Copies a variable number of methods from source to target.
28019 function utilRebind(target, source) {
28020 var i = 1, n = arguments.length, method;
28022 target[method = arguments[i]] = d3_rebind(target, source, source[method]);
28027 // Method is assumed to be a standard D3 getter-setter:
28028 // If passed with no arguments, gets the value.
28029 // If passed with arguments, sets the value and returns the target.
28030 function d3_rebind(target, source, method) {
28031 return function() {
28032 var value = method.apply(source, arguments);
28033 return value === source ? target : value;
28037 // A per-domain session mutex backed by a cookie and dead man's
28038 // switch. If the session crashes, the mutex will auto-release
28039 // after 5 seconds.
28041 // This accepts a string and returns an object that complies with utilSessionMutexType
28042 function utilSessionMutex(name) {
28047 var expires = new Date();
28048 expires.setSeconds(expires.getSeconds() + 5);
28049 document.cookie = name + '=1; expires=' + expires.toUTCString();
28052 mutex.lock = function () {
28053 if (intervalID) return true;
28054 var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
28055 if (cookie) return false;
28057 intervalID = window.setInterval(renew, 4000);
28061 mutex.unlock = function () {
28062 if (!intervalID) return;
28063 document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
28064 clearInterval(intervalID);
28068 mutex.locked = function () {
28069 return !!intervalID;
28075 function utilSuggestNames(preset, suggestions) {
28076 preset = preset.id.split('/', 2);
28080 return function(value, callback) {
28082 if (value && value.length > 2) {
28083 if (suggestions[k] && suggestions[k][v]) {
28084 for (var sugg in suggestions[k][v]) {
28085 var dist = utilEditDistance(value, sugg.substring(0, value.length));
28095 result.sort(function(a, b) {
28096 return a.dist - b.dist;
28099 result = result.slice(0,3);
28104 function utilTiler() {
28105 var _size = [256, 256];
28107 var _tileSize = 256;
28108 var _zoomExtent = [0, 20];
28109 var _translate = [_size[0] / 2, _size[1] / 2];
28111 var _skipNullIsland = false;
28114 function bound(val) {
28115 return Math.min(_zoomExtent[1], Math.max(_zoomExtent[0], val));
28119 function nearNullIsland(tile) {
28124 var center = Math.pow(2, z - 1);
28125 var width = Math.pow(2, z - 6);
28126 var min$$1 = center - (width / 2);
28127 var max$$1 = center + (width / 2) - 1;
28128 return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
28135 var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
28136 var z0 = bound(Math.round(z));
28137 var log2ts = Math.log(_tileSize) * Math.LOG2E;
28138 var k = Math.pow(2, z - z0 + log2ts);
28140 (_translate[0] - _scale / 2) / k,
28141 (_translate[1] - _scale / 2) / k
28145 Math.max(0, Math.floor(-origin[0]) - _margin),
28146 Math.max(0, Math.ceil(_size[0] / k - origin[0]) + _margin)
28149 Math.max(0, Math.floor(-origin[1]) - _margin),
28150 Math.max(0, Math.ceil(_size[1] / k - origin[1]) + _margin)
28154 for (var i = 0; i < rows.length; i++) {
28156 for (var j = 0; j < cols.length; j++) {
28159 if (i >= _margin && i <= rows.length - _margin &&
28160 j >= _margin && j <= cols.length - _margin) {
28161 tiles.unshift([x, y, z0]); // tiles in view at beginning
28163 tiles.push([x, y, z0]); // tiles in margin at the end
28168 tiles.translate = origin;
28176 * getTiles() returns an array of tiles that cover the map view
28178 tiler.getTiles = function(projection) {
28180 projection.scale() * Math.PI - projection.translate()[0],
28181 projection.scale() * Math.PI - projection.translate()[1]
28185 .size(projection.clipExtent()[1])
28186 .scale(projection.scale() * 2 * Math.PI)
28187 .translate(projection.translate());
28189 var tiles = tiler();
28190 var ts = tiles.scale;
28193 .map(function(tile) {
28194 if (_skipNullIsland && nearNullIsland(tile)) {
28197 var x = tile[0] * ts - origin[0];
28198 var y = tile[1] * ts - origin[1];
28200 id: tile.toString(),
28202 extent: geoExtent$$1(
28203 projection.invert([x, y + ts]),
28204 projection.invert([x + ts, y])
28207 }).filter(Boolean);
28211 tiler.tileSize = function(val) {
28212 if (!arguments.length) return _tileSize;
28218 tiler.zoomExtent = function(val) {
28219 if (!arguments.length) return _zoomExtent;
28225 tiler.size = function(val) {
28226 if (!arguments.length) return _size;
28232 tiler.scale = function(val) {
28233 if (!arguments.length) return _scale;
28239 tiler.translate = function(val) {
28240 if (!arguments.length) return _translate;
28246 // number to extend the rows/columns beyond those covering the viewport
28247 tiler.margin = function(val) {
28248 if (!arguments.length) return _margin;
28254 tiler.skipNullIsland = function(val) {
28255 if (!arguments.length) return _skipNullIsland;
28256 _skipNullIsland = val;
28264 function utilTriggerEvent(target, type) {
28265 target.each(function() {
28266 var evt = document.createEvent('HTMLEvents');
28267 evt.initEvent(type, true, true);
28268 this.dispatchEvent(evt);
28272 function validationDeprecatedTag() {
28274 var validation = function(changes) {
28276 for (var i = 0; i < changes.created.length; i++) {
28277 var change = changes.created[i],
28278 deprecatedTags = change.deprecatedTags();
28280 if (!isEmpty(deprecatedTags)) {
28281 var tags = utilTagText({ tags: deprecatedTags });
28283 id: 'deprecated_tags',
28284 message: t('validations.deprecated_tags', { tags: tags }),
28297 function validationDisconnectedHighway() {
28299 function isDisconnectedHighway(entity, graph) {
28300 if (!entity.tags.highway) return false;
28301 if (entity.geometry(graph) !== 'line') return false;
28303 return graph.childNodes(entity)
28304 .every(function(vertex) {
28305 var parents = graph.parentWays(vertex);
28306 if (parents.length === 1) { // standalone vertex
28308 } else { // shared vertex
28309 return !vertex.tags.entrance &&
28310 parents.filter(function(parent) {
28311 return parent.tags.highway && parent !== entity;
28318 var validation = function(changes, graph) {
28320 for (var i = 0; i < changes.created.length; i++) {
28321 var entity = changes.created[i];
28323 if (isDisconnectedHighway(entity, graph)) {
28325 id: 'disconnected_highway',
28326 message: t('validations.disconnected_highway'),
28327 tooltip: t('validations.disconnected_highway_tooltip'),
28340 function validationManyDeletions() {
28341 var threshold = 100;
28343 var validation = function(changes, graph) {
28345 var nodes=0, ways=0, areas=0, relations=0;
28347 changes.deleted.forEach(function(c) {
28348 if (c.type === 'node') {nodes++;}
28349 else if (c.type === 'way' && c.geometry(graph) === 'line') {ways++;}
28350 else if (c.type === 'way' && c.geometry(graph) === 'area') {areas++;}
28351 else if (c.type === 'relation') {relations++;}
28353 if (changes.deleted.length > threshold) {
28355 id: 'many_deletions',
28356 message: t('validations.many_deletions',
28357 { n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations })
28368 function validationMissingTag() {
28370 // Slightly stricter check than Entity#isUsed (#3091)
28371 function hasTags(entity, graph) {
28372 return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
28373 graph.parentRelations(entity).length > 0;
28376 var validation = function(changes, graph) {
28377 var types = ['point', 'line', 'area', 'relation'],
28380 for (var i = 0; i < changes.created.length; i++) {
28381 var change = changes.created[i],
28382 geometry = change.geometry(graph);
28384 if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
28387 message: t('validations.untagged_' + geometry),
28388 tooltip: t('validations.untagged_' + geometry + '_tooltip'),
28401 function validationOldMultipolygon() {
28403 return function validation(changes, graph) {
28405 for (var i = 0; i < changes.created.length; i++) {
28406 var entity = changes.created[i];
28407 var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
28410 id: 'old_multipolygon',
28411 message: t('validations.old_multipolygon'),
28412 tooltip: t('validations.old_multipolygon_tooltip'),
28421 // https://github.com/openstreetmap/josm/blob/mirror/src/org/
28422 // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
28423 function validationTagSuggestsArea() {
28425 function tagSuggestsArea(tags) {
28426 if (isEmpty(tags)) return false;
28428 var presence = ['landuse', 'amenities', 'tourism', 'shop'];
28429 for (var i = 0; i < presence.length; i++) {
28430 if (tags[presence[i]] !== undefined) {
28431 if (presence[i] === 'tourism' && tags[presence[i]] === 'artwork') {
28432 continue; // exception for tourism=artwork - #5206
28434 return presence[i] + '=' + tags[presence[i]];
28439 if (tags.building && tags.building === 'yes') return 'building=yes';
28443 var validation = function(changes, graph) {
28445 for (var i = 0; i < changes.created.length; i++) {
28446 var change = changes.created[i],
28447 geometry = change.geometry(graph),
28448 suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
28452 id: 'tag_suggests_area',
28453 message: t('validations.tag_suggests_area', { tag: suggestion }),
28468 var Validations = /*#__PURE__*/Object.freeze({
28469 validationDeprecatedTag: validationDeprecatedTag,
28470 validationDisconnectedHighway: validationDisconnectedHighway,
28471 validationManyDeletions: validationManyDeletions,
28472 validationMissingTag: validationMissingTag,
28473 validationOldMultipolygon: validationOldMultipolygon,
28474 validationTagSuggestsArea: validationTagSuggestsArea
28478 * Performs a deep comparison between two values to determine if they are
28481 * **Note:** This method supports comparing arrays, array buffers, booleans,
28482 * date objects, error objects, maps, numbers, `Object` objects, regexes,
28483 * sets, strings, symbols, and typed arrays. `Object` objects are compared
28484 * by their own, not inherited, enumerable properties. Functions and DOM
28485 * nodes are compared by strict equality, i.e. `===`.
28491 * @param {*} value The value to compare.
28492 * @param {*} other The other value to compare.
28493 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
28496 * var object = { 'a': 1 };
28497 * var other = { 'a': 1 };
28499 * _.isEqual(object, other);
28502 * object === other;
28505 function isEqual(value, other) {
28506 return baseIsEqual(value, other);
28510 iD.Difference represents the difference between two graphs.
28511 It knows how to calculate the set of entities that were
28512 created, modified, or deleted, and also contains the logic
28513 for recursively extending a difference to the complete set
28514 of entities that will require a redraw, taking into account
28515 child and parent relationships.
28517 function coreDifference(base, head) {
28521 var i, k, h, b, keys;
28523 function changed(h, b) {
28524 if (h === b) return false;
28525 if (!h || !b) return true;
28527 if (h.loc || b.loc) {
28528 if (!h.loc && b.loc || h.loc && !b.loc ||
28529 h.loc[0] !== b.loc[0] || h.loc[1] !== b.loc[1]) return true;
28531 if (h.nodes || b.nodes) {
28532 if (!isEqual(h.nodes, b.nodes)) return true;
28534 if (h.members || b.members) {
28535 if (!isEqual(h.members, b.members)) return true;
28537 return !isEqual(h.tags, b.tags);
28541 keys = Object.keys(head.entities);
28542 for (i = 0; i < keys.length; i++) {
28544 h = head.entities[k];
28545 b = base.entities[k];
28546 if (changed(h, b)) {
28547 _changes[k] = {base: b, head: h};
28552 keys = Object.keys(base.entities);
28553 for (i = 0; i < keys.length; i++) {
28555 h = head.entities[k];
28556 b = base.entities[k];
28557 if (!_changes[k] && changed(h, b)) {
28558 _changes[k] = {base: b, head: h};
28564 function addParents(parents, result) {
28565 for (var i = 0; i < parents.length; i++) {
28566 var parent = parents[i];
28568 if (parent.id in result)
28571 result[parent.id] = parent;
28572 addParents(head.parentRelations(parent), result);
28577 _diff.length = function length() {
28582 _diff.changes = function changes() {
28587 _diff.extantIDs = function extantIDs() {
28589 forEach(_changes, function(change, id) {
28590 if (change.head) result.push(id);
28596 _diff.modified = function modified() {
28598 forEach(_changes, function(change) {
28599 if (change.base && change.head) result.push(change.head);
28605 _diff.created = function created() {
28607 forEach(_changes, function(change) {
28608 if (!change.base && change.head) result.push(change.head);
28614 _diff.deleted = function deleted() {
28616 forEach(_changes, function(change) {
28617 if (change.base && !change.head) result.push(change.base);
28623 _diff.summary = function summary() {
28626 function addEntity(entity, graph, changeType) {
28627 relevant[entity.id] = {
28630 changeType: changeType
28634 function addParents(entity) {
28635 var parents = head.parentWays(entity);
28636 for (var j = parents.length - 1; j >= 0; j--) {
28637 var parent = parents[j];
28638 if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
28642 var keys = Object.keys(_changes);
28643 for (var i = 0; i < keys.length; i++) {
28644 var change = _changes[keys[i]];
28646 if (change.head && change.head.geometry(head) !== 'vertex') {
28647 addEntity(change.head, head, change.base ? 'modified' : 'created');
28649 } else if (change.base && change.base.geometry(base) !== 'vertex') {
28650 addEntity(change.base, base, 'deleted');
28652 } else if (change.base && change.head) { // modified vertex
28653 var moved = !isEqual(change.base.loc, change.head.loc);
28654 var retagged = !isEqual(change.base.tags, change.head.tags);
28657 addParents(change.head);
28660 if (retagged || (moved && change.head.hasInterestingTags())) {
28661 addEntity(change.head, head, 'modified');
28664 } else if (change.head && change.head.hasInterestingTags()) { // created vertex
28665 addEntity(change.head, head, 'created');
28667 } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
28668 addEntity(change.base, base, 'deleted');
28672 return values$1(relevant);
28676 _diff.complete = function complete(extent) {
28680 for (id in _changes) {
28681 change = _changes[id];
28683 var h = change.head;
28684 var b = change.base;
28685 var entity = h || b;
28688 (!h || !h.intersects(extent, head)) &&
28689 (!b || !b.intersects(extent, base)))
28694 if (entity.type === 'way') {
28695 var nh = h ? h.nodes : [];
28696 var nb = b ? b.nodes : [];
28699 diff = difference(nh, nb);
28700 for (i = 0; i < diff.length; i++) {
28701 result[diff[i]] = head.hasEntity(diff[i]);
28704 diff = difference(nb, nh);
28705 for (i = 0; i < diff.length; i++) {
28706 result[diff[i]] = head.hasEntity(diff[i]);
28710 addParents(head.parentWays(entity), result);
28711 addParents(head.parentRelations(entity), result);
28721 /** Used for built-in method references. */
28722 var objectProto$i = Object.prototype;
28724 /** Used to check objects for own properties. */
28725 var hasOwnProperty$f = objectProto$i.hasOwnProperty;
28728 * Assigns own enumerable string keyed properties of source objects to the
28729 * destination object. Source objects are applied from left to right.
28730 * Subsequent sources overwrite property assignments of previous sources.
28732 * **Note:** This method mutates `object` and is loosely based on
28733 * [`Object.assign`](https://mdn.io/Object/assign).
28739 * @param {Object} object The destination object.
28740 * @param {...Object} [sources] The source objects.
28741 * @returns {Object} Returns `object`.
28753 * Foo.prototype.b = 2;
28754 * Bar.prototype.d = 4;
28756 * _.assign({ 'a': 0 }, new Foo, new Bar);
28757 * // => { 'a': 1, 'c': 3 }
28759 var assign = createAssigner(function(object, source) {
28760 if (isPrototype(source) || isArrayLike(source)) {
28761 copyObject(source, keys$1(source), object);
28764 for (var key in source) {
28765 if (hasOwnProperty$f.call(source, key)) {
28766 assignValue(object, key, source[key]);
28771 /* Built-in method references for those with the same name as other `lodash` methods. */
28772 var nativeMax$3 = Math.max;
28775 * Checks if `value` is in `collection`. If `collection` is a string, it's
28776 * checked for a substring of `value`, otherwise
28777 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
28778 * is used for equality comparisons. If `fromIndex` is negative, it's used as
28779 * the offset from the end of `collection`.
28784 * @category Collection
28785 * @param {Array|Object|string} collection The collection to inspect.
28786 * @param {*} value The value to search for.
28787 * @param {number} [fromIndex=0] The index to search from.
28788 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
28789 * @returns {boolean} Returns `true` if `value` is found, else `false`.
28792 * _.includes([1, 2, 3], 1);
28795 * _.includes([1, 2, 3], 1, 2);
28798 * _.includes({ 'a': 1, 'b': 2 }, 1);
28801 * _.includes('abcd', 'bc');
28804 function includes(collection, value, fromIndex, guard) {
28805 collection = isArrayLike(collection) ? collection : values$1(collection);
28806 fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
28808 var length = collection.length;
28809 if (fromIndex < 0) {
28810 fromIndex = nativeMax$3(length + fromIndex, 0);
28812 return isString(collection)
28813 ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
28814 : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
28817 function coreGraph$$1(other, mutable) {
28818 if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
28820 if (other instanceof coreGraph$$1) {
28821 var base = other.base();
28822 this.entities = assign(Object.create(base.entities), other.entities);
28823 this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
28824 this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
28827 this.entities = Object.create({});
28828 this._parentWays = Object.create({});
28829 this._parentRels = Object.create({});
28830 this.rebase(other || [], [this]);
28833 this.transients = {};
28834 this._childNodes = {};
28835 this.frozen = !mutable;
28839 coreGraph$$1.prototype = {
28841 hasEntity: function(id) {
28842 return this.entities[id];
28846 entity: function(id) {
28847 var entity = this.entities[id];
28849 //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
28851 entity = this.entities.__proto__[id]; // eslint-disable-line no-proto
28855 throw new Error('entity ' + id + ' not found');
28861 transient: function(entity, key, fn) {
28862 var id = entity.id;
28863 var transients = this.transients[id] || (this.transients[id] = {});
28865 if (transients[key] !== undefined) {
28866 return transients[key];
28869 transients[key] = fn.call(entity);
28871 return transients[key];
28875 parentWays: function(entity) {
28876 var parents = this._parentWays[entity.id];
28880 for (var i = 0; i < parents.length; i++) {
28881 result.push(this.entity(parents[i]));
28888 isPoi: function(entity) {
28889 var parentWays = this._parentWays[entity.id];
28890 return !parentWays || parentWays.length === 0;
28894 isShared: function(entity) {
28895 var parentWays = this._parentWays[entity.id];
28896 return parentWays && parentWays.length > 1;
28900 parentRelations: function(entity) {
28901 var parents = this._parentRels[entity.id];
28905 for (var i = 0; i < parents.length; i++) {
28906 result.push(this.entity(parents[i]));
28913 childNodes: function(entity) {
28914 if (this._childNodes[entity.id]) return this._childNodes[entity.id];
28915 if (!entity.nodes) return [];
28918 for (var i = 0; i < entity.nodes.length; i++) {
28919 nodes[i] = this.entity(entity.nodes[i]);
28922 this._childNodes[entity.id] = nodes;
28923 return this._childNodes[entity.id];
28929 'entities': utilGetPrototypeOf(this.entities),
28930 'parentWays': utilGetPrototypeOf(this._parentWays),
28931 'parentRels': utilGetPrototypeOf(this._parentRels)
28936 // Unlike other graph methods, rebase mutates in place. This is because it
28937 // is used only during the history operation that merges newly downloaded
28938 // data into each state. To external consumers, it should appear as if the
28939 // graph always contained the newly downloaded data.
28940 rebase: function(entities, stack, force) {
28941 var base = this.base();
28944 for (i = 0; i < entities.length; i++) {
28945 var entity = entities[i];
28947 if (!entity.visible || (!force && base.entities[entity.id]))
28950 // Merging data into the base graph
28951 base.entities[entity.id] = entity;
28952 this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
28954 // Restore provisionally-deleted nodes that are discovered to have an extant parent
28955 if (entity.type === 'way') {
28956 for (j = 0; j < entity.nodes.length; j++) {
28957 id = entity.nodes[j];
28958 for (k = 1; k < stack.length; k++) {
28959 var ents = stack[k].entities;
28960 if (ents.hasOwnProperty(id) && ents[id] === undefined) {
28968 for (i = 0; i < stack.length; i++) {
28969 stack[i]._updateRebased();
28974 _updateRebased: function() {
28975 var base = this.base();
28976 var i, k, child, id, keys;
28978 keys = Object.keys(this._parentWays);
28979 for (i = 0; i < keys.length; i++) {
28981 if (base.parentWays[child]) {
28982 for (k = 0; k < base.parentWays[child].length; k++) {
28983 id = base.parentWays[child][k];
28984 if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
28985 this._parentWays[child].push(id);
28991 keys = Object.keys(this._parentRels);
28992 for (i = 0; i < keys.length; i++) {
28994 if (base.parentRels[child]) {
28995 for (k = 0; k < base.parentRels[child].length; k++) {
28996 id = base.parentRels[child][k];
28997 if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
28998 this._parentRels[child].push(id);
29004 this.transients = {};
29006 // this._childNodes is not updated, under the assumption that
29007 // ways are always downloaded with their child nodes.
29011 // Updates calculated properties (parentWays, parentRels) for the specified change
29012 _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
29013 parentWays = parentWays || this._parentWays;
29014 parentRels = parentRels || this._parentRels;
29016 var type = entity && entity.type || oldentity && oldentity.type;
29017 var removed, added, ways, rels, i;
29019 if (type === 'way') { // Update parentWays
29020 if (oldentity && entity) {
29021 removed = difference(oldentity.nodes, entity.nodes);
29022 added = difference(entity.nodes, oldentity.nodes);
29023 } else if (oldentity) {
29024 removed = oldentity.nodes;
29026 } else if (entity) {
29028 added = entity.nodes;
29030 for (i = 0; i < removed.length; i++) {
29031 parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
29033 for (i = 0; i < added.length; i++) {
29034 ways = without(parentWays[added[i]], entity.id);
29035 ways.push(entity.id);
29036 parentWays[added[i]] = ways;
29039 } else if (type === 'relation') { // Update parentRels
29040 if (oldentity && entity) {
29041 removed = difference(oldentity.members, entity.members);
29042 added = difference(entity.members, oldentity);
29043 } else if (oldentity) {
29044 removed = oldentity.members;
29046 } else if (entity) {
29048 added = entity.members;
29050 for (i = 0; i < removed.length; i++) {
29051 parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
29053 for (i = 0; i < added.length; i++) {
29054 rels = without(parentRels[added[i].id], entity.id);
29055 rels.push(entity.id);
29056 parentRels[added[i].id] = rels;
29062 replace: function(entity) {
29063 if (this.entities[entity.id] === entity) return this;
29065 return this.update(function() {
29066 this._updateCalculated(this.entities[entity.id], entity);
29067 this.entities[entity.id] = entity;
29072 remove: function(entity) {
29073 return this.update(function() {
29074 this._updateCalculated(entity, undefined);
29075 this.entities[entity.id] = undefined;
29080 revert: function(id) {
29081 var baseEntity = this.base().entities[id];
29082 var headEntity = this.entities[id];
29083 if (headEntity === baseEntity) return this;
29085 return this.update(function() {
29086 this._updateCalculated(headEntity, baseEntity);
29087 delete this.entities[id];
29092 update: function() {
29093 var graph = this.frozen ? coreGraph$$1(this, true) : this;
29094 for (var i = 0; i < arguments.length; i++) {
29095 arguments[i].call(graph, graph);
29098 if (this.frozen) graph.frozen = true;
29104 // Obliterates any existing entities
29105 load: function(entities) {
29106 var base = this.base();
29107 this.entities = Object.create(base.entities);
29109 for (var i in entities) {
29110 this.entities[i] = entities[i];
29111 this._updateCalculated(base.entities[i], this.entities[i]);
29118 function coreTree(head) {
29119 var rtree = rbush_1(),
29124 function entityBBox(entity) {
29125 var bbox = entity.extent(head).bbox();
29126 bbox.id = entity.id;
29127 bboxes[entity.id] = bbox;
29132 function updateParents(entity, insertions, memo) {
29133 head.parentWays(entity).forEach(function(way) {
29134 if (bboxes[way.id]) {
29135 rtree.remove(bboxes[way.id]);
29136 insertions[way.id] = way;
29138 updateParents(way, insertions, memo);
29141 head.parentRelations(entity).forEach(function(relation) {
29142 if (memo[entity.id]) return;
29143 memo[entity.id] = true;
29144 if (bboxes[relation.id]) {
29145 rtree.remove(bboxes[relation.id]);
29146 insertions[relation.id] = relation;
29148 updateParents(relation, insertions, memo);
29153 tree.rebase = function(entities, force) {
29154 var insertions = {};
29156 for (var i = 0; i < entities.length; i++) {
29157 var entity = entities[i];
29159 if (!entity.visible)
29162 if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
29165 } else if (bboxes[entity.id]) {
29166 rtree.remove(bboxes[entity.id]);
29170 insertions[entity.id] = entity;
29171 updateParents(entity, insertions, {});
29174 rtree.load(map$3(insertions, entityBBox));
29180 tree.intersects = function(extent, graph) {
29181 if (graph !== head) {
29182 var diff = coreDifference(head, graph),
29187 diff.deleted().forEach(function(entity) {
29188 rtree.remove(bboxes[entity.id]);
29189 delete bboxes[entity.id];
29192 diff.modified().forEach(function(entity) {
29193 rtree.remove(bboxes[entity.id]);
29194 insertions[entity.id] = entity;
29195 updateParents(entity, insertions, {});
29198 diff.created().forEach(function(entity) {
29199 insertions[entity.id] = entity;
29202 rtree.load(map$3(insertions, entityBBox));
29205 return rtree.search(extent.bbox()).map(function(bbox) {
29206 return head.entity(bbox.id);
29215 * This code is licensed under the MIT license.
29217 * Copyright © 2013, iD authors.
29219 * Portions copyright © 2011, Keith Cirkel
29220 * See https://github.com/keithamus/jwerty
29223 function d3keybinding(namespace$$1) {
29227 function testBindings(isCapturing) {
29228 var didMatch = false,
29231 // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
29232 // so we don't strictly match on the shift key, but we prioritize
29233 // shifted bindings first, and fallback to unshifted only if no match.
29234 // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
29236 // priority match shifted bindings first
29237 for (i = 0; i < bindings.length; i++) {
29238 binding = bindings[i];
29239 if (!binding.event.modifiers.shiftKey) continue; // no shift
29240 if (!!binding.capture !== isCapturing) continue;
29241 if (matches(binding, true)) {
29242 binding.callback();
29247 // then unshifted bindings
29248 if (didMatch) return;
29249 for (i = 0; i < bindings.length; i++) {
29250 binding = bindings[i];
29251 if (binding.event.modifiers.shiftKey) continue; // shift
29252 if (!!binding.capture !== isCapturing) continue;
29253 if (matches(binding, false)) {
29254 binding.callback();
29259 function matches(binding, testShift) {
29260 var event$$1 = event;
29261 var isMatch = false;
29262 var tryKeyCode = true;
29264 // Prefer a match on `KeyboardEvent.key`
29265 if (event$$1.key !== undefined) {
29266 tryKeyCode = (event$$1.key.charCodeAt(0) > 255); // outside ISO-Latin-1
29269 if (binding.event.key === undefined) {
29271 } else if (Array.isArray(binding.event.key)) {
29272 if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
29275 if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
29280 // Fallback match on `KeyboardEvent.keyCode`, can happen if:
29281 // - browser doesn't support `KeyboardEvent.key`
29282 // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
29283 if (!isMatch && tryKeyCode) {
29284 isMatch = (event$$1.keyCode === binding.event.keyCode);
29287 if (!isMatch) return false;
29289 // test modifier keys
29290 if (!(event$$1.ctrlKey && event$$1.altKey)) { // if both are set, assume AltGr and skip it - #4096
29291 if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
29292 if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
29294 if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
29295 if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
29302 function capture() {
29303 testBindings(true);
29307 function bubble() {
29308 var tagName = select(event.target).node().tagName;
29309 if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
29312 testBindings(false);
29316 function keybinding(selection$$1) {
29317 selection$$1 = selection$$1 || select(document);
29318 selection$$1.on('keydown.capture' + namespace$$1, capture, true);
29319 selection$$1.on('keydown.bubble' + namespace$$1, bubble, false);
29324 keybinding.off = function(selection$$1) {
29326 selection$$1 = selection$$1 || select(document);
29327 selection$$1.on('keydown.capture' + namespace$$1, null);
29328 selection$$1.on('keydown.bubble' + namespace$$1, null);
29333 keybinding.on = function(codes, callback, capture) {
29334 var arr = [].concat(codes);
29335 for (var i = 0; i < arr.length; i++) {
29339 key: undefined, // preferred
29340 keyCode: 0, // fallback
29352 code = code.toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
29354 for (var j = 0; j < code.length; j++) {
29355 // Normalise matching errors
29356 if (code[j] === '++') code[j] = '+';
29358 if (code[j] in d3keybinding.modifierCodes) {
29359 binding.event.modifiers[d3keybinding.modifierProperties[d3keybinding.modifierCodes[code[j]]]] = true;
29361 binding.event.key = d3keybinding.keys[code[j]] || code[j];
29362 if (code[j] in d3keybinding.keyCodes) {
29363 binding.event.keyCode = d3keybinding.keyCodes[code[j]];
29368 bindings.push(binding);
29378 d3keybinding.modifierCodes = {
29380 '⇧': 16, shift: 16,
29381 // CTRL key, on Mac: ⌃
29383 // ALT key, on Mac: ⌥ (Alt)
29384 '⌥': 18, alt: 18, option: 18,
29385 // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
29386 '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
29389 d3keybinding.modifierProperties = {
29396 d3keybinding.keys = {
29397 // Backspace key, on Mac: ⌫ (Backspace)
29398 '⌫': 'Backspace', backspace: 'Backspace',
29399 // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29400 '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
29402 '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
29404 'pause': 'Pause', 'pause-break': 'Pause',
29405 // Caps Lock key, ⇪
29406 '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
29407 // Escape key, on Mac: ⎋, on Windows: Esc
29408 '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
29410 space: [' ', 'Spacebar'],
29411 // Page-Up key, or pgup, on Mac: ↖
29412 '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
29413 // Page-Down key, or pgdown, on Mac: ↘
29414 '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
29415 // END key, on Mac: ⇟
29416 '⇟': 'End', end: 'End',
29417 // HOME key, on Mac: ⇞
29418 '⇞': 'Home', home: 'Home',
29419 // Insert key, or ins
29420 ins: 'Insert', insert: 'Insert',
29421 // Delete key, on Mac: ⌦ (Delete)
29422 '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
29423 // Left Arrow Key, or ←
29424 '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
29425 // Up Arrow Key, or ↑
29426 '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
29427 // Right Arrow Key, or →
29428 '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
29429 // Up Arrow Key, or ↓
29430 '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29431 // odities, stuff for backward compatibility (browsers and code):
29432 // Num-Multiply, or *
29433 '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29435 '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29436 // Num-Subtract, or -
29437 '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29444 // Period, or ., or full-stop
29445 period: '.', 'full-stop': '.',
29446 // Slash, or /, or forward-slash
29447 slash: '/', 'forward-slash': '/',
29448 // Tick, or `, or back-quote
29449 tick: '`', 'back-quote': '`',
29450 // Open bracket, or [
29451 'open-bracket': '[',
29452 // Back slash, or \
29453 'back-slash': '\\',
29454 // Close backet, or ]
29455 'close-bracket': ']',
29456 // Apostrophe, or Quote, or '
29457 quote: '\'', apostrophe: '\'',
29497 d3keybinding.keyCodes = {
29498 // Backspace key, on Mac: ⌫ (Backspace)
29499 '⌫': 8, backspace: 8,
29500 // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29501 '⇥': 9, '⇆': 9, tab: 9,
29503 '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29505 'pause': 19, 'pause-break': 19,
29506 // Caps Lock key, ⇪
29507 '⇪': 20, caps: 20, 'caps-lock': 20,
29508 // Escape key, on Mac: ⎋, on Windows: Esc
29509 '⎋': 27, escape: 27, esc: 27,
29512 // Page-Up key, or pgup, on Mac: ↖
29513 '↖': 33, pgup: 33, 'page-up': 33,
29514 // Page-Down key, or pgdown, on Mac: ↘
29515 '↘': 34, pgdown: 34, 'page-down': 34,
29516 // END key, on Mac: ⇟
29518 // HOME key, on Mac: ⇞
29520 // Insert key, or ins
29521 ins: 45, insert: 45,
29522 // Delete key, on Mac: ⌦ (Delete)
29523 '⌦': 46, del: 46, 'delete': 46,
29524 // Left Arrow Key, or ←
29525 '←': 37, left: 37, 'arrow-left': 37,
29526 // Up Arrow Key, or ↑
29527 '↑': 38, up: 38, 'arrow-up': 38,
29528 // Right Arrow Key, or →
29529 '→': 39, right: 39, 'arrow-right': 39,
29530 // Up Arrow Key, or ↓
29531 '↓': 40, down: 40, 'arrow-down': 40,
29532 // odities, printing characters that come out wrong:
29535 // Num-Multiply, or *
29536 '*': 106, star: 106, asterisk: 106, multiply: 106,
29538 '+': 107, 'plus': 107,
29539 // Num-Subtract, or -
29540 '-': 109, subtract: 109,
29546 ';': 186, semicolon: 186,
29548 '=': 187, 'equals': 187,
29550 ',': 188, comma: 188,
29551 // Dash / Underscore key
29553 // Period, or ., or full-stop
29554 '.': 190, period: 190, 'full-stop': 190,
29555 // Slash, or /, or forward-slash
29556 '/': 191, slash: 191, 'forward-slash': 191,
29557 // Tick, or `, or back-quote
29558 '`': 192, tick: 192, 'back-quote': 192,
29559 // Open bracket, or [
29560 '[': 219, 'open-bracket': 219,
29561 // Back slash, or \
29562 '\\': 220, 'back-slash': 220,
29563 // Close backet, or ]
29564 ']': 221, 'close-bracket': 221,
29565 // Apostrophe, or Quote, or '
29566 '\'': 222, quote: 222, apostrophe: 222
29570 var i$1 = 95, n = 0;
29571 while (++i$1 < 106) {
29572 d3keybinding.keyCodes['num-' + n] = i$1;
29578 while (++i$1 < 58) {
29579 d3keybinding.keyCodes[n] = i$1;
29585 while (++i$1 < 136) {
29586 d3keybinding.keyCodes['f' + n] = i$1;
29592 while (++i$1 < 91) {
29593 d3keybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
29596 function tooltip() {
29597 var tooltip = function(selection$$1) {
29598 selection$$1.each(setup);
29600 animation = utilFunctor(false),
29601 html = utilFunctor(false),
29602 title = function() {
29603 var title = this.getAttribute('data-original-title');
29607 title = this.getAttribute('title');
29608 this.removeAttribute('title');
29609 this.setAttribute('data-original-title', title);
29613 over = 'mouseenter.tooltip',
29614 out = 'mouseleave.tooltip',
29615 placement = utilFunctor('top');
29618 tooltip.title = function(_) {
29619 if (arguments.length) {
29620 title = utilFunctor(_);
29628 tooltip.html = function(_) {
29629 if (arguments.length) {
29630 html = utilFunctor(_);
29638 tooltip.placement = function(_) {
29639 if (arguments.length) {
29640 placement = utilFunctor(_);
29648 tooltip.show = function(selection$$1) {
29649 selection$$1.each(show);
29653 tooltip.hide = function(selection$$1) {
29654 selection$$1.each(hide);
29658 tooltip.toggle = function(selection$$1) {
29659 selection$$1.each(toggle);
29663 tooltip.destroy = function(selection$$1) {
29667 .attr('title', function() {
29668 return this.getAttribute('data-original-title') || this.getAttribute('title');
29670 .attr('data-original-title', null)
29671 .selectAll('.tooltip')
29677 var root = select(this),
29678 animate = animation.apply(this, arguments),
29679 tip = root.selectAll('.tooltip').data([0]);
29681 var enter = tip.enter()
29683 .attr('class', 'tooltip');
29687 .attr('class', 'tooltip-arrow');
29691 .attr('class', 'tooltip-inner');
29697 tip.classed('fade', true);
29700 var place = placement.apply(this, arguments);
29701 tip.classed(place, true);
29703 root.on(over, show);
29704 root.on(out, hide);
29709 var root = select(this),
29710 content = title.apply(this, arguments),
29711 tip = root.selectAll('.tooltip')
29712 .classed('in', true),
29713 markup = html.apply(this, arguments);
29715 tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
29716 var place = placement.apply(this, arguments),
29717 outer = getPosition(root.node()),
29718 inner = getPosition(tip.node()),
29723 pos = {x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h};
29726 pos = {x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2};
29729 pos = {x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2};
29732 pos = {x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h};
29737 tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
29739 tip.style('left', null).style('top', null);
29742 this.tooltipVisible = true;
29747 select(this).selectAll('.tooltip')
29748 .classed('in', false);
29750 this.tooltipVisible = false;
29754 function toggle() {
29755 if (this.tooltipVisible) {
29756 hide.apply(this, arguments);
29758 show.apply(this, arguments);
29766 function getPosition(node) {
29767 var mode = select(node).style('position');
29768 if (mode === 'absolute' || mode === 'static') {
29770 x: node.offsetLeft,
29772 w: node.offsetWidth,
29773 h: node.offsetHeight
29779 w: node.offsetWidth,
29780 h: node.offsetHeight
29785 function behaviorEdit(context) {
29789 .minzoom(context.minEditableZoom());
29793 edit.off = function() {
29803 The hover behavior adds the `.hover` class on mouseover to all elements to which
29804 the identical datum is bound, and removes it on mouseout.
29806 The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
29807 representation may consist of several elements scattered throughout the DOM hierarchy.
29808 Only one of these elements can have the :hover pseudo-class, but all of them will
29809 have the .hover class.
29811 function behaviorHover(context) {
29812 var dispatch$$1 = dispatch('hover');
29813 var _selection = select(null);
29820 function keydown() {
29821 if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29822 _selection.selectAll('.hover')
29823 .classed('hover-suppressed', true)
29824 .classed('hover', false);
29827 .classed('hover-disabled', true);
29829 dispatch$$1.call('hover', this, null);
29835 if (_altDisables && event.keyCode === d3keybinding.modifierCodes.alt) {
29836 _selection.selectAll('.hover-suppressed')
29837 .classed('hover-suppressed', false)
29838 .classed('hover', true);
29841 .classed('hover-disabled', false);
29843 dispatch$$1.call('hover', this, _target ? _target.id : null);
29848 var hover = function(selection$$1) {
29849 _selection = selection$$1;
29853 .on('mouseover.hover', mouseover)
29854 .on('mouseout.hover', mouseout)
29855 .on('mousedown.hover', mousedown);
29858 .on('keydown.hover', keydown)
29859 .on('keyup.hover', keyup);
29862 function mouseover() {
29863 if (_buttonDown) return;
29864 var target = event.target;
29865 enter(target ? target.__data__ : null);
29869 function mouseout() {
29870 if (_buttonDown) return;
29871 var target = event.relatedTarget;
29872 enter(target ? target.__data__ : null);
29876 function mousedown() {
29877 _buttonDown = true;
29879 .on('mouseup.hover', mouseup, true);
29883 function mouseup() {
29884 _buttonDown = false;
29886 .on('mouseup.hover', null, true);
29890 function enter(datum) {
29891 if (datum === _target) return;
29894 _selection.selectAll('.hover')
29895 .classed('hover', false);
29896 _selection.selectAll('.hover-suppressed')
29897 .classed('hover-suppressed', false);
29899 // What are we hovering over?
29900 var entity, selector$$1;
29901 if (datum && datum.__featurehash__) {
29903 selector$$1 = '.data' + datum.__featurehash__;
29905 } else if (datum instanceof osmNote) {
29907 selector$$1 = '.note-' + datum.id;
29909 } else if (datum instanceof osmEntity$$1) {
29911 selector$$1 = '.' + entity.id;
29912 if (entity.type === 'relation') {
29913 entity.members.forEach(function(member) { selector$$1 += ', .' + member.id; });
29916 } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity$$1)) {
29917 entity = datum.properties.entity;
29918 selector$$1 = '.' + entity.id;
29919 if (entity.type === 'relation') {
29920 entity.members.forEach(function(member) { selector$$1 += ', .' + member.id; });
29924 // Update hover state and dispatch event
29925 if (entity && entity.id !== _newId) {
29926 // If drawing a way, don't hover on a node that was just placed. #3974
29927 var mode = context.mode() && context.mode().id;
29928 if ((mode === 'draw-line' || mode === 'draw-area') && !_newId && entity.type === 'node') {
29929 _newId = entity.id;
29933 var suppressed = _altDisables && event && event.altKey;
29934 _selection.selectAll(selector$$1)
29935 .classed(suppressed ? 'hover-suppressed' : 'hover', true);
29937 dispatch$$1.call('hover', this, !suppressed && entity);
29940 dispatch$$1.call('hover', this, null);
29946 hover.off = function(selection$$1) {
29947 selection$$1.selectAll('.hover')
29948 .classed('hover', false);
29949 selection$$1.selectAll('.hover-suppressed')
29950 .classed('hover-suppressed', false);
29952 .classed('hover-disabled', false);
29955 .on('mouseover.hover', null)
29956 .on('mouseout.hover', null)
29957 .on('mousedown.hover', null);
29960 .on('keydown.hover', null)
29961 .on('keyup.hover', null);
29965 hover.altDisables = function(_) {
29966 if (!arguments.length) return _altDisables;
29972 return utilRebind(hover, dispatch$$1, 'on');
29975 function refresh(selection, node) {
29976 var cr = node.getBoundingClientRect();
29977 var prop = [cr.width, cr.height];
29978 selection.property('__dimensions__', prop);
29982 function utilGetDimensions(selection, force) {
29983 if (!selection || selection.empty()) {
29986 var node = selection.node(),
29987 cached = selection.property('__dimensions__');
29988 return (!cached || force) ? refresh(selection, node) : cached;
29992 function utilSetDimensions(selection, dimensions) {
29993 if (!selection || selection.empty()) {
29996 var node = selection.node();
29997 if (dimensions === null) {
29998 refresh(selection, node);
30002 .property('__dimensions__', [dimensions[0], dimensions[1]])
30003 .attr('width', dimensions[0])
30004 .attr('height', dimensions[1]);
30007 function behaviorTail() {
30011 tooltipSize = [0, 0],
30012 selectionSize = [0, 0];
30015 function tail(selection$$1) {
30019 .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
30021 container = select(document.body)
30023 .style('display', 'none')
30024 .attr('class', 'tail tooltip-inner');
30026 container.append('div')
30030 .on('mousemove.tail', mousemove)
30031 .on('mouseenter.tail', mouseenter)
30032 .on('mouseleave.tail', mouseleave);
30035 .on('mousemove.tail', mousemove);
30037 tooltipSize = utilGetDimensions(container);
30038 selectionSize = utilGetDimensions(selection$$1);
30042 container.style('display', 'block');
30043 tooltipSize = utilGetDimensions(container);
30047 function mousemove() {
30048 if (container.style('display') === 'none') show();
30049 var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
30050 -tooltipSize[0] - xmargin : xmargin;
30051 container.classed('left', xoffset > 0);
30052 utilSetTransform(container, event.clientX + xoffset, event.clientY);
30056 function mouseleave() {
30057 if (event.relatedTarget !== container.node()) {
30058 container.style('display', 'none');
30063 function mouseenter() {
30064 if (event.relatedTarget !== container.node()) {
30071 tail.off = function(selection$$1) {
30075 .on('mousemove.tail', null)
30079 .on('mousemove.tail', null)
30080 .on('mouseenter.tail', null)
30081 .on('mouseleave.tail', null);
30084 .on('resize.tail', null);
30088 tail.text = function(_) {
30089 if (!arguments.length) return text;
30098 var _usedTails = {};
30099 var _disableSpace = false;
30100 var _lastSpace = null;
30103 function behaviorDraw(context) {
30104 var dispatch$$1 = dispatch(
30105 'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
30108 var keybinding = d3keybinding('draw');
30110 var hover = behaviorHover(context).altDisables(true)
30111 .on('hover', context.ui().sidebar.hover);
30112 var tail = behaviorTail();
30113 var edit = behaviorEdit(context);
30115 var closeTolerance = 4;
30116 var tolerance = 12;
30117 var _mouseLeave = false;
30118 var _lastMouse = null;
30122 // - `mode/drag_node.js` `datum()`
30124 if (event.altKey) return {};
30127 if (event.type === 'keydown') {
30128 element = _lastMouse && _lastMouse.target;
30130 element = event.target;
30133 // When drawing, snap only to touch targets..
30134 // (this excludes area fills and active drawing elements)
30135 var d = element.__data__;
30136 return (d && d.properties && d.properties.target) ? d : {};
30140 function mousedown() {
30142 function point$$1() {
30143 var p = context.container().node();
30144 return touchId !== null ? d3_touches(p).filter(function(p) {
30145 return p.identifier === touchId;
30149 var element = select(this);
30150 var touchId = event.touches ? event.changedTouches[0].identifier : null;
30151 var t1 = +new Date();
30152 var p1 = point$$1();
30154 element.on('mousemove.draw', null);
30156 select(window).on('mouseup.draw', function() {
30157 var t2 = +new Date();
30158 var p2 = point$$1();
30159 var dist = geoVecLength(p1, p2);
30161 element.on('mousemove.draw', mousemove);
30162 select(window).on('mouseup.draw', null);
30164 if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
30165 // Prevent a quick second click
30166 select(window).on('click.draw-block', function() {
30167 event.stopPropagation();
30170 context.map().dblclickEnable(false);
30172 window.setTimeout(function() {
30173 context.map().dblclickEnable(true);
30174 select(window).on('click.draw-block', null);
30183 function mousemove() {
30184 _lastMouse = event;
30185 dispatch$$1.call('move', this, datum());
30189 function mouseenter() {
30190 _mouseLeave = false;
30194 function mouseleave() {
30195 _mouseLeave = true;
30200 // - `mode/drag_node.js` `doMode()`
30201 // - `behavior/draw.js` `click()`
30202 // - `behavior/draw_way.js` `move()`
30205 var target = d && d.properties && d.properties.entity;
30207 if (target && target.type === 'node') { // Snap to a node
30208 dispatch$$1.call('clickNode', this, target, d);
30211 } else if (target && target.type === 'way') { // Snap to a way
30212 var choice = geoChooseEdge(
30213 context.childNodes(target), context.mouse(), context.projection, context.activeID()
30216 var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
30217 dispatch$$1.call('clickWay', this, choice.loc, edge, d);
30221 dispatch$$1.call('click', this, context.map().mouseCoordinates(), d);
30226 event.preventDefault();
30227 event.stopPropagation();
30229 var currSpace = context.mouse();
30230 if (_disableSpace && _lastSpace) {
30231 var dist = geoVecLength(_lastSpace, currSpace);
30232 if (dist > tolerance) {
30233 _disableSpace = false;
30237 if (_disableSpace || _mouseLeave || !_lastMouse) return;
30239 // user must move mouse or release space bar to allow another click
30240 _lastSpace = currSpace;
30241 _disableSpace = true;
30243 select(window).on('keyup.space-block', function() {
30244 event.preventDefault();
30245 event.stopPropagation();
30246 _disableSpace = false;
30247 select(window).on('keyup.space-block', null);
30254 function backspace() {
30255 event.preventDefault();
30256 dispatch$$1.call('undo');
30261 event.preventDefault();
30262 dispatch$$1.call('cancel');
30267 event.preventDefault();
30268 dispatch$$1.call('finish');
30272 function draw(selection$$1) {
30273 context.install(hover);
30274 context.install(edit);
30276 if (!context.inIntro() && !_usedTails[tail.text()]) {
30277 context.install(tail);
30281 .on('⌫', backspace)
30285 .on('space', space)
30286 .on('⌥space', space);
30289 .on('mouseenter.draw', mouseenter)
30290 .on('mouseleave.draw', mouseleave)
30291 .on('mousedown.draw', mousedown)
30292 .on('mousemove.draw', mousemove);
30301 draw.off = function(selection$$1) {
30302 context.ui().sidebar.hover.cancel();
30303 context.uninstall(hover);
30304 context.uninstall(edit);
30306 if (!context.inIntro() && !_usedTails[tail.text()]) {
30307 context.uninstall(tail);
30308 _usedTails[tail.text()] = true;
30312 .on('mouseenter.draw', null)
30313 .on('mouseleave.draw', null)
30314 .on('mousedown.draw', null)
30315 .on('mousemove.draw', null);
30318 .on('mouseup.draw', null);
30319 // note: keyup.space-block, click.draw-block should remain
30322 .call(keybinding.off);
30326 draw.tail = function(_) {
30332 return utilRebind(draw, dispatch$$1, 'on');
30335 function modeAddArea$$1(context) {
30339 title: t('modes.add_area.title'),
30340 description: t('modes.add_area.description'),
30344 var behavior = behaviorAddWay(context)
30345 .tail(t('modes.add_area.tail'))
30346 .on('start', start)
30347 .on('startFromWay', startFromWay)
30348 .on('startFromNode', startFromNode),
30349 defaultTags = { area: 'yes' };
30352 function actionClose(wayId) {
30353 return function (graph) {
30354 return graph.replace(graph.entity(wayId).close());
30359 function start(loc) {
30360 var startGraph = context.graph(),
30361 node = osmNode({ loc: loc }),
30362 way = osmWay({ tags: defaultTags });
30365 actionAddEntity(node),
30366 actionAddEntity(way),
30367 actionAddVertex(way.id, node.id),
30368 actionClose(way.id)
30371 context.enter(modeDrawArea(context, way.id, startGraph));
30375 function startFromWay(loc, edge) {
30376 var startGraph = context.graph(),
30377 node = osmNode({ loc: loc }),
30378 way = osmWay({ tags: defaultTags });
30381 actionAddEntity(node),
30382 actionAddEntity(way),
30383 actionAddVertex(way.id, node.id),
30384 actionClose(way.id),
30385 actionAddMidpoint({ loc: loc, edge: edge }, node)
30388 context.enter(modeDrawArea(context, way.id, startGraph));
30392 function startFromNode(node) {
30393 var startGraph = context.graph(),
30394 way = osmWay({ tags: defaultTags });
30397 actionAddEntity(way),
30398 actionAddVertex(way.id, node.id),
30399 actionClose(way.id)
30402 context.enter(modeDrawArea(context, way.id, startGraph));
30406 mode.enter = function() {
30407 context.install(behavior);
30411 mode.exit = function() {
30412 context.uninstall(behavior);
30419 function modeAddLine$$1(context) {
30423 title: t('modes.add_line.title'),
30424 description: t('modes.add_line.description'),
30428 var behavior = behaviorAddWay(context)
30429 .tail(t('modes.add_line.tail'))
30430 .on('start', start)
30431 .on('startFromWay', startFromWay)
30432 .on('startFromNode', startFromNode);
30435 function start(loc) {
30436 var startGraph = context.graph(),
30437 node = osmNode({ loc: loc }),
30441 actionAddEntity(node),
30442 actionAddEntity(way),
30443 actionAddVertex(way.id, node.id)
30446 context.enter(modeDrawLine(context, way.id, startGraph));
30450 function startFromWay(loc, edge) {
30451 var startGraph = context.graph(),
30452 node = osmNode({ loc: loc }),
30456 actionAddEntity(node),
30457 actionAddEntity(way),
30458 actionAddVertex(way.id, node.id),
30459 actionAddMidpoint({ loc: loc, edge: edge }, node)
30462 context.enter(modeDrawLine(context, way.id, startGraph));
30466 function startFromNode(node) {
30467 var startGraph = context.graph(),
30471 actionAddEntity(way),
30472 actionAddVertex(way.id, node.id)
30475 context.enter(modeDrawLine(context, way.id, startGraph));
30479 mode.enter = function() {
30480 context.install(behavior);
30484 mode.exit = function() {
30485 context.uninstall(behavior);
30491 function modeAddPoint$$1(context) {
30495 title: t('modes.add_point.title'),
30496 description: t('modes.add_point.description'),
30500 var behavior = behaviorDraw(context)
30501 .tail(t('modes.add_point.tail'))
30503 .on('clickWay', addWay)
30504 .on('clickNode', addNode)
30505 .on('cancel', cancel)
30506 .on('finish', cancel);
30509 function add(loc) {
30510 var node = osmNode({ loc: loc });
30513 actionAddEntity(node),
30514 t('operations.add.annotation.point')
30518 modeSelect(context, [node.id]).newFeature(true)
30523 function addWay(loc) {
30528 function addNode(node) {
30533 function cancel() {
30534 context.enter(modeBrowse(context));
30538 mode.enter = function() {
30539 context.install(behavior);
30543 mode.exit = function() {
30544 context.uninstall(behavior);
30551 function svgAreas$$1(projection, context) {
30552 // Patterns only work in Firefox when set directly on element.
30553 // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
30556 cemetery: 'cemetery',
30557 construction: 'construction',
30559 farmland: 'farmland',
30560 grave_yard: 'cemetery',
30562 military: 'construction',
30563 orchard: 'orchard',
30566 wetland: 'wetland',
30569 var patternKeys = ['landuse', 'natural', 'amenity'];
30572 function setPattern(d) {
30573 for (var i = 0; i < patternKeys.length; i++) {
30574 if (d.tags.building && d.tags.building !== 'no') continue;
30576 if (patterns.hasOwnProperty(d.tags[patternKeys[i]])) {
30577 this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[d.tags[patternKeys[i]]] + '")';
30581 this.style.fill = this.style.stroke = '';
30585 function drawTargets(selection, graph, entities, filter) {
30586 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
30587 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
30588 var getPath = svgPath(projection).geojson;
30589 var activeID = context.activeID();
30591 // The targets and nopes will be MultiLineString sub-segments of the ways
30592 var data = { targets: [], nopes: [] };
30594 entities.forEach(function(way) {
30595 var features = svgSegmentWay(way, graph, activeID);
30596 data.targets.push.apply(data.targets, features.passive);
30597 data.nopes.push.apply(data.nopes, features.active);
30601 // Targets allow hover and vertex snapping
30602 var targetData = data.targets.filter(getPath);
30603 var targets = selection.selectAll('.area.target-allowed')
30604 .filter(function(d) { return filter(d.properties.entity); })
30605 .data(targetData, function key(d) { return d.id; });
30615 .attr('d', getPath)
30616 .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
30620 var nopeData = data.nopes.filter(getPath);
30621 var nopes = selection.selectAll('.area.target-nope')
30622 .filter(function(d) { return filter(d.properties.entity); })
30623 .data(nopeData, function key(d) { return d.id; });
30633 .attr('d', getPath)
30634 .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
30638 function drawAreas(selection, graph, entities, filter) {
30639 var path = svgPath(projection, graph, true),
30643 for (var i = 0; i < entities.length; i++) {
30644 var entity = entities[i];
30645 if (entity.geometry(graph) !== 'area') continue;
30647 multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
30648 if (multipolygon) {
30649 areas[multipolygon.id] = {
30650 entity: multipolygon.mergeTags(entity.tags),
30651 area: Math.abs(entity.area(graph))
30653 } else if (!areas[entity.id]) {
30654 areas[entity.id] = {
30656 area: Math.abs(entity.area(graph))
30661 areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
30662 areas.sort(function areaSort(a, b) { return b.area - a.area; });
30663 areas = map$3(areas, 'entity');
30665 var strokes = areas.filter(function(area) {
30666 return area.type === 'way';
30676 var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
30678 .data(data.clip, osmEntity$$1.key);
30683 var clipPathsEnter = clipPaths.enter()
30684 .append('clipPath')
30685 .attr('class', 'clipPath-osm')
30686 .attr('id', function(entity) { return entity.id + '-clippath'; });
30691 clipPaths.merge(clipPathsEnter)
30696 var layer = selection.selectAll('.layer-areas .layer-areas-areas');
30698 var areagroup = layer
30699 .selectAll('g.areagroup')
30700 .data(['fill', 'shadow', 'stroke']);
30702 areagroup = areagroup.enter()
30704 .attr('class', function(d) { return 'areagroup area-' + d; })
30707 var paths = areagroup
30710 .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
30715 var fills = selection.selectAll('.area-fill path.area').nodes();
30717 var bisect = bisector(function(node) {
30718 return -node.__data__.area(graph);
30721 function sortedByArea(entity) {
30722 if (this._parent.__data__ === 'fill') {
30723 return fills[bisect(fills, -entity.area(graph))];
30727 paths = paths.enter()
30728 .insert('path', sortedByArea)
30730 .each(function(entity) {
30731 var layer = this.parentNode.__data__;
30733 this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
30735 if (layer === 'fill') {
30736 this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
30737 setPattern.apply(this, arguments);
30740 .call(svgTagClasses())
30745 selection.selectAll('.layer-areas .layer-areas-targets')
30746 .call(drawTargets, graph, data.stroke, filter);
30753 * A specialized version of `_.reduce` for arrays without support for
30754 * iteratee shorthands.
30757 * @param {Array} [array] The array to iterate over.
30758 * @param {Function} iteratee The function invoked per iteration.
30759 * @param {*} [accumulator] The initial value.
30760 * @param {boolean} [initAccum] Specify using the first element of `array` as
30761 * the initial value.
30762 * @returns {*} Returns the accumulated value.
30764 function arrayReduce(array, iteratee, accumulator, initAccum) {
30766 length = array == null ? 0 : array.length;
30768 if (initAccum && length) {
30769 accumulator = array[++index];
30771 while (++index < length) {
30772 accumulator = iteratee(accumulator, array[index], index, array);
30774 return accumulator;
30778 * The base implementation of `_.reduce` and `_.reduceRight`, without support
30779 * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
30782 * @param {Array|Object} collection The collection to iterate over.
30783 * @param {Function} iteratee The function invoked per iteration.
30784 * @param {*} accumulator The initial value.
30785 * @param {boolean} initAccum Specify using the first or last element of
30786 * `collection` as the initial value.
30787 * @param {Function} eachFunc The function to iterate over `collection`.
30788 * @returns {*} Returns the accumulated value.
30790 function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
30791 eachFunc(collection, function(value, index, collection) {
30792 accumulator = initAccum
30793 ? (initAccum = false, value)
30794 : iteratee(accumulator, value, index, collection);
30796 return accumulator;
30800 * Reduces `collection` to a value which is the accumulated result of running
30801 * each element in `collection` thru `iteratee`, where each successive
30802 * invocation is supplied the return value of the previous. If `accumulator`
30803 * is not given, the first element of `collection` is used as the initial
30804 * value. The iteratee is invoked with four arguments:
30805 * (accumulator, value, index|key, collection).
30807 * Many lodash methods are guarded to work as iteratees for methods like
30808 * `_.reduce`, `_.reduceRight`, and `_.transform`.
30810 * The guarded methods are:
30811 * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
30817 * @category Collection
30818 * @param {Array|Object} collection The collection to iterate over.
30819 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
30820 * @param {*} [accumulator] The initial value.
30821 * @returns {*} Returns the accumulated value.
30822 * @see _.reduceRight
30825 * _.reduce([1, 2], function(sum, n) {
30830 * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
30831 * (result[value] || (result[value] = [])).push(key);
30834 * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
30836 function reduce(collection, iteratee, accumulator) {
30837 var func = isArray(collection) ? arrayReduce : baseReduce,
30838 initAccum = arguments.length < 3;
30840 return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
30843 /** Error message constants. */
30844 var FUNC_ERROR_TEXT$3 = 'Expected a function';
30847 * Creates a throttled function that only invokes `func` at most once per
30848 * every `wait` milliseconds. The throttled function comes with a `cancel`
30849 * method to cancel delayed `func` invocations and a `flush` method to
30850 * immediately invoke them. Provide `options` to indicate whether `func`
30851 * should be invoked on the leading and/or trailing edge of the `wait`
30852 * timeout. The `func` is invoked with the last arguments provided to the
30853 * throttled function. Subsequent calls to the throttled function return the
30854 * result of the last `func` invocation.
30856 * **Note:** If `leading` and `trailing` options are `true`, `func` is
30857 * invoked on the trailing edge of the timeout only if the throttled function
30858 * is invoked more than once during the `wait` timeout.
30860 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
30861 * until to the next tick, similar to `setTimeout` with a timeout of `0`.
30863 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
30864 * for details over the differences between `_.throttle` and `_.debounce`.
30869 * @category Function
30870 * @param {Function} func The function to throttle.
30871 * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
30872 * @param {Object} [options={}] The options object.
30873 * @param {boolean} [options.leading=true]
30874 * Specify invoking on the leading edge of the timeout.
30875 * @param {boolean} [options.trailing=true]
30876 * Specify invoking on the trailing edge of the timeout.
30877 * @returns {Function} Returns the new throttled function.
30880 * // Avoid excessively updating the position while scrolling.
30881 * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
30883 * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
30884 * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
30885 * jQuery(element).on('click', throttled);
30887 * // Cancel the trailing throttled invocation.
30888 * jQuery(window).on('popstate', throttled.cancel);
30890 function throttle(func, wait, options) {
30891 var leading = true,
30894 if (typeof func != 'function') {
30895 throw new TypeError(FUNC_ERROR_TEXT$3);
30897 if (isObject(options)) {
30898 leading = 'leading' in options ? !!options.leading : leading;
30899 trailing = 'trailing' in options ? !!options.trailing : trailing;
30901 return debounce(func, wait, {
30902 'leading': leading,
30904 'trailing': trailing
30908 var fastJsonStableStringify = function (data, opts) {
30909 if (!opts) opts = {};
30910 if (typeof opts === 'function') opts = { cmp: opts };
30911 var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
30913 var cmp = opts.cmp && (function (f) {
30914 return function (node) {
30915 return function (a, b) {
30916 var aobj = { key: a, value: node[a] };
30917 var bobj = { key: b, value: node[b] };
30918 return f(aobj, bobj);
30924 return (function stringify (node) {
30925 if (node && node.toJSON && typeof node.toJSON === 'function') {
30926 node = node.toJSON();
30929 if (node === undefined) return;
30930 if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
30931 if (typeof node !== 'object') return JSON.stringify(node);
30934 if (Array.isArray(node)) {
30936 for (i = 0; i < node.length; i++) {
30938 out += stringify(node[i]) || 'null';
30943 if (node === null) return 'null';
30945 if (seen.indexOf(node) !== -1) {
30946 if (cycles) return JSON.stringify('__cycle__');
30947 throw new TypeError('Converting circular structure to JSON');
30950 var seenIndex = seen.push(node) - 1;
30951 var keys = Object.keys(node).sort(cmp && cmp(node));
30953 for (i = 0; i < keys.length; i++) {
30955 var value = stringify(node[key]);
30957 if (!value) continue;
30958 if (out) out += ',';
30959 out += JSON.stringify(key) + ':' + value;
30961 seen.splice(seenIndex, 1);
30962 return '{' + out + '}';
30966 var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
30968 function unwrapExports (x) {
30969 return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
30972 function createCommonjsModule(fn, module) {
30973 return module = { exports: {} }, fn(module, module.exports), module.exports;
30976 //[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
30977 //[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
30978 //[5] Name ::= NameStartChar (NameChar)*
30979 var nameStartChar = /[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/;//\u10000-\uEFFFF
30980 var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
30981 var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
30982 //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
30983 //var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')
30985 //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
30986 //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
30987 var S_TAG = 0;//tag name offerring
30988 var S_ATTR = 1;//attr name offerring
30989 var S_ATTR_SPACE=2;//attr name end and space offer
30990 var S_EQ = 3;//=space?
30991 var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
30992 var S_ATTR_END = 5;//attr value end and no space(quot end)
30993 var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
30994 var S_TAG_CLOSE = 7;//closed el<el />
30996 function XMLReader(){
31000 XMLReader.prototype = {
31001 parse:function(source,defaultNSMap,entityMap){
31002 var domBuilder = this.domBuilder;
31003 domBuilder.startDocument();
31004 _copy(defaultNSMap ,defaultNSMap = {});
31005 parse(source,defaultNSMap,entityMap,
31006 domBuilder,this.errorHandler);
31007 domBuilder.endDocument();
31010 function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
31011 function fixedFromCharCode(code) {
31012 // String.prototype.fromCharCode does not supports
31013 // > 2 bytes unicode chars directly
31014 if (code > 0xffff) {
31016 var surrogate1 = 0xd800 + (code >> 10)
31017 , surrogate2 = 0xdc00 + (code & 0x3ff);
31019 return String.fromCharCode(surrogate1, surrogate2);
31021 return String.fromCharCode(code);
31024 function entityReplacer(a){
31025 var k = a.slice(1,-1);
31026 if(k in entityMap){
31027 return entityMap[k];
31028 }else if(k.charAt(0) === '#'){
31029 return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
31031 errorHandler.error('entity not found:'+a);
31035 function appendText(end){//has some bugs
31037 var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
31038 locator&&position(start);
31039 domBuilder.characters(xt,0,end-start);
31043 function position(p,m){
31044 while(p>=lineEnd && (m = linePattern.exec(source))){
31045 lineStart = m.index;
31046 lineEnd = lineStart + m[0].length;
31047 locator.lineNumber++;
31048 //console.log('line++:',locator,startPos,endPos)
31050 locator.columnNumber = p-lineStart+1;
31054 var linePattern = /.*(?:\r\n?|\n)|.*$/g;
31055 var locator = domBuilder.locator;
31057 var parseStack = [{currentNSMap:defaultNSMapCopy}];
31062 var tagStart = source.indexOf('<',start);
31064 if(!source.substr(start).match(/^\s*$/)){
31065 var doc = domBuilder.doc;
31066 var text = doc.createTextNode(source.substr(start));
31067 doc.appendChild(text);
31068 domBuilder.currentElement = text;
31072 if(tagStart>start){
31073 appendText(tagStart);
31075 switch(source.charAt(tagStart+1)){
31077 var end = source.indexOf('>',tagStart+3);
31078 var tagName = source.substring(tagStart+2,end);
31079 var config = parseStack.pop();
31082 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
31083 //console.error('#@@@@@@'+tagName)
31084 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
31085 end = tagStart+1+tagName.length;
31086 }else if(tagName.match(/\s</)){
31087 tagName = tagName.replace(/[\s<].*/,'');
31088 errorHandler.error("end tag name: "+tagName+' maybe not complete');
31089 end = tagStart+1+tagName.length;
31091 //console.error(parseStack.length,parseStack)
31092 //console.error(config);
31093 var localNSMap = config.localNSMap;
31094 var endMatch = config.tagName == tagName;
31095 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
31096 if(endIgnoreCaseMach){
31097 domBuilder.endElement(config.uri,config.localName,tagName);
31099 for(var prefix in localNSMap){
31100 domBuilder.endPrefixMapping(prefix) ;
31104 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
31107 parseStack.push(config);
31113 case '?':// <?...?>
31114 locator&&position(tagStart);
31115 end = parseInstruction(source,tagStart,domBuilder);
31117 case '!':// <!doctype,<![CDATA,<!--
31118 locator&&position(tagStart);
31119 end = parseDCC(source,tagStart,domBuilder,errorHandler);
31122 locator&&position(tagStart);
31123 var el = new ElementAttributes();
31124 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
31126 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
31127 var len = el.length;
31130 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
31132 if(!entityMap.nbsp){
31133 errorHandler.warning('unclosed xml attribute');
31136 if(locator && len){
31137 var locator2 = copyLocator(locator,{});
31138 //try{//attribute position fixed
31139 for(var i = 0;i<len;i++){
31141 position(a.offset);
31142 a.locator = copyLocator(locator,{});
31144 //}catch(e){console.error('@@@@@'+e)}
31145 domBuilder.locator = locator2;
31146 if(appendElement(el,domBuilder,currentNSMap)){
31147 parseStack.push(el);
31149 domBuilder.locator = locator;
31151 if(appendElement(el,domBuilder,currentNSMap)){
31152 parseStack.push(el);
31158 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
31159 end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
31165 errorHandler.error('element parse error: '+e);
31166 //errorHandler.error('element parse error: '+e);
31173 //TODO: 这里有可能sax回退,有位置错误风险
31174 appendText(Math.max(tagStart,start)+1);
31178 function copyLocator(f,t){
31179 t.lineNumber = f.lineNumber;
31180 t.columnNumber = f.columnNumber;
31185 * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
31186 * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
31188 function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
31192 var s = S_TAG;//status
31194 var c = source.charAt(p);
31197 if(s === S_ATTR){//attrName
31198 attrName = source.slice(start,p);
31200 }else if(s === S_ATTR_SPACE){
31203 //fatalError: equal must after attrName or space after attrName
31204 throw new Error('attribute equal must after attrName');
31209 if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
31212 errorHandler.warning('attribute value must after "="');
31213 attrName = source.slice(start,p);
31216 p = source.indexOf(c,start);
31218 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
31219 el.add(attrName,value,start-1);
31222 //fatalError: no end quot match
31223 throw new Error('attribute value no end \''+c+'\' match');
31225 }else if(s == S_ATTR_NOQUOT_VALUE){
31226 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
31227 //console.log(attrName,value,start,p)
31228 el.add(attrName,value,start);
31230 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
31234 //fatalError: no equal before
31235 throw new Error('attribute value must after "="');
31241 el.setTagName(source.slice(start,p));
31247 case S_ATTR_NOQUOT_VALUE:
31253 throw new Error("attribute invalid close char('/')")
31256 case ''://end document
31257 //throw new Error('unexpected end of input')
31258 errorHandler.error('unexpected end of input');
31260 el.setTagName(source.slice(start,p));
31266 el.setTagName(source.slice(start,p));
31271 case S_ATTR_NOQUOT_VALUE://Compatible state
31273 value = source.slice(start,p);
31274 if(value.slice(-1) === '/'){
31276 value = value.slice(0,-1);
31279 if(s === S_ATTR_SPACE){
31282 if(s == S_ATTR_NOQUOT_VALUE){
31283 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
31284 el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
31286 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
31287 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
31289 el.add(value,value,start);
31293 throw new Error('attribute value missed!!');
31295 // console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
31297 /*xml space '\x20' | #x9 | #xD | #xA; */
31301 if(c<= ' '){//space
31304 el.setTagName(source.slice(start,p));//tagName
31308 attrName = source.slice(start,p);
31311 case S_ATTR_NOQUOT_VALUE:
31312 var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
31313 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
31314 el.add(attrName,value,start);
31318 //case S_TAG_SPACE:
31320 //case S_ATTR_SPACE:
31322 //case S_TAG_CLOSE:
31326 //S_TAG, S_ATTR, S_EQ, S_ATTR_NOQUOT_VALUE
31327 //S_ATTR_SPACE, S_ATTR_END, S_TAG_SPACE, S_TAG_CLOSE
31329 //case S_TAG:void();break;
31330 //case S_ATTR:void();break;
31331 //case S_ATTR_NOQUOT_VALUE:void();break;
31333 var tagName = el.tagName;
31334 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
31335 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
31337 el.add(attrName,attrName,start);
31342 errorHandler.warning('attribute space is required"'+attrName+'"!!');
31348 s = S_ATTR_NOQUOT_VALUE;
31352 throw new Error("elements closed character '/' and '>' must be connected to");
31355 }//end outer switch
31356 //console.log('p++',p)
31361 * @return true if has new namespace define
31363 function appendElement(el,domBuilder,currentNSMap){
31364 var tagName = el.tagName;
31365 var localNSMap = null;
31366 //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
31370 var qName = a.qName;
31371 var value = a.value;
31372 var nsp = qName.indexOf(':');
31374 var prefix = a.prefix = qName.slice(0,nsp);
31375 var localName = qName.slice(nsp+1);
31376 var nsPrefix = prefix === 'xmlns' && localName;
31380 nsPrefix = qName === 'xmlns' && '';
31382 //can not set prefix,because prefix !== ''
31383 a.localName = localName ;
31384 //prefix == null for no ns prefix attribute
31385 if(nsPrefix !== false){//hack!!
31386 if(localNSMap == null){
31388 //console.log(currentNSMap,0)
31389 _copy(currentNSMap,currentNSMap={});
31390 //console.log(currentNSMap,1)
31392 currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
31393 a.uri = 'http://www.w3.org/2000/xmlns/';
31394 domBuilder.startPrefixMapping(nsPrefix, value);
31400 var prefix = a.prefix;
31401 if(prefix){//no prefix attribute has no namespace
31402 if(prefix === 'xml'){
31403 a.uri = 'http://www.w3.org/XML/1998/namespace';
31404 }if(prefix !== 'xmlns'){
31405 a.uri = currentNSMap[prefix || ''];
31407 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
31411 var nsp = tagName.indexOf(':');
31413 prefix = el.prefix = tagName.slice(0,nsp);
31414 localName = el.localName = tagName.slice(nsp+1);
31416 prefix = null;//important!!
31417 localName = el.localName = tagName;
31419 //no prefix element has default namespace
31420 var ns = el.uri = currentNSMap[prefix || ''];
31421 domBuilder.startElement(ns,localName,tagName,el);
31422 //endPrefixMapping and startPrefixMapping have not any help for dom builder
31423 //localNSMap = null
31425 domBuilder.endElement(ns,localName,tagName);
31427 for(prefix in localNSMap){
31428 domBuilder.endPrefixMapping(prefix);
31432 el.currentNSMap = currentNSMap;
31433 el.localNSMap = localNSMap;
31434 //parseStack.push(el);
31438 function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
31439 if(/^(?:script|textarea)$/i.test(tagName)){
31440 var elEndStart = source.indexOf('</'+tagName+'>',elStartEnd);
31441 var text = source.substring(elStartEnd+1,elEndStart);
31442 if(/[&<]/.test(text)){
31443 if(/^script$/i.test(tagName)){
31444 //if(!/\]\]>/.test(text)){
31445 //lexHandler.startCDATA();
31446 domBuilder.characters(text,0,text.length);
31447 //lexHandler.endCDATA();
31450 }//}else{//text area
31451 text = text.replace(/&#?\w+;/g,entityReplacer);
31452 domBuilder.characters(text,0,text.length);
31458 return elStartEnd+1;
31460 function fixSelfClosed(source,elStartEnd,tagName,closeMap){
31461 //if(tagName in closeMap){
31462 var pos = closeMap[tagName];
31464 //console.log(tagName)
31465 pos = source.lastIndexOf('</'+tagName+'>');
31466 if(pos<elStartEnd){//忘记闭合
31467 pos = source.lastIndexOf('</'+tagName);
31469 closeMap[tagName] =pos;
31471 return pos<elStartEnd;
31474 function _copy(source,target){
31475 for(var n in source){target[n] = source[n];}
31477 function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
31478 var next= source.charAt(start+2);
31481 if(source.charAt(start + 3) === '-'){
31482 var end = source.indexOf('-->',start+4);
31483 //append comment source.substring(4,end)//<!--
31485 domBuilder.comment(source,start+4,end-start-4);
31488 errorHandler.error("Unclosed comment");
31496 if(source.substr(start+3,6) == 'CDATA['){
31497 var end = source.indexOf(']]>',start+9);
31498 domBuilder.startCDATA();
31499 domBuilder.characters(source,start+9,end-start-9);
31500 domBuilder.endCDATA();
31504 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId)
31505 var matchs = split(source,start);
31506 var len = matchs.length;
31507 if(len>1 && /!doctype/i.test(matchs[0][0])){
31508 var name = matchs[1][0];
31509 var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
31510 var sysid = len>4 && matchs[4][0];
31511 var lastMatch = matchs[len-1];
31512 domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
31513 sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
31514 domBuilder.endDTD();
31516 return lastMatch.index+lastMatch[0].length
31524 function parseInstruction(source,start,domBuilder){
31525 var end = source.indexOf('?>',start);
31527 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
31529 var len = match[0].length;
31530 domBuilder.processingInstruction(match[1], match[2]) ;
31542 function ElementAttributes(source){
31545 ElementAttributes.prototype = {
31546 setTagName:function(tagName){
31547 if(!tagNamePattern.test(tagName)){
31548 throw new Error('invalid tagName:'+tagName)
31550 this.tagName = tagName;
31552 add:function(qName,value,offset){
31553 if(!tagNamePattern.test(qName)){
31554 throw new Error('invalid attribute:'+qName)
31556 this[this.length++] = {qName:qName,value:value,offset:offset};
31559 getLocalName:function(i){return this[i].localName},
31560 getLocator:function(i){return this[i].locator},
31561 getQName:function(i){return this[i].qName},
31562 getURI:function(i){return this[i].uri},
31563 getValue:function(i){return this[i].value}
31564 // ,getIndex:function(uri, localName)){
31571 // getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
31572 // getType:function(uri,localName){}
31573 // getType:function(i){},
31579 function _set_proto_(thiz,parent){
31580 thiz.__proto__ = parent;
31583 if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
31584 _set_proto_ = function(thiz,parent){
31585 function p(){} p.prototype = parent;
31587 for(parent in thiz){
31588 p[parent] = thiz[parent];
31594 function split(source,start){
31597 var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
31598 reg.lastIndex = start;
31599 reg.exec(source);//skip <
31600 while(match = reg.exec(source)){
31602 if(match[1])return buf;
31606 var XMLReader_1 = XMLReader;
31609 XMLReader: XMLReader_1
31614 * Object DOMException
31615 * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
31616 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
31619 function copy$1(src,dest){
31625 ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
31626 ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
31628 function _extends(Class,Super){
31629 var pt = Class.prototype;
31631 var ppt = Object.create(Super.prototype);
31632 pt.__proto__ = ppt;
31634 if(!(pt instanceof Super)){
31635 function t(){} t.prototype = Super.prototype;
31638 Class.prototype = pt = t;
31640 if(pt.constructor != Class){
31641 if(typeof Class != 'function'){
31642 console.error("unknow Class:"+Class);
31644 pt.constructor = Class;
31647 var htmlns = 'http://www.w3.org/1999/xhtml' ;
31650 var ELEMENT_NODE = NodeType.ELEMENT_NODE = 1;
31651 var ATTRIBUTE_NODE = NodeType.ATTRIBUTE_NODE = 2;
31652 var TEXT_NODE = NodeType.TEXT_NODE = 3;
31653 var CDATA_SECTION_NODE = NodeType.CDATA_SECTION_NODE = 4;
31654 var ENTITY_REFERENCE_NODE = NodeType.ENTITY_REFERENCE_NODE = 5;
31655 var ENTITY_NODE = NodeType.ENTITY_NODE = 6;
31656 var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
31657 var COMMENT_NODE = NodeType.COMMENT_NODE = 8;
31658 var DOCUMENT_NODE = NodeType.DOCUMENT_NODE = 9;
31659 var DOCUMENT_TYPE_NODE = NodeType.DOCUMENT_TYPE_NODE = 10;
31660 var DOCUMENT_FRAGMENT_NODE = NodeType.DOCUMENT_FRAGMENT_NODE = 11;
31661 var NOTATION_NODE = NodeType.NOTATION_NODE = 12;
31664 var ExceptionCode = {};
31665 var ExceptionMessage = {};
31666 var INDEX_SIZE_ERR = ExceptionCode.INDEX_SIZE_ERR = ((ExceptionMessage[1]="Index size error"),1);
31667 var DOMSTRING_SIZE_ERR = ExceptionCode.DOMSTRING_SIZE_ERR = ((ExceptionMessage[2]="DOMString size error"),2);
31668 var HIERARCHY_REQUEST_ERR = ExceptionCode.HIERARCHY_REQUEST_ERR = ((ExceptionMessage[3]="Hierarchy request error"),3);
31669 var WRONG_DOCUMENT_ERR = ExceptionCode.WRONG_DOCUMENT_ERR = ((ExceptionMessage[4]="Wrong document"),4);
31670 var INVALID_CHARACTER_ERR = ExceptionCode.INVALID_CHARACTER_ERR = ((ExceptionMessage[5]="Invalid character"),5);
31671 var NO_DATA_ALLOWED_ERR = ExceptionCode.NO_DATA_ALLOWED_ERR = ((ExceptionMessage[6]="No data allowed"),6);
31672 var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
31673 var NOT_FOUND_ERR = ExceptionCode.NOT_FOUND_ERR = ((ExceptionMessage[8]="Not found"),8);
31674 var NOT_SUPPORTED_ERR = ExceptionCode.NOT_SUPPORTED_ERR = ((ExceptionMessage[9]="Not supported"),9);
31675 var INUSE_ATTRIBUTE_ERR = ExceptionCode.INUSE_ATTRIBUTE_ERR = ((ExceptionMessage[10]="Attribute in use"),10);
31677 var INVALID_STATE_ERR = ExceptionCode.INVALID_STATE_ERR = ((ExceptionMessage[11]="Invalid state"),11);
31678 var SYNTAX_ERR = ExceptionCode.SYNTAX_ERR = ((ExceptionMessage[12]="Syntax error"),12);
31679 var INVALID_MODIFICATION_ERR = ExceptionCode.INVALID_MODIFICATION_ERR = ((ExceptionMessage[13]="Invalid modification"),13);
31680 var NAMESPACE_ERR = ExceptionCode.NAMESPACE_ERR = ((ExceptionMessage[14]="Invalid namespace"),14);
31681 var INVALID_ACCESS_ERR = ExceptionCode.INVALID_ACCESS_ERR = ((ExceptionMessage[15]="Invalid access"),15);
31684 function DOMException(code, message) {
31685 if(message instanceof Error){
31686 var error = message;
31689 Error.call(this, ExceptionMessage[code]);
31690 this.message = ExceptionMessage[code];
31691 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
31694 if(message) this.message = this.message + ": " + message;
31696 }DOMException.prototype = Error.prototype;
31697 copy$1(ExceptionCode,DOMException);
31699 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
31700 * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.
31701 * The items in the NodeList are accessible via an integral index, starting from 0.
31703 function NodeList() {
31704 }NodeList.prototype = {
31706 * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
31711 * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.
31713 * @param index unsigned long
31714 * Index into the collection.
31716 * The node at the indexth position in the NodeList, or null if that is not a valid index.
31718 item: function(index) {
31719 return this[index] || null;
31721 toString:function(isHTML,nodeFilter){
31722 for(var buf = [], i = 0;i<this.length;i++){
31723 serializeToString(this[i],buf,isHTML,nodeFilter);
31725 return buf.join('');
31728 function LiveNodeList(node,refresh){
31730 this._refresh = refresh;
31731 _updateLiveList(this);
31733 function _updateLiveList(list){
31734 var inc = list._node._inc || list._node.ownerDocument._inc;
31735 if(list._inc != inc){
31736 var ls = list._refresh(list._node);
31737 //console.log(ls.length)
31738 __set__(list,'length',ls.length);
31743 LiveNodeList.prototype.item = function(i){
31744 _updateLiveList(this);
31748 _extends(LiveNodeList,NodeList);
31751 * Objects implementing the NamedNodeMap interface are used to represent collections of nodes that can be accessed by name. Note that NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not maintained in any particular order. Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index, but this is simply to allow convenient enumeration of the contents of a NamedNodeMap, and does not imply that the DOM specifies an order to these Nodes.
31752 * NamedNodeMap objects in the DOM are live.
31753 * used for attributes or DocumentType entities
31755 function NamedNodeMap() {
31757 function _findNodeIndex(list,node){
31758 var i = list.length;
31760 if(list[i] === node){return i}
31764 function _addNamedNode(el,list,newAttr,oldAttr){
31766 list[_findNodeIndex(list,oldAttr)] = newAttr;
31768 list[list.length++] = newAttr;
31771 newAttr.ownerElement = el;
31772 var doc = el.ownerDocument;
31774 oldAttr && _onRemoveAttribute(doc,el,oldAttr);
31775 _onAddAttribute(doc,el,newAttr);
31779 function _removeNamedNode(el,list,attr){
31780 //console.log('remove attr:'+attr)
31781 var i = _findNodeIndex(list,attr);
31783 var lastIndex = list.length-1;
31784 while(i<lastIndex){
31785 list[i] = list[++i];
31787 list.length = lastIndex;
31789 var doc = el.ownerDocument;
31791 _onRemoveAttribute(doc,el,attr);
31792 attr.ownerElement = null;
31796 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
31799 NamedNodeMap.prototype = {
31801 item:NodeList.prototype.item,
31802 getNamedItem: function(key) {
31803 // if(key.indexOf(':')>0 || key == 'xmlns'){
31807 var i = this.length;
31809 var attr = this[i];
31810 //console.log(attr.nodeName,key)
31811 if(attr.nodeName == key){
31816 setNamedItem: function(attr) {
31817 var el = attr.ownerElement;
31818 if(el && el!=this._ownerElement){
31819 throw new DOMException(INUSE_ATTRIBUTE_ERR);
31821 var oldAttr = this.getNamedItem(attr.nodeName);
31822 _addNamedNode(this._ownerElement,this,attr,oldAttr);
31826 setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
31827 var el = attr.ownerElement, oldAttr;
31828 if(el && el!=this._ownerElement){
31829 throw new DOMException(INUSE_ATTRIBUTE_ERR);
31831 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
31832 _addNamedNode(this._ownerElement,this,attr,oldAttr);
31837 removeNamedItem: function(key) {
31838 var attr = this.getNamedItem(key);
31839 _removeNamedNode(this._ownerElement,this,attr);
31843 },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
31846 removeNamedItemNS:function(namespaceURI,localName){
31847 var attr = this.getNamedItemNS(namespaceURI,localName);
31848 _removeNamedNode(this._ownerElement,this,attr);
31851 getNamedItemNS: function(namespaceURI, localName) {
31852 var i = this.length;
31854 var node = this[i];
31855 if(node.localName == localName && node.namespaceURI == namespaceURI){
31863 * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
31865 function DOMImplementation(/* Object */ features) {
31866 this._features = {};
31868 for (var feature in features) {
31869 this._features = features[feature];
31873 DOMImplementation.prototype = {
31874 hasFeature: function(/* string */ feature, /* string */ version) {
31875 var versions = this._features[feature.toLowerCase()];
31876 if (versions && (!version || version in versions)) {
31882 // Introduced in DOM Level 2:
31883 createDocument:function(namespaceURI, qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
31884 var doc = new Document();
31885 doc.implementation = this;
31886 doc.childNodes = new NodeList();
31887 doc.doctype = doctype;
31889 doc.appendChild(doctype);
31892 var root = doc.createElementNS(namespaceURI,qualifiedName);
31893 doc.appendChild(root);
31897 // Introduced in DOM Level 2:
31898 createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
31899 var node = new DocumentType();
31900 node.name = qualifiedName;
31901 node.nodeName = qualifiedName;
31902 node.publicId = publicId;
31903 node.systemId = systemId;
31904 // Introduced in DOM Level 2:
31905 //readonly attribute DOMString internalSubset;
31908 // readonly attribute NamedNodeMap entities;
31909 // readonly attribute NamedNodeMap notations;
31916 * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
31919 function Node$2() {
31921 Node$2.prototype = {
31924 previousSibling : null,
31925 nextSibling : null,
31929 ownerDocument : null,
31931 namespaceURI : null,
31934 // Modified in DOM Level 2:
31935 insertBefore:function(newChild, refChild){//raises
31936 return _insertBefore(this,newChild,refChild);
31938 replaceChild:function(newChild, oldChild){//raises
31939 this.insertBefore(newChild,oldChild);
31941 this.removeChild(oldChild);
31944 removeChild:function(oldChild){
31945 return _removeChild(this,oldChild);
31947 appendChild:function(newChild){
31948 return this.insertBefore(newChild,null);
31950 hasChildNodes:function(){
31951 return this.firstChild != null;
31953 cloneNode:function(deep){
31954 return cloneNode(this.ownerDocument||this,this,deep);
31956 // Modified in DOM Level 2:
31957 normalize:function(){
31958 var child = this.firstChild;
31960 var next = child.nextSibling;
31961 if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
31962 this.removeChild(next);
31963 child.appendData(next.data);
31970 // Introduced in DOM Level 2:
31971 isSupported:function(feature, version){
31972 return this.ownerDocument.implementation.hasFeature(feature,version);
31974 // Introduced in DOM Level 2:
31975 hasAttributes:function(){
31976 return this.attributes.length>0;
31978 lookupPrefix:function(namespaceURI){
31981 var map = el._nsMap;
31985 if(map[n] == namespaceURI){
31990 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
31994 // Introduced in DOM Level 3:
31995 lookupNamespaceURI:function(prefix){
31998 var map = el._nsMap;
32002 return map[prefix] ;
32005 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
32009 // Introduced in DOM Level 3:
32010 isDefaultNamespace:function(namespaceURI){
32011 var prefix = this.lookupPrefix(namespaceURI);
32012 return prefix == null;
32017 function _xmlEncoder(c){
32018 return c == '<' && '<' ||
32019 c == '>' && '>' ||
32020 c == '&' && '&' ||
32021 c == '"' && '"' ||
32022 '&#'+c.charCodeAt()+';'
32026 copy$1(NodeType,Node$2);
32027 copy$1(NodeType,Node$2.prototype);
32030 * @param callback return true for continue,false for break
32031 * @return boolean true: break visit;
32033 function _visitNode(node,callback){
32034 if(callback(node)){
32037 if(node = node.firstChild){
32039 if(_visitNode(node,callback)){return true}
32040 }while(node=node.nextSibling)
32046 function Document(){
32048 function _onAddAttribute(doc,el,newAttr){
32050 var ns = newAttr.namespaceURI ;
32051 if(ns == 'http://www.w3.org/2000/xmlns/'){
32053 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
32056 function _onRemoveAttribute(doc,el,newAttr,remove){
32058 var ns = newAttr.namespaceURI ;
32059 if(ns == 'http://www.w3.org/2000/xmlns/'){
32061 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
32064 function _onUpdateChild(doc,el,newChild){
32065 if(doc && doc._inc){
32067 //update childNodes
32068 var cs = el.childNodes;
32070 cs[cs.length++] = newChild;
32073 var child = el.firstChild;
32077 child =child.nextSibling;
32088 * writeable properties:
32089 * nodeValue,Attr:value,CharacterData:data
32092 function _removeChild(parentNode,child){
32093 var previous = child.previousSibling;
32094 var next = child.nextSibling;
32096 previous.nextSibling = next;
32098 parentNode.firstChild = next;
32101 next.previousSibling = previous;
32103 parentNode.lastChild = previous;
32105 _onUpdateChild(parentNode.ownerDocument,parentNode);
32109 * preformance key(refChild == null)
32111 function _insertBefore(parentNode,newChild,nextChild){
32112 var cp = newChild.parentNode;
32114 cp.removeChild(newChild);//remove and update
32116 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
32117 var newFirst = newChild.firstChild;
32118 if (newFirst == null) {
32121 var newLast = newChild.lastChild;
32123 newFirst = newLast = newChild;
32125 var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
32127 newFirst.previousSibling = pre;
32128 newLast.nextSibling = nextChild;
32132 pre.nextSibling = newFirst;
32134 parentNode.firstChild = newFirst;
32136 if(nextChild == null){
32137 parentNode.lastChild = newLast;
32139 nextChild.previousSibling = newLast;
32142 newFirst.parentNode = parentNode;
32143 }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
32144 _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
32145 //console.log(parentNode.lastChild.nextSibling == null)
32146 if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
32147 newChild.firstChild = newChild.lastChild = null;
32151 function _appendSingleChild(parentNode,newChild){
32152 var cp = newChild.parentNode;
32154 var pre = parentNode.lastChild;
32155 cp.removeChild(newChild);//remove and update
32156 var pre = parentNode.lastChild;
32158 var pre = parentNode.lastChild;
32159 newChild.parentNode = parentNode;
32160 newChild.previousSibling = pre;
32161 newChild.nextSibling = null;
32163 pre.nextSibling = newChild;
32165 parentNode.firstChild = newChild;
32167 parentNode.lastChild = newChild;
32168 _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
32170 //console.log("__aa",parentNode.lastChild.nextSibling == null)
32172 Document.prototype = {
32173 //implementation : null,
32174 nodeName : '#document',
32175 nodeType : DOCUMENT_NODE,
32177 documentElement : null,
32180 insertBefore : function(newChild, refChild){//raises
32181 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
32182 var child = newChild.firstChild;
32184 var next = child.nextSibling;
32185 this.insertBefore(child,refChild);
32190 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
32191 this.documentElement = newChild;
32194 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
32196 removeChild : function(oldChild){
32197 if(this.documentElement == oldChild){
32198 this.documentElement = null;
32200 return _removeChild(this,oldChild);
32202 // Introduced in DOM Level 2:
32203 importNode : function(importedNode,deep){
32204 return importNode(this,importedNode,deep);
32206 // Introduced in DOM Level 2:
32207 getElementById : function(id){
32209 _visitNode(this.documentElement,function(node){
32210 if(node.nodeType == ELEMENT_NODE){
32211 if(node.getAttribute('id') == id){
32220 //document factory method:
32221 createElement : function(tagName){
32222 var node = new Element();
32223 node.ownerDocument = this;
32224 node.nodeName = tagName;
32225 node.tagName = tagName;
32226 node.childNodes = new NodeList();
32227 var attrs = node.attributes = new NamedNodeMap();
32228 attrs._ownerElement = node;
32231 createDocumentFragment : function(){
32232 var node = new DocumentFragment();
32233 node.ownerDocument = this;
32234 node.childNodes = new NodeList();
32237 createTextNode : function(data){
32238 var node = new Text();
32239 node.ownerDocument = this;
32240 node.appendData(data);
32243 createComment : function(data){
32244 var node = new Comment();
32245 node.ownerDocument = this;
32246 node.appendData(data);
32249 createCDATASection : function(data){
32250 var node = new CDATASection();
32251 node.ownerDocument = this;
32252 node.appendData(data);
32255 createProcessingInstruction : function(target,data){
32256 var node = new ProcessingInstruction();
32257 node.ownerDocument = this;
32258 node.tagName = node.target = target;
32259 node.nodeValue= node.data = data;
32262 createAttribute : function(name){
32263 var node = new Attr();
32264 node.ownerDocument = this;
32266 node.nodeName = name;
32267 node.localName = name;
32268 node.specified = true;
32271 createEntityReference : function(name){
32272 var node = new EntityReference();
32273 node.ownerDocument = this;
32274 node.nodeName = name;
32277 // Introduced in DOM Level 2:
32278 createElementNS : function(namespaceURI,qualifiedName){
32279 var node = new Element();
32280 var pl = qualifiedName.split(':');
32281 var attrs = node.attributes = new NamedNodeMap();
32282 node.childNodes = new NodeList();
32283 node.ownerDocument = this;
32284 node.nodeName = qualifiedName;
32285 node.tagName = qualifiedName;
32286 node.namespaceURI = namespaceURI;
32287 if(pl.length == 2){
32288 node.prefix = pl[0];
32289 node.localName = pl[1];
32291 //el.prefix = null;
32292 node.localName = qualifiedName;
32294 attrs._ownerElement = node;
32297 // Introduced in DOM Level 2:
32298 createAttributeNS : function(namespaceURI,qualifiedName){
32299 var node = new Attr();
32300 var pl = qualifiedName.split(':');
32301 node.ownerDocument = this;
32302 node.nodeName = qualifiedName;
32303 node.name = qualifiedName;
32304 node.namespaceURI = namespaceURI;
32305 node.specified = true;
32306 if(pl.length == 2){
32307 node.prefix = pl[0];
32308 node.localName = pl[1];
32310 //el.prefix = null;
32311 node.localName = qualifiedName;
32316 _extends(Document,Node$2);
32319 function Element() {
32321 }Element.prototype = {
32322 nodeType : ELEMENT_NODE,
32323 hasAttribute : function(name){
32324 return this.getAttributeNode(name)!=null;
32326 getAttribute : function(name){
32327 var attr = this.getAttributeNode(name);
32328 return attr && attr.value || '';
32330 getAttributeNode : function(name){
32331 return this.attributes.getNamedItem(name);
32333 setAttribute : function(name, value){
32334 var attr = this.ownerDocument.createAttribute(name);
32335 attr.value = attr.nodeValue = "" + value;
32336 this.setAttributeNode(attr);
32338 removeAttribute : function(name){
32339 var attr = this.getAttributeNode(name);
32340 attr && this.removeAttributeNode(attr);
32343 //four real opeartion method
32344 appendChild:function(newChild){
32345 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
32346 return this.insertBefore(newChild,null);
32348 return _appendSingleChild(this,newChild);
32351 setAttributeNode : function(newAttr){
32352 return this.attributes.setNamedItem(newAttr);
32354 setAttributeNodeNS : function(newAttr){
32355 return this.attributes.setNamedItemNS(newAttr);
32357 removeAttributeNode : function(oldAttr){
32358 //console.log(this == oldAttr.ownerElement)
32359 return this.attributes.removeNamedItem(oldAttr.nodeName);
32361 //get real attribute name,and remove it by removeAttributeNode
32362 removeAttributeNS : function(namespaceURI, localName){
32363 var old = this.getAttributeNodeNS(namespaceURI, localName);
32364 old && this.removeAttributeNode(old);
32367 hasAttributeNS : function(namespaceURI, localName){
32368 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
32370 getAttributeNS : function(namespaceURI, localName){
32371 var attr = this.getAttributeNodeNS(namespaceURI, localName);
32372 return attr && attr.value || '';
32374 setAttributeNS : function(namespaceURI, qualifiedName, value){
32375 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
32376 attr.value = attr.nodeValue = "" + value;
32377 this.setAttributeNode(attr);
32379 getAttributeNodeNS : function(namespaceURI, localName){
32380 return this.attributes.getNamedItemNS(namespaceURI, localName);
32383 getElementsByTagName : function(tagName){
32384 return new LiveNodeList(this,function(base){
32386 _visitNode(base,function(node){
32387 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
32394 getElementsByTagNameNS : function(namespaceURI, localName){
32395 return new LiveNodeList(this,function(base){
32397 _visitNode(base,function(node){
32398 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
32407 Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
32408 Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
32411 _extends(Element,Node$2);
32413 }Attr.prototype.nodeType = ATTRIBUTE_NODE;
32414 _extends(Attr,Node$2);
32417 function CharacterData() {
32418 }CharacterData.prototype = {
32420 substringData : function(offset, count) {
32421 return this.data.substring(offset, offset+count);
32423 appendData: function(text) {
32424 text = this.data+text;
32425 this.nodeValue = this.data = text;
32426 this.length = text.length;
32428 insertData: function(offset,text) {
32429 this.replaceData(offset,0,text);
32432 appendChild:function(newChild){
32433 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
32435 deleteData: function(offset, count) {
32436 this.replaceData(offset,count,"");
32438 replaceData: function(offset, count, text) {
32439 var start = this.data.substring(0,offset);
32440 var end = this.data.substring(offset+count);
32441 text = start + text + end;
32442 this.nodeValue = this.data = text;
32443 this.length = text.length;
32446 _extends(CharacterData,Node$2);
32448 }Text.prototype = {
32449 nodeName : "#text",
32450 nodeType : TEXT_NODE,
32451 splitText : function(offset) {
32452 var text = this.data;
32453 var newText = text.substring(offset);
32454 text = text.substring(0, offset);
32455 this.data = this.nodeValue = text;
32456 this.length = text.length;
32457 var newNode = this.ownerDocument.createTextNode(newText);
32458 if(this.parentNode){
32459 this.parentNode.insertBefore(newNode, this.nextSibling);
32464 _extends(Text,CharacterData);
32465 function Comment() {
32466 }Comment.prototype = {
32467 nodeName : "#comment",
32468 nodeType : COMMENT_NODE
32470 _extends(Comment,CharacterData);
32472 function CDATASection() {
32473 }CDATASection.prototype = {
32474 nodeName : "#cdata-section",
32475 nodeType : CDATA_SECTION_NODE
32477 _extends(CDATASection,CharacterData);
32480 function DocumentType() {
32481 }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
32482 _extends(DocumentType,Node$2);
32484 function Notation() {
32485 }Notation.prototype.nodeType = NOTATION_NODE;
32486 _extends(Notation,Node$2);
32488 function Entity() {
32489 }Entity.prototype.nodeType = ENTITY_NODE;
32490 _extends(Entity,Node$2);
32492 function EntityReference() {
32493 }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
32494 _extends(EntityReference,Node$2);
32496 function DocumentFragment() {
32497 }DocumentFragment.prototype.nodeName = "#document-fragment";
32498 DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
32499 _extends(DocumentFragment,Node$2);
32502 function ProcessingInstruction() {
32504 ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
32505 _extends(ProcessingInstruction,Node$2);
32506 function XMLSerializer$1(){}
32507 XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
32508 return nodeSerializeToString.call(node,isHtml,nodeFilter);
32510 Node$2.prototype.toString = nodeSerializeToString;
32511 function nodeSerializeToString(isHtml,nodeFilter){
32513 var refNode = this.nodeType == 9?this.documentElement:this;
32514 var prefix = refNode.prefix;
32515 var uri = refNode.namespaceURI;
32517 if(uri && prefix == null){
32518 //console.log(prefix)
32519 var prefix = refNode.lookupPrefix(uri);
32520 if(prefix == null){
32522 var visibleNamespaces=[
32523 {namespace:uri,prefix:null}
32524 //{namespace:uri,prefix:''}
32528 serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
32529 //console.log('###',this.nodeType,uri,prefix,buf.join(''))
32530 return buf.join('');
32532 function needNamespaceDefine(node,isHTML, visibleNamespaces) {
32533 var prefix = node.prefix||'';
32534 var uri = node.namespaceURI;
32535 if (!prefix && !uri){
32538 if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace"
32539 || uri == 'http://www.w3.org/2000/xmlns/'){
32543 var i = visibleNamespaces.length;
32544 //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
32546 var ns = visibleNamespaces[i];
32547 // get namespace prefix
32548 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
32549 if (ns.prefix == prefix){
32550 return ns.namespace != uri;
32553 //console.log(isHTML,uri,prefix=='')
32554 //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
32557 //node.flag = '11111'
32558 //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
32561 function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
32563 node = nodeFilter(node);
32565 if(typeof node == 'string'){
32572 //buf.sort.apply(attrs, attributeSorter);
32574 switch(node.nodeType){
32576 if (!visibleNamespaces) visibleNamespaces = [];
32577 var startVisibleNamespaces = visibleNamespaces.length;
32578 var attrs = node.attributes;
32579 var len = attrs.length;
32580 var child = node.firstChild;
32581 var nodeName = node.tagName;
32583 isHTML = (htmlns === node.namespaceURI) ||isHTML;
32584 buf.push('<',nodeName);
32588 for(var i=0;i<len;i++){
32589 // add namespaces for attributes
32590 var attr = attrs.item(i);
32591 if (attr.prefix == 'xmlns') {
32592 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
32593 }else if(attr.nodeName == 'xmlns'){
32594 visibleNamespaces.push({ prefix: '', namespace: attr.value });
32597 for(var i=0;i<len;i++){
32598 var attr = attrs.item(i);
32599 if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
32600 var prefix = attr.prefix||'';
32601 var uri = attr.namespaceURI;
32602 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
32603 buf.push(ns, '="' , uri , '"');
32604 visibleNamespaces.push({ prefix: prefix, namespace:uri });
32606 serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
32608 // add namespace for current node
32609 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
32610 var prefix = node.prefix||'';
32611 var uri = node.namespaceURI;
32612 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
32613 buf.push(ns, '="' , uri , '"');
32614 visibleNamespaces.push({ prefix: prefix, namespace:uri });
32617 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
32619 //if is cdata child node
32620 if(isHTML && /^script$/i.test(nodeName)){
32623 buf.push(child.data);
32625 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
32627 child = child.nextSibling;
32632 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
32633 child = child.nextSibling;
32636 buf.push('</',nodeName,'>');
32640 // remove added visible namespaces
32641 //visibleNamespaces.length = startVisibleNamespaces;
32643 case DOCUMENT_NODE:
32644 case DOCUMENT_FRAGMENT_NODE:
32645 var child = node.firstChild;
32647 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
32648 child = child.nextSibling;
32651 case ATTRIBUTE_NODE:
32652 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
32654 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
32655 case CDATA_SECTION_NODE:
32656 return buf.push( '<![CDATA[',node.data,']]>');
32658 return buf.push( "<!--",node.data,"-->");
32659 case DOCUMENT_TYPE_NODE:
32660 var pubid = node.publicId;
32661 var sysid = node.systemId;
32662 buf.push('<!DOCTYPE ',node.name);
32664 buf.push(' PUBLIC "',pubid);
32665 if (sysid && sysid!='.') {
32666 buf.push( '" "',sysid);
32669 }else if(sysid && sysid!='.'){
32670 buf.push(' SYSTEM "',sysid,'">');
32672 var sub = node.internalSubset;
32674 buf.push(" [",sub,"]");
32679 case PROCESSING_INSTRUCTION_NODE:
32680 return buf.push( "<?",node.target," ",node.data,"?>");
32681 case ENTITY_REFERENCE_NODE:
32682 return buf.push( '&',node.nodeName,';');
32683 //case ENTITY_NODE:
32684 //case NOTATION_NODE:
32686 buf.push('??',node.nodeName);
32689 function importNode(doc,node,deep){
32691 switch (node.nodeType) {
32693 node2 = node.cloneNode(false);
32694 node2.ownerDocument = doc;
32695 //var attrs = node2.attributes;
32696 //var len = attrs.length;
32697 //for(var i=0;i<len;i++){
32698 //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
32700 case DOCUMENT_FRAGMENT_NODE:
32702 case ATTRIBUTE_NODE:
32705 //case ENTITY_REFERENCE_NODE:
32706 //case PROCESSING_INSTRUCTION_NODE:
32707 ////case TEXT_NODE:
32708 //case CDATA_SECTION_NODE:
32709 //case COMMENT_NODE:
32712 //case DOCUMENT_NODE:
32713 //case DOCUMENT_TYPE_NODE:
32714 //cannot be imported.
32715 //case ENTITY_NODE:
32716 //case NOTATION_NODE:
32717 //can not hit in level3
32721 node2 = node.cloneNode(false);//false
32723 node2.ownerDocument = doc;
32724 node2.parentNode = null;
32726 var child = node.firstChild;
32728 node2.appendChild(importNode(doc,child,deep));
32729 child = child.nextSibling;
32735 //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
32736 // attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
32737 function cloneNode(doc,node,deep){
32738 var node2 = new node.constructor();
32739 for(var n in node){
32741 if(typeof v != 'object' ){
32747 if(node.childNodes){
32748 node2.childNodes = new NodeList();
32750 node2.ownerDocument = doc;
32751 switch (node2.nodeType) {
32753 var attrs = node.attributes;
32754 var attrs2 = node2.attributes = new NamedNodeMap();
32755 var len = attrs.length;
32756 attrs2._ownerElement = node2;
32757 for(var i=0;i<len;i++){
32758 node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
32761 case ATTRIBUTE_NODE:
32765 var child = node.firstChild;
32767 node2.appendChild(cloneNode(doc,child,deep));
32768 child = child.nextSibling;
32774 function __set__(object,key,value){
32775 object[key] = value;
32779 if(Object.defineProperty){
32780 Object.defineProperty(LiveNodeList.prototype,'length',{
32782 _updateLiveList(this);
32783 return this.$$length;
32786 Object.defineProperty(Node$2.prototype,'textContent',{
32788 return getTextContent(this);
32790 set:function(data){
32791 switch(this.nodeType){
32793 case DOCUMENT_FRAGMENT_NODE:
32794 while(this.firstChild){
32795 this.removeChild(this.firstChild);
32797 if(data || String(data)){
32798 this.appendChild(this.ownerDocument.createTextNode(data));
32805 this.nodeValue = data;
32810 function getTextContent(node){
32811 switch(node.nodeType){
32813 case DOCUMENT_FRAGMENT_NODE:
32815 node = node.firstChild;
32817 if(node.nodeType!==7 && node.nodeType !==8){
32818 buf.push(getTextContent(node));
32820 node = node.nextSibling;
32822 return buf.join('');
32824 return node.nodeValue;
32827 __set__ = function(object,key,value){
32828 //console.log(value)
32829 object['$$'+key] = value;
32835 //if(typeof require == 'function'){
32836 var DOMImplementation_1 = DOMImplementation;
32837 var XMLSerializer_1 = XMLSerializer$1;
32841 DOMImplementation: DOMImplementation_1,
32842 XMLSerializer: XMLSerializer_1
32845 var domParser = createCommonjsModule(function (module, exports) {
32846 function DOMParser(options){
32847 this.options = options ||{locator:{}};
32850 DOMParser.prototype.parseFromString = function(source,mimeType){
32851 var options = this.options;
32852 var sax$$1 = new XMLReader();
32853 var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
32854 var errorHandler = options.errorHandler;
32855 var locator = options.locator;
32856 var defaultNSMap = options.xmlns||{};
32857 var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
32859 domBuilder.setDocumentLocator(locator);
32862 sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
32863 sax$$1.domBuilder = options.domBuilder || domBuilder;
32864 if(/\/x?html?$/.test(mimeType)){
32865 entityMap.nbsp = '\xa0';
32866 entityMap.copy = '\xa9';
32867 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
32869 defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
32871 sax$$1.parse(source,defaultNSMap,entityMap);
32873 sax$$1.errorHandler.error("invalid doc source");
32875 return domBuilder.doc;
32877 function buildErrorHandler(errorImpl,domBuilder,locator){
32879 if(domBuilder instanceof DOMHandler){
32882 errorImpl = domBuilder ;
32884 var errorHandler = {};
32885 var isCallback = errorImpl instanceof Function;
32886 locator = locator||{};
32887 function build(key){
32888 var fn = errorImpl[key];
32889 if(!fn && isCallback){
32890 fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
32892 errorHandler[key] = fn && function(msg){
32893 fn('[xmldom '+key+']\t'+msg+_locator(locator));
32898 build('fatalError');
32899 return errorHandler;
32902 //console.log('#\n\n\n\n\n\n\n####')
32904 * +ContentHandler+ErrorHandler
32905 * +LexicalHandler+EntityResolver2
32906 * -DeclHandler-DTDHandler
32908 * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
32909 * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
32910 * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
32912 function DOMHandler() {
32913 this.cdata = false;
32915 function position(locator,node){
32916 node.lineNumber = locator.lineNumber;
32917 node.columnNumber = locator.columnNumber;
32920 * @see org.xml.sax.ContentHandler#startDocument
32921 * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
32923 DOMHandler.prototype = {
32924 startDocument : function() {
32925 this.doc = new DOMImplementation().createDocument(null, null, null);
32926 if (this.locator) {
32927 this.doc.documentURI = this.locator.systemId;
32930 startElement:function(namespaceURI, localName, qName, attrs) {
32931 var doc = this.doc;
32932 var el = doc.createElementNS(namespaceURI, qName||localName);
32933 var len = attrs.length;
32934 appendElement(this, el);
32935 this.currentElement = el;
32937 this.locator && position(this.locator,el);
32938 for (var i = 0 ; i < len; i++) {
32939 var namespaceURI = attrs.getURI(i);
32940 var value = attrs.getValue(i);
32941 var qName = attrs.getQName(i);
32942 var attr = doc.createAttributeNS(namespaceURI, qName);
32943 this.locator &&position(attrs.getLocator(i),attr);
32944 attr.value = attr.nodeValue = value;
32945 el.setAttributeNode(attr);
32948 endElement:function(namespaceURI, localName, qName) {
32949 var current = this.currentElement;
32950 var tagName = current.tagName;
32951 this.currentElement = current.parentNode;
32953 startPrefixMapping:function(prefix, uri) {
32955 endPrefixMapping:function(prefix) {
32957 processingInstruction:function(target, data) {
32958 var ins = this.doc.createProcessingInstruction(target, data);
32959 this.locator && position(this.locator,ins);
32960 appendElement(this, ins);
32962 ignorableWhitespace:function(ch, start, length) {
32964 characters:function(chars, start, length) {
32965 chars = _toString.apply(this,arguments);
32966 //console.log(chars)
32969 var charNode = this.doc.createCDATASection(chars);
32971 var charNode = this.doc.createTextNode(chars);
32973 if(this.currentElement){
32974 this.currentElement.appendChild(charNode);
32975 }else if(/^\s*$/.test(chars)){
32976 this.doc.appendChild(charNode);
32979 this.locator && position(this.locator,charNode);
32982 skippedEntity:function(name) {
32984 endDocument:function() {
32985 this.doc.normalize();
32987 setDocumentLocator:function (locator) {
32988 if(this.locator = locator){// && !('lineNumber' in locator)){
32989 locator.lineNumber = 0;
32993 comment:function(chars, start, length) {
32994 chars = _toString.apply(this,arguments);
32995 var comm = this.doc.createComment(chars);
32996 this.locator && position(this.locator,comm);
32997 appendElement(this, comm);
33000 startCDATA:function() {
33001 //used in characters() methods
33004 endCDATA:function() {
33005 this.cdata = false;
33008 startDTD:function(name, publicId, systemId) {
33009 var impl = this.doc.implementation;
33010 if (impl && impl.createDocumentType) {
33011 var dt = impl.createDocumentType(name, publicId, systemId);
33012 this.locator && position(this.locator,dt);
33013 appendElement(this, dt);
33017 * @see org.xml.sax.ErrorHandler
33018 * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
33020 warning:function(error) {
33021 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
33023 error:function(error) {
33024 console.error('[xmldom error]\t'+error,_locator(this.locator));
33026 fatalError:function(error) {
33027 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
33031 function _locator(l){
33033 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
33036 function _toString(chars,start,length){
33037 if(typeof chars == 'string'){
33038 return chars.substr(start,length)
33039 }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
33040 if(chars.length >= start+length || start){
33041 return new java.lang.String(chars,start,length)+'';
33048 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
33049 * used method of org.xml.sax.ext.LexicalHandler:
33050 * #comment(chars, start, length)
33053 * #startDTD(name, publicId, systemId)
33056 * IGNORED method of org.xml.sax.ext.LexicalHandler:
33058 * #startEntity(name)
33062 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
33063 * IGNORED method of org.xml.sax.ext.DeclHandler
33064 * #attributeDecl(eName, aName, type, mode, value)
33065 * #elementDecl(name, model)
33066 * #externalEntityDecl(name, publicId, systemId)
33067 * #internalEntityDecl(name, value)
33068 * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
33069 * IGNORED method of org.xml.sax.EntityResolver2
33070 * #resolveEntity(String name,String publicId,String baseURI,String systemId)
33071 * #resolveEntity(publicId, systemId)
33072 * #getExternalSubset(name, baseURI)
33073 * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
33074 * IGNORED method of org.xml.sax.DTDHandler
33075 * #notationDecl(name, publicId, systemId) {};
33076 * #unparsedEntityDecl(name, publicId, systemId, notationName) {};
33078 "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
33079 DOMHandler.prototype[key] = function(){return null};
33082 /* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */
33083 function appendElement (hander,node) {
33084 if (!hander.currentElement) {
33085 hander.doc.appendChild(node);
33087 hander.currentElement.appendChild(node);
33089 }//appendChild and setAttributeNS are preformance key
33091 //if(typeof require == 'function'){
33092 var XMLReader = sax.XMLReader;
33093 var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
33094 exports.XMLSerializer = dom.XMLSerializer ;
33095 exports.DOMParser = DOMParser;
33098 var domParser_1 = domParser.DOMImplementation;
33099 var domParser_2 = domParser.XMLSerializer;
33100 var domParser_3 = domParser.DOMParser;
33102 var domParser$1 = /*#__PURE__*/Object.freeze({
33103 default: domParser,
33104 __moduleExports: domParser,
33105 DOMImplementation: domParser_1,
33106 XMLSerializer: domParser_2,
33107 DOMParser: domParser_3
33110 var require$$0$1 = ( domParser$1 && domParser ) || domParser$1;
33112 var togeojson = createCommonjsModule(function (module, exports) {
33113 var toGeoJSON = (function() {
33115 var removeSpace = /\s*/g,
33116 trimSpace = /^\s*|\s*$/g,
33117 splitSpace = /\s+/;
33118 // generate a short, numeric hash of a string
33119 function okhash(x) {
33120 if (!x || !x.length) return 0;
33121 for (var i = 0, h = 0; i < x.length; i++) {
33122 h = ((h << 5) - h) + x.charCodeAt(i) | 0;
33125 // all Y children of X
33126 function get(x, y) { return x.getElementsByTagName(y); }
33127 function attr(x, y) { return x.getAttribute(y); }
33128 function attrf(x, y) { return parseFloat(attr(x, y)); }
33129 // one Y child of X, if any, otherwise null
33130 function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
33131 // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
33132 function norm(el) { if (el.normalize) { el.normalize(); } return el; }
33133 // cast array x into numbers
33134 function numarray(x) {
33135 for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
33138 // get the content of a text node, if any
33139 function nodeVal(x) {
33140 if (x) { norm(x); }
33141 return (x && x.textContent) || '';
33143 // get the contents of multiple text nodes, if present
33144 function getMulti(x, ys) {
33146 for (k = 0; k < ys.length; k++) {
33147 n = get1(x, ys[k]);
33148 if (n) o[ys[k]] = nodeVal(n);
33152 // add properties of Y to X, overwriting if present in both
33153 function extend(x, y) { for (var k in y) x[k] = y[k]; }
33154 // get one coordinate from a coordinate array, if any
33155 function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
33156 // get all coordinates from a coordinate array as [[],[]]
33157 function coord(v) {
33158 var coords = v.replace(trimSpace, '').split(splitSpace),
33160 for (var i = 0; i < coords.length; i++) {
33161 o.push(coord1(coords[i]));
33165 function coordPair(x) {
33166 var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
33167 ele = get1(x, 'ele'),
33168 // handle namespaced attribute in browser
33169 heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
33170 time = get1(x, 'time'),
33173 e = parseFloat(nodeVal(ele));
33180 time: time ? nodeVal(time) : null,
33181 heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
33185 // create a new feature collection parent object
33188 type: 'FeatureCollection',
33194 if (typeof XMLSerializer !== 'undefined') {
33195 /* istanbul ignore next */
33196 serializer = new XMLSerializer();
33197 // only require xmldom in a node environment
33198 } else if (typeof process === 'object' && !process.browser) {
33199 serializer = new (require$$0$1.XMLSerializer)();
33201 function xml2str(str) {
33202 // IE9 will create a new XMLSerializer but it'll crash immediately.
33203 // This line is ignored because we don't run coverage tests in IE9
33204 /* istanbul ignore next */
33205 if (str.xml !== undefined) return str.xml;
33206 return serializer.serializeToString(str);
33210 kml: function(doc) {
33213 // styleindex keeps track of hashed styles in order to match features
33214 styleIndex = {}, styleByHash = {},
33215 // stylemapindex keeps track of style maps to expose in properties
33216 styleMapIndex = {},
33217 // atomic geospatial types supported by KML - MultiGeometry is
33218 // handled separately
33219 geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
33220 // all root placemarks in the file
33221 placemarks = get(doc, 'Placemark'),
33222 styles = get(doc, 'Style'),
33223 styleMaps = get(doc, 'StyleMap');
33225 for (var k = 0; k < styles.length; k++) {
33226 var hash = okhash(xml2str(styles[k])).toString(16);
33227 styleIndex['#' + attr(styles[k], 'id')] = hash;
33228 styleByHash[hash] = styles[k];
33230 for (var l = 0; l < styleMaps.length; l++) {
33231 styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
33232 var pairs = get(styleMaps[l], 'Pair');
33234 for (var m = 0; m < pairs.length; m++) {
33235 pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
33237 styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
33240 for (var j = 0; j < placemarks.length; j++) {
33241 gj.features = gj.features.concat(getPlacemark(placemarks[j]));
33243 function kmlColor(v) {
33244 var color, opacity;
33246 if (v.substr(0, 1) === '#') { v = v.substr(1); }
33247 if (v.length === 6 || v.length === 3) { color = v; }
33248 if (v.length === 8) {
33249 opacity = parseInt(v.substr(0, 2), 16) / 255;
33250 color = '#' + v.substr(6, 2) +
33254 return [color, isNaN(opacity) ? undefined : opacity];
33256 function gxCoord(v) { return numarray(v.split(' ')); }
33257 function gxCoords(root) {
33258 var elems = get(root, 'coord', 'gx'), coords = [], times = [];
33259 if (elems.length === 0) elems = get(root, 'gx:coord');
33260 for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
33261 var timeElems = get(root, 'when');
33262 for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
33268 function getGeometry(root) {
33269 var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
33270 if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
33271 if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
33272 if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
33273 for (i = 0; i < geotypes.length; i++) {
33274 geomNodes = get(root, geotypes[i]);
33276 for (j = 0; j < geomNodes.length; j++) {
33277 geomNode = geomNodes[j];
33278 if (geotypes[i] === 'Point') {
33281 coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
33283 } else if (geotypes[i] === 'LineString') {
33285 type: 'LineString',
33286 coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
33288 } else if (geotypes[i] === 'Polygon') {
33289 var rings = get(geomNode, 'LinearRing'),
33291 for (k = 0; k < rings.length; k++) {
33292 coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
33296 coordinates: coords
33298 } else if (geotypes[i] === 'Track' ||
33299 geotypes[i] === 'gx:Track') {
33300 var track = gxCoords(geomNode);
33302 type: 'LineString',
33303 coordinates: track.coords
33305 if (track.times.length) coordTimes.push(track.times);
33312 coordTimes: coordTimes
33315 function getPlacemark(root) {
33316 var geomsAndTimes = getGeometry(root), i, properties = {},
33317 name = nodeVal(get1(root, 'name')),
33318 address = nodeVal(get1(root, 'address')),
33319 styleUrl = nodeVal(get1(root, 'styleUrl')),
33320 description = nodeVal(get1(root, 'description')),
33321 timeSpan = get1(root, 'TimeSpan'),
33322 timeStamp = get1(root, 'TimeStamp'),
33323 extendedData = get1(root, 'ExtendedData'),
33324 lineStyle = get1(root, 'LineStyle'),
33325 polyStyle = get1(root, 'PolyStyle'),
33326 visibility = get1(root, 'visibility');
33328 if (!geomsAndTimes.geoms.length) return [];
33329 if (name) properties.name = name;
33330 if (address) properties.address = address;
33332 if (styleUrl[0] !== '#') {
33333 styleUrl = '#' + styleUrl;
33336 properties.styleUrl = styleUrl;
33337 if (styleIndex[styleUrl]) {
33338 properties.styleHash = styleIndex[styleUrl];
33340 if (styleMapIndex[styleUrl]) {
33341 properties.styleMapHash = styleMapIndex[styleUrl];
33342 properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
33344 // Try to populate the lineStyle or polyStyle since we got the style hash
33345 var style = styleByHash[properties.styleHash];
33347 if (!lineStyle) lineStyle = get1(style, 'LineStyle');
33348 if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
33351 if (description) properties.description = description;
33353 var begin = nodeVal(get1(timeSpan, 'begin'));
33354 var end = nodeVal(get1(timeSpan, 'end'));
33355 properties.timespan = { begin: begin, end: end };
33358 properties.timestamp = nodeVal(get1(timeStamp, 'when'));
33361 var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
33362 color = linestyles[0],
33363 opacity = linestyles[1],
33364 width = parseFloat(nodeVal(get1(lineStyle, 'width')));
33365 if (color) properties.stroke = color;
33366 if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
33367 if (!isNaN(width)) properties['stroke-width'] = width;
33370 var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
33371 pcolor = polystyles[0],
33372 popacity = polystyles[1],
33373 fill = nodeVal(get1(polyStyle, 'fill')),
33374 outline = nodeVal(get1(polyStyle, 'outline'));
33375 if (pcolor) properties.fill = pcolor;
33376 if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
33377 if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
33378 if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
33380 if (extendedData) {
33381 var datas = get(extendedData, 'Data'),
33382 simpleDatas = get(extendedData, 'SimpleData');
33384 for (i = 0; i < datas.length; i++) {
33385 properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
33387 for (i = 0; i < simpleDatas.length; i++) {
33388 properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
33392 properties.visibility = nodeVal(visibility);
33394 if (geomsAndTimes.coordTimes.length) {
33395 properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
33396 geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
33400 geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
33401 type: 'GeometryCollection',
33402 geometries: geomsAndTimes.geoms
33404 properties: properties
33406 if (attr(root, 'id')) feature.id = attr(root, 'id');
33411 gpx: function(doc) {
33413 tracks = get(doc, 'trk'),
33414 routes = get(doc, 'rte'),
33415 waypoints = get(doc, 'wpt'),
33416 // a feature collection
33419 for (i = 0; i < tracks.length; i++) {
33420 feature = getTrack(tracks[i]);
33421 if (feature) gj.features.push(feature);
33423 for (i = 0; i < routes.length; i++) {
33424 feature = getRoute(routes[i]);
33425 if (feature) gj.features.push(feature);
33427 for (i = 0; i < waypoints.length; i++) {
33428 gj.features.push(getPoint(waypoints[i]));
33430 function getPoints(node, pointname) {
33431 var pts = get(node, pointname),
33436 if (l < 2) return {}; // Invalid line in GeoJSON
33437 for (var i = 0; i < l; i++) {
33438 var c = coordPair(pts[i]);
33439 line.push(c.coordinates);
33440 if (c.time) times.push(c.time);
33441 if (c.heartRate) heartRates.push(c.heartRate);
33446 heartRates: heartRates
33449 function getTrack(node) {
33450 var segments = get(node, 'trkseg'),
33455 for (var i = 0; i < segments.length; i++) {
33456 line = getPoints(segments[i], 'trkpt');
33458 if (line.line) track.push(line.line);
33459 if (line.times && line.times.length) times.push(line.times);
33460 if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
33463 if (track.length === 0) return;
33464 var properties = getProperties(node);
33465 extend(properties, getLineStyle(get1(node, 'extensions')));
33466 if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
33467 if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
33470 properties: properties,
33472 type: track.length === 1 ? 'LineString' : 'MultiLineString',
33473 coordinates: track.length === 1 ? track[0] : track
33477 function getRoute(node) {
33478 var line = getPoints(node, 'rtept');
33479 if (!line.line) return;
33480 var prop = getProperties(node);
33481 extend(prop, getLineStyle(get1(node, 'extensions')));
33486 type: 'LineString',
33487 coordinates: line.line
33492 function getPoint(node) {
33493 var prop = getProperties(node);
33494 extend(prop, getMulti(node, ['sym']));
33500 coordinates: coordPair(node).coordinates
33504 function getLineStyle(extensions) {
33507 var lineStyle = get1(extensions, 'line');
33509 var color = nodeVal(get1(lineStyle, 'color')),
33510 opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
33511 width = parseFloat(nodeVal(get1(lineStyle, 'width')));
33512 if (color) style.stroke = color;
33513 if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
33514 // GPX width is in mm, convert to px with 96 px per inch
33515 if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
33520 function getProperties(node) {
33521 var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
33522 links = get(node, 'link');
33523 if (links.length) prop.links = [];
33524 for (var i = 0, link; i < links.length; i++) {
33525 link = { href: attr(links[i], 'href') };
33526 extend(link, getMulti(links[i], ['text', 'type']));
33527 prop.links.push(link);
33537 module.exports = toGeoJSON;
33540 var _initialized = false;
33541 var _enabled = false;
33545 function svgData$$1(projection$$1, context, dispatch) {
33546 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
33547 var _showLabels = true;
33548 var detected = utilDetect();
33549 var layer = select(null);
33557 if (_initialized) return; // run once
33563 event.stopPropagation();
33564 event.preventDefault();
33565 event.dataTransfer.dropEffect = 'copy';
33569 .attr('dropzone', 'copy')
33570 .on('drop.svgData', function() {
33571 event.stopPropagation();
33572 event.preventDefault();
33573 if (!detected.filedrop) return;
33574 drawData.fileList(event.dataTransfer.files);
33576 .on('dragenter.svgData', over)
33577 .on('dragexit.svgData', over)
33578 .on('dragover.svgData', over);
33580 _initialized = true;
33584 function getService() {
33585 if (services.vectorTile && !_vtService) {
33586 _vtService = services.vectorTile;
33587 _vtService.event.on('loadedData', throttledRedraw);
33588 } else if (!services.vectorTile && _vtService) {
33596 function showLayer() {
33600 .style('opacity', 0)
33603 .style('opacity', 1)
33604 .on('end', function () { dispatch.call('change'); });
33608 function hideLayer() {
33609 throttledRedraw.cancel();
33614 .style('opacity', 0)
33615 .on('end', layerOff);
33619 function layerOn() {
33620 layer.style('display', 'block');
33624 function layerOff() {
33625 layer.selectAll('.viewfield-group').remove();
33626 layer.style('display', 'none');
33630 // ensure that all geojson features in a collection have IDs
33631 function ensureIDs(gj) {
33632 if (!gj) return null;
33634 if (gj.type === 'FeatureCollection') {
33635 for (var i = 0; i < gj.features.length; i++) {
33636 ensureFeatureID(gj.features[i]);
33639 ensureFeatureID(gj);
33645 // ensure that each single Feature object has a unique ID
33646 function ensureFeatureID(feature) {
33647 if (!feature) return;
33648 feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
33653 // Prefer an array of Features instead of a FeatureCollection
33654 function getFeatures(gj) {
33655 if (!gj) return [];
33657 if (gj.type === 'FeatureCollection') {
33658 return gj.features;
33665 function featureKey(d) {
33666 return d.__featurehash__;
33670 function isPolygon(d) {
33671 return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
33675 function clipPathID(d) {
33676 return 'data-' + d.__featurehash__ + '-clippath';
33680 function featureClasses(d) {
33682 'data' + d.__featurehash__,
33684 isPolygon(d) ? 'area' : '',
33685 d.__layerID__ || ''
33686 ].filter(Boolean).join(' ');
33690 function drawData(selection$$1) {
33691 var vtService = getService();
33692 var getPath = svgPath(projection$$1).geojson;
33693 var getAreaPath = svgPath(projection$$1, null, true).geojson;
33694 var hasData = drawData.hasData();
33696 layer = selection$$1.selectAll('.layer-mapdata')
33697 .data(_enabled && hasData ? [0] : []);
33702 layer = layer.enter()
33704 .attr('class', 'layer-mapdata')
33707 var surface = context.surface();
33708 if (!surface || surface.empty()) return; // not ready to draw yet, starting up
33712 var geoData, polygonData;
33713 if (_template && vtService) { // fetch data from vector tile service
33714 var sourceID = _template;
33715 vtService.loadTiles(sourceID, _template, projection$$1);
33716 geoData = vtService.data(sourceID, projection$$1);
33718 geoData = getFeatures(_geojson);
33720 geoData = geoData.filter(getPath);
33721 polygonData = geoData.filter(isPolygon);
33724 // Draw clip paths for polygons
33725 var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
33726 .data(polygonData, featureKey);
33731 var clipPathsEnter = clipPaths.enter()
33732 .append('clipPath')
33733 .attr('class', 'clipPath-data')
33734 .attr('id', clipPathID);
33739 clipPaths.merge(clipPathsEnter)
33741 .attr('d', getAreaPath);
33744 // Draw fill, shadow, stroke layers
33745 var datagroups = layer
33746 .selectAll('g.datagroup')
33747 .data(['fill', 'shadow', 'stroke']);
33749 datagroups = datagroups.enter()
33751 .attr('class', function(d) { return 'datagroup datagroup-' + d; })
33752 .merge(datagroups);
33762 var paths = datagroups
33764 .data(function(layer) { return pathData[layer]; }, featureKey);
33771 paths = paths.enter()
33773 .attr('class', function(d) {
33774 var datagroup = this.parentNode.__data__;
33775 return 'pathdata ' + datagroup + ' ' + featureClasses(d);
33777 .attr('clip-path', function(d) {
33778 var datagroup = this.parentNode.__data__;
33779 return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
33782 .attr('d', function(d) {
33783 var datagroup = this.parentNode.__data__;
33784 return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
33790 .call(drawLabels, 'label-halo', geoData)
33791 .call(drawLabels, 'label', geoData);
33794 function drawLabels(selection$$1, textClass, data) {
33795 var labelPath = d3_geoPath(projection$$1);
33796 var labelData = data.filter(function(d) {
33797 return _showLabels && d.properties && (d.properties.desc || d.properties.name);
33800 var labels = selection$$1.selectAll('text.' + textClass)
33801 .data(labelData, featureKey);
33808 labels = labels.enter()
33810 .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
33812 .text(function(d) {
33813 return d.properties.desc || d.properties.name;
33815 .attr('x', function(d) {
33816 var centroid = labelPath.centroid(d);
33817 return centroid[0] + 11;
33819 .attr('y', function(d) {
33820 var centroid = labelPath.centroid(d);
33821 return centroid[1];
33827 function getExtension(fileName) {
33828 if (!fileName) return;
33830 var re = /\.(gpx|kml|(geo)?json)$/i;
33831 var match = fileName.match(re);
33832 return match && match.length && match[0];
33836 function xmlToDom(textdata) {
33837 return (new DOMParser()).parseFromString(textdata, 'text/xml');
33841 drawData.setFile = function(extension, data) {
33848 switch (extension) {
33850 gj = togeojson.gpx(xmlToDom(data));
33853 gj = togeojson.kml(xmlToDom(data));
33857 gj = JSON.parse(data);
33861 if (!isEmpty(gj)) {
33862 _geojson = ensureIDs(gj);
33863 _src = extension + ' data file';
33867 dispatch.call('change');
33872 drawData.showLabels = function(val) {
33873 if (!arguments.length) return _showLabels;
33880 drawData.enabled = function(val) {
33881 if (!arguments.length) return _enabled;
33890 dispatch.call('change');
33895 drawData.hasData = function() {
33896 return !!(_template || !isEmpty(_geojson));
33900 drawData.template = function(val, src) {
33901 if (!arguments.length) return _template;
33903 // test source against OSM imagery blacklists..
33904 var osm = context.connection();
33906 var blacklists = osm.imageryBlacklists();
33911 for (var i = 0; i < blacklists.length; i++) {
33913 regex = new RegExp(blacklists[i]);
33914 fail = regex.test(val);
33922 // ensure at least one test was run.
33924 regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
33925 fail = regex.test(val);
33933 // strip off the querystring/hash from the template,
33934 // it often includes the access token
33935 _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
33937 dispatch.call('change');
33942 drawData.geojson = function(gj, src) {
33943 if (!arguments.length) return _geojson;
33950 if (!isEmpty(gj)) {
33951 _geojson = ensureIDs(gj);
33952 _src = src || 'unknown.geojson';
33955 dispatch.call('change');
33960 drawData.fileList = function(fileList) {
33961 if (!arguments.length) return _fileList;
33964 _fileList = fileList;
33968 if (!fileList || !fileList.length) return this;
33969 var f = fileList[0];
33970 var extension = getExtension(f.name);
33971 var reader = new FileReader();
33972 reader.onload = (function() {
33973 return function(e) {
33974 drawData.setFile(extension, e.target.result);
33978 reader.readAsText(f);
33984 drawData.url = function(url, defaultExtension) {
33990 // strip off any querystring/hash from the url before checking extension
33991 var testUrl = url.split(/[?#]/)[0];
33992 var extension = getExtension(testUrl) || defaultExtension;
33995 d3_text(url, function(err, data) {
33997 drawData.setFile(extension, data);
34000 drawData.template(url);
34007 drawData.getSrc = function() {
34012 drawData.fitZoom = function() {
34013 var features = getFeatures(_geojson);
34014 if (!features.length) return;
34016 var map = context.map();
34017 var viewport = map.trimmedExtent().polygon();
34018 var coords = reduce(features, function(coords, feature) {
34019 var c = feature.geometry.coordinates;
34021 /* eslint-disable no-fallthrough */
34022 switch (feature.geometry.type) {
34029 case 'MultiPolygon':
34032 case 'MultiLineString':
34036 /* eslint-enable no-fallthrough */
34038 return union(coords, c);
34041 if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
34042 var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
34043 map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
34054 function svgDebug$$1(projection, context) {
34056 function drawDebug(selection$$1) {
34057 var showsTile = context.getDebug('tile');
34058 var showsCollision = context.getDebug('collision');
34059 var showsImagery = context.getDebug('imagery');
34060 var showsCommunity = context.getDebug('community');
34061 var showsImperial = context.getDebug('imperial');
34062 var showsDriveLeft = context.getDebug('driveLeft');
34063 var showsTouchTargets = context.getDebug('target');
34065 var debugData = [];
34067 debugData.push({ class: 'red', label: 'tile' });
34069 if (showsCollision) {
34070 debugData.push({ class: 'yellow', label: 'collision' });
34072 if (showsImagery) {
34073 debugData.push({ class: 'orange', label: 'imagery' });
34075 if (showsCommunity) {
34076 debugData.push({ class: 'blue', label: 'community' });
34078 if (showsImperial) {
34079 debugData.push({ class: 'cyan', label: 'imperial' });
34081 if (showsDriveLeft) {
34082 debugData.push({ class: 'green', label: 'driveLeft' });
34084 if (showsTouchTargets) {
34085 debugData.push({ class: 'pink', label: 'touchTargets' });
34089 var legend = select('#content')
34090 .selectAll('.debug-legend')
34091 .data(debugData.length ? [0] : []);
34096 legend = legend.enter()
34098 .attr('class', 'fillD debug-legend')
34102 var legendItems = legend.selectAll('.debug-legend-item')
34103 .data(debugData, function(d) { return d.label; });
34108 legendItems.enter()
34110 .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
34111 .text(function(d) { return d.label; });
34114 var layer = selection$$1.selectAll('.layer-debug')
34115 .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft ? [0] : []);
34120 layer = layer.enter()
34122 .attr('class', 'layer-debug')
34126 var extent = context.map().extent();
34127 var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
34128 var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
34130 var imagery = layer.selectAll('path.debug-imagery')
34138 .attr('class', 'debug-imagery debug orange');
34141 var community = layer.selectAll('path.debug-community')
34142 .data(showsCommunity ? values$1(data.community.features) : []);
34149 .attr('class', 'debug-community debug blue');
34152 var imperial = layer
34153 .selectAll('path.debug-imperial')
34154 .data(showsImperial ? [dataImperial] : []);
34161 .attr('class', 'debug-imperial debug cyan');
34164 var driveLeft = layer
34165 .selectAll('path.debug-drive-left')
34166 .data(showsDriveLeft ? [dataDriveLeft] : []);
34173 .attr('class', 'debug-drive-left debug green');
34177 layer.selectAll('path')
34178 .attr('d', svgPath(projection).geojson);
34182 // This looks strange because `enabled` methods on other layers are
34183 // chainable getter/setters, and this one is just a getter.
34184 drawDebug.enabled = function() {
34185 if (!arguments.length) {
34186 return context.getDebug('tile') ||
34187 context.getDebug('collision') ||
34188 context.getDebug('imagery') ||
34189 context.getDebug('imperial') ||
34190 context.getDebug('driveLeft') ||
34191 context.getDebug('target');
34202 A standalone SVG element that contains only a `defs` sub-element. To be
34203 used once globally, since defs IDs must be unique within a document.
34205 function svgDefs(context) {
34207 function drawDefs(selection$$1) {
34208 var defs = selection$$1.append('defs');
34213 .attr('id', 'oneway-marker')
34214 .attr('viewBox', '0 0 10 5')
34217 .attr('markerWidth', 2)
34218 .attr('markerHeight', 2)
34219 .attr('markerUnits', 'strokeWidth')
34220 .attr('orient', 'auto')
34222 .attr('class', 'oneway-marker-path')
34223 .attr('d', 'M 5,3 L 0,3 L 0,2 L 5,2 L 5,0 L 10,2.5 L 5,5 z')
34224 .attr('stroke', 'none')
34225 .attr('fill', '#000')
34226 .attr('opacity', '0.75');
34230 .attr('id', 'viewfield-marker')
34231 .attr('viewBox', '0 0 16 16')
34234 .attr('markerWidth', 4)
34235 .attr('markerHeight', 4)
34236 .attr('markerUnits', 'strokeWidth')
34237 .attr('orient', 'auto')
34239 .attr('class', 'viewfield-marker-path')
34240 .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
34241 .attr('fill', '#333')
34242 .attr('fill-opacity', '0.75')
34243 .attr('stroke', '#fff')
34244 .attr('stroke-width', '0.5px')
34245 .attr('stroke-opacity', '0.75');
34249 .attr('id', 'viewfield-marker-wireframe')
34250 .attr('viewBox', '0 0 16 16')
34253 .attr('markerWidth', 4)
34254 .attr('markerHeight', 4)
34255 .attr('markerUnits', 'strokeWidth')
34256 .attr('orient', 'auto')
34258 .attr('class', 'viewfield-marker-path')
34259 .attr('d', 'M 6,14 C 8,13.4 8,13.4 10,14 L 16,3 C 12,0 4,0 0,3 z')
34260 .attr('fill', 'none')
34261 .attr('stroke', '#fff')
34262 .attr('stroke-width', '0.5px')
34263 .attr('stroke-opacity', '0.75');
34266 var patterns = defs.selectAll('pattern')
34268 // pattern name, pattern image name
34269 ['wetland', 'wetland'],
34270 ['construction', 'construction'],
34271 ['cemetery', 'cemetery'],
34272 ['orchard', 'orchard'],
34273 ['farmland', 'farmland'],
34280 .attr('id', function (d) { return 'pattern-' + d[0]; })
34282 .attr('height', 32)
34283 .attr('patternUnits', 'userSpaceOnUse');
34290 .attr('height', 32)
34291 .attr('class', function (d) { return 'pattern-color-' + d[0]; });
34298 .attr('height', 32)
34299 .attr('xlink:href', function (d) {
34300 return context.imagePath('pattern/' + d[1] + '.png');
34304 defs.selectAll('clipPath')
34305 .data([12, 18, 20, 32, 45])
34307 .append('clipPath')
34308 .attr('id', function (d) { return 'clip-square-' + d; })
34312 .attr('width', function (d) { return d; })
34313 .attr('height', function (d) { return d; });
34315 // add symbol spritesheets
34317 .call(drawDefs.addSprites, [
34318 'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'community-sprite'
34323 drawDefs.addSprites = function(selection$$1, ids) {
34324 var spritesheets = selection$$1.selectAll('.spritesheet');
34325 var currData = spritesheets.data();
34326 var data = uniq(currData.concat(ids));
34332 .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
34333 .each(function(d) {
34334 var url = context.imagePath(d + '.svg');
34335 var node = select(this).node();
34337 .mimeType('image/svg+xml')
34338 .response(function(xhr) { return xhr.responseXML; })
34339 .get(function(err, svg) {
34342 select(svg.documentElement).attr('id', d).node()
34352 function svgIcon(name, svgklass, useklass) {
34353 return function drawIcon(selection) {
34354 selection.selectAll('svg')
34358 .attr('class', 'icon ' + (svgklass || ''))
34360 .attr('xlink:href', name)
34361 .attr('class', useklass);
34365 function svgLabels(projection$$1, context) {
34366 var path = d3_geoPath(projection$$1);
34367 var detected = utilDetect();
34368 var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
34369 var _rdrawn = rbush_1();
34370 var _rskipped = rbush_1();
34371 var _textWidthCache = {};
34372 var _entitybboxes = {};
34374 // Listed from highest to lowest priority
34376 ['line', 'aeroway', '*', 12],
34377 ['line', 'highway', 'motorway', 12],
34378 ['line', 'highway', 'trunk', 12],
34379 ['line', 'highway', 'primary', 12],
34380 ['line', 'highway', 'secondary', 12],
34381 ['line', 'highway', 'tertiary', 12],
34382 ['line', 'highway', '*', 12],
34383 ['line', 'railway', '*', 12],
34384 ['line', 'waterway', '*', 12],
34385 ['area', 'aeroway', '*', 12],
34386 ['area', 'amenity', '*', 12],
34387 ['area', 'building', '*', 12],
34388 ['area', 'historic', '*', 12],
34389 ['area', 'leisure', '*', 12],
34390 ['area', 'man_made', '*', 12],
34391 ['area', 'natural', '*', 12],
34392 ['area', 'shop', '*', 12],
34393 ['area', 'tourism', '*', 12],
34394 ['area', 'camp_site', '*', 12],
34395 ['point', 'aeroway', '*', 10],
34396 ['point', 'amenity', '*', 10],
34397 ['point', 'building', '*', 10],
34398 ['point', 'historic', '*', 10],
34399 ['point', 'leisure', '*', 10],
34400 ['point', 'man_made', '*', 10],
34401 ['point', 'natural', '*', 10],
34402 ['point', 'shop', '*', 10],
34403 ['point', 'tourism', '*', 10],
34404 ['point', 'camp_site', '*', 10],
34405 ['line', 'name', '*', 12],
34406 ['area', 'name', '*', 12],
34407 ['point', 'name', '*', 10]
34411 function blacklisted(preset) {
34412 var noIcons = ['building', 'landuse', 'natural'];
34413 return some(noIcons, function(s) {
34414 return preset.id.indexOf(s) >= 0;
34419 function get(array, prop) {
34420 return function(d, i) { return array[i][prop]; };
34424 function textWidth(text, size, elem) {
34425 var c = _textWidthCache[size];
34426 if (!c) c = _textWidthCache[size] = {};
34432 c[text] = elem.getComputedTextLength();
34436 var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
34437 if (str === null) {
34438 return size / 3 * 2 * text.length;
34440 return size / 3 * (2 * text.length + str.length);
34446 function drawLinePaths(selection, entities, filter, classes, labels) {
34447 var paths = selection.selectAll('path')
34449 .data(entities, osmEntity$$1.key);
34458 .style('stroke-width', get(labels, 'font-size'))
34459 .attr('id', function(d) { return 'labelpath-' + d.id; })
34460 .attr('class', classes)
34462 .attr('d', get(labels, 'lineString'));
34466 function drawLineLabels(selection, entities, filter, classes, labels) {
34467 var texts = selection.selectAll('text.' + classes)
34469 .data(entities, osmEntity$$1.key);
34478 .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
34479 .attr('dy', baselineHack ? '0.35em' : null)
34480 .append('textPath')
34481 .attr('class', 'textpath');
34484 selection.selectAll('text.' + classes).selectAll('.textpath')
34486 .data(entities, osmEntity$$1.key)
34487 .attr('startOffset', '50%')
34488 .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
34489 .text(utilDisplayNameForPath);
34493 function drawPointLabels(selection, entities, filter, classes, labels) {
34494 var texts = selection.selectAll('text.' + classes)
34496 .data(entities, osmEntity$$1.key);
34505 .attr('class', function(d, i) {
34506 return classes + ' ' + labels[i].classes + ' ' + d.id;
34509 .attr('x', get(labels, 'x'))
34510 .attr('y', get(labels, 'y'))
34511 .style('text-anchor', get(labels, 'textAnchor'))
34512 .text(utilDisplayName)
34513 .each(function(d, i) {
34514 textWidth(utilDisplayName(d), labels[i].height, this);
34519 function drawAreaLabels(selection, entities, filter, classes, labels) {
34520 entities = entities.filter(hasText);
34521 labels = labels.filter(hasText);
34522 drawPointLabels(selection, entities, filter, classes, labels);
34524 function hasText(d, i) {
34525 return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
34530 function drawAreaIcons(selection, entities, filter, classes, labels) {
34531 var icons = selection.selectAll('use.' + classes)
34533 .data(entities, osmEntity$$1.key);
34542 .attr('class', 'icon ' + classes)
34543 .attr('width', '17px')
34544 .attr('height', '17px')
34546 .attr('transform', get(labels, 'transform'))
34547 .attr('xlink:href', function(d) {
34548 var preset = context.presets().match(d, context.graph());
34549 var picon = preset && preset.icon;
34554 var isMaki = /^maki-/.test(picon);
34555 return '#' + picon + (isMaki ? '-15' : '');
34561 function drawCollisionBoxes(selection, rtree, which) {
34562 var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
34565 if (context.getDebug('collision')) {
34566 gj = rtree.all().map(function(d) {
34567 return { type: 'Polygon', coordinates: [[
34577 var boxes = selection.selectAll('.' + which)
34587 .attr('class', classes)
34589 .attr('d', d3_geoPath());
34593 function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
34594 var wireframe = context.surface().classed('fill-wireframe');
34595 var zoom = geoScaleToZoom(projection$$1.scale());
34597 var labelable = [];
34598 var renderNodeAs = {};
34599 var i, j, k, entity, geometry;
34601 for (i = 0; i < labelStack.length; i++) {
34602 labelable.push([]);
34608 _entitybboxes = {};
34611 for (i = 0; i < entities.length; i++) {
34612 entity = entities[i];
34614 .concat(_entitybboxes[entity.id] || [])
34615 .concat(_entitybboxes[entity.id + 'I'] || []);
34617 for (j = 0; j < toRemove.length; j++) {
34618 _rdrawn.remove(toRemove[j]);
34619 _rskipped.remove(toRemove[j]);
34624 // Loop through all the entities to do some preprocessing
34625 for (i = 0; i < entities.length; i++) {
34626 entity = entities[i];
34627 geometry = entity.geometry(graph);
34629 // Insert collision boxes around interesting points/vertices
34630 if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
34631 var hasDirections = entity.directions(graph, projection$$1).length;
34634 if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
34635 renderNodeAs[entity.id] = 'point';
34636 markerPadding = 20; // extra y for marker height
34638 renderNodeAs[entity.id] = 'vertex';
34642 var coord = projection$$1(entity.loc);
34643 var nodePadding = 10;
34645 minX: coord[0] - nodePadding,
34646 minY: coord[1] - nodePadding - markerPadding,
34647 maxX: coord[0] + nodePadding,
34648 maxY: coord[1] + nodePadding
34651 doInsert(bbox, entity.id + 'P');
34654 // From here on, treat vertices like points
34655 if (geometry === 'vertex') {
34656 geometry = 'point';
34659 // Determine which entities are label-able
34660 var preset = geometry === 'area' && context.presets().match(entity, graph);
34661 var icon = preset && !blacklisted(preset) && preset.icon;
34663 if (!icon && !utilDisplayName(entity))
34666 for (k = 0; k < labelStack.length; k++) {
34667 var matchGeom = labelStack[k][0];
34668 var matchKey = labelStack[k][1];
34669 var matchVal = labelStack[k][2];
34670 var hasVal = entity.tags[matchKey];
34672 if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
34673 labelable[k].push(entity);
34691 // Try and find a valid label for labellable entities
34692 for (k = 0; k < labelable.length; k++) {
34693 var fontSize = labelStack[k][3];
34695 for (i = 0; i < labelable[k].length; i++) {
34696 entity = labelable[k][i];
34697 geometry = entity.geometry(graph);
34699 var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
34700 var name = getName(entity);
34701 var width = name && textWidth(name, fontSize);
34704 if (geometry === 'point' || geometry === 'vertex') {
34705 // no point or vertex labels in wireframe mode
34706 // no vertex labels at low zooms (vertices have no icons)
34707 if (wireframe) continue;
34708 var renderAs = renderNodeAs[entity.id];
34709 if (renderAs === 'vertex' && zoom < 17) continue;
34711 p = getPointLabel(entity, width, fontSize, renderAs);
34713 } else if (geometry === 'line') {
34714 p = getLineLabel(entity, width, fontSize);
34716 } else if (geometry === 'area') {
34717 p = getAreaLabel(entity, width, fontSize);
34721 if (geometry === 'vertex') { geometry = 'point'; } // treat vertex like point
34722 p.classes = geometry + ' tag-' + labelStack[k][1];
34723 positions[geometry].push(p);
34724 labelled[geometry].push(entity);
34730 function isInterestingVertex(entity) {
34731 var selectedIDs = context.selectedIDs();
34733 return entity.hasInterestingTags() ||
34734 entity.isEndpoint(graph) ||
34735 entity.isConnected(graph) ||
34736 selectedIDs.indexOf(entity.id) !== -1 ||
34737 some(graph.parentWays(entity), function(parent) {
34738 return selectedIDs.indexOf(parent.id) !== -1;
34743 function getPointLabel(entity, width, height, geometry) {
34744 var y = (geometry === 'point' ? -12 : 0);
34745 var pointOffsets = {
34746 ltr: [15, y, 'start'],
34747 rtl: [-15, y, 'end']
34750 var coord = projection$$1(entity.loc);
34751 var textPadding = 2;
34752 var offset = pointOffsets[textDirection];
34756 x: coord[0] + offset[0],
34757 y: coord[1] + offset[1],
34758 textAnchor: offset[2]
34761 // insert a collision box for the text label..
34763 if (textDirection === 'rtl') {
34765 minX: p.x - width - textPadding,
34766 minY: p.y - (height / 2) - textPadding,
34767 maxX: p.x + textPadding,
34768 maxY: p.y + (height / 2) + textPadding
34772 minX: p.x - textPadding,
34773 minY: p.y - (height / 2) - textPadding,
34774 maxX: p.x + width + textPadding,
34775 maxY: p.y + (height / 2) + textPadding
34779 if (tryInsert([bbox], entity.id, true)) {
34785 function getLineLabel(entity, width, height) {
34786 var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
34787 var points = map$3(graph.childNodes(entity), 'loc').map(projection$$1);
34788 var length = geoPathLength(points);
34790 if (length < width + 20) return;
34792 // todo: properly clip points to viewport
34794 // % along the line to attempt to place the label
34795 var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
34796 25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
34799 for (var i = 0; i < lineOffsets.length; i++) {
34800 var offset = lineOffsets[i];
34801 var middle = offset / 100 * length;
34802 var start = middle - width / 2;
34804 if (start < 0 || start + width > length) continue;
34806 // generate subpath and ignore paths that are invalid or don't cross viewport.
34807 var sub = subpath(points, start, start + width);
34808 if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
34812 var isReverse = reverse(sub);
34814 sub = sub.reverse();
34818 var boxsize = (height + 2) / 2;
34820 for (var j = 0; j < sub.length - 1; j++) {
34822 var b = sub[j + 1];
34824 // split up the text into small collision boxes
34825 var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
34827 for (var box = 0; box < num; box++) {
34828 var p = geoVecInterp(a, b, box / num);
34829 var x0 = p[0] - boxsize - padding;
34830 var y0 = p[1] - boxsize - padding;
34831 var x1 = p[0] + boxsize + padding;
34832 var y1 = p[1] + boxsize + padding;
34835 minX: Math.min(x0, x1),
34836 minY: Math.min(y0, y1),
34837 maxX: Math.max(x0, x1),
34838 maxY: Math.max(y0, y1)
34843 if (tryInsert(bboxes, entity.id, false)) { // accept this one
34845 'font-size': height + 2,
34846 lineString: lineString(sub),
34847 startOffset: offset + '%'
34852 function reverse(p) {
34853 var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
34854 return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
34857 function lineString(points) {
34858 return 'M' + points.join('L');
34861 function subpath(points, from, to) {
34863 var start, end, i0, i1;
34865 for (var i = 0; i < points.length - 1; i++) {
34867 var b = points[i + 1];
34868 var current = geoVecLength(a, b);
34870 if (!start && sofar + current >= from) {
34871 portion = (from - sofar) / current;
34873 a[0] + portion * (b[0] - a[0]),
34874 a[1] + portion * (b[1] - a[1])
34878 if (!end && sofar + current >= to) {
34879 portion = (to - sofar) / current;
34881 a[0] + portion * (b[0] - a[0]),
34882 a[1] + portion * (b[1] - a[1])
34889 var result = points.slice(i0, i1);
34890 result.unshift(start);
34897 function getAreaLabel(entity, width, height) {
34898 var centroid = path.centroid(entity.asGeoJSON(graph, true));
34899 var extent = entity.extent(graph);
34900 var areaWidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
34902 if (isNaN(centroid[0]) || areaWidth < 20) return;
34904 var preset = context.presets().match(entity, context.graph());
34905 var picon = preset && preset.icon;
34910 if (picon) { // icon and label..
34912 addLabel(iconSize + padding);
34915 } else { // label only..
34922 function addIcon() {
34923 var iconX = centroid[0] - (iconSize / 2);
34924 var iconY = centroid[1] - (iconSize / 2);
34928 maxX: iconX + iconSize,
34929 maxY: iconY + iconSize
34932 if (tryInsert([bbox], entity.id + 'I', true)) {
34933 p.transform = 'translate(' + iconX + ',' + iconY + ')';
34939 function addLabel(yOffset) {
34940 if (width && areaWidth >= width + 20) {
34941 var labelX = centroid[0];
34942 var labelY = centroid[1] + yOffset;
34944 minX: labelX - (width / 2) - padding,
34945 minY: labelY - (height / 2) - padding,
34946 maxX: labelX + (width / 2) + padding,
34947 maxY: labelY + (height / 2) + padding
34950 if (tryInsert([bbox], entity.id, true)) {
34953 p.textAnchor = 'middle';
34963 // force insert a singular bounding box
34964 // singular box only, no array, id better be unique
34965 function doInsert(bbox, id) {
34968 var oldbox = _entitybboxes[id];
34970 _rdrawn.remove(oldbox);
34972 _entitybboxes[id] = bbox;
34973 _rdrawn.insert(bbox);
34977 function tryInsert(bboxes, id, saveSkipped) {
34978 var skipped = false;
34980 for (var i = 0; i < bboxes.length; i++) {
34981 var bbox = bboxes[i];
34984 // Check that label is visible
34985 if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
34989 if (_rdrawn.collides(bbox)) {
34995 _entitybboxes[id] = bboxes;
34999 _rskipped.load(bboxes);
35002 _rdrawn.load(bboxes);
35009 var layer = selection.selectAll('.layer-labels');
35010 var halo = layer.selectAll('.layer-labels-halo');
35011 var label = layer.selectAll('.layer-labels-label');
35012 var debug = layer.selectAll('.layer-labels-debug');
35015 drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
35016 drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
35019 drawLinePaths(halo, labelled.line, filter, '', positions.line);
35020 drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
35021 drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
35024 drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
35025 drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
35026 drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
35027 drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
35030 drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
35031 drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
35033 layer.call(filterLabels);
35037 function filterLabels(selection) {
35038 var layers = selection
35039 .selectAll('.layer-labels-label, .layer-labels-halo');
35041 layers.selectAll('.nolabel')
35042 .classed('nolabel', false);
35044 var mouse = context.mouse();
35045 var graph = context.graph();
35046 var selectedIDs = context.selectedIDs();
35050 // hide labels near the mouse
35053 bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
35054 ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
35057 // hide labels on selected nodes (they look weird when dragging / haloed)
35058 for (var i = 0; i < selectedIDs.length; i++) {
35059 var entity = graph.hasEntity(selectedIDs[i]);
35060 if (entity && entity.type === 'node') {
35061 ids.push(selectedIDs[i]);
35065 layers.selectAll(utilEntitySelector(ids))
35066 .classed('nolabel', true);
35069 // draw the mouse bbox if debugging is on..
35070 var debug = selection.selectAll('.layer-labels-debug');
35072 if (context.getDebug('collision')) {
35076 [bbox.minX, bbox.minY],
35077 [bbox.maxX, bbox.minY],
35078 [bbox.maxX, bbox.maxY],
35079 [bbox.minX, bbox.maxY],
35080 [bbox.minX, bbox.minY]
35085 var box = debug.selectAll('.debug-mouse')
35095 .attr('class', 'debug debug-mouse yellow')
35097 .attr('d', d3_geoPath());
35101 var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
35104 drawLabels.observe = function(selection) {
35105 var listener = function() { throttleFilterLabels(selection); };
35106 selection.on('mousemove.hidelabels', listener);
35107 context.on('enter.hidelabels', listener);
35111 drawLabels.off = function(selection) {
35112 throttleFilterLabels.cancel();
35113 selection.on('mousemove.hidelabels', null);
35114 context.on('enter.hidelabels', null);
35121 function svgStreetside$$1(projection, context, dispatch) {
35122 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35124 var minMarkerZoom = 16;
35125 var minViewfieldZoom = 18;
35126 var layer = select(null);
35127 var _viewerYaw = 0;
35128 var _selectedSequence = null;
35129 var _hoveredBubble = null;
35136 if (svgStreetside$$1.initialized) return; // run once
35137 svgStreetside$$1.enabled = false;
35138 svgStreetside$$1.initialized = true;
35144 function getService() {
35145 if (services.streetside && !_streetside) {
35146 _streetside = services.streetside;
35148 .on('viewerChanged', viewerChanged)
35149 .on('loadedBubbles', throttledRedraw);
35150 } else if (!services.streetside && _streetside) {
35151 _streetside = null;
35154 return _streetside;
35160 function showLayer() {
35161 var service = getService();
35162 if (!service) return;
35164 service.loadViewer(context);
35168 .style('opacity', 0)
35171 .style('opacity', 1)
35172 .on('end', function () { dispatch.call('change'); });
35178 function hideLayer() {
35179 var service = getService();
35181 service.hideViewer();
35184 throttledRedraw.cancel();
35189 .style('opacity', 0)
35190 .on('end', editOff);
35196 function editOn() {
35197 layer.style('display', 'block');
35203 function editOff() {
35204 layer.selectAll('.viewfield-group').remove();
35205 layer.style('display', 'none');
35209 * click() Handles 'bubble' point click event.
35211 function click(d) {
35212 var service = getService();
35213 if (!service) return;
35215 // try to preserve the viewer rotation when staying on the same sequence
35216 if (d.sequenceKey !== _selectedSequence) {
35217 _viewerYaw = 0; // reset
35219 _selectedSequence = d.sequenceKey;
35223 .then(function(r) {
35224 if (r.status === 'ok'){
35225 service.showViewer(_viewerYaw);
35230 context.map().centerEase(d.loc);
35236 function mouseover(d) {
35237 var service = getService();
35238 _hoveredBubble = d;
35239 if (service) service.setStyles(d, true);
35245 function mouseout() {
35246 var service = getService();
35247 _hoveredBubble = null;
35248 if (service) service.setStyles(null, true);
35254 function transform(d) {
35255 var t = svgPointTransform(projection)(d);
35256 var rot = d.ca + _viewerYaw;
35258 t += ' rotate(' + Math.floor(rot) + ',0,0)';
35264 function viewerChanged() {
35265 var service = getService();
35266 if (!service) return;
35268 var viewer = service.viewer();
35269 if (!viewer) return;
35271 // update viewfield rotation
35272 _viewerYaw = viewer.getYaw();
35274 // avoid updating if the map is currently transformed
35275 // e.g. during drags or easing.
35276 if (context.map().isTransformed()) return;
35278 layer.selectAll('.viewfield-group.selected')
35279 .attr('transform', transform);
35286 function update() {
35287 var viewer = select('#photoviewer');
35288 var selected = viewer.empty() ? undefined : viewer.datum();
35289 var z = ~~context.map().zoom();
35290 var showMarkers = (z >= minMarkerZoom);
35291 var showViewfields = (z >= minViewfieldZoom);
35292 var service = getService();
35294 var sequences = (service ? service.sequences(projection) : []);
35295 var bubbles = (service && showMarkers ? service.bubbles(projection) : []);
35297 var traces = layer.selectAll('.sequences').selectAll('.sequence')
35298 .data(sequences, function(d) { return d.properties.key; });
35305 traces = traces.enter()
35307 .attr('class', 'sequence')
35309 .attr('d', svgPath(projection).geojson);
35312 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
35313 .data(bubbles, function(d) {
35314 // force reenter once bubbles are attached to a sequence
35315 return d.key + (d.sequenceKey ? 'v1' : 'v0');
35323 var groupsEnter = groups.enter()
35325 .attr('class', 'viewfield-group')
35326 .on('mouseover', mouseover)
35327 .on('mouseout', mouseout)
35328 .on('click', click);
35332 .attr('class', 'viewfield-scale');
35335 var markers = groups
35336 .merge(groupsEnter)
35337 .sort(function(a, b) {
35338 return (a === selected) ? 1
35339 : (b === selected) ? -1
35340 : b.loc[1] - a.loc[1];
35342 .attr('transform', transform)
35343 .select('.viewfield-scale');
35346 markers.selectAll('circle')
35354 var viewfields = markers.selectAll('.viewfield')
35355 .data(showViewfields ? [0] : []);
35360 // viewfields may or may not be drawn...
35361 // but if they are, draw below the circles
35363 .insert('path', 'circle')
35364 .attr('class', 'viewfield')
35365 .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
35366 .attr('d', viewfieldPath);
35370 service.setStyles(_hoveredBubble, true);
35374 function viewfieldPath() {
35375 var d = this.parentNode.__data__;
35377 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
35379 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
35387 * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
35388 * 'svgStreetside()' is called from index.js
35390 function drawImages(selection$$1) {
35391 var enabled = svgStreetside$$1.enabled;
35392 var service = getService();
35394 layer = selection$$1.selectAll('.layer-streetside-images')
35395 .data(service ? [0] : []);
35400 var layerEnter = layer.enter()
35402 .attr('class', 'layer-streetside-images')
35403 .style('display', enabled ? 'block' : 'none');
35407 .attr('class', 'sequences');
35411 .attr('class', 'markers');
35417 if (service && ~~context.map().zoom() >= minZoom) {
35420 service.loadBubbles(projection);
35429 * drawImages.enabled().
35431 drawImages.enabled = function(_) {
35432 if (!arguments.length) return svgStreetside$$1.enabled;
35433 svgStreetside$$1.enabled = _;
35434 if (svgStreetside$$1.enabled) {
35439 dispatch.call('change');
35444 * drawImages.supported().
35446 drawImages.supported = function() {
35447 return !!getService();
35455 function svgMapillaryImages$$1(projection, context, dispatch) {
35456 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35458 var minMarkerZoom = 16;
35459 var minViewfieldZoom = 18;
35460 var layer = select(null);
35462 var viewerCompassAngle;
35466 if (svgMapillaryImages$$1.initialized) return; // run once
35467 svgMapillaryImages$$1.enabled = false;
35468 svgMapillaryImages$$1.initialized = true;
35472 function getService() {
35473 if (services.mapillary && !_mapillary) {
35474 _mapillary = services.mapillary;
35475 _mapillary.event.on('loadedImages', throttledRedraw);
35476 _mapillary.event.on('bearingChanged', function(e) {
35477 viewerCompassAngle = e;
35479 // avoid updating if the map is currently transformed
35480 // e.g. during drags or easing.
35481 if (context.map().isTransformed()) return;
35483 layer.selectAll('.viewfield-group.selected')
35484 .filter(function(d) {
35487 .attr('transform', transform);
35489 } else if (!services.mapillary && _mapillary) {
35497 function showLayer() {
35498 var service = getService();
35499 if (!service) return;
35501 service.loadViewer(context);
35505 .style('opacity', 0)
35508 .style('opacity', 1)
35509 .on('end', function () { dispatch.call('change'); });
35513 function hideLayer() {
35514 var service = getService();
35516 service.hideViewer();
35519 throttledRedraw.cancel();
35524 .style('opacity', 0)
35525 .on('end', editOff);
35529 function editOn() {
35530 layer.style('display', 'block');
35534 function editOff() {
35535 layer.selectAll('.viewfield-group').remove();
35536 layer.style('display', 'none');
35540 function click(d) {
35541 var service = getService();
35542 if (!service) return;
35546 .updateViewer(d.key, context)
35549 context.map().centerEase(d.loc);
35553 function mouseover(d) {
35554 var service = getService();
35555 if (service) service.setStyles(d);
35559 function mouseout() {
35560 var service = getService();
35561 if (service) service.setStyles(null);
35565 function transform(d) {
35566 var t = svgPointTransform(projection)(d);
35567 if (d.pano && isNumber(viewerCompassAngle)) {
35568 t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
35570 t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
35576 function update() {
35577 var viewer = select('#photoviewer');
35578 var selected = viewer.empty() ? undefined : viewer.datum();
35580 var z = ~~context.map().zoom();
35581 var showMarkers = (z >= minMarkerZoom);
35582 var showViewfields = (z >= minViewfieldZoom);
35584 var service = getService();
35585 var sequences = (service ? service.sequences(projection) : []);
35586 var images = (service && showMarkers ? service.images(projection) : []);
35588 var traces = layer.selectAll('.sequences').selectAll('.sequence')
35589 .data(sequences, function(d) { return d.properties.key; });
35596 traces = traces.enter()
35598 .attr('class', 'sequence')
35600 .attr('d', svgPath(projection).geojson);
35603 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
35604 .data(images, function(d) { return d.key; });
35611 var groupsEnter = groups.enter()
35613 .attr('class', 'viewfield-group')
35614 .on('mouseover', mouseover)
35615 .on('mouseout', mouseout)
35616 .on('click', click);
35620 .attr('class', 'viewfield-scale');
35623 var markers = groups
35624 .merge(groupsEnter)
35625 .sort(function(a, b) {
35626 return (a === selected) ? 1
35627 : (b === selected) ? -1
35628 : b.loc[1] - a.loc[1]; // sort Y
35630 .attr('transform', transform)
35631 .select('.viewfield-scale');
35634 markers.selectAll('circle')
35642 var viewfields = markers.selectAll('.viewfield')
35643 .data(showViewfields ? [0] : []);
35648 viewfields.enter() // viewfields may or may not be drawn...
35649 .insert('path', 'circle') // but if they are, draw below the circles
35650 .attr('class', 'viewfield')
35651 .classed('pano', function() { return this.parentNode.__data__.pano; })
35652 .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
35653 .attr('d', viewfieldPath);
35655 function viewfieldPath() {
35656 var d = this.parentNode.__data__;
35658 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
35660 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
35666 function drawImages(selection$$1) {
35667 var enabled = svgMapillaryImages$$1.enabled,
35668 service = getService();
35670 layer = selection$$1.selectAll('.layer-mapillary-images')
35671 .data(service ? [0] : []);
35676 var layerEnter = layer.enter()
35678 .attr('class', 'layer-mapillary-images')
35679 .style('display', enabled ? 'block' : 'none');
35683 .attr('class', 'sequences');
35687 .attr('class', 'markers');
35693 if (service && ~~context.map().zoom() >= minZoom) {
35696 service.loadImages(projection);
35704 drawImages.enabled = function(_) {
35705 if (!arguments.length) return svgMapillaryImages$$1.enabled;
35706 svgMapillaryImages$$1.enabled = _;
35707 if (svgMapillaryImages$$1.enabled) {
35712 dispatch.call('change');
35717 drawImages.supported = function() {
35718 return !!getService();
35726 function svgMapillarySigns$$1(projection, context, dispatch) {
35727 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35729 var layer = select(null);
35734 if (svgMapillarySigns$$1.initialized) return; // run once
35735 svgMapillarySigns$$1.enabled = false;
35736 svgMapillarySigns$$1.initialized = true;
35740 function getService() {
35741 if (services.mapillary && !_mapillary) {
35742 _mapillary = services.mapillary;
35743 _mapillary.event.on('loadedSigns', throttledRedraw);
35744 } else if (!services.mapillary && _mapillary) {
35751 function showLayer() {
35752 var service = getService();
35753 if (!service) return;
35755 service.loadViewer(context);
35760 function hideLayer() {
35761 throttledRedraw.cancel();
35766 function editOn() {
35767 layer.style('display', 'block');
35771 function editOff() {
35772 layer.selectAll('.icon-sign').remove();
35773 layer.style('display', 'none');
35777 function click(d) {
35778 var service = getService();
35779 if (!service) return;
35781 context.map().centerEase(d.loc);
35783 var selected = service.getSelectedImage();
35784 var selectedImageKey = selected && selected.key;
35787 // Pick one of the images the sign was detected in,
35788 // preference given to an image already selected.
35789 d.detections.forEach(function(detection) {
35790 if (!imageKey || selectedImageKey === detection.image_key) {
35791 imageKey = detection.image_key;
35796 .selectImage(null, imageKey)
35797 .updateViewer(imageKey, context)
35802 function update() {
35803 var service = getService();
35804 var data = (service ? service.signs(projection) : []);
35805 var viewer = select('#photoviewer');
35806 var selected = viewer.empty() ? undefined : viewer.datum();
35807 var selectedImageKey = selected && selected.key;
35808 var transform = svgPointTransform(projection);
35810 var signs = layer.selectAll('.icon-sign')
35811 .data(data, function(d) { return d.key; });
35818 var enter = signs.enter()
35820 .attr('class', 'icon-sign')
35821 .attr('width', '24px')
35822 .attr('height', '24px')
35823 .attr('x', '-12px')
35824 .attr('y', '-12px')
35825 .attr('xlink:href', function(d) { return '#' + d.value; })
35826 .classed('selected', function(d) {
35827 return some(d.detections, function(detection) {
35828 return detection.image_key === selectedImageKey;
35831 .on('click', click);
35836 .sort(function(a, b) {
35837 return (a === selected) ? 1
35838 : (b === selected) ? -1
35839 : b.loc[1] - a.loc[1]; // sort Y
35841 .attr('transform', transform);
35845 function drawSigns(selection$$1) {
35846 var enabled = svgMapillarySigns$$1.enabled;
35847 var service = getService();
35849 layer = selection$$1.selectAll('.layer-mapillary-signs')
35850 .data(service ? [0] : []);
35855 layer = layer.enter()
35857 .attr('class', 'layer-mapillary-signs')
35858 .style('display', enabled ? 'block' : 'none')
35862 if (service && ~~context.map().zoom() >= minZoom) {
35865 service.loadSigns(context, projection);
35873 drawSigns.enabled = function(_) {
35874 if (!arguments.length) return svgMapillarySigns$$1.enabled;
35875 svgMapillarySigns$$1.enabled = _;
35876 if (svgMapillarySigns$$1.enabled) {
35881 dispatch.call('change');
35886 drawSigns.supported = function() {
35887 return !!getService();
35895 function svgOpenstreetcamImages$$1(projection, context, dispatch) {
35896 var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35898 var minMarkerZoom = 16;
35899 var minViewfieldZoom = 18;
35900 var layer = select(null);
35901 var _openstreetcam;
35905 if (svgOpenstreetcamImages$$1.initialized) return; // run once
35906 svgOpenstreetcamImages$$1.enabled = false;
35907 svgOpenstreetcamImages$$1.initialized = true;
35911 function getService() {
35912 if (services.openstreetcam && !_openstreetcam) {
35913 _openstreetcam = services.openstreetcam;
35914 _openstreetcam.event.on('loadedImages', throttledRedraw);
35915 } else if (!services.openstreetcam && _openstreetcam) {
35916 _openstreetcam = null;
35919 return _openstreetcam;
35923 function showLayer() {
35924 var service = getService();
35925 if (!service) return;
35927 service.loadViewer(context);
35931 .style('opacity', 0)
35934 .style('opacity', 1)
35935 .on('end', function () { dispatch.call('change'); });
35939 function hideLayer() {
35940 var service = getService();
35942 service.hideViewer();
35945 throttledRedraw.cancel();
35950 .style('opacity', 0)
35951 .on('end', editOff);
35955 function editOn() {
35956 layer.style('display', 'block');
35960 function editOff() {
35961 layer.selectAll('.viewfield-group').remove();
35962 layer.style('display', 'none');
35966 function click(d) {
35967 var service = getService();
35968 if (!service) return;
35975 context.map().centerEase(d.loc);
35979 function mouseover(d) {
35980 var service = getService();
35981 if (service) service.setStyles(d);
35985 function mouseout() {
35986 var service = getService();
35987 if (service) service.setStyles(null);
35991 function transform(d) {
35992 var t = svgPointTransform(projection)(d);
35994 t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
36000 function update() {
36001 var viewer = select('#photoviewer');
36002 var selected = viewer.empty() ? undefined : viewer.datum();
36004 var z = ~~context.map().zoom();
36005 var showMarkers = (z >= minMarkerZoom);
36006 var showViewfields = (z >= minViewfieldZoom);
36008 var service = getService();
36009 var sequences = (service ? service.sequences(projection) : []);
36010 var images = (service && showMarkers ? service.images(projection) : []);
36012 var traces = layer.selectAll('.sequences').selectAll('.sequence')
36013 .data(sequences, function(d) { return d.properties.key; });
36020 traces = traces.enter()
36022 .attr('class', 'sequence')
36024 .attr('d', svgPath(projection).geojson);
36027 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
36028 .data(images, function(d) { return d.key; });
36035 var groupsEnter = groups.enter()
36037 .attr('class', 'viewfield-group')
36038 .on('mouseover', mouseover)
36039 .on('mouseout', mouseout)
36040 .on('click', click);
36044 .attr('class', 'viewfield-scale');
36047 var markers = groups
36048 .merge(groupsEnter)
36049 .sort(function(a, b) {
36050 return (a === selected) ? 1
36051 : (b === selected) ? -1
36052 : b.loc[1] - a.loc[1]; // sort Y
36054 .attr('transform', transform)
36055 .select('.viewfield-scale');
36058 markers.selectAll('circle')
36066 var viewfields = markers.selectAll('.viewfield')
36067 .data(showViewfields ? [0] : []);
36072 viewfields.enter() // viewfields may or may not be drawn...
36073 .insert('path', 'circle') // but if they are, draw below the circles
36074 .attr('class', 'viewfield')
36075 .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
36076 .attr('d', 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z');
36080 function drawImages(selection$$1) {
36081 var enabled = svgOpenstreetcamImages$$1.enabled,
36082 service = getService();
36084 layer = selection$$1.selectAll('.layer-openstreetcam-images')
36085 .data(service ? [0] : []);
36090 var layerEnter = layer.enter()
36092 .attr('class', 'layer-openstreetcam-images')
36093 .style('display', enabled ? 'block' : 'none');
36097 .attr('class', 'sequences');
36101 .attr('class', 'markers');
36107 if (service && ~~context.map().zoom() >= minZoom) {
36110 service.loadImages(projection);
36118 drawImages.enabled = function(_) {
36119 if (!arguments.length) return svgOpenstreetcamImages$$1.enabled;
36120 svgOpenstreetcamImages$$1.enabled = _;
36121 if (svgOpenstreetcamImages$$1.enabled) {
36126 dispatch.call('change');
36131 drawImages.supported = function() {
36132 return !!getService();
36140 function svgOsm(projection, context, dispatch) {
36141 var enabled = true;
36144 function drawOsm(selection) {
36145 selection.selectAll('.layer-osm')
36146 .data(['covered', 'areas', 'lines', 'points', 'labels'])
36149 .attr('class', function(d) { return 'layer-osm layer-' + d; });
36151 selection.selectAll('.layer-areas').selectAll('.layer-areas-group')
36152 .data(['areas', 'targets'])
36155 .attr('class', function(d) { return 'layer-areas-group layer-areas-' + d; });
36157 selection.selectAll('.layer-lines').selectAll('.layer-lines-group')
36158 .data(['lines', 'targets'])
36161 .attr('class', function(d) { return 'layer-lines-group layer-lines-' + d; });
36163 selection.selectAll('.layer-points').selectAll('.layer-points-group')
36164 .data(['points', 'midpoints', 'vertices', 'turns', 'targets'])
36167 .attr('class', function(d) { return 'layer-points-group layer-points-' + d; });
36169 selection.selectAll('.layer-labels').selectAll('.layer-labels-group')
36170 .data(['halo', 'label', 'debug'])
36173 .attr('class', function(d) { return 'layer-labels-group layer-labels-' + d; });
36177 function showLayer() {
36178 var layer = context.surface().selectAll('.data-layer-osm');
36182 .classed('disabled', false)
36183 .style('opacity', 0)
36186 .style('opacity', 1)
36187 .on('end interrupt', function () {
36188 dispatch.call('change');
36193 function hideLayer() {
36194 var layer = context.surface().selectAll('.data-layer-osm');
36200 .style('opacity', 0)
36201 .on('end interrupt', function () {
36202 layer.classed('disabled', true);
36203 dispatch.call('change');
36208 drawOsm.enabled = function(_) {
36209 if (!arguments.length) return enabled;
36218 dispatch.call('change');
36226 function svgNotes$$1(projection, context, dispatch$$1) {
36227 if (!dispatch$$1) { dispatch$$1 = dispatch('change'); }
36228 var throttledRedraw = throttle(function () { dispatch$$1.call('change'); }, 1000);
36230 var layer = select(null);
36233 function markerPath(selection$$1, klass) {
36235 .attr('class', klass)
36236 .attr('transform', 'translate(-8, -22)')
36237 .attr('d', 'm17.5,0l-15,0c-1.37,0 -2.5,1.12 -2.5,2.5l0,11.25c0,1.37 1.12,2.5 2.5,2.5l3.75,0l0,3.28c0,0.38 0.43,0.6 0.75,0.37l4.87,-3.65l5.62,0c1.37,0 2.5,-1.12 2.5,-2.5l0,-11.25c0,-1.37 -1.12,-2.5 -2.5,-2.5z');
36241 if (svgNotes$$1.initialized) return; // run once
36242 svgNotes$$1.enabled = false;
36243 svgNotes$$1.initialized = true;
36246 function editOn() {
36247 layer.style('display', 'block');
36251 function editOff() {
36252 layer.selectAll('.note').remove();
36253 layer.style('display', 'none');
36257 function getService() {
36258 if (services.osm && !_notes) {
36259 _notes = services.osm;
36260 _notes.on('loadedNotes', throttledRedraw);
36261 } else if (!services.osm && _notes) {
36269 function showLayer() {
36273 .classed('disabled', false)
36274 .style('opacity', 0)
36277 .style('opacity', 1)
36278 .on('end interrupt', function () {
36279 dispatch$$1.call('change');
36284 function hideLayer() {
36287 throttledRedraw.cancel();
36293 .style('opacity', 0)
36294 .on('end interrupt', function () {
36295 layer.classed('disabled', true);
36296 dispatch$$1.call('change');
36302 function update() {
36303 var service = getService();
36304 var selectedID = context.selectedNoteID();
36305 var data = (service ? service.notes(projection) : []);
36306 var transform = svgPointTransform(projection);
36307 var notes = layer.selectAll('.note')
36308 .data(data, function(d) { return d.status + d.id; });
36315 var notesEnter = notes.enter()
36317 .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
36318 .classed('new', function(d) { return d.id < 0; });
36326 .attr('class', 'stroke');
36330 .call(markerPath, 'shadow');
36334 .attr('class', 'note-fill')
36335 .attr('width', '20px')
36336 .attr('height', '20px')
36338 .attr('y', '-22px')
36339 .attr('xlink:href', '#iD-icon-note');
36341 notesEnter.selectAll('.note-annotation')
36342 .data(function(d) { return [d]; })
36345 .attr('class', 'note-annotation')
36346 .attr('width', '10px')
36347 .attr('height', '10px')
36349 .attr('y', '-19px')
36350 .attr('xlink:href', function(d) {
36351 return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
36357 .sort(function(a, b) {
36358 return (a.id === selectedID) ? 1
36359 : (b.id === selectedID) ? -1
36360 : b.loc[1] - a.loc[1]; // sort Y
36362 .classed('selected', function(d) { return d.id === selectedID; })
36363 .attr('transform', transform);
36367 function drawNotes(selection$$1) {
36368 var enabled = svgNotes$$1.enabled;
36369 var service = getService();
36371 layer = selection$$1.selectAll('.layer-notes')
36372 .data(service ? [0] : []);
36379 .attr('class', 'layer-notes')
36380 .style('display', enabled ? 'block' : 'none')
36383 function dimensions() {
36384 return [window.innerWidth, window.innerHeight];
36388 if (service && ~~context.map().zoom() >= minZoom) {
36390 service.loadNotes(projection, dimensions());
36398 drawNotes.enabled = function(val) {
36399 if (!arguments.length) return svgNotes$$1.enabled;
36401 svgNotes$$1.enabled = val;
36402 if (svgNotes$$1.enabled) {
36406 if (context.selectedNoteID()) {
36407 context.enter(modeBrowse(context));
36411 dispatch$$1.call('change');
36419 function svgLayers(projection, context) {
36420 var dispatch$$1 = dispatch('change');
36421 var svg = select(null);
36423 { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
36424 { id: 'notes', layer: svgNotes$$1(projection, context, dispatch$$1) },
36425 { id: 'data', layer: svgData$$1(projection, context, dispatch$$1) },
36426 { id: 'streetside', layer: svgStreetside$$1(projection, context, dispatch$$1)},
36427 { id: 'mapillary-images', layer: svgMapillaryImages$$1(projection, context, dispatch$$1) },
36428 { id: 'mapillary-signs', layer: svgMapillarySigns$$1(projection, context, dispatch$$1) },
36429 { id: 'openstreetcam-images', layer: svgOpenstreetcamImages$$1(projection, context, dispatch$$1) },
36430 { id: 'debug', layer: svgDebug$$1(projection, context, dispatch$$1) }
36434 function drawLayers(selection$$1) {
36435 svg = selection$$1.selectAll('.surface')
36440 .attr('class', 'surface')
36443 var defs = svg.selectAll('.surface-defs')
36448 .attr('class', 'surface-defs');
36450 var groups = svg.selectAll('.data-layer')
36458 .attr('class', function(d) { return 'data-layer data-layer-' + d.id; })
36460 .each(function(d) { select(this).call(d.layer); });
36464 drawLayers.all = function() {
36469 drawLayers.layer = function(id) {
36470 var obj = find$1(layers, function(o) {return o.id === id;});
36471 return obj && obj.layer;
36475 drawLayers.only = function(what) {
36476 var arr = [].concat(what);
36477 drawLayers.remove(difference(map$3(layers, 'id'), arr));
36482 drawLayers.remove = function(what) {
36483 var arr = [].concat(what);
36484 arr.forEach(function(id) {
36485 layers = reject(layers, function(o) {return o.id === id;});
36487 dispatch$$1.call('change');
36492 drawLayers.add = function(what) {
36493 var arr = [].concat(what);
36494 arr.forEach(function(obj) {
36495 if ('id' in obj && 'layer' in obj) {
36499 dispatch$$1.call('change');
36504 drawLayers.dimensions = function(_) {
36505 if (!arguments.length) return utilGetDimensions(svg);
36506 utilSetDimensions(svg, _);
36511 return utilRebind(drawLayers, dispatch$$1, 'on');
36514 function svgLines$$1(projection, context) {
36515 var detected = utilDetect();
36517 var highway_stack = {
36533 function drawTargets(selection, graph, entities, filter$$1) {
36534 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
36535 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
36536 var getPath = svgPath(projection).geojson;
36537 var activeID = context.activeID();
36539 // The targets and nopes will be MultiLineString sub-segments of the ways
36540 var data = { targets: [], nopes: [] };
36542 entities.forEach(function(way) {
36543 var features = svgSegmentWay(way, graph, activeID);
36544 data.targets.push.apply(data.targets, features.passive);
36545 data.nopes.push.apply(data.nopes, features.active);
36549 // Targets allow hover and vertex snapping
36550 var targetData = data.targets.filter(getPath);
36551 var targets = selection.selectAll('.line.target-allowed')
36552 .filter(function(d) { return filter$$1(d.properties.entity); })
36553 .data(targetData, function key(d) { return d.id; });
36563 .attr('d', getPath)
36564 .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
36568 var nopeData = data.nopes.filter(getPath);
36569 var nopes = selection.selectAll('.line.target-nope')
36570 .filter(function(d) { return filter$$1(d.properties.entity); })
36571 .data(nopeData, function key(d) { return d.id; });
36581 .attr('d', getPath)
36582 .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
36586 function drawLines(selection, graph, entities, filter$$1) {
36588 function waystack(a, b) {
36589 var selected = context.selectedIDs();
36590 var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
36591 var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
36593 if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
36594 if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
36595 return scoreA - scoreB;
36599 function drawLineGroup(selection, klass, isSelected) {
36600 // Note: Don't add `.selected` class in draw modes
36601 var mode = context.mode();
36602 var isDrawing = mode && /^draw/.test(mode.id);
36603 var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
36605 var lines = selection
36608 .data(getPathData(isSelected), osmEntity$$1.key);
36613 // Optimization: Call expensive TagClasses only on enter selection. This
36614 // works because osmEntity.key is defined to include the entity v attribute.
36617 .attr('class', function(d) {
36618 var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
36619 return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
36621 .call(svgTagClasses())
36624 .attr('d', getPath)
36625 .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
36631 function getPathData(isSelected) {
36632 return function() {
36633 var layer = this.parentNode.__data__;
36634 var data = pathdata[layer] || [];
36635 return data.filter(function(d) {
36637 return context.selectedIDs().indexOf(d.id) !== -1;
36639 return context.selectedIDs().indexOf(d.id) === -1;
36645 var getPath = svgPath(projection, graph);
36648 var onewaydata = {};
36649 var oldMultiPolygonOuters = {};
36651 for (var i = 0; i < entities.length; i++) {
36652 var entity = entities[i];
36653 var outer = osmSimpleMultipolygonOuterMember(entity, graph);
36655 ways.push(entity.mergeTags(outer.tags));
36656 oldMultiPolygonOuters[outer.id] = true;
36657 } else if (entity.geometry(graph) === 'line') {
36662 ways = ways.filter(getPath);
36663 pathdata = groupBy(ways, function(way) { return way.layer(); });
36665 forOwn(pathdata, function(v, k) {
36666 var arr = filter(v, function(d) { return d.isOneWay(); });
36667 onewaydata[k] = flatten(map$3(arr, svgOneWaySegments(projection, graph, 35)));
36671 var covered = selection.selectAll('.layer-covered'); // under areas
36672 var uncovered = selection.selectAll('.layer-lines .layer-lines-lines'); // over areas
36674 [covered, uncovered].forEach(function(selection) {
36675 var range$$1 = (selection === covered ? range(-10,0) : range(0,11));
36676 var layergroup = selection
36677 .selectAll('g.layergroup')
36680 layergroup = layergroup.enter()
36682 .attr('class', function(d) { return 'layergroup layer' + String(d); })
36683 .merge(layergroup);
36686 .selectAll('g.linegroup')
36687 .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
36690 .attr('class', function(d) { return 'linegroup line-' + d; });
36692 layergroup.selectAll('g.line-shadow')
36693 .call(drawLineGroup, 'shadow', false);
36694 layergroup.selectAll('g.line-casing')
36695 .call(drawLineGroup, 'casing', false);
36696 layergroup.selectAll('g.line-stroke')
36697 .call(drawLineGroup, 'stroke', false);
36699 layergroup.selectAll('g.line-shadow-highlighted')
36700 .call(drawLineGroup, 'shadow', true);
36701 layergroup.selectAll('g.line-casing-highlighted')
36702 .call(drawLineGroup, 'casing', true);
36703 layergroup.selectAll('g.line-stroke-highlighted')
36704 .call(drawLineGroup, 'stroke', true);
36707 var onewaygroup = layergroup
36708 .selectAll('g.onewaygroup')
36711 onewaygroup = onewaygroup.enter()
36713 .attr('class', 'onewaygroup')
36714 .merge(onewaygroup);
36716 var oneways = onewaygroup
36720 function data() { return onewaydata[this.parentNode.__data__] || []; },
36721 function key(d) { return [d.id, d.index]; }
36727 oneways = oneways.enter()
36729 .attr('class', 'oneway')
36730 .attr('marker-mid', 'url(#oneway-marker)')
36732 .attr('d', function(d) { return d.d; });
36735 oneways.each(function() { this.parentNode.insertBefore(this, this); });
36740 selection.selectAll('.layer-lines .layer-lines-targets')
36741 .call(drawTargets, graph, ways, filter$$1);
36748 function svgMidpoints$$1(projection, context) {
36749 var targetRadius = 8;
36751 function drawTargets(selection, graph, entities, filter) {
36752 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
36753 var getTransform = svgPointTransform(projection).geojson;
36755 var data = entities.map(function(midpoint) {
36765 coordinates: midpoint.loc
36770 var targets = selection.selectAll('.midpoint.target')
36771 .filter(function(d) { return filter(d.properties.entity); })
36772 .data(data, function key(d) { return d.id; });
36781 .attr('r', targetRadius)
36783 .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
36784 .attr('transform', getTransform);
36788 function drawMidpoints(selection, graph, entities, filter, extent) {
36789 var layer = selection.selectAll('.layer-points .layer-points-midpoints');
36791 var mode = context.mode();
36792 if (mode && mode.id !== 'select') {
36793 layer.selectAll('g.midpoint')
36796 selection.selectAll('.layer-points .layer-points-targets .midpoint.target')
36802 var poly = extent.polygon();
36803 var midpoints = {};
36805 for (var i = 0; i < entities.length; i++) {
36806 var entity = entities[i];
36808 if (entity.type !== 'way')
36810 if (!filter(entity))
36812 if (context.selectedIDs().indexOf(entity.id) < 0)
36815 var nodes = graph.childNodes(entity);
36816 for (var j = 0; j < nodes.length - 1; j++) {
36819 var b = nodes[j + 1];
36820 var id = [a.id, b.id].sort().join('-');
36822 if (midpoints[id]) {
36823 midpoints[id].parents.push(entity);
36825 if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
36826 var point = geoVecInterp(a.loc, b.loc, 0.5);
36829 if (extent.intersects(point)) {
36832 for (var k = 0; k < 4; k++) {
36833 point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
36835 geoVecLength(projection(a.loc), projection(point)) > 20 &&
36836 geoVecLength(projection(b.loc), projection(point)) > 20)
36849 edge: [a.id, b.id],
36859 function midpointFilter(d) {
36860 if (midpoints[d.id])
36863 for (var i = 0; i < d.parents.length; i++) {
36864 if (filter(d.parents[i])) {
36874 .selectAll('g.midpoint')
36875 .filter(midpointFilter)
36876 .data(values$1(midpoints), function(d) { return d.id; });
36881 var enter = groups.enter()
36882 .insert('g', ':first-child')
36883 .attr('class', 'midpoint');
36887 .attr('points', '-6,8 10,0 -6,-8')
36888 .attr('class', 'shadow');
36892 .attr('points', '-3,4 5,0 -3,-4')
36893 .attr('class', 'fill');
36897 .attr('transform', function(d) {
36898 var translate = svgPointTransform(projection);
36899 var a = graph.entity(d.edge[0]);
36900 var b = graph.entity(d.edge[1]);
36901 var angle = geoAngle(a, b, projection) * (180 / Math.PI);
36902 return translate(d) + ' rotate(' + angle + ')';
36904 .call(svgTagClasses().tags(
36905 function(d) { return d.parents[0].tags; }
36908 // Propagate data bindings.
36909 groups.select('polygon.shadow');
36910 groups.select('polygon.fill');
36913 // Draw touch targets..
36914 selection.selectAll('.layer-points .layer-points-targets')
36915 .call(drawTargets, graph, values$1(midpoints), midpointFilter);
36918 return drawMidpoints;
36921 // Touch targets control which other vertices we can drag a vertex onto.
36923 // - the activeID - nope
36924 // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
36925 // - 2 away from the activeID - nope (would create a self intersecting segment)
36926 // - all others on a linear way - yes
36927 // - all others on a closed way - nope (would create a self intersecting polygon)
36930 // 0 = active vertex - no touch/connect
36931 // 1 = passive vertex - yes touch/connect
36932 // 2 = adjacent vertex - yes but pay attention segmenting a line here
36934 function svgPassiveVertex(node, graph, activeID) {
36935 if (!activeID) return 1;
36936 if (activeID === node.id) return 0;
36938 var parents = graph.parentWays(node);
36940 for (var i = 0; i < parents.length; i++) {
36941 var nodes = parents[i].nodes;
36942 var isClosed = parents[i].isClosed();
36943 for (var j = 0; j < nodes.length; j++) { // find this vertex, look nearby
36944 if (nodes[j] === node.id) {
36950 if (isClosed) { // wraparound if needed
36951 var max = nodes.length - 1;
36952 if (ix1 < 0) ix1 = max + ix1;
36953 if (ix2 < 0) ix2 = max + ix2;
36954 if (ix3 > max) ix3 = ix3 - max;
36955 if (ix4 > max) ix4 = ix4 - max;
36958 if (nodes[ix1] === activeID) return 0; // no - prevent self intersect
36959 else if (nodes[ix2] === activeID) return 2; // ok - adjacent
36960 else if (nodes[ix3] === activeID) return 2; // ok - adjacent
36961 else if (nodes[ix4] === activeID) return 0; // no - prevent self intersect
36962 else if (isClosed && nodes.indexOf(activeID) !== -1) return 0; // no - prevent self intersect
36971 function svgOneWaySegments(projection$$1, graph, dt) {
36972 return function(entity) {
36976 var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
36977 var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
36980 if (entity.tags.oneway === '-1') {
36981 coordinates.reverse();
36984 var isReversible = (entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating');
36987 type: 'LineString',
36988 coordinates: coordinates
36989 }, projection$$1.stream(clip({
36990 lineStart: function() {},
36991 lineEnd: function() { a = null; },
36992 point: function(x, y) {
36996 var span = geoVecLength(a, b) - offset;
36999 var heading = geoVecAngle(a, b);
37000 var dx = dt * Math.cos(heading);
37001 var dy = dt * Math.sin(heading);
37003 a[0] + offset * Math.cos(heading),
37004 a[1] + offset * Math.sin(heading)
37007 // gather coordinates
37008 var coord = [a, p];
37009 for (span -= dt; span >= 0; span -= dt) {
37010 p = geoVecAdd(p, [dx, dy]);
37015 // generate svg paths
37019 for (j = 0; j < coord.length; j++) {
37020 segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37022 segments.push({ id: entity.id, index: i++, d: segment });
37024 if (isReversible) {
37026 for (j = coord.length - 1; j >= 0; j--) {
37027 segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37029 segments.push({ id: entity.id, index: i++, d: segment });
37045 function svgPath(projection$$1, graph, isArea) {
37047 // Explanation of magic numbers:
37048 // "padding" here allows space for strokes to extend beyond the viewport,
37049 // so that the stroke isn't drawn along the edge of the viewport when
37050 // the shape is clipped.
37052 // When drawing lines, pad viewport by 5px.
37053 // When drawing areas, pad viewport by 65px in each direction to allow
37054 // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
37057 var padding = isArea ? 65 : 5;
37058 var viewport = projection$$1.clipExtent();
37059 var paddedExtent = [
37060 [viewport[0][0] - padding, viewport[0][1] - padding],
37061 [viewport[1][0] + padding, viewport[1][1] + padding]
37063 var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
37064 var project = projection$$1.stream;
37065 var path = d3_geoPath()
37066 .projection({stream: function(output) { return project(clip(output)); }});
37068 var svgpath = function(entity) {
37069 if (entity.id in cache) {
37070 return cache[entity.id];
37072 return cache[entity.id] = path(entity.asGeoJSON(graph));
37076 svgpath.geojson = function(d) {
37077 if (d.__featurehash__ !== undefined) {
37078 if (d.__featurehash__ in cache) {
37079 return cache[d.__featurehash__];
37081 return cache[d.__featurehash__] = path(d);
37092 function svgPointTransform(projection$$1) {
37093 var svgpoint = function(entity) {
37094 // http://jsperf.com/short-array-join
37095 var pt = projection$$1(entity.loc);
37096 return 'translate(' + pt[0] + ',' + pt[1] + ')';
37099 svgpoint.geojson = function(d) {
37100 return svgpoint(d.properties.entity);
37107 function svgRelationMemberTags(graph) {
37108 return function(entity) {
37109 var tags = entity.tags;
37110 graph.parentRelations(entity).forEach(function(relation) {
37111 var type = relation.tags.type;
37112 if (type === 'multipolygon' || type === 'boundary') {
37113 tags = assignIn({}, relation.tags, tags);
37121 function svgSegmentWay(way, graph, activeID) {
37122 var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
37123 var features = { passive: [], active: [] };
37128 for (var i = 0; i < way.nodes.length; i++) {
37129 node = graph.entity(way.nodes[i]);
37130 type = svgPassiveVertex(node, graph, activeID);
37131 end = { node: node, type: type };
37133 if (start.type !== undefined) {
37134 if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) { // one adjacent vertex
37135 pushActive(start, end, i);
37136 } else if (start.type === 0 && end.type === 0) { // both active vertices
37137 pushActive(start, end, i);
37139 pushPassive(start, end, i);
37149 function pushActive(start, end, index) {
37150 features.active.push({
37152 id: way.id + '-' + index + '-nope',
37157 nodes: [start.node, end.node],
37161 type: 'LineString',
37162 coordinates: [start.node.loc, end.node.loc]
37167 function pushPassive(start, end, index) {
37168 features.passive.push({
37170 id: way.id + '-' + index,
37174 nodes: [start.node, end.node],
37178 type: 'LineString',
37179 coordinates: [start.node.loc, end.node.loc]
37185 function svgPoints$$1(projection, context) {
37187 function markerPath(selection, klass) {
37189 .attr('class', klass)
37190 .attr('transform', 'translate(-8, -23)')
37191 .attr('d', 'M 17,8 C 17,13 11,21 8.5,23.5 C 6,21 0,13 0,8 C 0,4 4,-0.5 8.5,-0.5 C 13,-0.5 17,4 17,8 z');
37194 function sortY(a, b) {
37195 return b.loc[1] - a.loc[1];
37199 // Avoid exit/enter if we're just moving stuff around.
37200 // The node will get a new version but we only need to run the update selection.
37201 function fastEntityKey(d) {
37202 var mode = context.mode();
37203 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
37204 return isMoving ? d.id : osmEntity$$1.key(d);
37208 function drawTargets(selection, graph, entities, filter) {
37209 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37210 var getTransform = svgPointTransform(projection).geojson;
37211 var activeID = context.activeID();
37214 entities.forEach(function(node) {
37215 if (activeID === node.id) return; // draw no target on the activeID
37224 geometry: node.asGeoJSON()
37228 var targets = selection.selectAll('.point.target')
37229 .filter(function(d) { return filter(d.properties.entity); })
37230 .data(data, function key(d) { return d.id; });
37242 .attr('height', 30)
37244 .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
37245 .attr('transform', getTransform);
37249 function drawPoints(selection, graph, entities, filter) {
37250 var wireframe = context.surface().classed('fill-wireframe');
37251 var zoom = geoScaleToZoom(projection.scale());
37253 // points with a direction will render as vertices at higher zooms
37254 function renderAsPoint(entity) {
37255 return entity.geometry(graph) === 'point' &&
37256 !(zoom >= 18 && entity.directions(graph, projection).length);
37259 // all points will render as vertices in wireframe mode too
37260 var points = wireframe ? [] : entities.filter(renderAsPoint);
37262 points.sort(sortY);
37265 var layer = selection.selectAll('.layer-points .layer-points-points');
37267 var groups = layer.selectAll('g.point')
37269 .data(points, fastEntityKey);
37274 var enter = groups.enter()
37276 .attr('class', function(d) { return 'node point ' + d.id; })
37281 .call(markerPath, 'shadow');
37289 .attr('class', 'stroke');
37293 .call(markerPath, 'stroke');
37297 .attr('transform', 'translate(-5, -19)')
37298 .attr('class', 'icon')
37299 .attr('width', '11px')
37300 .attr('height', '11px');
37304 .attr('transform', svgPointTransform(projection))
37305 .call(svgTagClasses());
37307 // Selecting the following implicitly
37308 // sets the data (point entity) on the element
37309 groups.select('.shadow');
37310 groups.select('.stroke');
37311 groups.select('.icon')
37312 .attr('xlink:href', function(entity) {
37313 var preset = context.presets().match(entity, graph);
37314 var picon = preset && preset.icon;
37319 var isMaki = /^maki-/.test(picon);
37320 return '#' + picon + (isMaki ? '-11' : '');
37326 selection.selectAll('.layer-points .layer-points-targets')
37327 .call(drawTargets, graph, points, filter);
37334 function svgTagClasses() {
37336 'building', 'highway', 'railway', 'waterway', 'aeroway',
37337 'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
37338 'leisure', 'military', 'place', 'man_made'
37341 'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
37342 'razed', 'demolished', 'obliterated', 'intermittent'
37344 var secondaries = [
37345 'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
37346 'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
37349 var tagClassRe = /^tag-/;
37350 var _tags = function(entity) { return entity.tags; };
37353 var tagClasses = function(selection$$1) {
37354 selection$$1.each(function tagClassesEach(entity) {
37355 var value = this.className;
37356 var classes, primary, status;
37358 if (value.baseVal !== undefined) value = value.baseVal;
37360 classes = value.trim().split(/\s+/).filter(function(name) {
37361 return name.length && !tagClassRe.test(name);
37364 var t = _tags(entity), i, k, v;
37366 // pick at most one primary classification tag..
37367 for (i = 0; i < primaries.length; i++) {
37370 if (!v || v === 'no') continue;
37373 if (statuses.indexOf(v) !== -1) { // e.g. `railway=abandoned`
37375 classes += ' tag-' + k;
37377 classes += ' tag-' + k + ' tag-' + k + '-' + v;
37383 // add at most one status tag, only if relates to primary tag..
37385 for (i = 0; i < statuses.length; i++) {
37388 if (!v || v === 'no') continue;
37390 if (v === 'yes') { // e.g. `railway=rail + abandoned=yes`
37393 else if (primary && primary === v) { // e.g. `railway=rail + abandoned=railway`
37395 } else if (!primary && primaries.indexOf(v) !== -1) { // e.g. `abandoned=railway`
37398 classes += ' tag-' + v;
37399 } // else ignore e.g. `highway=path + abandoned=railway`
37406 classes += ' tag-status tag-status-' + status;
37409 // add any secondary (structure) tags
37410 for (i = 0; i < secondaries.length; i++) {
37411 k = secondaries[i];
37413 if (!v || v === 'no') continue;
37414 classes += ' tag-' + k + ' tag-' + k + '-' + v;
37417 // For highways, look for surface tagging..
37418 if (primary === 'highway') {
37419 var paved = (t.highway !== 'track');
37422 if (k in osmPavedTags) {
37423 paved = !!osmPavedTags[k][v];
37428 classes += ' tag-unpaved';
37432 classes = classes.trim();
37434 if (classes !== value) {
37435 select(this).attr('class', classes);
37441 tagClasses.tags = function(_) {
37442 if (!arguments.length) return _tags;
37450 function svgTurns(projection) {
37452 return function drawTurns(selection, graph, turns) {
37454 function icon(turn) {
37455 var u = turn.u ? '-u' : '';
37456 if (turn.no) return '#iD-turn-no' + u;
37457 if (turn.only) return '#iD-turn-only' + u;
37458 return '#iD-turn-yes' + u;
37461 var layer = selection.selectAll('.data-layer-osm').selectAll('.layer-turns')
37464 layer = layer.enter()
37466 .attr('class', 'layer-osm layer-turns')
37470 var groups = layer.selectAll('g.turn')
37471 .data(turns, function(d) { return d.key; });
37477 var enter = groups.enter()
37479 .attr('class', function(d) { return 'turn ' + d.key; });
37482 .filter(function(d) { return !d.u; });
37484 nEnter.append('rect')
37485 .attr('transform', 'translate(-22, -12)')
37486 .attr('width', '44')
37487 .attr('height', '24');
37489 nEnter.append('use')
37490 .attr('transform', 'translate(-22, -12)')
37491 .attr('width', '44')
37492 .attr('height', '24');
37496 .filter(function(d) { return d.u; });
37498 uEnter.append('circle')
37501 uEnter.append('use')
37502 .attr('transform', 'translate(-16, -16)')
37503 .attr('width', '32')
37504 .attr('height', '32');
37511 .attr('opacity', function(d) {
37512 return d.direct === false ? '0.7' : null;
37514 .attr('transform', function(d) {
37516 var toWay = graph.entity(d.to.way);
37517 var toPoints = graph.childNodes(toWay)
37518 .map(function (n) { return n.loc; })
37520 var toLength = geoPathLength(toPoints);
37521 var mid = toLength / 2; // midpoint of destination way
37523 var toNode = graph.entity(d.to.node);
37524 var toVertex = graph.entity(d.to.vertex);
37525 var a = geoAngle(toVertex, toNode, projection);
37526 var o = projection(toVertex.loc);
37527 var r = d.u ? 0 // u-turn: no radius
37528 : !toWay.__via ? pxRadius // leaf way: put marker at pxRadius
37529 : Math.min(mid, pxRadius); // via way: prefer pxRadius, fallback to mid for very short ways
37531 return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
37532 'rotate(' + a * 180 / Math.PI + ')';
37535 groups.select('use')
37536 .attr('xlink:href', icon);
37538 groups.select('rect');
37539 groups.select('circle');
37545 function svgVertices$$1(projection, context) {
37547 // z16-, z17, z18+, w/icon
37548 shadow: [6, 7.5, 7.5, 12],
37549 stroke: [2.5, 3.5, 3.5, 8],
37550 fill: [1, 1.5, 1.5, 1.5]
37553 var _currHoverTarget;
37554 var _currPersistent = {};
37555 var _currHover = {};
37556 var _prevHover = {};
37557 var _currSelected = {};
37558 var _prevSelected = {};
37562 function sortY(a, b) {
37563 return b.loc[1] - a.loc[1];
37566 // Avoid exit/enter if we're just moving stuff around.
37567 // The node will get a new version but we only need to run the update selection.
37568 function fastEntityKey(d) {
37569 var mode = context.mode();
37570 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
37571 return isMoving ? d.id : osmEntity$$1.key(d);
37575 function draw(selection$$1, graph, vertices, sets, filter) {
37576 sets = sets || { selected: {}, important: {}, hovered: {} };
37579 var directions = {};
37580 var wireframe = context.surface().classed('fill-wireframe');
37581 var zoom = geoScaleToZoom(projection.scale());
37582 var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
37585 function getIcon(d) {
37586 // always check latest entity, as fastEntityKey avoids enter/exit now
37587 var entity = graph.entity(d.id);
37588 if (entity.id in icons) return icons[entity.id];
37591 entity.hasInterestingTags() &&
37592 context.presets().match(entity, graph).icon;
37593 return icons[entity.id];
37597 // memoize directions results, return false for empty arrays (for use in filter)
37598 function getDirections(entity) {
37599 if (entity.id in directions) return directions[entity.id];
37601 var angles = entity.directions(graph, projection);
37602 directions[entity.id] = angles.length ? angles : false;
37607 function updateAttributes(selection$$1) {
37608 ['shadow', 'stroke', 'fill'].forEach(function(klass) {
37609 var rads = radiuses[klass];
37610 selection$$1.selectAll('.' + klass)
37611 .each(function(entity) {
37612 var i = z && getIcon(entity);
37613 var r = rads[i ? 3 : z];
37615 // slightly increase the size of unconnected endpoints #3775
37616 if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
37620 if (klass === 'shadow') { // remember this value, so we don't need to
37621 _radii[entity.id] = r; // recompute it when we draw the touch targets
37626 .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
37631 vertices.sort(sortY);
37633 var groups = selection$$1.selectAll('g.vertex')
37635 .data(vertices, fastEntityKey);
37642 var enter = groups.enter()
37644 .attr('class', function(d) { return 'node vertex ' + d.id; })
37649 .attr('class', 'shadow');
37653 .attr('class', 'stroke');
37655 // Vertices with tags get a fill.
37656 enter.filter(function(d) { return d.hasInterestingTags(); })
37658 .attr('class', 'fill');
37663 .attr('transform', svgPointTransform(projection))
37664 .classed('sibling', function(d) { return d.id in sets.selected; })
37665 .classed('shared', function(d) { return graph.isShared(d); })
37666 .classed('endpoint', function(d) { return d.isEndpoint(graph); })
37667 .call(updateAttributes);
37670 // Vertices with icons get a `use`.
37671 var iconUse = groups
37672 .selectAll('.icon')
37673 .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
37682 .attr('class', 'icon')
37683 .attr('width', '11px')
37684 .attr('height', '11px')
37685 .attr('transform', 'translate(-5.5, -5.5)')
37686 .attr('xlink:href', function(d) {
37687 var picon = getIcon(d);
37688 var isMaki = /^maki-/.test(picon);
37689 return '#' + picon + (isMaki ? '-11' : '');
37693 // Vertices with directions get viewfields
37694 var dgroups = groups
37695 .selectAll('.viewfieldgroup')
37696 .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
37703 dgroups = dgroups.enter()
37704 .insert('g', '.shadow')
37705 .attr('class', 'viewfieldgroup')
37708 var viewfields = dgroups.selectAll('.viewfield')
37709 .data(getDirections, function key(d) { return osmEntity$$1.key(d); });
37718 .attr('class', 'viewfield')
37719 .attr('d', 'M0,0H0')
37721 .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
37722 .attr('transform', function(d) { return 'rotate(' + d + ')'; });
37726 function drawTargets(selection$$1, graph, entities, filter) {
37727 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37728 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
37729 var getTransform = svgPointTransform(projection).geojson;
37730 var activeID = context.activeID();
37731 var data = { targets: [], nopes: [] };
37733 entities.forEach(function(node) {
37734 if (activeID === node.id) return; // draw no target on the activeID
37736 var vertexType = svgPassiveVertex(node, graph, activeID);
37737 if (vertexType !== 0) { // passive or adjacent - allow to connect
37738 data.targets.push({
37745 geometry: node.asGeoJSON()
37750 id: node.id + '-nope',
37756 geometry: node.asGeoJSON()
37762 // Targets allow hover and vertex snapping
37763 var targets = selection$$1.selectAll('.vertex.target-allowed')
37764 .filter(function(d) { return filter(d.properties.entity); })
37765 .data(data.targets, function key(d) { return d.id; });
37774 .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
37776 .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
37777 .attr('transform', getTransform);
37781 var nopes = selection$$1.selectAll('.vertex.target-nope')
37782 .filter(function(d) { return filter(d.properties.entity); })
37783 .data(data.nopes, function key(d) { return d.id; });
37792 .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
37794 .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
37795 .attr('transform', getTransform);
37799 // Points can also render as vertices:
37800 // 1. in wireframe mode or
37801 // 2. at higher zooms if they have a direction
37802 function renderAsVertex(entity, graph, wireframe, zoom) {
37803 var geometry = entity.geometry(graph);
37804 return geometry === 'vertex' || (geometry === 'point' && (
37805 wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
37810 function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
37813 function addChildVertices(entity) {
37814 var geometry = entity.geometry(graph);
37815 if (!context.features().isHiddenFeature(entity, graph, geometry)) {
37817 if (entity.type === 'way') {
37818 for (i = 0; i < entity.nodes.length; i++) {
37819 var child = graph.hasEntity(entity.nodes[i]);
37821 addChildVertices(child);
37824 } else if (entity.type === 'relation') {
37825 for (i = 0; i < entity.members.length; i++) {
37826 var member = graph.hasEntity(entity.members[i].id);
37828 addChildVertices(member);
37831 } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
37832 results[entity.id] = entity;
37837 ids.forEach(function(id) {
37838 var entity = graph.hasEntity(id);
37839 if (!entity) return;
37841 if (entity.type === 'node') {
37842 if (renderAsVertex(entity, graph, wireframe, zoom)) {
37843 results[entity.id] = entity;
37844 graph.parentWays(entity).forEach(function(entity) {
37845 addChildVertices(entity);
37848 } else { // way, relation
37849 addChildVertices(entity);
37857 function drawVertices(selection$$1, graph, entities, filter, extent, fullRedraw) {
37858 var wireframe = context.surface().classed('fill-wireframe');
37859 var zoom = geoScaleToZoom(projection.scale());
37860 var mode = context.mode();
37861 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
37864 _currPersistent = {};
37868 // Collect important vertices from the `entities` list..
37869 // (during a paritial redraw, it will not contain everything)
37870 for (var i = 0; i < entities.length; i++) {
37871 var entity = entities[i];
37872 var geometry = entity.geometry(graph);
37875 // a point that looks like a vertex..
37876 if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
37877 _currPersistent[entity.id] = entity;
37880 // a vertex of some importance..
37881 } else if (geometry === 'vertex' &&
37882 (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
37883 _currPersistent[entity.id] = entity;
37887 // whatever this is, it's not a persistent vertex..
37888 if (!keep && !fullRedraw) {
37889 delete _currPersistent[entity.id];
37893 // 3 sets of vertices to consider:
37895 persistent: _currPersistent, // persistent = important vertices (render always)
37896 selected: _currSelected, // selected + siblings of selected (render always)
37897 hovered: _currHover // hovered + siblings of hovered (render only in draw modes)
37900 var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
37902 // Draw the vertices..
37903 // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
37904 // Adjust the filter function to expand the scope beyond whatever entities were passed in.
37905 var filterRendered = function(d) {
37906 return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
37908 selection$$1.selectAll('.layer-points .layer-points-vertices')
37909 .call(draw, graph, currentVisible(all), sets, filterRendered);
37911 // Draw touch targets..
37912 // When drawing, render all targets (not just those affected by a partial redraw)
37913 var filterTouch = function(d) {
37914 return isMoving ? true : filterRendered(d);
37916 selection$$1.selectAll('.layer-points .layer-points-targets')
37917 .call(drawTargets, graph, currentVisible(all), filterTouch);
37920 function currentVisible(which) {
37921 return Object.keys(which)
37922 .map(graph.hasEntity, graph) // the current version of this entity
37923 .filter(function (entity) { return entity && entity.intersects(extent, graph); });
37928 // partial redraw - only update the selected items..
37929 drawVertices.drawSelected = function(selection$$1, graph, extent) {
37930 var wireframe = context.surface().classed('fill-wireframe');
37931 var zoom = geoScaleToZoom(projection.scale());
37933 _prevSelected = _currSelected || {};
37934 _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
37936 // note that drawVertices will add `_currSelected` automatically if needed..
37937 var filter = function(d) { return d.id in _prevSelected; };
37938 drawVertices(selection$$1, graph, values$1(_prevSelected), filter, extent, false);
37942 // partial redraw - only update the hovered items..
37943 drawVertices.drawHover = function(selection$$1, graph, target, extent) {
37944 if (target === _currHoverTarget) return; // continue only if something changed
37946 var wireframe = context.surface().classed('fill-wireframe');
37947 var zoom = geoScaleToZoom(projection.scale());
37949 _prevHover = _currHover || {};
37950 _currHoverTarget = target;
37951 var entity = target && target.properties && target.properties.entity;
37954 _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
37959 // note that drawVertices will add `_currHover` automatically if needed..
37960 var filter = function(d) { return d.id in _prevHover; };
37961 drawVertices(selection$$1, graph, values$1(_prevHover), filter, extent, false);
37964 return drawVertices;
37967 /* global Mapillary:false */
37970 var apibase = 'https://a.mapillary.com/v3/';
37971 var viewercss = 'mapillary-js/mapillary.min.css';
37972 var viewerjs = 'mapillary-js/mapillary.min.js';
37973 var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
37974 var maxResults = 1000;
37976 var tiler = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
37977 var dispatch$1 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
37978 var _mlyFallback = false;
37981 var _mlySelectedImage;
37985 function abortRequest(i) {
37990 function maxPageAtZoom(z) {
37991 if (z < 15) return 2;
37992 if (z === 15) return 5;
37993 if (z === 16) return 10;
37994 if (z === 17) return 20;
37995 if (z === 18) return 40;
37996 if (z > 18) return 80;
38000 function loadTiles(which, url, projection) {
38001 var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
38002 var tiles = tiler.getTiles(projection);
38004 // abort inflight requests that are no longer needed
38005 var cache = _mlyCache[which];
38006 forEach(cache.inflight, function(v, k) {
38007 var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
38011 delete cache.inflight[k];
38015 tiles.forEach(function(tile) {
38016 loadNextTilePage(which, currZoom, url, tile);
38021 function loadNextTilePage(which, currZoom, url, tile) {
38022 var cache = _mlyCache[which];
38023 var rect = tile.extent.rectangle();
38024 var maxPages = maxPageAtZoom(currZoom);
38025 var nextPage = cache.nextPage[tile.id] || 0;
38026 var nextURL = cache.nextURL[tile.id] || url +
38028 per_page: maxResults,
38030 client_id: clientId,
38031 bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
38034 if (nextPage > maxPages) return;
38036 var id = tile.id + ',' + String(nextPage);
38037 if (cache.loaded[id] || cache.inflight[id]) return;
38038 cache.inflight[id] = request(nextURL)
38039 .mimeType('application/json')
38040 .response(function(xhr) {
38041 var linkHeader = xhr.getResponseHeader('Link');
38043 var pagination = parsePagination(xhr.getResponseHeader('Link'));
38044 if (pagination.next) {
38045 cache.nextURL[tile.id] = pagination.next;
38048 return JSON.parse(xhr.responseText);
38050 .get(function(err, data) {
38051 cache.loaded[id] = true;
38052 delete cache.inflight[id];
38053 if (err || !data.features || !data.features.length) return;
38055 var features = data.features.map(function(feature) {
38056 var loc = feature.geometry.coordinates;
38059 if (which === 'images') {
38062 key: feature.properties.key,
38063 ca: feature.properties.ca,
38064 captured_at: feature.properties.captured_at,
38065 captured_by: feature.properties.username,
38066 pano: feature.properties.pano
38068 cache.forImageKey[d.key] = d; // cache imageKey -> image
38070 } else if (which === 'sequences') {
38071 var sequenceKey = feature.properties.key;
38072 cache.lineString[sequenceKey] = feature; // cache sequenceKey -> lineString
38073 feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
38074 cache.forImageKey[imageKey] = sequenceKey; // cache imageKey -> sequenceKey
38076 return false; // because no `d` data worth loading into an rbush
38078 } else if (which === 'objects') {
38081 key: feature.properties.key,
38082 value: feature.properties.value,
38083 package: feature.properties.package,
38084 detections: feature.properties.detections
38087 // cache imageKey -> detectionKey
38088 feature.properties.detections.forEach(function(detection) {
38089 var imageKey = detection.image_key;
38090 var detectionKey = detection.detection_key;
38091 if (!_mlyCache.detections[imageKey]) {
38092 _mlyCache.detections[imageKey] = {};
38094 if (!_mlyCache.detections[imageKey][detectionKey]) {
38095 _mlyCache.detections[imageKey][detectionKey] = {};
38101 minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
38104 }).filter(Boolean);
38106 cache.rtree.load(features);
38108 if (which === 'images' || which === 'sequences') {
38109 dispatch$1.call('loadedImages');
38110 } else if (which === 'objects') {
38111 dispatch$1.call('loadedSigns');
38114 if (data.features.length === maxResults) { // more pages to load
38115 cache.nextPage[tile.id] = nextPage + 1;
38116 loadNextTilePage(which, currZoom, url, tile);
38118 cache.nextPage[tile.id] = Infinity; // no more pages to load
38123 // extract links to pages of API results
38124 function parsePagination(links) {
38125 return links.split(',').map(function(rel) {
38126 var elements = rel.split(';');
38127 if (elements.length === 2) {
38129 /<(.+)>/.exec(elements[0])[1],
38130 /rel="(.+)"/.exec(elements[1])[1]
38135 }).reduce(function(pagination, val) {
38136 pagination[val[1]] = val[0];
38142 // partition viewport into `psize` x `psize` regions
38143 function partitionViewport(psize, projection) {
38144 var dimensions = projection.clipExtent()[1];
38145 psize = psize || 16;
38146 var cols = range(0, dimensions[0], psize);
38147 var rows = range(0, dimensions[1], psize);
38148 var partitions = [];
38150 rows.forEach(function(y) {
38151 cols.forEach(function(x) {
38152 var min$$1 = [x, y + psize];
38153 var max$$1 = [x + psize, y];
38155 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
38163 // no more than `limit` results per partition.
38164 function searchLimited(psize, limit, projection, rtree) {
38165 limit = limit || 3;
38167 var partitions = partitionViewport(psize, projection);
38170 // console.time('previous');
38171 results = flatten(map$3(partitions, function(extent$$1) {
38172 return rtree.search(extent$$1.bbox())
38174 .map(function(d) { return d.data; });
38176 // console.timeEnd('previous');
38178 // console.time('new');
38179 // results = partitions.reduce(function(result, extent) {
38180 // var found = rtree.search(extent.bbox())
38181 // .map(function(d) { return d.data; })
38182 // .sort(function(a, b) {
38183 // return a.loc[1] - b.loc[1];
38184 // // return a.key.localeCompare(b.key);
38186 // .slice(0, limit);
38188 // return (found.length ? result.concat(found) : result);
38190 // console.timeEnd('new');
38197 var serviceMapillary = {
38204 this.event = utilRebind(this, dispatch$1, 'on');
38207 reset: function() {
38208 var cache = _mlyCache;
38211 if (cache.images && cache.images.inflight) {
38212 forEach(cache.images.inflight, abortRequest);
38214 if (cache.objects && cache.objects.inflight) {
38215 forEach(cache.objects.inflight, abortRequest);
38217 if (cache.sequences && cache.sequences.inflight) {
38218 forEach(cache.sequences.inflight, abortRequest);
38223 images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
38224 objects: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
38225 sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} },
38229 _mlySelectedImage = null;
38234 images: function(projection) {
38235 var psize = 16, limit = 3;
38236 return searchLimited(psize, limit, projection, _mlyCache.images.rtree);
38240 signs: function(projection) {
38241 var psize = 32, limit = 3;
38242 return searchLimited(psize, limit, projection, _mlyCache.objects.rtree);
38246 sequences: function(projection) {
38247 var viewport = projection.clipExtent();
38248 var min$$1 = [viewport[0][0], viewport[1][1]];
38249 var max$$1 = [viewport[1][0], viewport[0][1]];
38250 var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
38251 var sequenceKeys = {};
38253 // all sequences for images in viewport
38254 _mlyCache.images.rtree.search(bbox)
38255 .forEach(function(d) {
38256 var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
38258 sequenceKeys[sequenceKey] = true;
38262 // Return lineStrings for the sequences
38263 return Object.keys(sequenceKeys).map(function(sequenceKey) {
38264 return _mlyCache.sequences.lineString[sequenceKey];
38269 signsSupported: function() {
38274 loadImages: function(projection) {
38275 loadTiles('images', apibase + 'images?', projection);
38276 loadTiles('sequences', apibase + 'sequences?', projection);
38280 loadSigns: function(context, projection) {
38281 // if we are looking at signs, we'll actually need to fetch images too
38282 loadTiles('images', apibase + 'images?', projection);
38283 loadTiles('objects', apibase + 'objects?', projection);
38287 loadViewer: function(context) {
38289 var wrap = select('#photoviewer').selectAll('.mly-wrapper')
38295 .attr('class', 'photo-wrapper mly-wrapper')
38296 .classed('hide', true);
38298 // load mapillary-viewercss
38299 select('head').selectAll('#mapillary-viewercss')
38303 .attr('id', 'mapillary-viewercss')
38304 .attr('rel', 'stylesheet')
38305 .attr('href', context.asset(viewercss));
38307 // load mapillary-viewerjs
38308 select('head').selectAll('#mapillary-viewerjs')
38312 .attr('id', 'mapillary-viewerjs')
38313 .attr('src', context.asset(viewerjs));
38315 // load mapillary signs sprite
38316 var defs = context.container().select('defs');
38317 defs.call(svgDefs(context).addSprites, ['mapillary-sprite']);
38319 // Register viewer resize handler
38320 context.ui().on('photoviewerResize', function() {
38322 _mlyViewer.resize();
38328 showViewer: function() {
38329 var wrap = select('#photoviewer')
38330 .classed('hide', false);
38332 var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
38334 if (isHidden && _mlyViewer) {
38336 .selectAll('.photo-wrapper:not(.mly-wrapper)')
38337 .classed('hide', true);
38340 .selectAll('.photo-wrapper.mly-wrapper')
38341 .classed('hide', false);
38343 _mlyViewer.resize();
38350 hideViewer: function() {
38351 _mlySelectedImage = null;
38353 if (!_mlyFallback && _mlyViewer) {
38354 _mlyViewer.getComponent('sequence').stop();
38357 var viewer = select('#photoviewer');
38358 if (!viewer.empty()) viewer.datum(null);
38361 .classed('hide', true)
38362 .selectAll('.photo-wrapper')
38363 .classed('hide', true);
38365 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
38366 .classed('selected', false);
38368 return this.setStyles(null, true);
38372 parsePagination: parsePagination,
38375 updateViewer: function(imageKey, context) {
38376 if (!imageKey) return this;
38379 this.initViewer(imageKey, context);
38381 _mlyViewer.moveToKey(imageKey)
38382 .catch(function(e) { console.error('mly3', e); }); // eslint-disable-line no-console
38389 initViewer: function(imageKey, context) {
38391 if (window.Mapillary && imageKey) {
38393 baseImageSize: 320,
38401 // Disable components requiring WebGL support
38402 if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
38403 _mlyFallback = true;
38412 image: true, // fallback
38413 navigation: true // fallback
38417 _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
38418 _mlyViewer.on('nodechanged', nodeChanged);
38419 _mlyViewer.on('bearingchanged', bearingChanged);
38420 _mlyViewer.moveToKey(imageKey)
38421 .catch(function(e) { console.error('mly3', e); }); // eslint-disable-line no-console
38424 // nodeChanged: called after the viewer has changed images and is ready.
38426 // There is some logic here to batch up clicks into a _mlyClicks array
38427 // because the user might click on a lot of markers quickly and nodechanged
38428 // may be called out of order asychronously.
38430 // Clicks are added to the array in `selectedImage` and removed here.
38432 function nodeChanged(node) {
38433 if (!_mlyFallback) {
38434 _mlyViewer.getComponent('tag').removeAll(); // remove previous detections
38437 var clicks = _mlyClicks;
38438 var index = clicks.indexOf(node.key);
38439 var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
38441 if (index > -1) { // `nodechanged` initiated from clicking on a marker..
38442 clicks.splice(index, 1); // remove the click
38443 // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
38444 // one more time to update the detections and attribution..
38445 if (node.key === selectedKey) {
38446 that.selectImage(_mlySelectedImage, node.key, true);
38448 } else { // `nodechanged` initiated from the Mapillary viewer controls..
38449 var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
38450 context.map().centerEase(loc);
38451 that.selectImage(undefined, node.key, true);
38455 function bearingChanged(e) {
38456 dispatch$1.call('bearingChanged', undefined, e);
38461 // Pass the image datum itself in `d` or the `imageKey` string.
38462 // This allows images to be selected from places that dont have access
38463 // to the full image datum (like the street signs layer or the js viewer)
38464 selectImage: function(d, imageKey, fromViewer) {
38465 if (!d && imageKey) {
38466 // If the user clicked on something that's not an image marker, we
38467 // might get in here.. Cache lookup can fail, e.g. if the user
38468 // clicked a streetsign, but images are loading slowly asynchronously.
38469 // We'll try to carry on anyway if there is no datum. There just
38470 // might be a delay before user sees detections, captured_at, etc.
38471 d = _mlyCache.images.forImageKey[imageKey];
38474 _mlySelectedImage = d;
38475 var viewer = select('#photoviewer');
38476 if (!viewer.empty()) viewer.datum(d);
38478 imageKey = (d && d.key) || imageKey;
38479 if (!fromViewer && imageKey) {
38480 _mlyClicks.push(imageKey);
38483 this.setStyles(null, true);
38485 d3_selectAll('.layer-mapillary-signs .icon-sign')
38486 .classed('selected', function(d) {
38487 return some(d.detections, function(detection) {
38488 return detection.image_key === imageKey;
38493 this.updateDetections(d);
38500 getSelectedImage: function() {
38501 return _mlySelectedImage;
38505 getSequenceKeyForImage: function(d) {
38506 var imageKey = d && d.key;
38507 return imageKey && _mlyCache.sequences.forImageKey[imageKey];
38511 setStyles: function(hovered, reset) {
38512 if (reset) { // reset all layers
38513 d3_selectAll('.viewfield-group')
38514 .classed('highlighted', false)
38515 .classed('hovered', false)
38516 .classed('selected', false);
38518 d3_selectAll('.sequence')
38519 .classed('highlighted', false)
38520 .classed('selected', false);
38523 var hoveredImageKey = hovered && hovered.key;
38524 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
38525 var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
38526 var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
38528 var viewer = select('#photoviewer');
38529 var selected = viewer.empty() ? undefined : viewer.datum();
38530 var selectedImageKey = selected && selected.key;
38531 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
38532 var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
38533 var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
38535 // highlight sibling viewfields on either the selected or the hovered sequences
38536 var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
38538 d3_selectAll('.layer-mapillary-images .viewfield-group')
38539 .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
38540 .classed('hovered', function(d) { return d.key === hoveredImageKey; })
38541 .classed('selected', function(d) { return d.key === selectedImageKey; });
38543 d3_selectAll('.layer-mapillary-images .sequence')
38544 .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
38545 .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
38547 // update viewfields if needed
38548 d3_selectAll('.viewfield-group .viewfield')
38549 .attr('d', viewfieldPath);
38551 function viewfieldPath() {
38552 var d = this.parentNode.__data__;
38553 if (d.pano && d.key !== selectedImageKey) {
38554 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
38556 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
38564 updateDetections: function(d) {
38565 if (!_mlyViewer || _mlyFallback) return;
38567 var imageKey = d && d.key;
38568 var detections = (imageKey && _mlyCache.detections[imageKey]) || [];
38570 forEach(detections, function(data, k) {
38571 if (isEmpty(data)) {
38574 var tag = makeTag(data);
38576 var tagComponent = _mlyViewer.getComponent('tag');
38577 tagComponent.add([tag]);
38583 function loadDetection(detectionKey) {
38584 var url = apibase + 'detections/' +
38585 detectionKey + '?' + utilQsString({ client_id: clientId });
38588 .mimeType('application/json')
38589 .response(function(xhr) {
38590 return JSON.parse(xhr.responseText);
38592 .get(function(err, data) {
38593 if (!data || !data.properties) return;
38595 var imageKey = data.properties.image_key;
38596 _mlyCache.detections[imageKey][detectionKey] = data;
38598 var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
38599 if (imageKey === selectedKey) {
38600 var tag = makeTag(data);
38602 var tagComponent = _mlyViewer.getComponent('tag');
38603 tagComponent.add([tag]);
38610 function makeTag(data) {
38611 var valueParts = data.properties.value.split('--');
38612 if (valueParts.length !== 3) return;
38614 var text = valueParts[1].replace(/-/g, ' ');
38617 // Currently only two shapes <Polygon|Point>
38618 if (data.properties.shape.type === 'Polygon') {
38619 var polygonGeometry = new Mapillary
38621 .PolygonGeometry(data.properties.shape.coordinates[0]);
38623 tag = new Mapillary.TagComponent.OutlineTag(
38624 data.properties.key,
38628 textColor: 0xffff00,
38629 lineColor: 0xffff00,
38631 fillColor: 0xffff00,
38636 } else if (data.properties.shape.type === 'Point') {
38637 var pointGeometry = new Mapillary
38639 .PointGeometry(data.properties.shape.coordinates[0]);
38641 tag = new Mapillary.TagComponent.SpotTag(
38642 data.properties.key,
38647 textColor: 0xffff00
38657 cache: function() {
38663 var apibase$1 = 'https://nominatim.openstreetmap.org/',
38668 var serviceNominatim = {
38672 nominatimCache = rbush_1();
38675 reset: function() {
38676 forEach(inflight, function(req) { req.abort(); });
38678 nominatimCache = rbush_1();
38682 countryCode: function (location, callback) {
38683 this.reverse(location, function(err, result) {
38685 return callback(err);
38686 } else if (result.address) {
38687 return callback(null, result.address.country_code);
38689 return callback('Unable to geocode', null);
38695 reverse: function (location, callback) {
38696 var cached = nominatimCache.search(
38697 { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
38700 if (cached.length > 0) {
38701 return callback(null, cached[0].data);
38704 var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
38705 var url = apibase$1 + 'reverse?' + utilQsString(params);
38706 if (inflight[url]) return;
38708 inflight[url] = d3_json(url, function(err, result) {
38709 delete inflight[url];
38712 return callback(err);
38713 } else if (result && result.error) {
38714 return callback(result.error);
38717 var extent = geoExtent$$1(location).padByMeters(200);
38718 nominatimCache.insert(assign(extent.bbox(), {data: result}));
38720 callback(null, result);
38725 search: function (val, callback) {
38726 var searchVal = encodeURIComponent(val);
38727 var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
38728 if (inflight[url]) return;
38730 inflight[url] = d3_json(url, function(err, result) {
38731 delete inflight[url];
38732 callback(err, result);
38738 var apibase$2 = 'https://openstreetcam.org';
38739 var maxResults$1 = 1000;
38740 var tileZoom$1 = 14;
38741 var tiler$1 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
38742 var dispatch$2 = dispatch('loadedImages');
38743 var imgZoom = d3_zoom()
38744 .extent([[0, 0], [320, 240]])
38745 .translateExtent([[0, 0], [320, 240]])
38746 .scaleExtent([1, 15])
38747 .on('zoom', zoomPan);
38749 var _oscSelectedImage;
38752 function abortRequest$1(i) {
38757 function maxPageAtZoom$1(z) {
38758 if (z < 15) return 2;
38759 if (z === 15) return 5;
38760 if (z === 16) return 10;
38761 if (z === 17) return 20;
38762 if (z === 18) return 40;
38763 if (z > 18) return 80;
38767 function loadTiles$1(which, url, projection) {
38768 var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
38769 var tiles = tiler$1.getTiles(projection);
38771 // abort inflight requests that are no longer needed
38772 var cache = _oscCache[which];
38773 forEach(cache.inflight, function(v, k) {
38774 var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
38778 delete cache.inflight[k];
38782 tiles.forEach(function(tile) {
38783 loadNextTilePage$1(which, currZoom, url, tile);
38788 function loadNextTilePage$1(which, currZoom, url, tile) {
38789 var cache = _oscCache[which];
38790 var bbox = tile.extent.bbox();
38791 var maxPages = maxPageAtZoom$1(currZoom);
38792 var nextPage = cache.nextPage[tile.id] || 1;
38793 var params = utilQsString({
38796 // client_id: clientId,
38797 bbTopLeft: [bbox.maxY, bbox.minX].join(','),
38798 bbBottomRight: [bbox.minY, bbox.maxX].join(',')
38801 if (nextPage > maxPages) return;
38803 var id = tile.id + ',' + String(nextPage);
38804 if (cache.loaded[id] || cache.inflight[id]) return;
38806 cache.inflight[id] = request(url)
38807 .mimeType('application/json')
38808 .header('Content-type', 'application/x-www-form-urlencoded')
38809 .response(function(xhr) { return JSON.parse(xhr.responseText); })
38810 .post(params, function(err, data) {
38811 cache.loaded[id] = true;
38812 delete cache.inflight[id];
38813 if (err || !data.currentPageItems || !data.currentPageItems.length) return;
38815 function localeDateString(s) {
38816 if (!s) return null;
38817 var detected = utilDetect();
38818 var options = { day: 'numeric', month: 'short', year: 'numeric' };
38819 var d = new Date(s);
38820 if (isNaN(d.getTime())) return null;
38821 return d.toLocaleDateString(detected.locale, options);
38824 var features = data.currentPageItems.map(function(item) {
38825 var loc = [+item.lng, +item.lat];
38828 if (which === 'images') {
38833 captured_at: localeDateString(item.shot_date || item.date_added),
38834 captured_by: item.username,
38835 imagePath: item.lth_name,
38836 sequence_id: item.sequence_id,
38837 sequence_index: +item.sequence_index
38840 // cache sequence info
38841 var seq = _oscCache.sequences[d.sequence_id];
38843 seq = { rotation: 0, images: [] };
38844 _oscCache.sequences[d.sequence_id] = seq;
38846 seq.images[d.sequence_index] = d;
38850 minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
38854 cache.rtree.load(features);
38856 if (which === 'images') {
38857 dispatch$2.call('loadedImages');
38860 if (data.currentPageItems.length === maxResults$1) { // more pages to load
38861 cache.nextPage[tile.id] = nextPage + 1;
38862 loadNextTilePage$1(which, currZoom, url, tile);
38864 cache.nextPage[tile.id] = Infinity; // no more pages to load
38870 // partition viewport into `psize` x `psize` regions
38871 function partitionViewport$1(psize, projection) {
38872 var dimensions = projection.clipExtent()[1];
38873 psize = psize || 16;
38874 var cols = range(0, dimensions[0], psize);
38875 var rows = range(0, dimensions[1], psize);
38876 var partitions = [];
38878 rows.forEach(function(y) {
38879 cols.forEach(function(x) {
38880 var min$$1 = [x, y + psize];
38881 var max$$1 = [x + psize, y];
38883 geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
38891 // no more than `limit` results per partition.
38892 function searchLimited$1(psize, limit, projection, rtree) {
38893 limit = limit || 3;
38895 var partitions = partitionViewport$1(psize, projection);
38898 results = flatten(map$3(partitions, function(extent$$1) {
38899 return rtree.search(extent$$1.bbox())
38901 .map(function(d) { return d.data; });
38907 function zoomPan() {
38908 var t = event.transform;
38909 select('#photoviewer .osc-image-wrap')
38910 .call(utilSetTransform, t.x, t.y, t.k);
38914 var serviceOpenstreetcam = {
38921 this.event = utilRebind(this, dispatch$2, 'on');
38924 reset: function() {
38925 var cache = _oscCache;
38928 if (cache.images && cache.images.inflight) {
38929 forEach(cache.images.inflight, abortRequest$1);
38934 images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
38938 _oscSelectedImage = null;
38942 images: function(projection) {
38943 var psize = 16, limit = 3;
38944 return searchLimited$1(psize, limit, projection, _oscCache.images.rtree);
38948 sequences: function(projection) {
38949 var viewport = projection.clipExtent();
38950 var min$$1 = [viewport[0][0], viewport[1][1]];
38951 var max$$1 = [viewport[1][0], viewport[0][1]];
38952 var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
38953 var sequenceKeys = {};
38955 // all sequences for images in viewport
38956 _oscCache.images.rtree.search(bbox)
38957 .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
38959 // make linestrings from those sequences
38960 var lineStrings = [];
38961 Object.keys(sequenceKeys)
38962 .forEach(function(sequenceKey) {
38963 var seq = _oscCache.sequences[sequenceKey];
38964 var images = seq && seq.images;
38967 type: 'LineString',
38968 coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
38969 properties: { key: sequenceKey }
38973 return lineStrings;
38977 loadImages: function(projection) {
38978 var url = apibase$2 + '/1.0/list/nearby-photos/';
38979 loadTiles$1('images', url, projection);
38983 loadViewer: function(context) {
38987 var wrap = select('#photoviewer').selectAll('.osc-wrapper')
38990 var wrapEnter = wrap.enter()
38992 .attr('class', 'photo-wrapper osc-wrapper')
38993 .classed('hide', true)
38995 .on('dblclick.zoom', null);
38999 .attr('class', 'photo-attribution fillD');
39001 var controlsEnter = wrapEnter
39003 .attr('class', 'photo-controls-wrap')
39005 .attr('class', 'photo-controls');
39009 .on('click.back', step(-1))
39014 .on('click.rotate-ccw', rotate(-90))
39019 .on('click.rotate-cw', rotate(90))
39024 .on('click.forward', step(1))
39029 .attr('class', 'osc-image-wrap');
39032 // Register viewer resize handler
39033 context.ui().on('photoviewerResize', function(dimensions) {
39034 imgZoom = d3_zoom()
39035 .extent([[0, 0], dimensions])
39036 .translateExtent([[0, 0], dimensions])
39037 .scaleExtent([1, 15])
39038 .on('zoom', zoomPan);
39042 function rotate(deg) {
39043 return function() {
39044 if (!_oscSelectedImage) return;
39045 var sequenceKey = _oscSelectedImage.sequence_id;
39046 var sequence = _oscCache.sequences[sequenceKey];
39047 if (!sequence) return;
39049 var r = sequence.rotation || 0;
39052 if (r > 180) r -= 360;
39053 if (r < -180) r += 360;
39054 sequence.rotation = r;
39056 var wrap = select('#photoviewer .osc-wrapper');
39061 .call(imgZoom.transform, identity$7);
39063 wrap.selectAll('.osc-image')
39066 .style('transform', 'rotate(' + r + 'deg)');
39070 function step(stepBy) {
39071 return function() {
39072 if (!_oscSelectedImage) return;
39073 var sequenceKey = _oscSelectedImage.sequence_id;
39074 var sequence = _oscCache.sequences[sequenceKey];
39075 if (!sequence) return;
39077 var nextIndex = _oscSelectedImage.sequence_index + stepBy;
39078 var nextImage = sequence.images[nextIndex];
39079 if (!nextImage) return;
39081 context.map().centerEase(nextImage.loc);
39084 .selectImage(nextImage)
39085 .updateViewer(nextImage);
39091 showViewer: function() {
39092 var viewer = select('#photoviewer')
39093 .classed('hide', false);
39095 var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
39099 .selectAll('.photo-wrapper:not(.osc-wrapper)')
39100 .classed('hide', true);
39103 .selectAll('.photo-wrapper.osc-wrapper')
39104 .classed('hide', false);
39111 hideViewer: function() {
39112 _oscSelectedImage = null;
39114 var viewer = select('#photoviewer');
39115 if (!viewer.empty()) viewer.datum(null);
39118 .classed('hide', true)
39119 .selectAll('.photo-wrapper')
39120 .classed('hide', true);
39122 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
39123 .classed('selected', false);
39125 return this.setStyles(null, true);
39129 updateViewer: function(d) {
39130 var wrap = select('#photoviewer .osc-wrapper');
39131 var imageWrap = wrap.selectAll('.osc-image-wrap');
39132 var attribution = wrap.selectAll('.photo-attribution').html('');
39137 .call(imgZoom.transform, identity$7);
39140 .selectAll('.osc-image')
39144 var sequence = _oscCache.sequences[d.sequence_id];
39145 var r = (sequence && sequence.rotation) || 0;
39149 .attr('class', 'osc-image')
39150 .attr('src', apibase$2 + '/' + d.imagePath)
39151 .style('transform', 'rotate(' + r + 'deg)');
39153 if (d.captured_by) {
39156 .attr('class', 'captured_by')
39157 .attr('target', '_blank')
39158 .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
39159 .text('@' + d.captured_by);
39166 if (d.captured_at) {
39169 .attr('class', 'captured_at')
39170 .text(d.captured_at);
39179 .attr('class', 'image-link')
39180 .attr('target', '_blank')
39181 .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
39182 .text('openstreetcam.org');
39188 selectImage: function(d) {
39189 _oscSelectedImage = d;
39190 var viewer = select('#photoviewer');
39191 if (!viewer.empty()) viewer.datum(d);
39193 this.setStyles(null, true);
39195 d3_selectAll('.icon-sign')
39196 .classed('selected', false);
39202 getSelectedImage: function() {
39203 return _oscSelectedImage;
39207 getSequenceKeyForImage: function(d) {
39208 return d && d.sequence_id;
39212 setStyles: function(hovered, reset) {
39213 if (reset) { // reset all layers
39214 d3_selectAll('.viewfield-group')
39215 .classed('highlighted', false)
39216 .classed('hovered', false)
39217 .classed('selected', false);
39219 d3_selectAll('.sequence')
39220 .classed('highlighted', false)
39221 .classed('selected', false);
39224 var hoveredImageKey = hovered && hovered.key;
39225 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
39226 var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
39227 var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
39229 var viewer = select('#photoviewer');
39230 var selected = viewer.empty() ? undefined : viewer.datum();
39231 var selectedImageKey = selected && selected.key;
39232 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
39233 var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
39234 var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
39236 // highlight sibling viewfields on either the selected or the hovered sequences
39237 var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
39239 d3_selectAll('.layer-openstreetcam-images .viewfield-group')
39240 .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
39241 .classed('hovered', function(d) { return d.key === hoveredImageKey; })
39242 .classed('selected', function(d) { return d.key === selectedImageKey; });
39244 d3_selectAll('.layer-openstreetcam-images .sequence')
39245 .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
39246 .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
39248 // update viewfields if needed
39249 d3_selectAll('.viewfield-group .viewfield')
39250 .attr('d', viewfieldPath);
39252 function viewfieldPath() {
39253 var d = this.parentNode.__data__;
39254 if (d.pano && d.key !== selectedImageKey) {
39255 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
39257 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
39265 cache: function() {
39271 /* Built-in method references for those with the same name as other `lodash` methods. */
39272 var nativeCeil = Math.ceil,
39273 nativeMax$4 = Math.max;
39276 * Creates an array of elements split into groups the length of `size`.
39277 * If `array` can't be split evenly, the final chunk will be the remaining
39284 * @param {Array} array The array to process.
39285 * @param {number} [size=1] The length of each chunk
39286 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
39287 * @returns {Array} Returns the new array of chunks.
39290 * _.chunk(['a', 'b', 'c', 'd'], 2);
39291 * // => [['a', 'b'], ['c', 'd']]
39293 * _.chunk(['a', 'b', 'c', 'd'], 3);
39294 * // => [['a', 'b', 'c'], ['d']]
39296 function chunk(array, size, guard) {
39297 if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
39300 size = nativeMax$4(toInteger(size), 0);
39302 var length = array == null ? 0 : array.length;
39303 if (!length || size < 1) {
39308 result = Array(nativeCeil(length / size));
39310 while (index < length) {
39311 result[resIndex++] = baseSlice(array, index, (index += size));
39316 var hashes = createCommonjsModule(function (module, exports) {
39318 * jshashes - https://github.com/h2non/jshashes
39319 * Released under the "New BSD" license
39321 * Algorithms specification:
39323 * MD5 - http://www.ietf.org/rfc/rfc1321.txt
39324 * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
39325 * SHA1 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
39326 * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
39327 * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
39328 * HMAC - http://www.ietf.org/rfc/rfc2104.txt
39333 function utf8Encode(str) {
39334 var x, y, output = '',
39338 if (str && str.length) {
39340 while ((i += 1) < l) {
39341 /* Decode utf-16 surrogate pairs */
39342 x = str.charCodeAt(i);
39343 y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
39344 if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
39345 x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
39348 /* Encode output as utf-8 */
39350 output += String.fromCharCode(x);
39351 } else if (x <= 0x7FF) {
39352 output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
39353 0x80 | (x & 0x3F));
39354 } else if (x <= 0xFFFF) {
39355 output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
39356 0x80 | ((x >>> 6) & 0x3F),
39357 0x80 | (x & 0x3F));
39358 } else if (x <= 0x1FFFFF) {
39359 output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
39360 0x80 | ((x >>> 12) & 0x3F),
39361 0x80 | ((x >>> 6) & 0x3F),
39362 0x80 | (x & 0x3F));
39369 function utf8Decode(str) {
39370 var i, ac, c1, c2, c3, arr = [],
39372 i = ac = c1 = c2 = c3 = 0;
39374 if (str && str.length) {
39379 c1 = str.charCodeAt(i);
39382 arr[ac] = String.fromCharCode(c1);
39384 } else if (c1 > 191 && c1 < 224) {
39385 c2 = str.charCodeAt(i + 1);
39386 arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
39389 c2 = str.charCodeAt(i + 1);
39390 c3 = str.charCodeAt(i + 2);
39391 arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
39396 return arr.join('');
39400 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
39401 * to work around bugs in some JS interpreters.
39404 function safe_add(x, y) {
39405 var lsw = (x & 0xFFFF) + (y & 0xFFFF),
39406 msw = (x >> 16) + (y >> 16) + (lsw >> 16);
39407 return (msw << 16) | (lsw & 0xFFFF);
39411 * Bitwise rotate a 32-bit number to the left.
39414 function bit_rol(num, cnt) {
39415 return (num << cnt) | (num >>> (32 - cnt));
39419 * Convert a raw string to a hex string
39422 function rstr2hex(input, hexcase) {
39423 var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
39427 for (; i < l; i += 1) {
39428 x = input.charCodeAt(i);
39429 output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
39435 * Convert an array of big-endian words to a string
39438 function binb2rstr(input) {
39439 var i, l = input.length * 32,
39441 for (i = 0; i < l; i += 8) {
39442 output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
39448 * Convert an array of little-endian words to a string
39451 function binl2rstr(input) {
39452 var i, l = input.length * 32,
39454 for (i = 0; i < l; i += 8) {
39455 output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
39461 * Convert a raw string to an array of little-endian words
39462 * Characters >255 have their high-byte silently ignored.
39465 function rstr2binl(input) {
39466 var i, l = input.length * 8,
39467 output = Array(input.length >> 2),
39468 lo = output.length;
39469 for (i = 0; i < lo; i += 1) {
39472 for (i = 0; i < l; i += 8) {
39473 output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
39479 * Convert a raw string to an array of big-endian words
39480 * Characters >255 have their high-byte silently ignored.
39483 function rstr2binb(input) {
39484 var i, l = input.length * 8,
39485 output = Array(input.length >> 2),
39486 lo = output.length;
39487 for (i = 0; i < lo; i += 1) {
39490 for (i = 0; i < l; i += 8) {
39491 output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
39497 * Convert a raw string to an arbitrary string encoding
39500 function rstr2any(input, encoding) {
39501 var divisor = encoding.length,
39502 remainders = Array(),
39503 i, q, x, ld, quotient, dividend, output, full_length;
39505 /* Convert to an array of 16-bit big-endian values, forming the dividend */
39506 dividend = Array(Math.ceil(input.length / 2));
39507 ld = dividend.length;
39508 for (i = 0; i < ld; i += 1) {
39509 dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
39513 * Repeatedly perform a long division. The binary array forms the dividend,
39514 * the length of the encoding is the divisor. Once computed, the quotient
39515 * forms the dividend for the next step. We stop when the dividend is zerHashes.
39516 * All remainders are stored for later use.
39518 while (dividend.length > 0) {
39519 quotient = Array();
39521 for (i = 0; i < dividend.length; i += 1) {
39522 x = (x << 16) + dividend[i];
39523 q = Math.floor(x / divisor);
39525 if (quotient.length > 0 || q > 0) {
39526 quotient[quotient.length] = q;
39529 remainders[remainders.length] = x;
39530 dividend = quotient;
39533 /* Convert the remainders to the output string */
39535 for (i = remainders.length - 1; i >= 0; i--) {
39536 output += encoding.charAt(remainders[i]);
39539 /* Append leading zero equivalents */
39540 full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
39541 for (i = output.length; i < full_length; i += 1) {
39542 output = encoding[0] + output;
39548 * Convert a raw string to a base-64 string
39551 function rstr2b64(input, b64pad) {
39552 var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
39554 len = input.length,
39556 b64pad = b64pad || '=';
39557 for (i = 0; i < len; i += 3) {
39558 triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
39559 for (j = 0; j < 4; j += 1) {
39560 if (i * 8 + j * 6 > input.length * 8) {
39563 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
39572 * @property {String} version
39581 Base64: function() {
39582 // private properties
39583 var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
39584 pad = '=', // default pad according with the RFC standard
39585 utf8 = true; // by default enable UTF-8 support encoding
39587 // public method for encoding
39588 this.encode = function(input) {
39591 len = input.length;
39594 input = (utf8) ? utf8Encode(input) : input;
39596 for (i = 0; i < len; i += 3) {
39597 triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
39598 for (j = 0; j < 4; j += 1) {
39599 if (i * 8 + j * 6 > len * 8) {
39602 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
39609 // public method for decoding
39610 this.decode = function(input) {
39611 // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
39612 var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
39620 input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
39623 do { // unpack four hexets into three octets using index points in b64
39624 h1 = tab.indexOf(input.charAt(i += 1));
39625 h2 = tab.indexOf(input.charAt(i += 1));
39626 h3 = tab.indexOf(input.charAt(i += 1));
39627 h4 = tab.indexOf(input.charAt(i += 1));
39629 bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
39631 o1 = bits >> 16 & 0xff;
39632 o2 = bits >> 8 & 0xff;
39637 arr[ac] = String.fromCharCode(o1);
39638 } else if (h4 === 64) {
39639 arr[ac] = String.fromCharCode(o1, o2);
39641 arr[ac] = String.fromCharCode(o1, o2, o3);
39643 } while (i < input.length);
39645 dec = arr.join('');
39646 dec = (utf8) ? utf8Decode(dec) : dec;
39651 // set custom pad string
39652 this.setPad = function(str) {
39656 // set custom tab string characters
39657 this.setTab = function(str) {
39661 this.setUTF8 = function(bool) {
39662 if (typeof bool === 'boolean') {
39670 * CRC-32 calculation
39674 * @param {String} str Input String
39677 CRC32: function(str) {
39682 str = utf8Encode(str);
39685 '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
39686 '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
39687 '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
39688 '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
39689 'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
39690 '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
39691 'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
39692 '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
39693 'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
39694 '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
39695 'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
39696 '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
39697 'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
39698 '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
39699 '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
39700 '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
39701 '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
39702 'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
39703 '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
39704 'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
39705 '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
39706 'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
39707 '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
39708 'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
39709 '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
39710 'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
39714 for (i = 0, iTop = str.length; i < iTop; i += 1) {
39715 y = (crc ^ str.charCodeAt(i)) & 0xFF;
39716 x = '0x' + table.substr(y * 9, 8);
39717 crc = (crc >>> 8) ^ x;
39719 // always return a positive number (that's what >>> 0 does)
39720 return (crc ^ (-1)) >>> 0;
39726 * @param {Object} [config]
39728 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
39729 * Digest Algorithm, as defined in RFC 1321.
39730 * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
39731 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
39732 * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
39734 MD5: function(options) {
39736 * Private config properties. You may need to tweak these to be compatible with
39737 * the server-side, but the defaults work in most cases.
39738 * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
39740 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
39741 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
39742 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
39744 // privileged (public) methods
39745 this.hex = function(s) {
39746 return rstr2hex(rstr(s, utf8), hexcase);
39748 this.b64 = function(s) {
39749 return rstr2b64(rstr(s), b64pad);
39751 this.any = function(s, e) {
39752 return rstr2any(rstr(s, utf8), e);
39754 this.raw = function(s) {
39755 return rstr(s, utf8);
39757 this.hex_hmac = function(k, d) {
39758 return rstr2hex(rstr_hmac(k, d), hexcase);
39760 this.b64_hmac = function(k, d) {
39761 return rstr2b64(rstr_hmac(k, d), b64pad);
39763 this.any_hmac = function(k, d, e) {
39764 return rstr2any(rstr_hmac(k, d), e);
39767 * Perform a simple self-test to see if the VM is working
39768 * @return {String} Hexadecimal hash sample
39770 this.vm_test = function() {
39771 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
39774 * Enable/disable uppercase hexadecimal returned string
39776 * @return {Object} this
39778 this.setUpperCase = function(a) {
39779 if (typeof a === 'boolean') {
39785 * Defines a base64 pad string
39786 * @param {String} Pad
39787 * @return {Object} this
39789 this.setPad = function(a) {
39790 b64pad = a || b64pad;
39794 * Defines a base64 pad string
39796 * @return {Object} [this]
39798 this.setUTF8 = function(a) {
39799 if (typeof a === 'boolean') {
39808 * Calculate the MD5 of a raw string
39812 s = (utf8) ? utf8Encode(s) : s;
39813 return binl2rstr(binl(rstr2binl(s), s.length * 8));
39817 * Calculate the HMAC-MD5, of a key and some data (raw strings)
39820 function rstr_hmac(key, data) {
39821 var bkey, ipad, opad, hash, i;
39823 key = (utf8) ? utf8Encode(key) : key;
39824 data = (utf8) ? utf8Encode(data) : data;
39825 bkey = rstr2binl(key);
39826 if (bkey.length > 16) {
39827 bkey = binl(bkey, key.length * 8);
39830 ipad = Array(16), opad = Array(16);
39831 for (i = 0; i < 16; i += 1) {
39832 ipad[i] = bkey[i] ^ 0x36363636;
39833 opad[i] = bkey[i] ^ 0x5C5C5C5C;
39835 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
39836 return binl2rstr(binl(opad.concat(hash), 512 + 128));
39840 * Calculate the MD5 of an array of little-endian words, and a bit length.
39843 function binl(x, len) {
39844 var i, olda, oldb, oldc, oldd,
39850 /* append padding */
39851 x[len >> 5] |= 0x80 << ((len) % 32);
39852 x[(((len + 64) >>> 9) << 4) + 14] = len;
39854 for (i = 0; i < x.length; i += 16) {
39860 a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
39861 d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
39862 c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
39863 b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
39864 a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
39865 d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
39866 c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
39867 b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
39868 a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
39869 d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
39870 c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
39871 b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
39872 a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
39873 d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
39874 c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
39875 b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
39877 a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
39878 d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
39879 c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
39880 b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
39881 a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
39882 d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
39883 c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
39884 b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
39885 a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
39886 d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
39887 c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
39888 b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
39889 a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
39890 d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
39891 c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
39892 b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
39894 a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
39895 d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
39896 c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
39897 b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
39898 a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
39899 d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
39900 c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
39901 b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
39902 a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
39903 d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
39904 c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
39905 b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
39906 a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
39907 d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
39908 c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
39909 b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
39911 a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
39912 d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
39913 c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
39914 b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
39915 a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
39916 d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
39917 c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
39918 b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
39919 a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
39920 d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
39921 c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
39922 b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
39923 a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
39924 d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
39925 c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
39926 b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
39928 a = safe_add(a, olda);
39929 b = safe_add(b, oldb);
39930 c = safe_add(c, oldc);
39931 d = safe_add(d, oldd);
39933 return Array(a, b, c, d);
39937 * These functions implement the four basic operations the algorithm uses.
39940 function md5_cmn(q, a, b, x, s, t) {
39941 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
39944 function md5_ff(a, b, c, d, x, s, t) {
39945 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
39948 function md5_gg(a, b, c, d, x, s, t) {
39949 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
39952 function md5_hh(a, b, c, d, x, s, t) {
39953 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
39956 function md5_ii(a, b, c, d, x, s, t) {
39957 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
39962 * @class Hashes.SHA1
39963 * @param {Object} [config]
39966 * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
39967 * Version 2.2 Copyright Paul Johnston 2000 - 2009.
39968 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
39969 * See http://pajhome.org.uk/crypt/md5 for details.
39971 SHA1: function(options) {
39973 * Private config properties. You may need to tweak these to be compatible with
39974 * the server-side, but the defaults work in most cases.
39975 * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
39977 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
39978 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
39979 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
39982 this.hex = function(s) {
39983 return rstr2hex(rstr(s, utf8), hexcase);
39985 this.b64 = function(s) {
39986 return rstr2b64(rstr(s, utf8), b64pad);
39988 this.any = function(s, e) {
39989 return rstr2any(rstr(s, utf8), e);
39991 this.raw = function(s) {
39992 return rstr(s, utf8);
39994 this.hex_hmac = function(k, d) {
39995 return rstr2hex(rstr_hmac(k, d));
39997 this.b64_hmac = function(k, d) {
39998 return rstr2b64(rstr_hmac(k, d), b64pad);
40000 this.any_hmac = function(k, d, e) {
40001 return rstr2any(rstr_hmac(k, d), e);
40004 * Perform a simple self-test to see if the VM is working
40005 * @return {String} Hexadecimal hash sample
40008 this.vm_test = function() {
40009 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40012 * @description Enable/disable uppercase hexadecimal returned string
40014 * @return {Object} this
40017 this.setUpperCase = function(a) {
40018 if (typeof a === 'boolean') {
40024 * @description Defines a base64 pad string
40025 * @param {string} Pad
40026 * @return {Object} this
40029 this.setPad = function(a) {
40030 b64pad = a || b64pad;
40034 * @description Defines a base64 pad string
40036 * @return {Object} this
40039 this.setUTF8 = function(a) {
40040 if (typeof a === 'boolean') {
40049 * Calculate the SHA-512 of a raw string
40053 s = (utf8) ? utf8Encode(s) : s;
40054 return binb2rstr(binb(rstr2binb(s), s.length * 8));
40058 * Calculate the HMAC-SHA1 of a key and some data (raw strings)
40061 function rstr_hmac(key, data) {
40062 var bkey, ipad, opad, i, hash;
40063 key = (utf8) ? utf8Encode(key) : key;
40064 data = (utf8) ? utf8Encode(data) : data;
40065 bkey = rstr2binb(key);
40067 if (bkey.length > 16) {
40068 bkey = binb(bkey, key.length * 8);
40070 ipad = Array(16), opad = Array(16);
40071 for (i = 0; i < 16; i += 1) {
40072 ipad[i] = bkey[i] ^ 0x36363636;
40073 opad[i] = bkey[i] ^ 0x5C5C5C5C;
40075 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
40076 return binb2rstr(binb(opad.concat(hash), 512 + 160));
40080 * Calculate the SHA-1 of an array of big-endian words, and a bit length
40083 function binb(x, len) {
40084 var i, j, t, olda, oldb, oldc, oldd, olde,
40092 /* append padding */
40093 x[len >> 5] |= 0x80 << (24 - len % 32);
40094 x[((len + 64 >> 9) << 4) + 15] = len;
40096 for (i = 0; i < x.length; i += 16) {
40103 for (j = 0; j < 80; j += 1) {
40107 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
40109 t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
40110 safe_add(safe_add(e, w[j]), sha1_kt(j)));
40113 c = bit_rol(b, 30);
40118 a = safe_add(a, olda);
40119 b = safe_add(b, oldb);
40120 c = safe_add(c, oldc);
40121 d = safe_add(d, oldd);
40122 e = safe_add(e, olde);
40124 return Array(a, b, c, d, e);
40128 * Perform the appropriate triplet combination function for the current
40132 function sha1_ft(t, b, c, d) {
40134 return (b & c) | ((~b) & d);
40140 return (b & c) | (b & d) | (c & d);
40146 * Determine the appropriate additive constant for the current iteration
40149 function sha1_kt(t) {
40150 return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
40151 (t < 60) ? -1894007588 : -899497514;
40155 * @class Hashes.SHA256
40158 * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
40159 * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
40160 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40161 * See http://pajhome.org.uk/crypt/md5 for details.
40162 * Also http://anmar.eu.org/projects/jssha2/
40164 SHA256: function(options) {
40166 * Private properties configuration variables. You may need to tweak these to be compatible with
40167 * the server-side, but the defaults work in most cases.
40168 * @see this.setUpperCase() method
40169 * @see this.setPad() method
40171 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase */
40172 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
40173 /* base-64 pad character. Default '=' for strict RFC compliance */
40174 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
40175 /* enable/disable utf8 encoding */
40178 /* privileged (public) methods */
40179 this.hex = function(s) {
40180 return rstr2hex(rstr(s, utf8));
40182 this.b64 = function(s) {
40183 return rstr2b64(rstr(s, utf8), b64pad);
40185 this.any = function(s, e) {
40186 return rstr2any(rstr(s, utf8), e);
40188 this.raw = function(s) {
40189 return rstr(s, utf8);
40191 this.hex_hmac = function(k, d) {
40192 return rstr2hex(rstr_hmac(k, d));
40194 this.b64_hmac = function(k, d) {
40195 return rstr2b64(rstr_hmac(k, d), b64pad);
40197 this.any_hmac = function(k, d, e) {
40198 return rstr2any(rstr_hmac(k, d), e);
40201 * Perform a simple self-test to see if the VM is working
40202 * @return {String} Hexadecimal hash sample
40205 this.vm_test = function() {
40206 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40209 * Enable/disable uppercase hexadecimal returned string
40211 * @return {Object} this
40214 this.setUpperCase = function(a) {
40215 if (typeof a === 'boolean') {
40221 * @description Defines a base64 pad string
40222 * @param {string} Pad
40223 * @return {Object} this
40226 this.setPad = function(a) {
40227 b64pad = a || b64pad;
40231 * Defines a base64 pad string
40233 * @return {Object} this
40236 this.setUTF8 = function(a) {
40237 if (typeof a === 'boolean') {
40246 * Calculate the SHA-512 of a raw string
40249 function rstr(s, utf8) {
40250 s = (utf8) ? utf8Encode(s) : s;
40251 return binb2rstr(binb(rstr2binb(s), s.length * 8));
40255 * Calculate the HMAC-sha256 of a key and some data (raw strings)
40258 function rstr_hmac(key, data) {
40259 key = (utf8) ? utf8Encode(key) : key;
40260 data = (utf8) ? utf8Encode(data) : data;
40262 bkey = rstr2binb(key),
40266 if (bkey.length > 16) {
40267 bkey = binb(bkey, key.length * 8);
40270 for (; i < 16; i += 1) {
40271 ipad[i] = bkey[i] ^ 0x36363636;
40272 opad[i] = bkey[i] ^ 0x5C5C5C5C;
40275 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
40276 return binb2rstr(binb(opad.concat(hash), 512 + 256));
40280 * Main sha256 function, with its support functions
40283 function sha256_S(X, n) {
40284 return (X >>> n) | (X << (32 - n));
40287 function sha256_R(X, n) {
40291 function sha256_Ch(x, y, z) {
40292 return ((x & y) ^ ((~x) & z));
40295 function sha256_Maj(x, y, z) {
40296 return ((x & y) ^ (x & z) ^ (y & z));
40299 function sha256_Sigma0256(x) {
40300 return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
40303 function sha256_Sigma1256(x) {
40304 return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
40307 function sha256_Gamma0256(x) {
40308 return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
40311 function sha256_Gamma1256(x) {
40312 return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
40316 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
40317 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
40318 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
40319 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
40320 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
40321 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
40322 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
40325 function binb(m, l) {
40326 var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
40327 1359893119, -1694144372, 528734635, 1541459225
40329 var W = new Array(64);
40330 var a, b, c, d, e, f, g, h;
40333 /* append padding */
40334 m[l >> 5] |= 0x80 << (24 - l % 32);
40335 m[((l + 64 >> 9) << 4) + 15] = l;
40337 for (i = 0; i < m.length; i += 16) {
40347 for (j = 0; j < 64; j += 1) {
40351 W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
40352 sha256_Gamma0256(W[j - 15])), W[j - 16]);
40355 T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
40356 sha256_K[j]), W[j]);
40357 T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
40361 e = safe_add(d, T1);
40365 a = safe_add(T1, T2);
40368 HASH[0] = safe_add(a, HASH[0]);
40369 HASH[1] = safe_add(b, HASH[1]);
40370 HASH[2] = safe_add(c, HASH[2]);
40371 HASH[3] = safe_add(d, HASH[3]);
40372 HASH[4] = safe_add(e, HASH[4]);
40373 HASH[5] = safe_add(f, HASH[5]);
40374 HASH[6] = safe_add(g, HASH[6]);
40375 HASH[7] = safe_add(h, HASH[7]);
40383 * @class Hashes.SHA512
40386 * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
40387 * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
40388 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40389 * See http://pajhome.org.uk/crypt/md5 for details.
40391 SHA512: function(options) {
40393 * Private properties configuration variables. You may need to tweak these to be compatible with
40394 * the server-side, but the defaults work in most cases.
40395 * @see this.setUpperCase() method
40396 * @see this.setPad() method
40398 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
40399 /* hexadecimal output case format. false - lowercase; true - uppercase */
40400 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
40401 /* base-64 pad character. Default '=' for strict RFC compliance */
40402 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
40403 /* enable/disable utf8 encoding */
40406 /* privileged (public) methods */
40407 this.hex = function(s) {
40408 return rstr2hex(rstr(s));
40410 this.b64 = function(s) {
40411 return rstr2b64(rstr(s), b64pad);
40413 this.any = function(s, e) {
40414 return rstr2any(rstr(s), e);
40416 this.raw = function(s) {
40417 return rstr(s, utf8);
40419 this.hex_hmac = function(k, d) {
40420 return rstr2hex(rstr_hmac(k, d));
40422 this.b64_hmac = function(k, d) {
40423 return rstr2b64(rstr_hmac(k, d), b64pad);
40425 this.any_hmac = function(k, d, e) {
40426 return rstr2any(rstr_hmac(k, d), e);
40429 * Perform a simple self-test to see if the VM is working
40430 * @return {String} Hexadecimal hash sample
40433 this.vm_test = function() {
40434 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40437 * @description Enable/disable uppercase hexadecimal returned string
40439 * @return {Object} this
40442 this.setUpperCase = function(a) {
40443 if (typeof a === 'boolean') {
40449 * @description Defines a base64 pad string
40450 * @param {string} Pad
40451 * @return {Object} this
40454 this.setPad = function(a) {
40455 b64pad = a || b64pad;
40459 * @description Defines a base64 pad string
40461 * @return {Object} this
40464 this.setUTF8 = function(a) {
40465 if (typeof a === 'boolean') {
40471 /* private methods */
40474 * Calculate the SHA-512 of a raw string
40478 s = (utf8) ? utf8Encode(s) : s;
40479 return binb2rstr(binb(rstr2binb(s), s.length * 8));
40482 * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
40485 function rstr_hmac(key, data) {
40486 key = (utf8) ? utf8Encode(key) : key;
40487 data = (utf8) ? utf8Encode(data) : data;
40490 bkey = rstr2binb(key),
40494 if (bkey.length > 32) {
40495 bkey = binb(bkey, key.length * 8);
40498 for (; i < 32; i += 1) {
40499 ipad[i] = bkey[i] ^ 0x36363636;
40500 opad[i] = bkey[i] ^ 0x5C5C5C5C;
40503 hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
40504 return binb2rstr(binb(opad.concat(hash), 1024 + 512));
40508 * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
40511 function binb(x, len) {
40514 hash = new Array(16),
40515 //Initial hash values
40517 new int64(0x6a09e667, -205731576),
40518 new int64(-1150833019, -2067093701),
40519 new int64(0x3c6ef372, -23791573),
40520 new int64(-1521486534, 0x5f1d36f1),
40521 new int64(0x510e527f, -1377402159),
40522 new int64(-1694144372, 0x2b3e6c1f),
40523 new int64(0x1f83d9ab, -79577749),
40524 new int64(0x5be0cd19, 0x137e2179)
40526 T1 = new int64(0, 0),
40527 T2 = new int64(0, 0),
40528 a = new int64(0, 0),
40529 b = new int64(0, 0),
40530 c = new int64(0, 0),
40531 d = new int64(0, 0),
40532 e = new int64(0, 0),
40533 f = new int64(0, 0),
40534 g = new int64(0, 0),
40535 h = new int64(0, 0),
40536 //Temporary variables not specified by the document
40537 s0 = new int64(0, 0),
40538 s1 = new int64(0, 0),
40539 Ch = new int64(0, 0),
40540 Maj = new int64(0, 0),
40541 r1 = new int64(0, 0),
40542 r2 = new int64(0, 0),
40543 r3 = new int64(0, 0);
40545 if (sha512_k === undefined) {
40548 new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
40549 new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
40550 new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
40551 new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
40552 new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
40553 new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
40554 new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
40555 new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
40556 new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
40557 new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
40558 new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
40559 new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
40560 new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
40561 new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
40562 new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
40563 new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
40564 new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
40565 new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
40566 new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
40567 new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
40568 new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
40569 new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
40570 new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
40571 new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
40572 new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
40573 new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
40574 new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
40575 new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
40576 new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
40577 new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
40578 new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
40579 new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
40580 new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
40581 new int64(-354779690, -840897762), new int64(-176337025, -294727304),
40582 new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
40583 new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
40584 new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
40585 new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
40586 new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
40587 new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
40591 for (i = 0; i < 80; i += 1) {
40592 W[i] = new int64(0, 0);
40595 // append padding to the source string. The format is described in the FIPS.
40596 x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
40597 x[((len + 128 >> 10) << 5) + 31] = len;
40599 for (i = 0; i < l; i += 32) { //32 dwords is the block size
40600 int64copy(a, H[0]);
40601 int64copy(b, H[1]);
40602 int64copy(c, H[2]);
40603 int64copy(d, H[3]);
40604 int64copy(e, H[4]);
40605 int64copy(f, H[5]);
40606 int64copy(g, H[6]);
40607 int64copy(h, H[7]);
40609 for (j = 0; j < 16; j += 1) {
40610 W[j].h = x[i + 2 * j];
40611 W[j].l = x[i + 2 * j + 1];
40614 for (j = 16; j < 80; j += 1) {
40616 int64rrot(r1, W[j - 2], 19);
40617 int64revrrot(r2, W[j - 2], 29);
40618 int64shr(r3, W[j - 2], 6);
40619 s1.l = r1.l ^ r2.l ^ r3.l;
40620 s1.h = r1.h ^ r2.h ^ r3.h;
40622 int64rrot(r1, W[j - 15], 1);
40623 int64rrot(r2, W[j - 15], 8);
40624 int64shr(r3, W[j - 15], 7);
40625 s0.l = r1.l ^ r2.l ^ r3.l;
40626 s0.h = r1.h ^ r2.h ^ r3.h;
40628 int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
40631 for (j = 0; j < 80; j += 1) {
40633 Ch.l = (e.l & f.l) ^ (~e.l & g.l);
40634 Ch.h = (e.h & f.h) ^ (~e.h & g.h);
40637 int64rrot(r1, e, 14);
40638 int64rrot(r2, e, 18);
40639 int64revrrot(r3, e, 9);
40640 s1.l = r1.l ^ r2.l ^ r3.l;
40641 s1.h = r1.h ^ r2.h ^ r3.h;
40644 int64rrot(r1, a, 28);
40645 int64revrrot(r2, a, 2);
40646 int64revrrot(r3, a, 7);
40647 s0.l = r1.l ^ r2.l ^ r3.l;
40648 s0.h = r1.h ^ r2.h ^ r3.h;
40651 Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
40652 Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
40654 int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
40655 int64add(T2, s0, Maj);
40660 int64add(e, d, T1);
40664 int64add(a, T1, T2);
40666 int64add(H[0], H[0], a);
40667 int64add(H[1], H[1], b);
40668 int64add(H[2], H[2], c);
40669 int64add(H[3], H[3], d);
40670 int64add(H[4], H[4], e);
40671 int64add(H[5], H[5], f);
40672 int64add(H[6], H[6], g);
40673 int64add(H[7], H[7], h);
40676 //represent the hash as an array of 32-bit dwords
40677 for (i = 0; i < 8; i += 1) {
40678 hash[2 * i] = H[i].h;
40679 hash[2 * i + 1] = H[i].l;
40684 //A constructor for 64-bit numbers
40686 function int64(h, l) {
40689 //this.toString = int64toString;
40692 //Copies src into dst, assuming both are 64-bit numbers
40694 function int64copy(dst, src) {
40699 //Right-rotates a 64-bit number by shift
40700 //Won't handle cases of shift>=32
40701 //The function revrrot() is for that
40703 function int64rrot(dst, x, shift) {
40704 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
40705 dst.h = (x.h >>> shift) | (x.l << (32 - shift));
40708 //Reverses the dwords of the source and then rotates right by shift.
40709 //This is equivalent to rotation by 32+shift
40711 function int64revrrot(dst, x, shift) {
40712 dst.l = (x.h >>> shift) | (x.l << (32 - shift));
40713 dst.h = (x.l >>> shift) | (x.h << (32 - shift));
40716 //Bitwise-shifts right a 64-bit number by shift
40717 //Won't handle shift>=32, but it's never needed in SHA512
40719 function int64shr(dst, x, shift) {
40720 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
40721 dst.h = (x.h >>> shift);
40724 //Adds two 64-bit numbers
40725 //Like the original implementation, does not rely on 32-bit operations
40727 function int64add(dst, x, y) {
40728 var w0 = (x.l & 0xffff) + (y.l & 0xffff);
40729 var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
40730 var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
40731 var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
40732 dst.l = (w0 & 0xffff) | (w1 << 16);
40733 dst.h = (w2 & 0xffff) | (w3 << 16);
40736 //Same, except with 4 addends. Works faster than adding them one by one.
40738 function int64add4(dst, a, b, c, d) {
40739 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
40740 var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
40741 var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
40742 var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
40743 dst.l = (w0 & 0xffff) | (w1 << 16);
40744 dst.h = (w2 & 0xffff) | (w3 << 16);
40747 //Same, except with 5 addends
40749 function int64add5(dst, a, b, c, d, e) {
40750 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
40751 w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
40752 w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
40753 w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
40754 dst.l = (w0 & 0xffff) | (w1 << 16);
40755 dst.h = (w2 & 0xffff) | (w3 << 16);
40759 * @class Hashes.RMD160
40761 * @param {Object} [config]
40763 * A JavaScript implementation of the RIPEMD-160 Algorithm
40764 * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
40765 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40766 * See http://pajhome.org.uk/crypt/md5 for details.
40767 * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
40769 RMD160: function(options) {
40771 * Private properties configuration variables. You may need to tweak these to be compatible with
40772 * the server-side, but the defaults work in most cases.
40773 * @see this.setUpperCase() method
40774 * @see this.setPad() method
40776 var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
40777 /* hexadecimal output case format. false - lowercase; true - uppercase */
40778 b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
40779 /* base-64 pad character. Default '=' for strict RFC compliance */
40780 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
40781 /* enable/disable utf8 encoding */
40783 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
40784 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
40785 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
40786 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
40787 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
40790 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
40791 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
40792 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
40793 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
40794 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
40797 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
40798 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
40799 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
40800 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
40801 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
40804 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
40805 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
40806 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
40807 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
40808 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
40811 /* privileged (public) methods */
40812 this.hex = function(s) {
40813 return rstr2hex(rstr(s, utf8));
40815 this.b64 = function(s) {
40816 return rstr2b64(rstr(s, utf8), b64pad);
40818 this.any = function(s, e) {
40819 return rstr2any(rstr(s, utf8), e);
40821 this.raw = function(s) {
40822 return rstr(s, utf8);
40824 this.hex_hmac = function(k, d) {
40825 return rstr2hex(rstr_hmac(k, d));
40827 this.b64_hmac = function(k, d) {
40828 return rstr2b64(rstr_hmac(k, d), b64pad);
40830 this.any_hmac = function(k, d, e) {
40831 return rstr2any(rstr_hmac(k, d), e);
40834 * Perform a simple self-test to see if the VM is working
40835 * @return {String} Hexadecimal hash sample
40838 this.vm_test = function() {
40839 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40842 * @description Enable/disable uppercase hexadecimal returned string
40844 * @return {Object} this
40847 this.setUpperCase = function(a) {
40848 if (typeof a === 'boolean') {
40854 * @description Defines a base64 pad string
40855 * @param {string} Pad
40856 * @return {Object} this
40859 this.setPad = function(a) {
40860 if (typeof a !== 'undefined') {
40866 * @description Defines a base64 pad string
40868 * @return {Object} this
40871 this.setUTF8 = function(a) {
40872 if (typeof a === 'boolean') {
40878 /* private methods */
40881 * Calculate the rmd160 of a raw string
40885 s = (utf8) ? utf8Encode(s) : s;
40886 return binl2rstr(binl(rstr2binl(s), s.length * 8));
40890 * Calculate the HMAC-rmd160 of a key and some data (raw strings)
40893 function rstr_hmac(key, data) {
40894 key = (utf8) ? utf8Encode(key) : key;
40895 data = (utf8) ? utf8Encode(data) : data;
40897 bkey = rstr2binl(key),
40901 if (bkey.length > 16) {
40902 bkey = binl(bkey, key.length * 8);
40905 for (i = 0; i < 16; i += 1) {
40906 ipad[i] = bkey[i] ^ 0x36363636;
40907 opad[i] = bkey[i] ^ 0x5C5C5C5C;
40909 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
40910 return binl2rstr(binl(opad.concat(hash), 512 + 160));
40914 * Convert an array of little-endian words to a string
40917 function binl2rstr(input) {
40918 var i, output = '',
40919 l = input.length * 32;
40920 for (i = 0; i < l; i += 8) {
40921 output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
40927 * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
40930 function binl(x, len) {
40937 A1, B1, C1, D1, E1,
40938 A2, B2, C2, D2, E2;
40940 /* append padding */
40941 x[len >> 5] |= 0x80 << (len % 32);
40942 x[(((len + 64) >>> 9) << 4) + 14] = len;
40945 for (i = 0; i < l; i += 16) {
40951 for (j = 0; j <= 79; j += 1) {
40952 T = safe_add(A1, rmd160_f(j, B1, C1, D1));
40953 T = safe_add(T, x[i + rmd160_r1[j]]);
40954 T = safe_add(T, rmd160_K1(j));
40955 T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
40958 D1 = bit_rol(C1, 10);
40961 T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
40962 T = safe_add(T, x[i + rmd160_r2[j]]);
40963 T = safe_add(T, rmd160_K2(j));
40964 T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
40967 D2 = bit_rol(C2, 10);
40972 T = safe_add(h1, safe_add(C1, D2));
40973 h1 = safe_add(h2, safe_add(D1, E2));
40974 h2 = safe_add(h3, safe_add(E1, A2));
40975 h3 = safe_add(h4, safe_add(A1, B2));
40976 h4 = safe_add(h0, safe_add(B1, C2));
40979 return [h0, h1, h2, h3, h4];
40982 // specific algorithm methods
40984 function rmd160_f(j, x, y, z) {
40985 return (0 <= j && j <= 15) ? (x ^ y ^ z) :
40986 (16 <= j && j <= 31) ? (x & y) | (~x & z) :
40987 (32 <= j && j <= 47) ? (x | ~y) ^ z :
40988 (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
40989 (64 <= j && j <= 79) ? x ^ (y | ~z) :
40990 'rmd160_f: j out of range';
40993 function rmd160_K1(j) {
40994 return (0 <= j && j <= 15) ? 0x00000000 :
40995 (16 <= j && j <= 31) ? 0x5a827999 :
40996 (32 <= j && j <= 47) ? 0x6ed9eba1 :
40997 (48 <= j && j <= 63) ? 0x8f1bbcdc :
40998 (64 <= j && j <= 79) ? 0xa953fd4e :
40999 'rmd160_K1: j out of range';
41002 function rmd160_K2(j) {
41003 return (0 <= j && j <= 15) ? 0x50a28be6 :
41004 (16 <= j && j <= 31) ? 0x5c4dd124 :
41005 (32 <= j && j <= 47) ? 0x6d703ef3 :
41006 (48 <= j && j <= 63) ? 0x7a6d76e9 :
41007 (64 <= j && j <= 79) ? 0x00000000 :
41008 'rmd160_K2: j out of range';
41014 (function(window, undefined) {
41015 var freeExports = false;
41017 freeExports = exports;
41018 if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
41019 window = commonjsGlobal;
41023 if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
41024 // define as an anonymous module, so, through path mapping, it can be aliased
41025 undefined(function() {
41028 } else if (freeExports) {
41029 // in Node.js or RingoJS v0.8.0+
41030 if (module && module.exports === freeExports) {
41031 module.exports = Hashes;
41033 // in Narwhal or RingoJS v0.7.0-
41035 freeExports.Hashes = Hashes;
41038 // in a browser or Rhino
41039 window.Hashes = Hashes;
41045 var hashes$1 = /*#__PURE__*/Object.freeze({
41047 __moduleExports: hashes
41050 var immutable = extend$2;
41052 var hasOwnProperty$g = Object.prototype.hasOwnProperty;
41054 function extend$2() {
41057 for (var i = 0; i < arguments.length; i++) {
41058 var source = arguments[i];
41060 for (var key in source) {
41061 if (hasOwnProperty$g.call(source, key)) {
41062 target[key] = source[key];
41070 var immutable$1 = /*#__PURE__*/Object.freeze({
41071 default: immutable,
41072 __moduleExports: immutable
41075 var hashes$2 = ( hashes$1 && hashes ) || hashes$1;
41077 var xtend = ( immutable$1 && immutable ) || immutable$1;
41079 var sha1 = new hashes$2.SHA1();
41083 ohauth.qsString = function(obj) {
41084 return Object.keys(obj).sort().map(function(key) {
41085 return ohauth.percentEncode(key) + '=' +
41086 ohauth.percentEncode(obj[key]);
41090 ohauth.stringQs = function(str) {
41091 return str.split('&').filter(function (pair) {
41092 return pair !== '';
41093 }).reduce(function(obj, pair){
41094 var parts = pair.split('=');
41095 obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
41096 '' : decodeURIComponent(parts[1]);
41101 ohauth.rawxhr = function(method, url, data, headers, callback) {
41102 var xhr = new XMLHttpRequest(),
41103 twoHundred = /^20\d$/;
41104 xhr.onreadystatechange = function() {
41105 if (4 === xhr.readyState && 0 !== xhr.status) {
41106 if (twoHundred.test(xhr.status)) callback(null, xhr);
41107 else return callback(xhr, null);
41110 xhr.onerror = function(e) { return callback(e, null); };
41111 xhr.open(method, url, true);
41112 for (var h in headers) xhr.setRequestHeader(h, headers[h]);
41117 ohauth.xhr = function(method, url, auth, data, options, callback) {
41118 var headers = (options && options.header) || {
41119 'Content-Type': 'application/x-www-form-urlencoded'
41121 headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
41122 return ohauth.rawxhr(method, url, data, headers, callback);
41125 ohauth.nonce = function() {
41126 for (var o = ''; o.length < 6;) {
41127 o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
41132 ohauth.authHeader = function(obj) {
41133 return Object.keys(obj).sort().map(function(key) {
41134 return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
41138 ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
41140 ohauth.percentEncode = function(s) {
41141 return encodeURIComponent(s)
41142 .replace(/\!/g, '%21').replace(/\'/g, '%27')
41143 .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
41146 ohauth.baseString = function(method, url, params) {
41147 if (params.oauth_signature) delete params.oauth_signature;
41150 ohauth.percentEncode(url),
41151 ohauth.percentEncode(ohauth.qsString(params))].join('&');
41154 ohauth.signature = function(oauth_secret, token_secret, baseString) {
41155 return sha1.b64_hmac(
41156 ohauth.percentEncode(oauth_secret) + '&' +
41157 ohauth.percentEncode(token_secret),
41162 * Takes an options object for configuration (consumer_key,
41163 * consumer_secret, version, signature_method, token, token_secret)
41164 * and returns a function that generates the Authorization header
41167 * The returned function takes these parameters:
41168 * - method: GET/POST/...
41169 * - uri: full URI with protocol, port, path and query string
41170 * - extra_params: any extra parameters (that are passed in the POST data),
41171 * can be an object or a from-urlencoded string.
41173 * Returned function returns full OAuth header with "OAuth" string in it.
41176 ohauth.headerGenerator = function(options) {
41177 options = options || {};
41178 var consumer_key = options.consumer_key || '',
41179 consumer_secret = options.consumer_secret || '',
41180 signature_method = options.signature_method || 'HMAC-SHA1',
41181 version = options.version || '1.0',
41182 token = options.token || '',
41183 token_secret = options.token_secret || '';
41185 return function(method, uri, extra_params) {
41186 method = method.toUpperCase();
41187 if (typeof extra_params === 'string' && extra_params.length > 0) {
41188 extra_params = ohauth.stringQs(extra_params);
41191 var uri_parts = uri.split('?', 2),
41192 base_uri = uri_parts[0];
41194 var query_params = uri_parts.length === 2 ?
41195 ohauth.stringQs(uri_parts[1]) : {};
41197 var oauth_params = {
41198 oauth_consumer_key: consumer_key,
41199 oauth_signature_method: signature_method,
41200 oauth_version: version,
41201 oauth_timestamp: ohauth.timestamp(),
41202 oauth_nonce: ohauth.nonce()
41205 if (token) oauth_params.oauth_token = token;
41207 var all_params = xtend({}, oauth_params, query_params, extra_params),
41208 base_str = ohauth.baseString(method, base_uri, all_params);
41210 oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
41212 return 'OAuth ' + ohauth.authHeader(oauth_params);
41216 var ohauth_1 = ohauth;
41218 var ohauth$1 = /*#__PURE__*/Object.freeze({
41220 __moduleExports: ohauth_1
41223 var resolveUrl = createCommonjsModule(function (module, exports) {
41224 // Copyright 2014 Simon Lydell
41225 // X11 (“MIT”) Licensed. (See LICENSE.)
41227 void (function(root, factory) {
41229 module.exports = factory();
41231 }(commonjsGlobal, function() {
41233 function resolveUrl(/* ...urls */) {
41234 var numUrls = arguments.length;
41236 if (numUrls === 0) {
41237 throw new Error("resolveUrl requires at least one argument; got none.")
41240 var base = document.createElement("base");
41241 base.href = arguments[0];
41243 if (numUrls === 1) {
41247 var head = document.getElementsByTagName("head")[0];
41248 head.insertBefore(base, head.firstChild);
41250 var a = document.createElement("a");
41253 for (var index = 1; index < numUrls; index++) {
41254 a.href = arguments[index];
41256 base.href = resolved;
41259 head.removeChild(base);
41269 var resolveUrl$1 = /*#__PURE__*/Object.freeze({
41270 default: resolveUrl,
41271 __moduleExports: resolveUrl
41274 var assign$1 = make_assign();
41275 var create$2 = make_create();
41276 var trim = make_trim();
41277 var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
41289 isFunction: isFunction$1,
41290 isObject: isObject$1,
41294 function make_assign() {
41295 if (Object.assign) {
41296 return Object.assign
41298 return function shimAssign(obj, props1, props2, etc) {
41299 for (var i = 1; i < arguments.length; i++) {
41300 each(Object(arguments[i]), function(val, key) {
41309 function make_create() {
41310 if (Object.create) {
41311 return function create(obj, assignProps1, assignProps2, etc) {
41312 var assignArgsList = slice$7(arguments, 1);
41313 return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
41316 function F() {} // eslint-disable-line no-inner-declarations
41317 return function create(obj, assignProps1, assignProps2, etc) {
41318 var assignArgsList = slice$7(arguments, 1);
41320 return assign$1.apply(this, [new F()].concat(assignArgsList))
41325 function make_trim() {
41326 if (String.prototype.trim) {
41327 return function trim(str) {
41328 return String.prototype.trim.call(str)
41331 return function trim(str) {
41332 return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
41337 function bind(obj, fn) {
41338 return function() {
41339 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
41343 function slice$7(arr, index) {
41344 return Array.prototype.slice.call(arr, index || 0)
41347 function each(obj, fn) {
41348 pluck(obj, function(val, key) {
41354 function map$4(obj, fn) {
41355 var res = (isList(obj) ? [] : {});
41356 pluck(obj, function(v, k) {
41363 function pluck(obj, fn) {
41365 for (var i=0; i<obj.length; i++) {
41366 if (fn(obj[i], i)) {
41371 for (var key in obj) {
41372 if (obj.hasOwnProperty(key)) {
41373 if (fn(obj[key], key)) {
41381 function isList(val) {
41382 return (val != null && typeof val != 'function' && typeof val.length == 'number')
41385 function isFunction$1(val) {
41386 return val && {}.toString.call(val) === '[object Function]'
41389 function isObject$1(val) {
41390 return val && {}.toString.call(val) === '[object Object]'
41393 var slice$8 = util.slice;
41394 var pluck$1 = util.pluck;
41395 var each$1 = util.each;
41396 var bind$1 = util.bind;
41397 var create$3 = util.create;
41398 var isList$1 = util.isList;
41399 var isFunction$2 = util.isFunction;
41400 var isObject$2 = util.isObject;
41402 var storeEngine = {
41403 createStore: createStore
41410 // get returns the value of the given key. If that value
41411 // is undefined, it returns optionalDefaultValue instead.
41412 get: function(key, optionalDefaultValue) {
41413 var data = this.storage.read(this._namespacePrefix + key);
41414 return this._deserialize(data, optionalDefaultValue)
41417 // set will store the given value at key and returns value.
41418 // Calling set with value === undefined is equivalent to calling remove.
41419 set: function(key, value) {
41420 if (value === undefined) {
41421 return this.remove(key)
41423 this.storage.write(this._namespacePrefix + key, this._serialize(value));
41427 // remove deletes the key and value stored at the given key.
41428 remove: function(key) {
41429 this.storage.remove(this._namespacePrefix + key);
41432 // each will call the given callback once for each key-value pair
41434 each: function(callback) {
41436 this.storage.each(function(val, namespacedKey) {
41437 callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
41441 // clearAll will remove all the stored key-value pairs in this store.
41442 clearAll: function() {
41443 this.storage.clearAll();
41446 // additional functionality that can't live in plugins
41447 // ---------------------------------------------------
41449 // hasNamespace returns true if this store instance has the given namespace.
41450 hasNamespace: function(namespace) {
41451 return (this._namespacePrefix == '__storejs_'+namespace+'_')
41454 // createStore creates a store.js instance with the first
41455 // functioning storage in the list of storage candidates,
41456 // and applies the the given mixins to the instance.
41457 createStore: function() {
41458 return createStore.apply(this, arguments)
41461 addPlugin: function(plugin) {
41462 this._addPlugin(plugin);
41465 namespace: function(namespace) {
41466 return createStore(this.storage, this.plugins, namespace)
41471 var _console = (typeof console == 'undefined' ? null : console);
41472 if (!_console) { return }
41473 var fn = (_console.warn ? _console.warn : _console.log);
41474 fn.apply(_console, arguments);
41477 function createStore(storages, plugins, namespace) {
41481 if (storages && !isList$1(storages)) {
41482 storages = [storages];
41484 if (plugins && !isList$1(plugins)) {
41485 plugins = [plugins];
41488 var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
41489 var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
41490 var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
41491 if (!legalNamespaces.test(namespace)) {
41492 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
41495 var _privateStoreProps = {
41496 _namespacePrefix: namespacePrefix,
41497 _namespaceRegexp: namespaceRegexp,
41499 _testStorage: function(storage) {
41501 var testStr = '__storejs__test__';
41502 storage.write(testStr, testStr);
41503 var ok = (storage.read(testStr) === testStr);
41504 storage.remove(testStr);
41511 _assignPluginFnProp: function(pluginFnProp, propName) {
41512 var oldFn = this[propName];
41513 this[propName] = function pluginFn() {
41514 var args = slice$8(arguments, 0);
41517 // super_fn calls the old function which was overwritten by
41519 function super_fn() {
41520 if (!oldFn) { return }
41521 each$1(arguments, function(arg, i) {
41524 return oldFn.apply(self, args)
41527 // Give mixing function access to super_fn by prefixing all mixin function
41528 // arguments with super_fn.
41529 var newFnArgs = [super_fn].concat(args);
41531 return pluginFnProp.apply(self, newFnArgs)
41535 _serialize: function(obj) {
41536 return JSON.stringify(obj)
41539 _deserialize: function(strVal, defaultVal) {
41540 if (!strVal) { return defaultVal }
41541 // It is possible that a raw string value has been previously stored
41542 // in a storage without using store.js, meaning it will be a raw
41543 // string value instead of a JSON serialized string. By defaulting
41544 // to the raw string value in case of a JSON parse error, we allow
41545 // for past stored values to be forwards-compatible with store.js
41547 try { val = JSON.parse(strVal); }
41548 catch(e) { val = strVal; }
41550 return (val !== undefined ? val : defaultVal)
41553 _addStorage: function(storage) {
41554 if (this.enabled) { return }
41555 if (this._testStorage(storage)) {
41556 this.storage = storage;
41557 this.enabled = true;
41561 _addPlugin: function(plugin) {
41564 // If the plugin is an array, then add all plugins in the array.
41565 // This allows for a plugin to depend on other plugins.
41566 if (isList$1(plugin)) {
41567 each$1(plugin, function(plugin) {
41568 self._addPlugin(plugin);
41573 // Keep track of all plugins we've seen so far, so that we
41574 // don't add any of them twice.
41575 var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
41576 return (plugin === seenPlugin)
41581 this.plugins.push(plugin);
41583 // Check that the plugin is properly formed
41584 if (!isFunction$2(plugin)) {
41585 throw new Error('Plugins must be function values that return objects')
41588 var pluginProperties = plugin.call(this);
41589 if (!isObject$2(pluginProperties)) {
41590 throw new Error('Plugins must return an object of function properties')
41593 // Add the plugin function properties to this store instance.
41594 each$1(pluginProperties, function(pluginFnProp, propName) {
41595 if (!isFunction$2(pluginFnProp)) {
41596 throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
41598 self._assignPluginFnProp(pluginFnProp, propName);
41602 // Put deprecated properties in the private API, so as to not expose it to accidential
41603 // discovery through inspection of the store object.
41605 // Deprecated: addStorage
41606 addStorage: function(storage) {
41607 _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
41608 this._addStorage(storage);
41612 var store = create$3(_privateStoreProps, storeAPI, {
41616 each$1(store, function(prop, propName) {
41617 if (isFunction$2(prop)) {
41618 store.raw[propName] = bind$1(store, prop);
41621 each$1(storages, function(storage) {
41622 store._addStorage(storage);
41624 each$1(plugins, function(plugin) {
41625 store._addPlugin(plugin);
41630 var Global$1 = util.Global;
41632 var localStorage_1 = {
41633 name: 'localStorage',
41638 clearAll: clearAll,
41641 function localStorage$1() {
41642 return Global$1.localStorage
41645 function read(key) {
41646 return localStorage$1().getItem(key)
41649 function write(key, data) {
41650 return localStorage$1().setItem(key, data)
41653 function each$2(fn) {
41654 for (var i = localStorage$1().length - 1; i >= 0; i--) {
41655 var key = localStorage$1().key(i);
41656 fn(read(key), key);
41660 function remove$2(key) {
41661 return localStorage$1().removeItem(key)
41664 function clearAll() {
41665 return localStorage$1().clear()
41668 // oldFF-globalStorage provides storage for Firefox
41669 // versions 6 and 7, where no localStorage, etc
41673 var Global$2 = util.Global;
41675 var oldFFGlobalStorage = {
41676 name: 'oldFF-globalStorage',
41681 clearAll: clearAll$1,
41684 var globalStorage = Global$2.globalStorage;
41686 function read$1(key) {
41687 return globalStorage[key]
41690 function write$1(key, data) {
41691 globalStorage[key] = data;
41694 function each$3(fn) {
41695 for (var i = globalStorage.length - 1; i >= 0; i--) {
41696 var key = globalStorage.key(i);
41697 fn(globalStorage[key], key);
41701 function remove$3(key) {
41702 return globalStorage.removeItem(key)
41705 function clearAll$1() {
41706 each$3(function(key, _) {
41707 delete globalStorage[key];
41711 // oldIE-userDataStorage provides storage for Internet Explorer
41712 // versions 6 and 7, where no localStorage, sessionStorage, etc
41716 var Global$3 = util.Global;
41718 var oldIEUserDataStorage = {
41719 name: 'oldIE-userDataStorage',
41724 clearAll: clearAll$2,
41727 var storageName = 'storejs';
41728 var doc = Global$3.document;
41729 var _withStorageEl = _makeIEStorageElFunction();
41730 var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
41732 function write$2(unfixedKey, data) {
41733 if (disable) { return }
41734 var fixedKey = fixKey(unfixedKey);
41735 _withStorageEl(function(storageEl) {
41736 storageEl.setAttribute(fixedKey, data);
41737 storageEl.save(storageName);
41741 function read$2(unfixedKey) {
41742 if (disable) { return }
41743 var fixedKey = fixKey(unfixedKey);
41745 _withStorageEl(function(storageEl) {
41746 res = storageEl.getAttribute(fixedKey);
41751 function each$4(callback) {
41752 _withStorageEl(function(storageEl) {
41753 var attributes = storageEl.XMLDocument.documentElement.attributes;
41754 for (var i=attributes.length-1; i>=0; i--) {
41755 var attr = attributes[i];
41756 callback(storageEl.getAttribute(attr.name), attr.name);
41761 function remove$4(unfixedKey) {
41762 var fixedKey = fixKey(unfixedKey);
41763 _withStorageEl(function(storageEl) {
41764 storageEl.removeAttribute(fixedKey);
41765 storageEl.save(storageName);
41769 function clearAll$2() {
41770 _withStorageEl(function(storageEl) {
41771 var attributes = storageEl.XMLDocument.documentElement.attributes;
41772 storageEl.load(storageName);
41773 for (var i=attributes.length-1; i>=0; i--) {
41774 storageEl.removeAttribute(attributes[i].name);
41776 storageEl.save(storageName);
41783 // In IE7, keys cannot start with a digit or contain certain chars.
41784 // See https://github.com/marcuswestin/store.js/issues/40
41785 // See https://github.com/marcuswestin/store.js/issues/83
41786 var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
41787 function fixKey(key) {
41788 return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
41791 function _makeIEStorageElFunction() {
41792 if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
41795 var scriptTag = 'script',
41800 // Since #userData storage applies only to specific paths, we need to
41801 // somehow link our data to a specific path. We choose /favicon.ico
41802 // as a pretty safe option, since all browsers already make a request to
41803 // this URL anyway and being a 404 will not hurt us here. We wrap an
41804 // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
41805 // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
41806 // since the iframe access rules appear to allow direct access and
41807 // manipulation of the document element, even for a 404 page. This
41808 // document can be used instead of the current document (which would
41809 // have been limited to the current path) to perform #userData storage.
41811 /* global ActiveXObject */
41812 storageContainer = new ActiveXObject('htmlfile');
41813 storageContainer.open();
41814 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
41815 storageContainer.close();
41816 storageOwner = storageContainer.w.frames[0].document;
41817 storageEl = storageOwner.createElement('div');
41819 // somehow ActiveXObject instantiation failed (perhaps some special
41820 // security settings or otherwse), fall back to per-path storage
41821 storageEl = doc.createElement('div');
41822 storageOwner = doc.body;
41825 return function(storeFunction) {
41826 var args = [].slice.call(arguments, 0);
41827 args.unshift(storageEl);
41828 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
41829 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
41830 storageOwner.appendChild(storageEl);
41831 storageEl.addBehavior('#default#userData');
41832 storageEl.load(storageName);
41833 storeFunction.apply(this, args);
41834 storageOwner.removeChild(storageEl);
41839 // cookieStorage is useful Safari private browser mode, where localStorage
41840 // doesn't work but cookies do. This implementation is adopted from
41841 // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
41844 var Global$4 = util.Global;
41845 var trim$1 = util.trim;
41847 var cookieStorage = {
41848 name: 'cookieStorage',
41853 clearAll: clearAll$3,
41856 var doc$1 = Global$4.document;
41858 function read$3(key) {
41859 if (!key || !_has(key)) { return null }
41860 var regexpStr = "(?:^|.*;\\s*)" +
41861 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
41862 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
41863 return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
41866 function each$5(callback) {
41867 var cookies = doc$1.cookie.split(/; ?/g);
41868 for (var i = cookies.length - 1; i >= 0; i--) {
41869 if (!trim$1(cookies[i])) {
41872 var kvp = cookies[i].split('=');
41873 var key = unescape(kvp[0]);
41874 var val = unescape(kvp[1]);
41875 callback(val, key);
41879 function write$3(key, data) {
41880 if(!key) { return }
41881 doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
41884 function remove$5(key) {
41885 if (!key || !_has(key)) {
41888 doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
41891 function clearAll$3() {
41892 each$5(function(_, key) {
41897 function _has(key) {
41898 return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
41901 var Global$5 = util.Global;
41903 var sessionStorage_1 = {
41904 name: 'sessionStorage',
41909 clearAll: clearAll$4
41912 function sessionStorage() {
41913 return Global$5.sessionStorage
41916 function read$4(key) {
41917 return sessionStorage().getItem(key)
41920 function write$4(key, data) {
41921 return sessionStorage().setItem(key, data)
41924 function each$6(fn) {
41925 for (var i = sessionStorage().length - 1; i >= 0; i--) {
41926 var key = sessionStorage().key(i);
41927 fn(read$4(key), key);
41931 function remove$6(key) {
41932 return sessionStorage().removeItem(key)
41935 function clearAll$4() {
41936 return sessionStorage().clear()
41939 // memoryStorage is a useful last fallback to ensure that the store
41940 // is functions (meaning store.get(), store.set(), etc will all function).
41941 // However, stored values will not persist when the browser navigates to
41942 // a new page or reloads the current page.
41944 var memoryStorage_1 = {
41945 name: 'memoryStorage',
41950 clearAll: clearAll$5,
41953 var memoryStorage = {};
41955 function read$5(key) {
41956 return memoryStorage[key]
41959 function write$5(key, data) {
41960 memoryStorage[key] = data;
41963 function each$7(callback) {
41964 for (var key in memoryStorage) {
41965 if (memoryStorage.hasOwnProperty(key)) {
41966 callback(memoryStorage[key], key);
41971 function remove$7(key) {
41972 delete memoryStorage[key];
41975 function clearAll$5(key) {
41976 memoryStorage = {};
41980 // Listed in order of usage preference
41982 oldFFGlobalStorage,
41983 oldIEUserDataStorage,
41989 /* eslint-disable */
41994 // NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
41995 // See http://www.JSON.org/js.html
41996 // This code should be minified before deployment.
41997 // See http://javascript.crockford.com/jsmin.html
41999 // USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
42002 // This file creates a global JSON object containing two methods: stringify
42003 // and parse. This file provides the ES5 JSON capability to ES3 systems.
42004 // If a project might run on IE8 or earlier, then this file should be included.
42005 // This file does nothing on ES5 systems.
42007 // JSON.stringify(value, replacer, space)
42008 // value any JavaScript value, usually an object or array.
42009 // replacer an optional parameter that determines how object
42010 // values are stringified for objects. It can be a
42011 // function or an array of strings.
42012 // space an optional parameter that specifies the indentation
42013 // of nested structures. If it is omitted, the text will
42014 // be packed without extra whitespace. If it is a number,
42015 // it will specify the number of spaces to indent at each
42016 // level. If it is a string (such as "\t" or " "),
42017 // it contains the characters used to indent at each level.
42018 // This method produces a JSON text from a JavaScript value.
42019 // When an object value is found, if the object contains a toJSON
42020 // method, its toJSON method will be called and the result will be
42021 // stringified. A toJSON method does not serialize: it returns the
42022 // value represented by the name/value pair that should be serialized,
42023 // or undefined if nothing should be serialized. The toJSON method
42024 // will be passed the key associated with the value, and this will be
42025 // bound to the value.
42027 // For example, this would serialize Dates as ISO strings.
42029 // Date.prototype.toJSON = function (key) {
42031 // // Format integers to have at least two digits.
42036 // return this.getUTCFullYear() + "-" +
42037 // f(this.getUTCMonth() + 1) + "-" +
42038 // f(this.getUTCDate()) + "T" +
42039 // f(this.getUTCHours()) + ":" +
42040 // f(this.getUTCMinutes()) + ":" +
42041 // f(this.getUTCSeconds()) + "Z";
42044 // You can provide an optional replacer method. It will be passed the
42045 // key and value of each member, with this bound to the containing
42046 // object. The value that is returned from your method will be
42047 // serialized. If your method returns undefined, then the member will
42048 // be excluded from the serialization.
42050 // If the replacer parameter is an array of strings, then it will be
42051 // used to select the members to be serialized. It filters the results
42052 // such that only members with keys listed in the replacer array are
42055 // Values that do not have JSON representations, such as undefined or
42056 // functions, will not be serialized. Such values in objects will be
42057 // dropped; in arrays they will be replaced with null. You can use
42058 // a replacer function to replace those with JSON values.
42060 // JSON.stringify(undefined) returns undefined.
42062 // The optional space parameter produces a stringification of the
42063 // value that is filled with line breaks and indentation to make it
42066 // If the space parameter is a non-empty string, then that string will
42067 // be used for indentation. If the space parameter is a number, then
42068 // the indentation will be that many spaces.
42072 // text = JSON.stringify(["e", {pluribus: "unum"}]);
42073 // // text is '["e",{"pluribus":"unum"}]'
42075 // text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
42076 // // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
42078 // text = JSON.stringify([new Date()], function (key, value) {
42079 // return this[key] instanceof Date
42080 // ? "Date(" + this[key] + ")"
42083 // // text is '["Date(---current time---)"]'
42085 // JSON.parse(text, reviver)
42086 // This method parses a JSON text to produce an object or array.
42087 // It can throw a SyntaxError exception.
42089 // The optional reviver parameter is a function that can filter and
42090 // transform the results. It receives each of the keys and values,
42091 // and its return value is used instead of the original value.
42092 // If it returns what it received, then the structure is not modified.
42093 // If it returns undefined then the member is deleted.
42097 // // Parse the text. Values that look like ISO date strings will
42098 // // be converted to Date objects.
42100 // myData = JSON.parse(text, function (key, value) {
42102 // if (typeof value === "string") {
42104 // /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
42106 // return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
42113 // myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
42115 // if (typeof value === "string" &&
42116 // value.slice(0, 5) === "Date(" &&
42117 // value.slice(-1) === ")") {
42118 // d = new Date(value.slice(5, -1));
42126 // This is a reference implementation. You are free to copy, modify, or
42134 JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
42135 getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
42136 lastIndex, length, parse, prototype, push, replace, slice, stringify,
42137 test, toJSON, toString, valueOf
42141 // Create a JSON object only if one does not already exist. We create the
42142 // methods in a closure to avoid creating global variables.
42144 if (typeof JSON !== "object") {
42150 var rx_one = /^[\],:{}\s]*$/;
42151 var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
42152 var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
42153 var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
42154 var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
42155 var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
42158 // Format integers to have at least two digits.
42164 function this_value() {
42165 return this.valueOf();
42168 if (typeof Date.prototype.toJSON !== "function") {
42170 Date.prototype.toJSON = function () {
42172 return isFinite(this.valueOf())
42173 ? this.getUTCFullYear() + "-" +
42174 f(this.getUTCMonth() + 1) + "-" +
42175 f(this.getUTCDate()) + "T" +
42176 f(this.getUTCHours()) + ":" +
42177 f(this.getUTCMinutes()) + ":" +
42178 f(this.getUTCSeconds()) + "Z"
42182 Boolean.prototype.toJSON = this_value;
42183 Number.prototype.toJSON = this_value;
42184 String.prototype.toJSON = this_value;
42193 function quote(string) {
42195 // If the string contains no control characters, no quote characters, and no
42196 // backslash characters, then we can safely slap some quotes around it.
42197 // Otherwise we must also replace the offending characters with safe escape
42200 rx_escapable.lastIndex = 0;
42201 return rx_escapable.test(string)
42202 ? "\"" + string.replace(rx_escapable, function (a) {
42204 return typeof c === "string"
42206 : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
42208 : "\"" + string + "\"";
42212 function str(key, holder) {
42214 // Produce a string from holder[key].
42216 var i; // The loop counter.
42217 var k; // The member key.
42218 var v; // The member value.
42222 var value = holder[key];
42224 // If the value has a toJSON method, call it to obtain a replacement value.
42226 if (value && typeof value === "object" &&
42227 typeof value.toJSON === "function") {
42228 value = value.toJSON(key);
42231 // If we were called with a replacer function, then call the replacer to
42232 // obtain a replacement value.
42234 if (typeof rep === "function") {
42235 value = rep.call(holder, key, value);
42238 // What happens next depends on the value's type.
42240 switch (typeof value) {
42242 return quote(value);
42246 // JSON numbers must be finite. Encode non-finite numbers as null.
42248 return isFinite(value)
42255 // If the value is a boolean or null, convert it to a string. Note:
42256 // typeof null does not produce "null". The case is included here in
42257 // the remote chance that this gets fixed someday.
42259 return String(value);
42261 // If the type is "object", we might be dealing with an object or an array or
42266 // Due to a specification blunder in ECMAScript, typeof null is "object",
42267 // so watch out for that case.
42273 // Make an array to hold the partial results of stringifying this object value.
42278 // Is the value an array?
42280 if (Object.prototype.toString.apply(value) === "[object Array]") {
42282 // The value is an array. Stringify every element. Use null as a placeholder
42283 // for non-JSON values.
42285 length = value.length;
42286 for (i = 0; i < length; i += 1) {
42287 partial[i] = str(i, value) || "null";
42290 // Join all of the elements together, separated with commas, and wrap them in
42293 v = partial.length === 0
42296 ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
42297 : "[" + partial.join(",") + "]";
42302 // If the replacer is an array, use it to select the members to be stringified.
42304 if (rep && typeof rep === "object") {
42305 length = rep.length;
42306 for (i = 0; i < length; i += 1) {
42307 if (typeof rep[i] === "string") {
42311 partial.push(quote(k) + (
42321 // Otherwise, iterate through all of the keys in the object.
42324 if (Object.prototype.hasOwnProperty.call(value, k)) {
42327 partial.push(quote(k) + (
42337 // Join all of the member texts together, separated with commas,
42338 // and wrap them in braces.
42340 v = partial.length === 0
42343 ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
42344 : "{" + partial.join(",") + "}";
42350 // If the JSON object does not yet have a stringify method, give it one.
42352 if (typeof JSON.stringify !== "function") {
42353 meta = { // table of character substitutions
42362 JSON.stringify = function (value, replacer, space) {
42364 // The stringify method takes a value and an optional replacer, and an optional
42365 // space parameter, and returns a JSON text. The replacer can be a function
42366 // that can replace values, or an array of strings that will select the keys.
42367 // A default replacer method can be provided. Use of the space parameter can
42368 // produce text that is more easily readable.
42374 // If the space parameter is a number, make an indent string containing that
42377 if (typeof space === "number") {
42378 for (i = 0; i < space; i += 1) {
42382 // If the space parameter is a string, it will be used as the indent string.
42384 } else if (typeof space === "string") {
42388 // If there is a replacer, it must be a function or an array.
42389 // Otherwise, throw an error.
42392 if (replacer && typeof replacer !== "function" &&
42393 (typeof replacer !== "object" ||
42394 typeof replacer.length !== "number")) {
42395 throw new Error("JSON.stringify");
42398 // Make a fake root object containing our value under the key of "".
42399 // Return the result of stringifying the value.
42401 return str("", {"": value});
42406 // If the JSON object does not yet have a parse method, give it one.
42408 if (typeof JSON.parse !== "function") {
42409 JSON.parse = function (text, reviver) {
42411 // The parse method takes a text and an optional reviver function, and returns
42412 // a JavaScript value if the text is a valid JSON text.
42416 function walk(holder, key) {
42418 // The walk method is used to recursively walk the resulting structure so
42419 // that modifications can be made.
42423 var value = holder[key];
42424 if (value && typeof value === "object") {
42426 if (Object.prototype.hasOwnProperty.call(value, k)) {
42427 v = walk(value, k);
42428 if (v !== undefined) {
42436 return reviver.call(holder, key, value);
42440 // Parsing happens in four stages. In the first stage, we replace certain
42441 // Unicode characters with escape sequences. JavaScript handles many characters
42442 // incorrectly, either silently deleting them, or treating them as line endings.
42444 text = String(text);
42445 rx_dangerous.lastIndex = 0;
42446 if (rx_dangerous.test(text)) {
42447 text = text.replace(rx_dangerous, function (a) {
42449 ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
42453 // In the second stage, we run the text against regular expressions that look
42454 // for non-JSON patterns. We are especially concerned with "()" and "new"
42455 // because they can cause invocation, and "=" because it can cause mutation.
42456 // But just to be safe, we want to reject all unexpected forms.
42458 // We split the second stage into 4 regexp operations in order to work around
42459 // crippling inefficiencies in IE's and Safari's regexp engines. First we
42460 // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
42461 // replace all simple value tokens with "]" characters. Third, we delete all
42462 // open brackets that follow a colon or comma or that begin the text. Finally,
42463 // we look to see that the remaining characters are only whitespace or "]" or
42464 // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
42469 .replace(rx_two, "@")
42470 .replace(rx_three, "]")
42471 .replace(rx_four, "")
42475 // In the third stage we use the eval function to compile the text into a
42476 // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
42477 // in JavaScript: it can begin a block or an object literal. We wrap the text
42478 // in parens to eliminate the ambiguity.
42480 j = eval("(" + text + ")");
42482 // In the optional fourth stage, we recursively walk the new structure, passing
42483 // each name/value pair to a reviver function for possible transformation.
42485 return (typeof reviver === "function")
42486 ? walk({"": j}, "")
42490 // If the text is not JSON parseable, then a SyntaxError is thrown.
42492 throw new SyntaxError("JSON.parse");
42497 var json2 = json2Plugin;
42499 function json2Plugin() {
42504 var plugins = [json2];
42506 var store_legacy = storeEngine.createStore(all, plugins);
42508 var store_legacy$1 = /*#__PURE__*/Object.freeze({
42509 default: store_legacy,
42510 __moduleExports: store_legacy
42513 var ohauth$2 = ( ohauth$1 && ohauth_1 ) || ohauth$1;
42515 var resolveUrl$2 = ( resolveUrl$1 && resolveUrl ) || resolveUrl$1;
42517 var store = ( store_legacy$1 && store_legacy ) || store_legacy$1;
42521 // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
42522 // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
42523 // does not support custom headers, which this uses everywhere.
42524 var osmAuth = function(o) {
42528 // authenticated users will also have a request token secret, but it's
42529 // not used in transactions with the server
42530 oauth.authenticated = function() {
42531 return !!(token('oauth_token') && token('oauth_token_secret'));
42534 oauth.logout = function() {
42535 token('oauth_token', '');
42536 token('oauth_token_secret', '');
42537 token('oauth_request_token_secret', '');
42541 // TODO: detect lack of click event
42542 oauth.authenticate = function(callback) {
42543 if (oauth.authenticated()) return callback();
42547 // ## Getting a request token
42548 var params = timenonce(getAuth(o)),
42549 url = o.url + '/oauth/request_token';
42551 params.oauth_signature = ohauth$2.signature(
42552 o.oauth_secret, '',
42553 ohauth$2.baseString('POST', url, params));
42555 if (!o.singlepage) {
42556 // Create a 600x550 popup window in the center of the screen
42557 var w = 600, h = 550,
42559 ['width', w], ['height', h],
42560 ['left', screen.width / 2 - w / 2],
42561 ['top', screen.height / 2 - h / 2]].map(function(x) {
42562 return x.join('=');
42564 popup = window.open('about:blank', 'oauth_window', settings);
42567 // Request a request token. When this is complete, the popup
42568 // window is redirected to OSM's authorization page.
42569 ohauth$2.xhr('POST', url, params, null, {}, reqTokenDone);
42572 function reqTokenDone(err, xhr) {
42574 if (err) return callback(err);
42575 var resp = ohauth$2.stringQs(xhr.response);
42576 token('oauth_request_token_secret', resp.oauth_token_secret);
42577 var authorize_url = o.url + '/oauth/authorize?' + ohauth$2.qsString({
42578 oauth_token: resp.oauth_token,
42579 oauth_callback: resolveUrl$2(o.landing)
42582 if (o.singlepage) {
42583 location.href = authorize_url;
42585 popup.location = authorize_url;
42589 // Called by a function in a landing page, in the popup window. The
42590 // window closes itself.
42591 window.authComplete = function(token) {
42592 var oauth_token = ohauth$2.stringQs(token.split('?')[1]);
42593 get_access_token(oauth_token.oauth_token);
42594 delete window.authComplete;
42597 // ## Getting an request token
42599 // At this point we have an `oauth_token`, brought in from a function
42600 // call on a landing page popup.
42601 function get_access_token(oauth_token) {
42602 var url = o.url + '/oauth/access_token',
42603 params = timenonce(getAuth(o)),
42604 request_token_secret = token('oauth_request_token_secret');
42605 params.oauth_token = oauth_token;
42606 params.oauth_signature = ohauth$2.signature(
42608 request_token_secret,
42609 ohauth$2.baseString('POST', url, params));
42611 // ## Getting an access token
42613 // The final token required for authentication. At this point
42614 // we have a `request token secret`
42615 ohauth$2.xhr('POST', url, params, null, {}, accessTokenDone);
42619 function accessTokenDone(err, xhr) {
42621 if (err) return callback(err);
42622 var access_token = ohauth$2.stringQs(xhr.response);
42623 token('oauth_token', access_token.oauth_token);
42624 token('oauth_token_secret', access_token.oauth_token_secret);
42625 callback(null, oauth);
42629 oauth.bootstrapToken = function(oauth_token, callback) {
42630 // ## Getting an request token
42631 // At this point we have an `oauth_token`, brought in from a function
42632 // call on a landing page popup.
42633 function get_access_token(oauth_token) {
42634 var url = o.url + '/oauth/access_token',
42635 params = timenonce(getAuth(o)),
42636 request_token_secret = token('oauth_request_token_secret');
42637 params.oauth_token = oauth_token;
42638 params.oauth_signature = ohauth$2.signature(
42640 request_token_secret,
42641 ohauth$2.baseString('POST', url, params));
42643 // ## Getting an access token
42644 // The final token required for authentication. At this point
42645 // we have a `request token secret`
42646 ohauth$2.xhr('POST', url, params, null, {}, accessTokenDone);
42650 function accessTokenDone(err, xhr) {
42652 if (err) return callback(err);
42653 var access_token = ohauth$2.stringQs(xhr.response);
42654 token('oauth_token', access_token.oauth_token);
42655 token('oauth_token_secret', access_token.oauth_token_secret);
42656 callback(null, oauth);
42659 get_access_token(oauth_token);
42664 // A single XMLHttpRequest wrapper that does authenticated calls if the
42665 // user has logged in.
42666 oauth.xhr = function(options, callback) {
42667 if (!oauth.authenticated()) {
42669 return oauth.authenticate(run);
42671 callback('not authenticated', null);
42679 var params = timenonce(getAuth(o)),
42680 oauth_token_secret = token('oauth_token_secret'),
42681 url = (options.prefix !== false) ? o.url + options.path : options.path,
42682 url_parts = url.replace(/#.*$/, '').split('?', 2),
42683 base_url = url_parts[0],
42684 query = (url_parts.length === 2) ? url_parts[1] : '';
42686 // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
42687 if ((!options.options || !options.options.header ||
42688 options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
42690 params = xtend(params, ohauth$2.stringQs(options.content));
42693 params.oauth_token = token('oauth_token');
42694 params.oauth_signature = ohauth$2.signature(
42696 oauth_token_secret,
42697 ohauth$2.baseString(options.method, base_url, xtend(params, ohauth$2.stringQs(query)))
42700 return ohauth$2.xhr(options.method, url, params, options.content, options.options, done);
42703 function done(err, xhr) {
42704 if (err) return callback(err);
42705 else if (xhr.responseXML) return callback(err, xhr.responseXML);
42706 else return callback(err, xhr.response);
42710 // pre-authorize this object, if we can just get a token and token_secret
42712 oauth.preauth = function(c) {
42714 if (c.oauth_token) token('oauth_token', c.oauth_token);
42715 if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
42719 oauth.options = function(_) {
42720 if (!arguments.length) return o;
42723 o.url = o.url || 'https://www.openstreetmap.org';
42724 o.landing = o.landing || 'land.html';
42725 o.singlepage = o.singlepage || false;
42727 // Optional loading and loading-done functions for nice UI feedback.
42728 // by default, no-ops
42729 o.loading = o.loading || function() {};
42730 o.done = o.done || function() {};
42732 return oauth.preauth(o);
42735 // 'stamp' an authentication object from `getAuth()`
42736 // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
42738 function timenonce(o) {
42739 o.oauth_timestamp = ohauth$2.timestamp();
42740 o.oauth_nonce = ohauth$2.nonce();
42744 // get/set tokens. These are prefixed with the base URL so that `osm-auth`
42745 // can be used with multiple APIs and the keys in `localStorage`
42749 if (store.enabled) {
42750 token = function (x, y) {
42751 if (arguments.length === 1) return store.get(o.url + x);
42752 else if (arguments.length === 2) return store.set(o.url + x, y);
42756 token = function (x, y) {
42757 if (arguments.length === 1) return storage[o.url + x];
42758 else if (arguments.length === 2) return storage[o.url + x] = y;
42762 // Get an authentication object. If you just add and remove properties
42763 // from a single object, you'll need to use `delete` to make sure that
42764 // it doesn't contain undesired properties for authentication
42765 function getAuth(o) {
42767 oauth_consumer_key: o.oauth_consumer_key,
42768 oauth_signature_method: 'HMAC-SHA1'
42772 // potentially pre-authorize
42778 var JXON = new (function () {
42780 sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
42781 aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
42783 function parseText (sValue) {
42784 if (rIsNull.test(sValue)) { return null; }
42785 if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
42786 if (isFinite(sValue)) { return parseFloat(sValue); }
42787 if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
42791 function EmptyTree () { }
42792 EmptyTree.prototype.toString = function () { return 'null'; };
42793 EmptyTree.prototype.valueOf = function () { return null; };
42795 function objectify (vValue) {
42796 return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
42799 function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
42801 nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
42802 bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
42805 sProp, vContent, nLength = 0, sCollectedTxt = '',
42806 vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
42809 for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
42810 oNode = oParentNode.childNodes.item(nItem);
42811 if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
42812 else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
42813 else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
42817 var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
42819 if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
42821 for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
42822 sProp = aCache[nElId].nodeName.toLowerCase();
42823 vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
42824 if (vResult.hasOwnProperty(sProp)) {
42825 if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
42826 vResult[sProp].push(vContent);
42828 vResult[sProp] = vContent;
42835 nAttrLen = oParentNode.attributes.length,
42836 sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
42838 for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
42839 oAttrib = oParentNode.attributes.item(nAttrib);
42840 oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
42844 if (bFreeze) { Object.freeze(oAttrParent); }
42845 vResult[sAttributesProp] = oAttrParent;
42846 nLength -= nAttrLen - 1;
42850 if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
42851 vResult[sValueProp] = vBuiltVal;
42852 } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
42853 vResult = vBuiltVal;
42856 if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
42858 aCache.length = nLevelStart;
42863 function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
42864 var vValue, oChild;
42866 if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
42867 oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
42868 } else if (oParentObj.constructor === Date) {
42869 oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));
42872 for (var sName in oParentObj) {
42873 vValue = oParentObj[sName];
42874 if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
42875 if (sName === sValueProp) {
42876 if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
42877 } else if (sName === sAttributesProp) { /* verbosity level is 3 */
42878 for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
42879 } else if (sName.charAt(0) === sAttrPref) {
42880 oParentEl.setAttribute(sName.slice(1), vValue);
42881 } else if (vValue.constructor === Array) {
42882 for (var nItem = 0; nItem < vValue.length; nItem++) {
42883 oChild = oXMLDoc.createElement(sName);
42884 loadObjTree(oXMLDoc, oChild, vValue[nItem]);
42885 oParentEl.appendChild(oChild);
42888 oChild = oXMLDoc.createElement(sName);
42889 if (vValue instanceof Object) {
42890 loadObjTree(oXMLDoc, oChild, vValue);
42891 } else if (vValue !== null && vValue !== true) {
42892 oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
42894 oParentEl.appendChild(oChild);
42899 this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
42900 var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
42901 return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);
42904 this.unbuild = function (oObjTree) {
42905 var oNewDoc = document.implementation.createDocument('', '', null);
42906 loadObjTree(oNewDoc, oNewDoc, oObjTree);
42910 this.stringify = function (oObjTree) {
42911 return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
42915 // var myObject = JXON.build(doc);
42916 // we got our javascript object! try: alert(JSON.stringify(myObject));
42918 // var newDoc = JXON.unbuild(myObject);
42919 // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
42921 var tiler$2 = utilTiler();
42922 var dispatch$3 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
42923 var urlroot = 'https://www.openstreetmap.org';
42924 var oauth = osmAuth({
42926 oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
42927 oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
42928 loading: authLoading,
42932 var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
42933 var _tileCache = { loaded: {}, inflight: {}, seen: {} };
42934 var _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, rtree: rbush_1() };
42935 var _userCache = { toLoad: {}, user: {} };
42936 var _changeset = {};
42938 var _connectionID = 1;
42939 var _tileZoom = 16;
42940 var _noteZoom = 12;
42941 var _rateLimitError;
42942 var _userChangesets;
42947 function authLoading() {
42948 dispatch$3.call('authLoading');
42952 function authDone() {
42953 dispatch$3.call('authDone');
42957 function abortRequest$2(i) {
42964 function abortUnwantedRequests(cache, tiles) {
42965 forEach(cache.inflight, function(v, k) {
42966 var wanted = find$1(tiles, function(tile) { return k === tile.id; });
42969 delete cache.inflight[k];
42975 function getLoc(attrs) {
42976 var lon = attrs.lon && attrs.lon.value;
42977 var lat = attrs.lat && attrs.lat.value;
42978 return [parseFloat(lon), parseFloat(lat)];
42982 function getNodes(obj) {
42983 var elems = obj.getElementsByTagName('nd');
42984 var nodes = new Array(elems.length);
42985 for (var i = 0, l = elems.length; i < l; i++) {
42986 nodes[i] = 'n' + elems[i].attributes.ref.value;
42992 function getTags(obj) {
42993 var elems = obj.getElementsByTagName('tag');
42995 for (var i = 0, l = elems.length; i < l; i++) {
42996 var attrs = elems[i].attributes;
42997 tags[attrs.k.value] = attrs.v.value;
43004 function getMembers(obj) {
43005 var elems = obj.getElementsByTagName('member');
43006 var members = new Array(elems.length);
43007 for (var i = 0, l = elems.length; i < l; i++) {
43008 var attrs = elems[i].attributes;
43010 id: attrs.type.value[0] + attrs.ref.value,
43011 type: attrs.type.value,
43012 role: attrs.role.value
43019 function getVisible(attrs) {
43020 return (!attrs.visible || attrs.visible.value !== 'false');
43024 function parseComments(comments) {
43025 var parsedComments = [];
43027 // for each comment
43028 for (var i = 0; i < comments.length; i++) {
43029 var comment = comments[i];
43030 if (comment.nodeName === 'comment') {
43031 var childNodes = comment.childNodes;
43032 var parsedComment = {};
43034 for (var j = 0; j < childNodes.length; j++) {
43035 var node = childNodes[j];
43036 var nodeName = node.nodeName;
43037 if (nodeName === '#text') continue;
43038 parsedComment[nodeName] = node.textContent;
43040 if (nodeName === 'uid') {
43041 var uid = node.textContent;
43042 if (uid && !_userCache.user[uid]) {
43043 _userCache.toLoad[uid] = true;
43048 if (parsedComment) {
43049 parsedComments.push(parsedComment);
43053 return parsedComments;
43057 function encodeNoteRtree(note) {
43069 node: function nodeData(obj, uid) {
43070 var attrs = obj.attributes;
43071 return new osmNode({
43073 visible: getVisible(attrs),
43074 version: attrs.version.value,
43075 changeset: attrs.changeset && attrs.changeset.value,
43076 timestamp: attrs.timestamp && attrs.timestamp.value,
43077 user: attrs.user && attrs.user.value,
43078 uid: attrs.uid && attrs.uid.value,
43079 loc: getLoc(attrs),
43084 way: function wayData(obj, uid) {
43085 var attrs = obj.attributes;
43086 return new osmWay({
43088 visible: getVisible(attrs),
43089 version: attrs.version.value,
43090 changeset: attrs.changeset && attrs.changeset.value,
43091 timestamp: attrs.timestamp && attrs.timestamp.value,
43092 user: attrs.user && attrs.user.value,
43093 uid: attrs.uid && attrs.uid.value,
43094 tags: getTags(obj),
43095 nodes: getNodes(obj),
43099 relation: function relationData(obj, uid) {
43100 var attrs = obj.attributes;
43101 return new osmRelation({
43103 visible: getVisible(attrs),
43104 version: attrs.version.value,
43105 changeset: attrs.changeset && attrs.changeset.value,
43106 timestamp: attrs.timestamp && attrs.timestamp.value,
43107 user: attrs.user && attrs.user.value,
43108 uid: attrs.uid && attrs.uid.value,
43109 tags: getTags(obj),
43110 members: getMembers(obj)
43114 note: function parseNote(obj, uid) {
43115 var attrs = obj.attributes;
43116 var childNodes = obj.childNodes;
43120 props.loc = getLoc(attrs);
43122 // if notes are coincident, move them apart slightly
43123 var coincident = false;
43124 var epsilon = 0.00001;
43127 props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
43129 var bbox = geoExtent$$1(props.loc).bbox();
43130 coincident = _noteCache.rtree.search(bbox).length;
43131 } while (coincident);
43133 // parse note contents
43134 for (var i = 0; i < childNodes.length; i++) {
43135 var node = childNodes[i];
43136 var nodeName = node.nodeName;
43137 if (nodeName === '#text') continue;
43139 // if the element is comments, parse the comments
43140 if (nodeName === 'comments') {
43141 props[nodeName] = parseComments(node.childNodes);
43143 props[nodeName] = node.textContent;
43147 var note = new osmNote(props);
43148 var item = encodeNoteRtree(note);
43149 _noteCache.note[note.id] = note;
43150 _noteCache.rtree.insert(item);
43155 user: function parseUser(obj, uid) {
43156 var attrs = obj.attributes;
43159 display_name: attrs.display_name && attrs.display_name.value,
43160 account_created: attrs.account_created && attrs.account_created.value,
43161 changesets_count: 0
43164 var img = obj.getElementsByTagName('img');
43165 if (img && img[0] && img[0].getAttribute('href')) {
43166 user.image_url = img[0].getAttribute('href');
43169 var changesets = obj.getElementsByTagName('changesets');
43170 if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
43171 user.changesets_count = changesets[0].getAttribute('count');
43174 _userCache.user[uid] = user;
43175 delete _userCache.toLoad[uid];
43181 function parseXML(xml$$1, callback, options) {
43182 options = assignIn({ skipSeen: true }, options);
43183 if (!xml$$1 || !xml$$1.childNodes) {
43184 return callback({ message: 'No XML', status: -1 });
43187 var root = xml$$1.childNodes[0];
43188 var children = root.childNodes;
43189 utilIdleWorker(children, parseChild, done);
43192 function done(results) {
43193 callback(null, results);
43196 function parseChild(child) {
43197 var parser = parsers[child.nodeName];
43198 if (!parser) return null;
43201 if (child.nodeName === 'user') {
43202 uid = child.attributes.id.value;
43203 if (options.skipSeen && _userCache.user[uid]) {
43204 delete _userCache.toLoad[uid];
43208 } else if (child.nodeName === 'note') {
43209 uid = child.getElementsByTagName('id')[0].textContent;
43212 uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
43213 if (options.skipSeen) {
43214 if (_tileCache.seen[uid]) return null; // avoid reparsing a "seen" entity
43215 _tileCache.seen[uid] = true;
43219 return parser(child, uid);
43224 // replace or remove note from rtree
43225 function updateRtree(item, replace) {
43226 _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
43229 _noteCache.rtree.insert(item);
43234 function wrapcb(thisArg, callback, cid) {
43235 return function(err, result) {
43237 // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
43238 if (err.status === 400 || err.status === 401 || err.status === 403) {
43241 return callback.call(thisArg, err);
43243 } else if (thisArg.getConnectionId() !== cid) {
43244 return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
43247 return callback.call(thisArg, err, result);
43256 utilRebind(this, dispatch$3, 'on');
43260 reset: function() {
43262 _userChangesets = undefined;
43263 _userDetails = undefined;
43264 _rateLimitError = undefined;
43266 forEach(_tileCache.inflight, abortRequest$2);
43267 forEach(_noteCache.inflight, abortRequest$2);
43268 forEach(_noteCache.inflightPost, abortRequest$2);
43269 if (_changeset.inflight) abortRequest$2(_changeset.inflight);
43271 _tileCache = { loaded: {}, inflight: {}, seen: {} };
43272 _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, rtree: rbush_1() };
43273 _userCache = { toLoad: {}, user: {} };
43280 getConnectionId: function() {
43281 return _connectionID;
43285 changesetURL: function(changesetID) {
43286 return urlroot + '/changeset/' + changesetID;
43290 changesetsURL: function(center, zoom) {
43291 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
43292 return urlroot + '/history#map=' +
43293 Math.floor(zoom) + '/' +
43294 center[1].toFixed(precision) + '/' +
43295 center[0].toFixed(precision);
43299 entityURL: function(entity) {
43300 return urlroot + '/' + entity.type + '/' + entity.osmId();
43304 historyURL: function(entity) {
43305 return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
43309 userURL: function(username) {
43310 return urlroot + '/user/' + username;
43314 noteURL: function(note) {
43315 return urlroot + '/note/' + note.id;
43319 // Generic method to load data from the OSM API
43320 // Can handle either auth or unauth calls.
43321 loadFromAPI: function(path, callback, options) {
43322 options = assignIn({ skipSeen: true }, options);
43324 var cid = _connectionID;
43326 function done(err, xml$$1) {
43327 if (that.getConnectionId() !== cid) {
43328 if (callback) callback({ message: 'Connection Switched', status: -1 });
43332 var isAuthenticated = that.authenticated();
43334 // 400 Bad Request, 401 Unauthorized, 403 Forbidden
43335 // Logout and retry the request..
43336 if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
43338 that.loadFromAPI(path, callback, options);
43340 // else, no retry..
43342 // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
43343 // Set the rateLimitError flag and trigger a warning..
43344 if (!isAuthenticated && !_rateLimitError && err &&
43345 (err.status === 509 || err.status === 429)) {
43346 _rateLimitError = err;
43347 dispatch$3.call('change');
43352 return callback(err);
43354 return parseXML(xml$$1, callback, options);
43360 if (this.authenticated()) {
43361 return oauth.xhr({ method: 'GET', path: path }, done);
43363 var url = urlroot + path;
43364 return d3_xml(url).get(done);
43369 // Load a single entity by id (ways and relations use the `/full` call)
43370 // GET /api/0.6/node/#id
43371 // GET /api/0.6/[way|relation]/#id/full
43372 loadEntity: function(id, callback) {
43373 var type = osmEntity$$1.id.type(id);
43374 var osmID = osmEntity$$1.id.toOSM(id);
43375 var options = { skipSeen: false };
43378 '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
43379 function(err, entities) {
43380 if (callback) callback(err, { data: entities });
43387 // Load a single entity with a specific version
43388 // GET /api/0.6/[node|way|relation]/#id/#version
43389 loadEntityVersion: function(id, version, callback) {
43390 var type = osmEntity$$1.id.type(id);
43391 var osmID = osmEntity$$1.id.toOSM(id);
43392 var options = { skipSeen: false };
43395 '/api/0.6/' + type + '/' + osmID + '/' + version,
43396 function(err, entities) {
43397 if (callback) callback(err, { data: entities });
43404 // Load multiple entities in chunks
43405 // (note: callback may be called multiple times)
43406 // GET /api/0.6/[nodes|ways|relations]?#parameters
43407 loadMultiple: function(ids, callback) {
43410 forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
43411 var type = k + 's';
43412 var osmIDs = map$3(v, osmEntity$$1.id.toOSM);
43413 var options = { skipSeen: false };
43415 forEach(chunk(osmIDs, 150), function(arr) {
43417 '/api/0.6/' + type + '?' + type + '=' + arr.join(),
43418 function(err, entities) {
43419 if (callback) callback(err, { data: entities });
43428 // Create, upload, and close a changeset
43429 // PUT /api/0.6/changeset/create
43430 // POST /api/0.6/changeset/#id/upload
43431 // PUT /api/0.6/changeset/#id/close
43432 putChangeset: function(changeset, changes, callback) {
43433 var cid = _connectionID;
43435 if (_changeset.inflight) {
43436 return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
43438 } else if (_changeset.open) { // reuse existing open changeset..
43439 return createdChangeset.call(this, null, _changeset.open);
43441 } else { // Open a new changeset..
43444 path: '/api/0.6/changeset/create',
43445 options: { header: { 'Content-Type': 'text/xml' } },
43446 content: JXON.stringify(changeset.asJXON())
43448 _changeset.inflight = oauth.xhr(
43450 wrapcb(this, createdChangeset, cid)
43455 function createdChangeset(err, changesetID) {
43456 _changeset.inflight = null;
43457 if (err) { return callback(err, changeset); }
43459 _changeset.open = changesetID;
43460 changeset = changeset.update({ id: changesetID });
43462 // Upload the changeset..
43465 path: '/api/0.6/changeset/' + changesetID + '/upload',
43466 options: { header: { 'Content-Type': 'text/xml' } },
43467 content: JXON.stringify(changeset.osmChangeJXON(changes))
43469 _changeset.inflight = oauth.xhr(
43471 wrapcb(this, uploadedChangeset, cid)
43476 function uploadedChangeset(err) {
43477 _changeset.inflight = null;
43478 if (err) return callback(err, changeset);
43480 // Upload was successful, safe to call the callback.
43481 // Add delay to allow for postgres replication #1646 #2678
43482 window.setTimeout(function() { callback(null, changeset); }, 2500);
43483 _changeset.open = null;
43485 // At this point, we don't really care if the connection was switched..
43486 // Only try to close the changeset if we're still talking to the same server.
43487 if (this.getConnectionId() === cid) {
43488 // Still attempt to close changeset, but ignore response because #2667
43491 path: '/api/0.6/changeset/' + changeset.id + '/close',
43492 options: { header: { 'Content-Type': 'text/xml' } }
43493 }, function() { return true; });
43499 // Load multiple users in chunks
43500 // (note: callback may be called multiple times)
43501 // GET /api/0.6/users?users=#id1,#id2,...,#idn
43502 loadUsers: function(uids, callback) {
43506 uniq(uids).forEach(function(uid) {
43507 if (_userCache.user[uid]) {
43508 delete _userCache.toLoad[uid];
43509 cached.push(_userCache.user[uid]);
43515 if (cached.length || !this.authenticated()) {
43516 callback(undefined, cached);
43517 if (!this.authenticated()) return; // require auth
43520 chunk(toLoad, 150).forEach(function(arr) {
43522 { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
43523 wrapcb(this, done, _connectionID)
43527 function done(err, xml$$1) {
43528 if (err) { return callback(err); }
43530 var options = { skipSeen: true };
43531 return parseXML(xml$$1, function(err, results) {
43533 return callback(err);
43535 return callback(undefined, results);
43542 // Load a given user by id
43543 // GET /api/0.6/user/#id
43544 loadUser: function(uid, callback) {
43545 if (_userCache.user[uid] || !this.authenticated()) { // require auth
43546 delete _userCache.toLoad[uid];
43547 return callback(undefined, _userCache.user[uid]);
43551 { method: 'GET', path: '/api/0.6/user/' + uid },
43552 wrapcb(this, done, _connectionID)
43555 function done(err, xml$$1) {
43556 if (err) { return callback(err); }
43558 var options = { skipSeen: true };
43559 return parseXML(xml$$1, function(err, results) {
43561 return callback(err);
43563 return callback(undefined, results[0]);
43570 // Load the details of the logged-in user
43571 // GET /api/0.6/user/details
43572 userDetails: function(callback) {
43573 if (_userDetails) { // retrieve cached
43574 return callback(undefined, _userDetails);
43578 { method: 'GET', path: '/api/0.6/user/details' },
43579 wrapcb(this, done, _connectionID)
43582 function done(err, xml$$1) {
43583 if (err) { return callback(err); }
43585 var options = { skipSeen: false };
43586 return parseXML(xml$$1, function(err, results) {
43588 return callback(err);
43590 _userDetails = results[0];
43591 return callback(undefined, _userDetails);
43598 // Load previous changesets for the logged in user
43599 // GET /api/0.6/changesets?user=#id
43600 userChangesets: function(callback) {
43601 if (_userChangesets) { // retrieve cached
43602 return callback(undefined, _userChangesets);
43606 wrapcb(this, gotDetails, _connectionID)
43610 function gotDetails(err, user) {
43611 if (err) { return callback(err); }
43614 { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
43615 wrapcb(this, done, _connectionID)
43619 function done(err, xml$$1) {
43620 if (err) { return callback(err); }
43622 _userChangesets = Array.prototype.map.call(
43623 xml$$1.getElementsByTagName('changeset'),
43624 function (changeset) { return { tags: getTags(changeset) }; }
43625 ).filter(function (changeset) {
43626 var comment = changeset.tags.comment;
43627 return comment && comment !== '';
43630 return callback(undefined, _userChangesets);
43635 // Fetch the status of the OSM API
43636 // GET /api/capabilities
43637 status: function(callback) {
43638 d3_xml(urlroot + '/api/capabilities').get(
43639 wrapcb(this, done, _connectionID)
43642 function done(err, xml$$1) {
43643 if (err) { return callback(err); }
43645 // update blacklists
43646 var elements = xml$$1.getElementsByTagName('blacklist');
43648 for (var i = 0; i < elements.length; i++) {
43649 var regex = elements[i].getAttribute('regex'); // needs unencode?
43651 regexes.push(regex);
43654 if (regexes.length) {
43655 _blacklists = regexes;
43658 if (_rateLimitError) {
43659 return callback(_rateLimitError, 'rateLimited');
43661 var apiStatus = xml$$1.getElementsByTagName('status');
43662 var val = apiStatus[0].getAttribute('api');
43663 return callback(undefined, val);
43669 // Load data (entities) from the API in tiles
43670 // GET /api/0.6/map?bbox=
43671 loadTiles: function(projection, callback) {
43675 var path = '/api/0.6/map?bbox=';
43677 // determine the needed tiles to cover the view
43678 var tiles = tiler$2.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
43680 // abort inflight requests that are no longer needed
43681 var hadRequests = !isEmpty(_tileCache.inflight);
43682 abortUnwantedRequests(_tileCache, tiles);
43683 if (hadRequests && isEmpty(_tileCache.inflight)) {
43684 dispatch$3.call('loaded'); // stop the spinner
43687 // issue new requests..
43688 tiles.forEach(function(tile) {
43689 if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
43690 if (isEmpty(_tileCache.inflight)) {
43691 dispatch$3.call('loading'); // start the spinner
43694 var options = { skipSeen: true };
43695 _tileCache.inflight[tile.id] = that.loadFromAPI(
43696 path + tile.extent.toParam(),
43697 function(err, parsed) {
43698 delete _tileCache.inflight[tile.id];
43700 _tileCache.loaded[tile.id] = true;
43703 callback(err, assignIn({ data: parsed }, tile));
43705 if (isEmpty(_tileCache.inflight)) {
43706 dispatch$3.call('loaded'); // stop the spinner
43715 // Load notes from the API in tiles
43716 // GET /api/0.6/notes?bbox=
43717 loadNotes: function(projection, noteOptions) {
43718 noteOptions = assignIn({ limit: 10000, closed: 7 }, noteOptions);
43722 var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
43723 var throttleLoadUsers = throttle(function() {
43724 var uids = Object.keys(_userCache.toLoad);
43725 if (!uids.length) return;
43726 that.loadUsers(uids, function() {}); // eagerly load user details
43729 // determine the needed tiles to cover the view
43730 var tiles = tiler$2.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
43732 // abort inflight requests that are no longer needed
43733 abortUnwantedRequests(_noteCache, tiles);
43735 // issue new requests..
43736 tiles.forEach(function(tile) {
43737 if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
43739 var options = { skipSeen: false };
43740 _noteCache.inflight[tile.id] = that.loadFromAPI(
43741 path + tile.extent.toParam(),
43743 delete _noteCache.inflight[tile.id];
43745 _noteCache.loaded[tile.id] = true;
43747 throttleLoadUsers();
43748 dispatch$3.call('loadedNotes');
43757 // POST /api/0.6/notes?params
43758 postNoteCreate: function(note, callback) {
43759 if (!this.authenticated()) {
43760 return callback({ message: 'Not Authenticated', status: -3 }, note);
43762 if (_noteCache.inflightPost[note.id]) {
43763 return callback({ message: 'Note update already inflight', status: -2 }, note);
43766 if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
43768 var comment = note.newComment;
43769 if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
43771 var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
43773 _noteCache.inflightPost[note.id] = oauth.xhr(
43774 { method: 'POST', path: path },
43775 wrapcb(this, done, _connectionID)
43779 function done(err, xml$$1) {
43780 delete _noteCache.inflightPost[note.id];
43781 if (err) { return callback(err); }
43783 // we get the updated note back, remove from caches and reparse..
43784 this.removeNote(note);
43786 var options = { skipSeen: false };
43787 return parseXML(xml$$1, function(err, results) {
43789 return callback(err);
43791 return callback(undefined, results[0]);
43799 // POST /api/0.6/notes/#id/comment?text=comment
43800 // POST /api/0.6/notes/#id/close?text=comment
43801 // POST /api/0.6/notes/#id/reopen?text=comment
43802 postNoteUpdate: function(note, newStatus, callback) {
43803 if (!this.authenticated()) {
43804 return callback({ message: 'Not Authenticated', status: -3 }, note);
43806 if (_noteCache.inflightPost[note.id]) {
43807 return callback({ message: 'Note update already inflight', status: -2 }, note);
43811 if (note.status !== 'closed' && newStatus === 'closed') {
43813 } else if (note.status !== 'open' && newStatus === 'open') {
43816 action = 'comment';
43817 if (!note.newComment) return; // when commenting, comment required
43820 var path = '/api/0.6/notes/' + note.id + '/' + action;
43821 if (note.newComment) {
43822 path += '?' + utilQsString({ text: note.newComment });
43825 _noteCache.inflightPost[note.id] = oauth.xhr(
43826 { method: 'POST', path: path },
43827 wrapcb(this, done, _connectionID)
43831 function done(err, xml$$1) {
43832 delete _noteCache.inflightPost[note.id];
43833 if (err) { return callback(err); }
43835 // we get the updated note back, remove from caches and reparse..
43836 this.removeNote(note);
43838 var options = { skipSeen: false };
43839 return parseXML(xml$$1, function(err, results) {
43841 return callback(err);
43843 return callback(undefined, results[0]);
43850 switch: function(options) {
43851 urlroot = options.urlroot;
43853 oauth.options(assignIn({
43855 loading: authLoading,
43860 this.userChangesets(function() {}); // eagerly load user details/changesets
43861 dispatch$3.call('change');
43866 toggle: function(_) {
43872 isChangesetInflight: function() {
43873 return !!_changeset.inflight;
43877 // get/set cached data
43878 // This is used to save/restore the state when entering/exiting the walkthrough
43879 // Also used for testing purposes.
43880 caches: function(obj) {
43881 if (!arguments.length) {
43883 tile: cloneDeep(_tileCache),
43884 note: cloneDeep(_noteCache),
43885 user: cloneDeep(_userCache)
43889 // access caches directly for testing (e.g., loading notes rtree)
43890 if (obj === 'get') {
43899 _tileCache = obj.tile;
43900 _tileCache.inflight = {};
43903 _noteCache = obj.note;
43904 _noteCache.inflight = {};
43905 _noteCache.inflightPost = {};
43908 _userCache = obj.user;
43915 logout: function() {
43916 _userChangesets = undefined;
43917 _userDetails = undefined;
43919 dispatch$3.call('change');
43924 authenticated: function() {
43925 return oauth.authenticated();
43929 authenticate: function(callback) {
43931 var cid = _connectionID;
43932 _userChangesets = undefined;
43933 _userDetails = undefined;
43935 function done(err, res) {
43937 if (callback) callback(err);
43940 if (that.getConnectionId() !== cid) {
43941 if (callback) callback({ message: 'Connection Switched', status: -1 });
43944 _rateLimitError = undefined;
43945 dispatch$3.call('change');
43946 if (callback) callback(err, res);
43947 that.userChangesets(function() {}); // eagerly load user details/changesets
43950 return oauth.authenticate(done);
43954 imageryBlacklists: function() {
43955 return _blacklists;
43959 tileZoom: function(_) {
43960 if (!arguments.length) return _tileZoom;
43966 // get all cached notes covering the viewport
43967 notes: function(projection) {
43968 var viewport = projection.clipExtent();
43969 var min = [viewport[0][0], viewport[1][1]];
43970 var max = [viewport[1][0], viewport[0][1]];
43971 var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
43973 return _noteCache.rtree.search(bbox)
43974 .map(function(d) { return d.data; });
43978 // get a single note from the cache
43979 getNote: function(id) {
43980 return _noteCache.note[id];
43984 // remove a single note from the cache
43985 removeNote: function(note) {
43986 if (!(note instanceof osmNote) || !note.id) return;
43988 delete _noteCache.note[note.id];
43989 updateRtree(encodeNoteRtree(note), false); // false = remove
43993 // replace a single note in the cache
43994 replaceNote: function(note) {
43995 if (!(note instanceof osmNote) || !note.id) return;
43997 _noteCache.note[note.id] = note;
43998 updateRtree(encodeNoteRtree(note), true); // true = replace
44004 var jsonpCache = {};
44005 window.jsonpCache = jsonpCache;
44007 function jsonpRequest(url, callback) {
44009 abort: function() {}
44012 if (window.JSONP_FIX) {
44013 if (window.JSONP_DELAY === 0) {
44014 callback(window.JSONP_FIX);
44016 var t = window.setTimeout(function() {
44017 callback(window.JSONP_FIX);
44018 }, window.JSONP_DELAY || 0);
44020 request.abort = function() { window.clearTimeout(t); };
44027 var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
44030 while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
44034 function create$$1(url) {
44035 var e = url.match(/callback=(\w+)/);
44036 var c = e ? e[1] : rand();
44038 jsonpCache[c] = function(data) {
44039 if (jsonpCache[c]) {
44045 function finalize() {
44046 delete jsonpCache[c];
44050 request.abort = finalize;
44051 return 'jsonpCache.' + c;
44054 var cb = create$$1(url);
44056 var script = select('head')
44058 .attr('type', 'text/javascript')
44059 .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
44064 var q = createCommonjsModule(function (module, exports) {
44065 // vim:ts=4:sts=4:sw=4:
44068 * Copyright 2009-2017 Kris Kowal under the terms of the MIT
44069 * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
44071 * With parts by Tyler Close
44072 * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
44073 * at http://www.opensource.org/licenses/mit-license.html
44074 * Forked at ref_send.js version: 2009-05-11
44076 * With parts by Mark Miller
44077 * Copyright (C) 2011 Google Inc.
44079 * Licensed under the Apache License, Version 2.0 (the "License");
44080 * you may not use this file except in compliance with the License.
44081 * You may obtain a copy of the License at
44083 * http://www.apache.org/licenses/LICENSE-2.0
44085 * Unless required by applicable law or agreed to in writing, software
44086 * distributed under the License is distributed on an "AS IS" BASIS,
44087 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
44088 * See the License for the specific language governing permissions and
44089 * limitations under the License.
44093 (function (definition) {
44095 // This file will function properly as a <script> tag, or a module
44096 // using CommonJS and NodeJS or RequireJS module formats. In
44097 // Common/Node/RequireJS, the module exports the Q API and when
44098 // executed as a simple <script>, it creates a Q global instead.
44101 if (typeof bootstrap === "function") {
44102 bootstrap("promise", definition);
44106 module.exports = definition();
44113 var hasStacks = false;
44117 hasStacks = !!e.stack;
44120 // All code after this point will be filtered from stack traces reported
44122 var qStartingLine = captureLine();
44127 // used for fallback in "allResolved"
44128 var noop = function () {};
44130 // Use the fastest possible means to execute a task in a future turn
44131 // of the event loop.
44132 var nextTick =(function () {
44133 // linked list of tasks (single, with head node)
44134 var head = {task: void 0, next: null};
44136 var flushing = false;
44137 var requestTick = void 0;
44138 var isNodeJS = false;
44139 // queue for late tasks, used by unhandled rejection tracking
44140 var laterQueue = [];
44143 /* jshint loopfunc: true */
44146 while (head.next) {
44149 head.task = void 0;
44150 domain = head.domain;
44153 head.domain = void 0;
44156 runSingle(task, domain);
44159 while (laterQueue.length) {
44160 task = laterQueue.pop();
44165 // runs a single function in the async queue
44166 function runSingle(task, domain) {
44172 // In node, uncaught exceptions are considered fatal errors.
44173 // Re-throw them synchronously to interrupt flushing!
44175 // Ensure continuation if the uncaught exception is suppressed
44176 // listening "uncaughtException" events (as domains does).
44177 // Continue in next event to avoid tick recursion.
44181 setTimeout(flush, 0);
44189 // In browsers, uncaught exceptions are not fatal.
44190 // Re-throw them asynchronously to avoid slow-downs.
44191 setTimeout(function () {
44202 nextTick = function (task) {
44203 tail = tail.next = {
44205 domain: isNodeJS && process.domain,
44215 if (typeof process === "object" &&
44216 process.toString() === "[object process]" && process.nextTick) {
44217 // Ensure Q is in a real Node environment, with a `process.nextTick`.
44218 // To see through fake Node environments:
44219 // * Mocha test runner - exposes a `process` global without a `nextTick`
44220 // * Browserify - exposes a `process.nexTick` function that uses
44221 // `setTimeout`. In this case `setImmediate` is preferred because
44222 // it is faster. Browserify's `process.toString()` yields
44223 // "[object Object]", while in a real Node environment
44224 // `process.toString()` yields "[object process]".
44227 requestTick = function () {
44228 process.nextTick(flush);
44231 } else if (typeof setImmediate === "function") {
44232 // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
44233 if (typeof window !== "undefined") {
44234 requestTick = setImmediate.bind(window, flush);
44236 requestTick = function () {
44237 setImmediate(flush);
44241 } else if (typeof MessageChannel !== "undefined") {
44243 // http://www.nonblocking.io/2011/06/windownexttick.html
44244 var channel = new MessageChannel();
44245 // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
44246 // working message ports the first time a page loads.
44247 channel.port1.onmessage = function () {
44248 requestTick = requestPortTick;
44249 channel.port1.onmessage = flush;
44252 var requestPortTick = function () {
44253 // Opera requires us to provide a message payload, regardless of
44254 // whether we use it.
44255 channel.port2.postMessage(0);
44257 requestTick = function () {
44258 setTimeout(flush, 0);
44264 requestTick = function () {
44265 setTimeout(flush, 0);
44268 // runs a task after all other tasks have been run
44269 // this is useful for unhandled rejection tracking that needs to happen
44270 // after all `then`d tasks have been run.
44271 nextTick.runAfter = function (task) {
44272 laterQueue.push(task);
44281 // Attempt to make generics safe in the face of downstream
44283 // There is no situation where this is necessary.
44284 // If you need a security guarantee, these primordials need to be
44285 // deeply frozen anyway, and if you don’t need a security guarantee,
44286 // this is just plain paranoid.
44287 // However, this **might** have the nice side-effect of reducing the size of
44288 // the minified code by reducing x.call() to merely x()
44289 // See Mark Miller’s explanation of what this does.
44290 // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
44291 var call = Function.call;
44292 function uncurryThis(f) {
44293 return function () {
44294 return call.apply(f, arguments);
44297 // This is equivalent, but slower:
44298 // uncurryThis = Function_bind.bind(Function_bind.call);
44299 // http://jsperf.com/uncurrythis
44301 var array_slice = uncurryThis(Array.prototype.slice);
44303 var array_reduce = uncurryThis(
44304 Array.prototype.reduce || function (callback, basis) {
44306 length = this.length;
44307 // concerning the initial value, if one is not provided
44308 if (arguments.length === 1) {
44309 // seek to the first value in the array, accounting
44310 // for the possibility that is is a sparse array
44312 if (index in this) {
44313 basis = this[index++];
44316 if (++index >= length) {
44317 throw new TypeError();
44322 for (; index < length; index++) {
44323 // account for the possibility that the array is sparse
44324 if (index in this) {
44325 basis = callback(basis, this[index], index);
44332 var array_indexOf = uncurryThis(
44333 Array.prototype.indexOf || function (value) {
44334 // not a very good shim, but good enough for our one use of it
44335 for (var i = 0; i < this.length; i++) {
44336 if (this[i] === value) {
44344 var array_map = uncurryThis(
44345 Array.prototype.map || function (callback, thisp) {
44348 array_reduce(self, function (undefined, value, index) {
44349 collect.push(callback.call(thisp, value, index, self));
44355 var object_create = Object.create || function (prototype) {
44356 function Type() { }
44357 Type.prototype = prototype;
44361 var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
44362 obj[prop] = descriptor.value;
44366 var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
44368 var object_keys = Object.keys || function (object) {
44370 for (var key in object) {
44371 if (object_hasOwnProperty(object, key)) {
44378 var object_toString = uncurryThis(Object.prototype.toString);
44380 function isObject(value) {
44381 return value === Object(value);
44384 // generator related shims
44386 // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
44387 function isStopIteration(exception) {
44389 object_toString(exception) === "[object StopIteration]" ||
44390 exception instanceof QReturnValue
44394 // FIXME: Remove this helper and Q.return once ES6 generators are in
44397 if (typeof ReturnValue !== "undefined") {
44398 QReturnValue = ReturnValue;
44400 QReturnValue = function (value) {
44401 this.value = value;
44405 // long stack traces
44407 var STACK_JUMP_SEPARATOR = "From previous event:";
44409 function makeStackTraceLong(error, promise) {
44410 // If possible, transform the error stack trace by removing Node and Q
44411 // cruft, then concatenating with the stack trace of `promise`. See #57.
44414 typeof error === "object" &&
44419 for (var p = promise; !!p; p = p.source) {
44420 if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
44421 object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
44422 stacks.unshift(p.stack);
44425 stacks.unshift(error.stack);
44427 var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
44428 var stack = filterStackString(concatedStacks);
44429 object_defineProperty(error, "stack", {value: stack, configurable: true});
44433 function filterStackString(stackString) {
44434 var lines = stackString.split("\n");
44435 var desiredLines = [];
44436 for (var i = 0; i < lines.length; ++i) {
44437 var line = lines[i];
44439 if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
44440 desiredLines.push(line);
44443 return desiredLines.join("\n");
44446 function isNodeFrame(stackLine) {
44447 return stackLine.indexOf("(module.js:") !== -1 ||
44448 stackLine.indexOf("(node.js:") !== -1;
44451 function getFileNameAndLineNumber(stackLine) {
44452 // Named functions: "at functionName (filename:lineNumber:columnNumber)"
44453 // In IE10 function name can have spaces ("Anonymous function") O_o
44454 var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
44456 return [attempt1[1], Number(attempt1[2])];
44459 // Anonymous functions: "at filename:lineNumber:columnNumber"
44460 var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
44462 return [attempt2[1], Number(attempt2[2])];
44465 // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
44466 var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
44468 return [attempt3[1], Number(attempt3[2])];
44472 function isInternalFrame(stackLine) {
44473 var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
44475 if (!fileNameAndLineNumber) {
44479 var fileName = fileNameAndLineNumber[0];
44480 var lineNumber = fileNameAndLineNumber[1];
44482 return fileName === qFileName &&
44483 lineNumber >= qStartingLine &&
44484 lineNumber <= qEndingLine;
44487 // discover own file name and line number range for filtering stack
44489 function captureLine() {
44497 var lines = e.stack.split("\n");
44498 var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
44499 var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
44500 if (!fileNameAndLineNumber) {
44504 qFileName = fileNameAndLineNumber[0];
44505 return fileNameAndLineNumber[1];
44509 function deprecate(callback, name, alternative) {
44510 return function () {
44511 if (typeof console !== "undefined" &&
44512 typeof console.warn === "function") {
44513 console.warn(name + " is deprecated, use " + alternative +
44514 " instead.", new Error("").stack);
44516 return callback.apply(callback, arguments);
44521 // beginning of real work
44524 * Constructs a promise for an immediate reference, passes promises through, or
44525 * coerces promises from different systems.
44526 * @param value immediate reference or promise
44528 function Q(value) {
44529 // If the object is already a Promise, return it directly. This enables
44530 // the resolve function to both be used to created references from objects,
44531 // but to tolerably coerce non-promises to promises.
44532 if (value instanceof Promise) {
44536 // assimilate thenables
44537 if (isPromiseAlike(value)) {
44538 return coerce(value);
44540 return fulfill(value);
44546 * Performs a task in a future turn of the event loop.
44547 * @param {Function} task
44549 Q.nextTick = nextTick;
44552 * Controls whether or not long stack traces will be on
44554 Q.longStackSupport = false;
44557 * The counter is used to determine the stopping point for building
44558 * long stack traces. In makeStackTraceLong we walk backwards through
44559 * the linked list of promises, only stacks which were created before
44560 * the rejection are concatenated.
44562 var longStackCounter = 1;
44564 // enable long stacks if Q_DEBUG is set
44565 if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
44566 Q.longStackSupport = true;
44570 * Constructs a {promise, resolve, reject} object.
44572 * `resolve` is a callback to invoke with a more resolved value for the
44573 * promise. To fulfill the promise, invoke `resolve` with any value that is
44574 * not a thenable. To reject the promise, invoke `resolve` with a rejected
44575 * thenable, or invoke `reject` with the reason directly. To resolve the
44576 * promise to another thenable, thus putting it in the same state, invoke
44577 * `resolve` with that other thenable.
44581 // if "messages" is an "Array", that indicates that the promise has not yet
44582 // been resolved. If it is "undefined", it has been resolved. Each
44583 // element of the messages array is itself an array of complete arguments to
44584 // forward to the resolved promise. We coerce the resolution value to a
44585 // promise using the `resolve` function because it handles both fully
44586 // non-thenable values and other thenables gracefully.
44587 var messages = [], progressListeners = [], resolvedPromise;
44589 var deferred = object_create(defer.prototype);
44590 var promise = object_create(Promise.prototype);
44592 promise.promiseDispatch = function (resolve, op, operands) {
44593 var args = array_slice(arguments);
44595 messages.push(args);
44596 if (op === "when" && operands[1]) { // progress operand
44597 progressListeners.push(operands[1]);
44600 Q.nextTick(function () {
44601 resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
44607 promise.valueOf = function () {
44611 var nearerValue = nearer(resolvedPromise);
44612 if (isPromise(nearerValue)) {
44613 resolvedPromise = nearerValue; // shorten chain
44615 return nearerValue;
44618 promise.inspect = function () {
44619 if (!resolvedPromise) {
44620 return { state: "pending" };
44622 return resolvedPromise.inspect();
44625 if (Q.longStackSupport && hasStacks) {
44629 // NOTE: don't try to use `Error.captureStackTrace` or transfer the
44630 // accessor around; that causes memory leaks as per GH-111. Just
44631 // reify the stack trace as a string ASAP.
44633 // At the same time, cut off the first line; it's always just
44634 // "[object Promise]\n", as per the `toString`.
44635 promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
44636 promise.stackCounter = longStackCounter++;
44640 // NOTE: we do the checks for `resolvedPromise` in each method, instead of
44641 // consolidating them into `become`, since otherwise we'd create new
44642 // promises with the lines `become(whatever(value))`. See e.g. GH-252.
44644 function become(newPromise) {
44645 resolvedPromise = newPromise;
44647 if (Q.longStackSupport && hasStacks) {
44648 // Only hold a reference to the new promise if long stacks
44649 // are enabled to reduce memory usage
44650 promise.source = newPromise;
44653 array_reduce(messages, function (undefined, message) {
44654 Q.nextTick(function () {
44655 newPromise.promiseDispatch.apply(newPromise, message);
44660 progressListeners = void 0;
44663 deferred.promise = promise;
44664 deferred.resolve = function (value) {
44665 if (resolvedPromise) {
44672 deferred.fulfill = function (value) {
44673 if (resolvedPromise) {
44677 become(fulfill(value));
44679 deferred.reject = function (reason) {
44680 if (resolvedPromise) {
44684 become(reject(reason));
44686 deferred.notify = function (progress) {
44687 if (resolvedPromise) {
44691 array_reduce(progressListeners, function (undefined, progressListener) {
44692 Q.nextTick(function () {
44693 progressListener(progress);
44702 * Creates a Node-style callback that will resolve or reject the deferred
44704 * @returns a nodeback
44706 defer.prototype.makeNodeResolver = function () {
44708 return function (error, value) {
44710 self.reject(error);
44711 } else if (arguments.length > 2) {
44712 self.resolve(array_slice(arguments, 1));
44714 self.resolve(value);
44720 * @param resolver {Function} a function that returns nothing and accepts
44721 * the resolve, reject, and notify functions for a deferred.
44722 * @returns a promise that may be resolved with the given resolve and reject
44723 * functions, or rejected by a thrown exception in resolver
44725 Q.Promise = promise; // ES6
44726 Q.promise = promise;
44727 function promise(resolver) {
44728 if (typeof resolver !== "function") {
44729 throw new TypeError("resolver must be a function.");
44731 var deferred = defer();
44733 resolver(deferred.resolve, deferred.reject, deferred.notify);
44735 deferred.reject(reason);
44737 return deferred.promise;
44740 promise.race = race; // ES6
44741 promise.all = all; // ES6
44742 promise.reject = reject; // ES6
44743 promise.resolve = Q; // ES6
44745 // XXX experimental. This method is a way to denote that a local value is
44746 // serializable and should be immediately dispatched to a remote upon request,
44747 // instead of passing a reference.
44748 Q.passByCopy = function (object) {
44750 //passByCopies.set(object, true);
44754 Promise.prototype.passByCopy = function () {
44756 //passByCopies.set(object, true);
44761 * If two promises eventually fulfill to the same value, promises that value,
44762 * but otherwise rejects.
44765 * @returns {Any*} a promise for x and y if they are the same, but a rejection
44769 Q.join = function (x, y) {
44770 return Q(x).join(y);
44773 Promise.prototype.join = function (that) {
44774 return Q([this, that]).spread(function (x, y) {
44776 // TODO: "===" should be Object.is or equiv
44779 throw new Error("Q can't join: not the same: " + x + " " + y);
44785 * Returns a promise for the first of an array of promises to become settled.
44786 * @param answers {Array[Any*]} promises to race
44787 * @returns {Any*} the first promise to be settled
44790 function race(answerPs) {
44791 return promise(function (resolve, reject) {
44792 // Switch to this once we can assume at least ES5
44793 // answerPs.forEach(function (answerP) {
44794 // Q(answerP).then(resolve, reject);
44796 // Use this in the meantime
44797 for (var i = 0, len = answerPs.length; i < len; i++) {
44798 Q(answerPs[i]).then(resolve, reject);
44803 Promise.prototype.race = function () {
44804 return this.then(Q.race);
44808 * Constructs a Promise with a promise descriptor object and optional fallback
44809 * function. The descriptor contains methods like when(rejected), get(name),
44810 * set(name, value), post(name, args), and delete(name), which all
44811 * return either a value, a promise for a value, or a rejection. The fallback
44812 * accepts the operation name, a resolver, and any further arguments that would
44813 * have been forwarded to the appropriate method above had a method been
44814 * provided with the proper name. The API makes no guarantees about the nature
44815 * of the returned object, apart from that it is usable whereever promises are
44818 Q.makePromise = Promise;
44819 function Promise(descriptor, fallback, inspect) {
44820 if (fallback === void 0) {
44821 fallback = function (op) {
44822 return reject(new Error(
44823 "Promise does not support operation: " + op
44827 if (inspect === void 0) {
44828 inspect = function () {
44829 return {state: "unknown"};
44833 var promise = object_create(Promise.prototype);
44835 promise.promiseDispatch = function (resolve, op, args) {
44838 if (descriptor[op]) {
44839 result = descriptor[op].apply(promise, args);
44841 result = fallback.call(promise, op, args);
44843 } catch (exception) {
44844 result = reject(exception);
44851 promise.inspect = inspect;
44853 // XXX deprecated `valueOf` and `exception` support
44855 var inspected = inspect();
44856 if (inspected.state === "rejected") {
44857 promise.exception = inspected.reason;
44860 promise.valueOf = function () {
44861 var inspected = inspect();
44862 if (inspected.state === "pending" ||
44863 inspected.state === "rejected") {
44866 return inspected.value;
44873 Promise.prototype.toString = function () {
44874 return "[object Promise]";
44877 Promise.prototype.then = function (fulfilled, rejected, progressed) {
44879 var deferred = defer();
44880 var done = false; // ensure the untrusted promise makes at most a
44881 // single call to one of the callbacks
44883 function _fulfilled(value) {
44885 return typeof fulfilled === "function" ? fulfilled(value) : value;
44886 } catch (exception) {
44887 return reject(exception);
44891 function _rejected(exception) {
44892 if (typeof rejected === "function") {
44893 makeStackTraceLong(exception, self);
44895 return rejected(exception);
44896 } catch (newException) {
44897 return reject(newException);
44900 return reject(exception);
44903 function _progressed(value) {
44904 return typeof progressed === "function" ? progressed(value) : value;
44907 Q.nextTick(function () {
44908 self.promiseDispatch(function (value) {
44914 deferred.resolve(_fulfilled(value));
44915 }, "when", [function (exception) {
44921 deferred.resolve(_rejected(exception));
44925 // Progress propagator need to be attached in the current tick.
44926 self.promiseDispatch(void 0, "when", [void 0, function (value) {
44930 newValue = _progressed(value);
44941 deferred.notify(newValue);
44945 return deferred.promise;
44948 Q.tap = function (promise, callback) {
44949 return Q(promise).tap(callback);
44953 * Works almost like "finally", but not called for rejections.
44954 * Original resolution value is passed through callback unaffected.
44955 * Callback may return a promise that will be awaited for.
44956 * @param {Function} callback
44957 * @returns {Q.Promise}
44961 * .tap(console.log)
44964 Promise.prototype.tap = function (callback) {
44965 callback = Q(callback);
44967 return this.then(function (value) {
44968 return callback.fcall(value).thenResolve(value);
44973 * Registers an observer on a promise.
44977 * 1. that fulfilled and rejected will be called only once.
44978 * 2. that either the fulfilled callback or the rejected callback will be
44979 * called, but not both.
44980 * 3. that fulfilled and rejected will not be called in this turn.
44982 * @param value promise or immediate reference to observe
44983 * @param fulfilled function to be called with the fulfilled value
44984 * @param rejected function to be called with the rejection exception
44985 * @param progressed function to be called on any progress notifications
44986 * @return promise for the return value from the invoked callback
44989 function when(value, fulfilled, rejected, progressed) {
44990 return Q(value).then(fulfilled, rejected, progressed);
44993 Promise.prototype.thenResolve = function (value) {
44994 return this.then(function () { return value; });
44997 Q.thenResolve = function (promise, value) {
44998 return Q(promise).thenResolve(value);
45001 Promise.prototype.thenReject = function (reason) {
45002 return this.then(function () { throw reason; });
45005 Q.thenReject = function (promise, reason) {
45006 return Q(promise).thenReject(reason);
45010 * If an object is not a promise, it is as "near" as possible.
45011 * If a promise is rejected, it is as "near" as possible too.
45012 * If it’s a fulfilled promise, the fulfillment value is nearer.
45013 * If it’s a deferred promise and the deferred has been resolved, the
45014 * resolution is "nearer".
45016 * @returns most resolved (nearest) form of the object
45019 // XXX should we re-do this?
45021 function nearer(value) {
45022 if (isPromise(value)) {
45023 var inspected = value.inspect();
45024 if (inspected.state === "fulfilled") {
45025 return inspected.value;
45032 * @returns whether the given object is a promise.
45033 * Otherwise it is a fulfilled value.
45035 Q.isPromise = isPromise;
45036 function isPromise(object) {
45037 return object instanceof Promise;
45040 Q.isPromiseAlike = isPromiseAlike;
45041 function isPromiseAlike(object) {
45042 return isObject(object) && typeof object.then === "function";
45046 * @returns whether the given object is a pending promise, meaning not
45047 * fulfilled or rejected.
45049 Q.isPending = isPending;
45050 function isPending(object) {
45051 return isPromise(object) && object.inspect().state === "pending";
45054 Promise.prototype.isPending = function () {
45055 return this.inspect().state === "pending";
45059 * @returns whether the given object is a value or fulfilled
45062 Q.isFulfilled = isFulfilled;
45063 function isFulfilled(object) {
45064 return !isPromise(object) || object.inspect().state === "fulfilled";
45067 Promise.prototype.isFulfilled = function () {
45068 return this.inspect().state === "fulfilled";
45072 * @returns whether the given object is a rejected promise.
45074 Q.isRejected = isRejected;
45075 function isRejected(object) {
45076 return isPromise(object) && object.inspect().state === "rejected";
45079 Promise.prototype.isRejected = function () {
45080 return this.inspect().state === "rejected";
45083 //// BEGIN UNHANDLED REJECTION TRACKING
45085 // This promise library consumes exceptions thrown in handlers so they can be
45086 // handled by a subsequent promise. The exceptions get added to this array when
45087 // they are created, and removed when they are handled. Note that in ES6 or
45088 // shimmed environments, this would naturally be a `Set`.
45089 var unhandledReasons = [];
45090 var unhandledRejections = [];
45091 var reportedUnhandledRejections = [];
45092 var trackUnhandledRejections = true;
45094 function resetUnhandledRejections() {
45095 unhandledReasons.length = 0;
45096 unhandledRejections.length = 0;
45098 if (!trackUnhandledRejections) {
45099 trackUnhandledRejections = true;
45103 function trackRejection(promise, reason) {
45104 if (!trackUnhandledRejections) {
45107 if (typeof process === "object" && typeof process.emit === "function") {
45108 Q.nextTick.runAfter(function () {
45109 if (array_indexOf(unhandledRejections, promise) !== -1) {
45110 process.emit("unhandledRejection", reason, promise);
45111 reportedUnhandledRejections.push(promise);
45116 unhandledRejections.push(promise);
45117 if (reason && typeof reason.stack !== "undefined") {
45118 unhandledReasons.push(reason.stack);
45120 unhandledReasons.push("(no stack) " + reason);
45124 function untrackRejection(promise) {
45125 if (!trackUnhandledRejections) {
45129 var at = array_indexOf(unhandledRejections, promise);
45131 if (typeof process === "object" && typeof process.emit === "function") {
45132 Q.nextTick.runAfter(function () {
45133 var atReport = array_indexOf(reportedUnhandledRejections, promise);
45134 if (atReport !== -1) {
45135 process.emit("rejectionHandled", unhandledReasons[at], promise);
45136 reportedUnhandledRejections.splice(atReport, 1);
45140 unhandledRejections.splice(at, 1);
45141 unhandledReasons.splice(at, 1);
45145 Q.resetUnhandledRejections = resetUnhandledRejections;
45147 Q.getUnhandledReasons = function () {
45148 // Make a copy so that consumers can't interfere with our internal state.
45149 return unhandledReasons.slice();
45152 Q.stopUnhandledRejectionTracking = function () {
45153 resetUnhandledRejections();
45154 trackUnhandledRejections = false;
45157 resetUnhandledRejections();
45159 //// END UNHANDLED REJECTION TRACKING
45162 * Constructs a rejected promise.
45163 * @param reason value describing the failure
45166 function reject(reason) {
45167 var rejection = Promise({
45168 "when": function (rejected) {
45169 // note that the error has been handled
45171 untrackRejection(this);
45173 return rejected ? rejected(reason) : this;
45175 }, function fallback() {
45177 }, function inspect() {
45178 return { state: "rejected", reason: reason };
45181 // Note that the reason has not been handled.
45182 trackRejection(rejection, reason);
45188 * Constructs a fulfilled promise for an immediate reference.
45189 * @param value immediate reference
45191 Q.fulfill = fulfill;
45192 function fulfill(value) {
45194 "when": function () {
45197 "get": function (name) {
45198 return value[name];
45200 "set": function (name, rhs) {
45203 "delete": function (name) {
45204 delete value[name];
45206 "post": function (name, args) {
45207 // Mark Miller proposes that post with no name should apply a
45208 // promised function.
45209 if (name === null || name === void 0) {
45210 return value.apply(void 0, args);
45212 return value[name].apply(value, args);
45215 "apply": function (thisp, args) {
45216 return value.apply(thisp, args);
45218 "keys": function () {
45219 return object_keys(value);
45221 }, void 0, function inspect() {
45222 return { state: "fulfilled", value: value };
45227 * Converts thenables to Q promises.
45228 * @param promise thenable promise
45229 * @returns a Q promise
45231 function coerce(promise) {
45232 var deferred = defer();
45233 Q.nextTick(function () {
45235 promise.then(deferred.resolve, deferred.reject, deferred.notify);
45236 } catch (exception) {
45237 deferred.reject(exception);
45240 return deferred.promise;
45244 * Annotates an object such that it will never be
45245 * transferred away from this process over any promise
45246 * communication channel.
45248 * @returns promise a wrapping of that object that
45249 * additionally responds to the "isDef" message
45250 * without a rejection.
45253 function master(object) {
45255 "isDef": function () {}
45256 }, function fallback(op, args) {
45257 return dispatch(object, op, args);
45259 return Q(object).inspect();
45264 * Spreads the values of a promised array of arguments into the
45265 * fulfillment callback.
45266 * @param fulfilled callback that receives variadic arguments from the
45268 * @param rejected callback that receives the exception if the promise
45270 * @returns a promise for the return value or thrown exception of
45274 function spread(value, fulfilled, rejected) {
45275 return Q(value).spread(fulfilled, rejected);
45278 Promise.prototype.spread = function (fulfilled, rejected) {
45279 return this.all().then(function (array) {
45280 return fulfilled.apply(void 0, array);
45285 * The async function is a decorator for generator functions, turning
45286 * them into asynchronous generators. Although generators are only part
45287 * of the newest ECMAScript 6 drafts, this code does not cause syntax
45288 * errors in older engines. This code should continue to work and will
45289 * in fact improve over time as the language improves.
45291 * ES6 generators are currently part of V8 version 3.19 with the
45292 * --harmony-generators runtime flag enabled. SpiderMonkey has had them
45293 * for longer, but under an older Python-inspired form. This function
45294 * works on both kinds of generators.
45296 * Decorates a generator function such that:
45297 * - it may yield promises
45298 * - execution will continue when that promise is fulfilled
45299 * - the value of the yield expression will be the fulfilled value
45300 * - it returns a promise for the return value (when the generator
45302 * - the decorated function returns a promise for the return value
45303 * of the generator or the first rejected promise among those
45305 * - if an error is thrown in the generator, it propagates through
45306 * every following yield until it is caught, or until it escapes
45307 * the generator function altogether, and is translated into a
45308 * rejection for the promise returned by the decorated generator.
45311 function async(makeGenerator) {
45312 return function () {
45313 // when verb is "send", arg is a value
45314 // when verb is "throw", arg is an exception
45315 function continuer(verb, arg) {
45318 // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
45319 // engine that has a deployed base of browsers that support generators.
45320 // However, SM's generators use the Python-inspired semantics of
45321 // outdated ES6 drafts. We would like to support ES6, but we'd also
45322 // like to make it possible to use generators in deployed browsers, so
45323 // we also support Python-style generators. At some point we can remove
45326 if (typeof StopIteration === "undefined") {
45329 result = generator[verb](arg);
45330 } catch (exception) {
45331 return reject(exception);
45334 return Q(result.value);
45336 return when(result.value, callback, errback);
45339 // SpiderMonkey Generators
45340 // FIXME: Remove this case when SM does ES6 generators.
45342 result = generator[verb](arg);
45343 } catch (exception) {
45344 if (isStopIteration(exception)) {
45345 return Q(exception.value);
45347 return reject(exception);
45350 return when(result, callback, errback);
45353 var generator = makeGenerator.apply(this, arguments);
45354 var callback = continuer.bind(continuer, "next");
45355 var errback = continuer.bind(continuer, "throw");
45361 * The spawn function is a small wrapper around async that immediately
45362 * calls the generator and also ends the promise chain, so that any
45363 * unhandled errors are thrown instead of forwarded to the error
45364 * handler. This is useful because it's extremely common to run
45365 * generators at the top-level to work with libraries.
45368 function spawn(makeGenerator) {
45369 Q.done(Q.async(makeGenerator)());
45372 // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
45374 * Throws a ReturnValue exception to stop an asynchronous generator.
45376 * This interface is a stop-gap measure to support generator return
45377 * values in older Firefox/SpiderMonkey. In browsers that support ES6
45378 * generators like Chromium 29, just use "return" in your generator
45381 * @param value the return value for the surrounding generator
45382 * @throws ReturnValue exception with the value.
45385 * Q.async(function* () {
45386 * var foo = yield getFooPromise();
45387 * var bar = yield getBarPromise();
45388 * return foo + bar;
45390 * // Older SpiderMonkey style
45391 * Q.async(function () {
45392 * var foo = yield getFooPromise();
45393 * var bar = yield getBarPromise();
45394 * Q.return(foo + bar);
45397 Q["return"] = _return;
45398 function _return(value) {
45399 throw new QReturnValue(value);
45403 * The promised function decorator ensures that any promise arguments
45404 * are settled and passed as values (`this` is also settled and passed
45405 * as a value). It will also ensure that the result of a function is
45406 * always a promise.
45409 * var add = Q.promised(function (a, b) {
45414 * @param {function} callback The function to decorate
45415 * @returns {function} a function that has been decorated.
45417 Q.promised = promised;
45418 function promised(callback) {
45419 return function () {
45420 return spread([this, all(arguments)], function (self, args) {
45421 return callback.apply(self, args);
45427 * sends a message to a value in a future turn
45428 * @param object* the recipient
45429 * @param op the name of the message operation, e.g., "when",
45430 * @param args further arguments to be forwarded to the operation
45431 * @returns result {Promise} a promise for the result of the operation
45433 Q.dispatch = dispatch;
45434 function dispatch(object, op, args) {
45435 return Q(object).dispatch(op, args);
45438 Promise.prototype.dispatch = function (op, args) {
45440 var deferred = defer();
45441 Q.nextTick(function () {
45442 self.promiseDispatch(deferred.resolve, op, args);
45444 return deferred.promise;
45448 * Gets the value of a property in a future turn.
45449 * @param object promise or immediate reference for target object
45450 * @param name name of property to get
45451 * @return promise for the property value
45453 Q.get = function (object, key) {
45454 return Q(object).dispatch("get", [key]);
45457 Promise.prototype.get = function (key) {
45458 return this.dispatch("get", [key]);
45462 * Sets the value of a property in a future turn.
45463 * @param object promise or immediate reference for object object
45464 * @param name name of property to set
45465 * @param value new value of property
45466 * @return promise for the return value
45468 Q.set = function (object, key, value) {
45469 return Q(object).dispatch("set", [key, value]);
45472 Promise.prototype.set = function (key, value) {
45473 return this.dispatch("set", [key, value]);
45477 * Deletes a property in a future turn.
45478 * @param object promise or immediate reference for target object
45479 * @param name name of property to delete
45480 * @return promise for the return value
45482 Q.del = // XXX legacy
45483 Q["delete"] = function (object, key) {
45484 return Q(object).dispatch("delete", [key]);
45487 Promise.prototype.del = // XXX legacy
45488 Promise.prototype["delete"] = function (key) {
45489 return this.dispatch("delete", [key]);
45493 * Invokes a method in a future turn.
45494 * @param object promise or immediate reference for target object
45495 * @param name name of method to invoke
45496 * @param value a value to post, typically an array of
45497 * invocation arguments for promises that
45498 * are ultimately backed with `resolve` values,
45499 * as opposed to those backed with URLs
45500 * wherein the posted value can be any
45501 * JSON serializable object.
45502 * @return promise for the return value
45504 // bound locally because it is used by other methods
45505 Q.mapply = // XXX As proposed by "Redsandro"
45506 Q.post = function (object, name, args) {
45507 return Q(object).dispatch("post", [name, args]);
45510 Promise.prototype.mapply = // XXX As proposed by "Redsandro"
45511 Promise.prototype.post = function (name, args) {
45512 return this.dispatch("post", [name, args]);
45516 * Invokes a method in a future turn.
45517 * @param object promise or immediate reference for target object
45518 * @param name name of method to invoke
45519 * @param ...args array of invocation arguments
45520 * @return promise for the return value
45522 Q.send = // XXX Mark Miller's proposed parlance
45523 Q.mcall = // XXX As proposed by "Redsandro"
45524 Q.invoke = function (object, name /*...args*/) {
45525 return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
45528 Promise.prototype.send = // XXX Mark Miller's proposed parlance
45529 Promise.prototype.mcall = // XXX As proposed by "Redsandro"
45530 Promise.prototype.invoke = function (name /*...args*/) {
45531 return this.dispatch("post", [name, array_slice(arguments, 1)]);
45535 * Applies the promised function in a future turn.
45536 * @param object promise or immediate reference for target function
45537 * @param args array of application arguments
45539 Q.fapply = function (object, args) {
45540 return Q(object).dispatch("apply", [void 0, args]);
45543 Promise.prototype.fapply = function (args) {
45544 return this.dispatch("apply", [void 0, args]);
45548 * Calls the promised function in a future turn.
45549 * @param object promise or immediate reference for target function
45550 * @param ...args array of application arguments
45553 Q.fcall = function (object /* ...args*/) {
45554 return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
45557 Promise.prototype.fcall = function (/*...args*/) {
45558 return this.dispatch("apply", [void 0, array_slice(arguments)]);
45562 * Binds the promised function, transforming return values into a fulfilled
45563 * promise and thrown errors into a rejected one.
45564 * @param object promise or immediate reference for target function
45565 * @param ...args array of application arguments
45567 Q.fbind = function (object /*...args*/) {
45568 var promise = Q(object);
45569 var args = array_slice(arguments, 1);
45570 return function fbound() {
45571 return promise.dispatch("apply", [
45573 args.concat(array_slice(arguments))
45577 Promise.prototype.fbind = function (/*...args*/) {
45578 var promise = this;
45579 var args = array_slice(arguments);
45580 return function fbound() {
45581 return promise.dispatch("apply", [
45583 args.concat(array_slice(arguments))
45589 * Requests the names of the owned properties of a promised
45590 * object in a future turn.
45591 * @param object promise or immediate reference for target object
45592 * @return promise for the keys of the eventually settled object
45594 Q.keys = function (object) {
45595 return Q(object).dispatch("keys", []);
45598 Promise.prototype.keys = function () {
45599 return this.dispatch("keys", []);
45603 * Turns an array of promises into a promise for an array. If any of
45604 * the promises gets rejected, the whole array is rejected immediately.
45605 * @param {Array*} an array (or promise for an array) of values (or
45606 * promises for values)
45607 * @returns a promise for an array of the corresponding values
45610 // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
45612 function all(promises) {
45613 return when(promises, function (promises) {
45614 var pendingCount = 0;
45615 var deferred = defer();
45616 array_reduce(promises, function (undefined, promise, index) {
45619 isPromise(promise) &&
45620 (snapshot = promise.inspect()).state === "fulfilled"
45622 promises[index] = snapshot.value;
45628 promises[index] = value;
45629 if (--pendingCount === 0) {
45630 deferred.resolve(promises);
45634 function (progress) {
45635 deferred.notify({ index: index, value: progress });
45640 if (pendingCount === 0) {
45641 deferred.resolve(promises);
45643 return deferred.promise;
45647 Promise.prototype.all = function () {
45652 * Returns the first resolved promise of an array. Prior rejected promises are
45653 * ignored. Rejects only if all promises are rejected.
45654 * @param {Array*} an array containing values or promises for values
45655 * @returns a promise fulfilled with the value of the first resolved promise,
45656 * or a rejected promise if all promises are rejected.
45660 function any(promises) {
45661 if (promises.length === 0) {
45662 return Q.resolve();
45665 var deferred = Q.defer();
45666 var pendingCount = 0;
45667 array_reduce(promises, function (prev, current, index) {
45668 var promise = promises[index];
45672 when(promise, onFulfilled, onRejected, onProgress);
45673 function onFulfilled(result) {
45674 deferred.resolve(result);
45676 function onRejected(err) {
45678 if (pendingCount === 0) {
45679 var rejection = err || new Error("" + err);
45681 rejection.message = ("Q can't get fulfillment value from any promise, all " +
45682 "promises were rejected. Last error message: " + rejection.message);
45684 deferred.reject(rejection);
45687 function onProgress(progress) {
45695 return deferred.promise;
45698 Promise.prototype.any = function () {
45703 * Waits for all promises to be settled, either fulfilled or
45704 * rejected. This is distinct from `all` since that would stop
45705 * waiting at the first rejection. The promise returned by
45706 * `allResolved` will never be rejected.
45707 * @param promises a promise for an array (or an array) of promises
45709 * @return a promise for an array of promises
45711 Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
45712 function allResolved(promises) {
45713 return when(promises, function (promises) {
45714 promises = array_map(promises, Q);
45715 return when(all(array_map(promises, function (promise) {
45716 return when(promise, noop, noop);
45723 Promise.prototype.allResolved = function () {
45724 return allResolved(this);
45728 * @see Promise#allSettled
45730 Q.allSettled = allSettled;
45731 function allSettled(promises) {
45732 return Q(promises).allSettled();
45736 * Turns an array of promises into a promise for an array of their states (as
45737 * returned by `inspect`) when they have all settled.
45738 * @param {Array[Any*]} values an array (or promise for an array) of values (or
45739 * promises for values)
45740 * @returns {Array[State]} an array of states for the respective values.
45742 Promise.prototype.allSettled = function () {
45743 return this.then(function (promises) {
45744 return all(array_map(promises, function (promise) {
45745 promise = Q(promise);
45746 function regardless() {
45747 return promise.inspect();
45749 return promise.then(regardless, regardless);
45755 * Captures the failure of a promise, giving an oportunity to recover
45756 * with a callback. If the given promise is fulfilled, the returned
45757 * promise is fulfilled.
45758 * @param {Any*} promise for something
45759 * @param {Function} callback to fulfill the returned promise if the
45760 * given promise is rejected
45761 * @returns a promise for the return value of the callback
45763 Q.fail = // XXX legacy
45764 Q["catch"] = function (object, rejected) {
45765 return Q(object).then(void 0, rejected);
45768 Promise.prototype.fail = // XXX legacy
45769 Promise.prototype["catch"] = function (rejected) {
45770 return this.then(void 0, rejected);
45774 * Attaches a listener that can respond to progress notifications from a
45775 * promise's originating deferred. This listener receives the exact arguments
45776 * passed to ``deferred.notify``.
45777 * @param {Any*} promise for something
45778 * @param {Function} callback to receive any progress notifications
45779 * @returns the given promise, unchanged
45781 Q.progress = progress;
45782 function progress(object, progressed) {
45783 return Q(object).then(void 0, void 0, progressed);
45786 Promise.prototype.progress = function (progressed) {
45787 return this.then(void 0, void 0, progressed);
45791 * Provides an opportunity to observe the settling of a promise,
45792 * regardless of whether the promise is fulfilled or rejected. Forwards
45793 * the resolution to the returned promise when the callback is done.
45794 * The callback can return a promise to defer completion.
45795 * @param {Any*} promise
45796 * @param {Function} callback to observe the resolution of the given
45797 * promise, takes no arguments.
45798 * @returns a promise for the resolution of the given promise when
45801 Q.fin = // XXX legacy
45802 Q["finally"] = function (object, callback) {
45803 return Q(object)["finally"](callback);
45806 Promise.prototype.fin = // XXX legacy
45807 Promise.prototype["finally"] = function (callback) {
45808 if (!callback || typeof callback.apply !== "function") {
45809 throw new Error("Q can't apply finally callback");
45811 callback = Q(callback);
45812 return this.then(function (value) {
45813 return callback.fcall().then(function () {
45816 }, function (reason) {
45817 // TODO attempt to recycle the rejection with "this".
45818 return callback.fcall().then(function () {
45825 * Terminates a chain of promises, forcing rejections to be
45826 * thrown as exceptions.
45827 * @param {Any*} promise at the end of a chain of promises
45830 Q.done = function (object, fulfilled, rejected, progress) {
45831 return Q(object).done(fulfilled, rejected, progress);
45834 Promise.prototype.done = function (fulfilled, rejected, progress) {
45835 var onUnhandledError = function (error) {
45836 // forward to a future turn so that ``when``
45837 // does not catch it and turn it into a rejection.
45838 Q.nextTick(function () {
45839 makeStackTraceLong(error, promise);
45848 // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
45849 var promise = fulfilled || rejected || progress ?
45850 this.then(fulfilled, rejected, progress) :
45853 if (typeof process === "object" && process && process.domain) {
45854 onUnhandledError = process.domain.bind(onUnhandledError);
45857 promise.then(void 0, onUnhandledError);
45861 * Causes a promise to be rejected if it does not get fulfilled before
45862 * some milliseconds time out.
45863 * @param {Any*} promise
45864 * @param {Number} milliseconds timeout
45865 * @param {Any*} custom error message or Error object (optional)
45866 * @returns a promise for the resolution of the given promise if it is
45867 * fulfilled before the timeout, otherwise rejected.
45869 Q.timeout = function (object, ms, error) {
45870 return Q(object).timeout(ms, error);
45873 Promise.prototype.timeout = function (ms, error) {
45874 var deferred = defer();
45875 var timeoutId = setTimeout(function () {
45876 if (!error || "string" === typeof error) {
45877 error = new Error(error || "Timed out after " + ms + " ms");
45878 error.code = "ETIMEDOUT";
45880 deferred.reject(error);
45883 this.then(function (value) {
45884 clearTimeout(timeoutId);
45885 deferred.resolve(value);
45886 }, function (exception) {
45887 clearTimeout(timeoutId);
45888 deferred.reject(exception);
45889 }, deferred.notify);
45891 return deferred.promise;
45895 * Returns a promise for the given value (or promised value), some
45896 * milliseconds after it resolved. Passes rejections immediately.
45897 * @param {Any*} promise
45898 * @param {Number} milliseconds
45899 * @returns a promise for the resolution of the given promise after milliseconds
45900 * time has elapsed since the resolution of the given promise.
45901 * If the given promise rejects, that is passed immediately.
45903 Q.delay = function (object, timeout) {
45904 if (timeout === void 0) {
45908 return Q(object).delay(timeout);
45911 Promise.prototype.delay = function (timeout) {
45912 return this.then(function (value) {
45913 var deferred = defer();
45914 setTimeout(function () {
45915 deferred.resolve(value);
45917 return deferred.promise;
45922 * Passes a continuation to a Node function, which is called with the given
45923 * arguments provided as an array, and returns a promise.
45925 * Q.nfapply(FS.readFile, [__filename])
45926 * .then(function (content) {
45930 Q.nfapply = function (callback, args) {
45931 return Q(callback).nfapply(args);
45934 Promise.prototype.nfapply = function (args) {
45935 var deferred = defer();
45936 var nodeArgs = array_slice(args);
45937 nodeArgs.push(deferred.makeNodeResolver());
45938 this.fapply(nodeArgs).fail(deferred.reject);
45939 return deferred.promise;
45943 * Passes a continuation to a Node function, which is called with the given
45944 * arguments provided individually, and returns a promise.
45946 * Q.nfcall(FS.readFile, __filename)
45947 * .then(function (content) {
45951 Q.nfcall = function (callback /*...args*/) {
45952 var args = array_slice(arguments, 1);
45953 return Q(callback).nfapply(args);
45956 Promise.prototype.nfcall = function (/*...args*/) {
45957 var nodeArgs = array_slice(arguments);
45958 var deferred = defer();
45959 nodeArgs.push(deferred.makeNodeResolver());
45960 this.fapply(nodeArgs).fail(deferred.reject);
45961 return deferred.promise;
45965 * Wraps a NodeJS continuation passing function and returns an equivalent
45966 * version that returns a promise.
45968 * Q.nfbind(FS.readFile, __filename)("utf-8")
45969 * .then(console.log)
45973 Q.denodeify = function (callback /*...args*/) {
45974 if (callback === undefined) {
45975 throw new Error("Q can't wrap an undefined function");
45977 var baseArgs = array_slice(arguments, 1);
45978 return function () {
45979 var nodeArgs = baseArgs.concat(array_slice(arguments));
45980 var deferred = defer();
45981 nodeArgs.push(deferred.makeNodeResolver());
45982 Q(callback).fapply(nodeArgs).fail(deferred.reject);
45983 return deferred.promise;
45987 Promise.prototype.nfbind =
45988 Promise.prototype.denodeify = function (/*...args*/) {
45989 var args = array_slice(arguments);
45990 args.unshift(this);
45991 return Q.denodeify.apply(void 0, args);
45994 Q.nbind = function (callback, thisp /*...args*/) {
45995 var baseArgs = array_slice(arguments, 2);
45996 return function () {
45997 var nodeArgs = baseArgs.concat(array_slice(arguments));
45998 var deferred = defer();
45999 nodeArgs.push(deferred.makeNodeResolver());
46001 return callback.apply(thisp, arguments);
46003 Q(bound).fapply(nodeArgs).fail(deferred.reject);
46004 return deferred.promise;
46008 Promise.prototype.nbind = function (/*thisp, ...args*/) {
46009 var args = array_slice(arguments, 0);
46010 args.unshift(this);
46011 return Q.nbind.apply(void 0, args);
46015 * Calls a method of a Node-style object that accepts a Node-style
46016 * callback with a given array of arguments, plus a provided callback.
46017 * @param object an object that has the named method
46018 * @param {String} name name of the method of object
46019 * @param {Array} args arguments to pass to the method; the callback
46020 * will be provided by Q and appended to these arguments.
46021 * @returns a promise for the value or error
46023 Q.nmapply = // XXX As proposed by "Redsandro"
46024 Q.npost = function (object, name, args) {
46025 return Q(object).npost(name, args);
46028 Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
46029 Promise.prototype.npost = function (name, args) {
46030 var nodeArgs = array_slice(args || []);
46031 var deferred = defer();
46032 nodeArgs.push(deferred.makeNodeResolver());
46033 this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46034 return deferred.promise;
46038 * Calls a method of a Node-style object that accepts a Node-style
46039 * callback, forwarding the given variadic arguments, plus a provided
46040 * callback argument.
46041 * @param object an object that has the named method
46042 * @param {String} name name of the method of object
46043 * @param ...args arguments to pass to the method; the callback will
46044 * be provided by Q and appended to these arguments.
46045 * @returns a promise for the value or error
46047 Q.nsend = // XXX Based on Mark Miller's proposed "send"
46048 Q.nmcall = // XXX Based on "Redsandro's" proposal
46049 Q.ninvoke = function (object, name /*...args*/) {
46050 var nodeArgs = array_slice(arguments, 2);
46051 var deferred = defer();
46052 nodeArgs.push(deferred.makeNodeResolver());
46053 Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46054 return deferred.promise;
46057 Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
46058 Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
46059 Promise.prototype.ninvoke = function (name /*...args*/) {
46060 var nodeArgs = array_slice(arguments, 1);
46061 var deferred = defer();
46062 nodeArgs.push(deferred.makeNodeResolver());
46063 this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46064 return deferred.promise;
46068 * If a function would like to support both Node continuation-passing-style and
46069 * promise-returning-style, it can end its internal promise chain with
46070 * `nodeify(nodeback)`, forwarding the optional nodeback argument. If the user
46071 * elects to use a nodeback, the result will be sent there. If they do not
46072 * pass a nodeback, they will receive the result promise.
46073 * @param object a result (or a promise for a result)
46074 * @param {Function} nodeback a Node.js-style callback
46075 * @returns either the promise or nothing
46077 Q.nodeify = nodeify;
46078 function nodeify(object, nodeback) {
46079 return Q(object).nodeify(nodeback);
46082 Promise.prototype.nodeify = function (nodeback) {
46084 this.then(function (value) {
46085 Q.nextTick(function () {
46086 nodeback(null, value);
46088 }, function (error) {
46089 Q.nextTick(function () {
46098 Q.noConflict = function() {
46099 throw new Error("Q.noConflict only works when Q is used as a global");
46102 // All code before this point will be filtered from stack traces.
46103 var qEndingLine = captureLine();
46110 var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
46111 var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
46112 var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
46113 var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
46114 var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
46115 var maxResults$2 = 2000;
46116 var tileZoom$2 = 16.5;
46117 var tiler$3 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
46118 var dispatch$4 = dispatch('loadedBubbles', 'viewerChanged');
46119 var minHfov = 10; // zoom in degrees: 20, 10, 5
46120 var maxHfov = 90; // zoom out degrees
46121 var defaultHfov = 45;
46123 var _hires = false;
46124 var _resolution = 512; // higher numbers are slower - 512, 1024, 2048, 4096
46125 var _currScene = 0;
46127 var _pannellumViewer;
46129 var _dataUrlArray = [];
46135 function abortRequest$3(i) {
46141 * localeTimeStamp().
46143 function localeTimestamp(s) {
46144 if (!s) return null;
46145 var detected = utilDetect();
46146 var options = { day: 'numeric', month: 'short', year: 'numeric' };
46147 var d = new Date(s);
46148 if (isNaN(d.getTime())) return null;
46149 return d.toLocaleString(detected.locale, options);
46154 * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
46156 function loadTiles$2(which, url, projection, margin) {
46157 var tiles = tiler$3.margin(margin).getTiles(projection);
46159 // abort inflight requests that are no longer needed
46160 var cache = _ssCache[which];
46161 forEach(cache.inflight, function(v, k) {
46162 var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
46166 delete cache.inflight[k];
46170 tiles.forEach(function (tile) {
46171 loadNextTilePage$2(which, url, tile);
46176 * loadNextTilePage() load data for the next tile page in line.
46178 function loadNextTilePage$2(which, url, tile) {
46179 var cache = _ssCache[which];
46180 var nextPage = cache.nextPage[tile.id] || 0;
46181 var id = tile.id + ',' + String(nextPage);
46182 if (cache.loaded[id] || cache.inflight[id]) return;
46184 cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
46185 cache.loaded[id] = true;
46186 delete cache.inflight[id];
46187 if (!bubbles) return;
46189 // [].shift() removes the first element, some statistics info, not a bubble point
46192 var features = bubbles.map(function(bubble) {
46193 if (cache.points[bubble.id]) return null; // skip duplicates
46195 var loc = [bubble.lo, bubble.la];
46200 captured_at: bubble.cd,
46201 captured_by: 'microsoft',
46202 // nbn: bubble.nbn,
46203 // pbn: bubble.pbn,
46206 pr: bubble.pr, // previous
46207 ne: bubble.ne, // next
46212 cache.points[bubble.id] = d;
46214 // a sequence starts here
46215 if (bubble.pr === undefined) {
46216 cache.leaders.push(bubble.id);
46220 minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
46223 }).filter(Boolean);
46225 cache.rtree.load(features);
46227 connectSequences();
46229 if (which === 'bubbles') {
46230 dispatch$4.call('loadedBubbles');
46236 // call this sometimes to connect the bubbles into sequences
46237 function connectSequences() {
46238 var cache = _ssCache.bubbles;
46239 var keepLeaders = [];
46241 for (var i = 0; i < cache.leaders.length; i++) {
46242 var bubble = cache.points[cache.leaders[i]];
46245 // try to make a sequence.. use the key of the leader bubble.
46246 var sequence = { key: bubble.key, bubbles: [] };
46247 var complete = false;
46250 sequence.bubbles.push(bubble);
46251 seen[bubble.key] = true;
46253 if (bubble.ne === undefined) {
46256 bubble = cache.points[bubble.ne]; // advance to next
46258 } while (bubble && !seen[bubble.key] && !complete);
46262 _ssCache.sequences[sequence.key] = sequence;
46264 // assign bubbles to the sequence
46265 for (var j = 0; j < sequence.bubbles.length; j++) {
46266 sequence.bubbles[j].sequenceKey = sequence.key;
46269 // create a GeoJSON LineString
46270 sequence.geojson = {
46271 type: 'LineString',
46272 properties: { key: sequence.key },
46273 coordinates: sequence.bubbles.map(function (d) { return d.loc; })
46277 keepLeaders.push(cache.leaders[i]);
46281 // couldn't complete these, save for later
46282 cache.leaders = keepLeaders;
46286 * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
46288 function getBubbles(url, tile, callback) {
46289 var rect = tile.extent.rectangle();
46290 var urlForRequest = url + utilQsString({
46296 appkey: bubbleAppKey,
46297 jsCallback: '{callback}'
46300 return jsonpRequest(urlForRequest, function (data) {
46301 if (!data || data.error) {
46310 * partitionViewport() partition viewport into `psize` x `psize` regions.
46312 function partitionViewport$2(psize, projection) {
46313 var dimensions = projection.clipExtent()[1];
46314 psize = psize || 16;
46316 var cols = range(0, dimensions[0], psize);
46317 var rows = range(0, dimensions[1], psize);
46318 var partitions = [];
46320 rows.forEach(function (y) {
46321 cols.forEach(function (x) {
46322 var min$$1 = [x, y + psize];
46323 var max$$1 = [x + psize, y];
46324 partitions.push(geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)));
46335 function searchLimited$2(psize, limit, projection, rtree) {
46336 limit = limit || 3;
46338 var partitions = partitionViewport$2(psize, projection);
46341 results = flatten(map$3(partitions, function (extent$$1) {
46342 return rtree.search(extent$$1.bbox())
46344 .map(function (d) { return d.data; });
46354 function getImage(imgInfo) {
46355 var response = q.defer();
46356 var img = new Image();
46358 img.onload = function() {
46359 var canvas = document.getElementById('canvas' + imgInfo.face);
46360 var ctx = canvas.getContext('2d');
46361 ctx.drawImage(img, imgInfo.x, imgInfo.y);
46362 response.resolve({imgInfo:imgInfo, status: 'ok'});
46364 img.onerror = function() {
46365 response.resolve({data: imgInfo, status: 'error'});
46367 img.setAttribute('crossorigin', '');
46368 img.src = imgInfo.url;
46370 return response.promise;
46377 function loadCanvas(imgInfoGroup) {
46378 var response = q.defer();
46379 var getImagePromises = imgInfoGroup.map(function(imgInfo) {
46380 return getImage(imgInfo);
46383 q.all(getImagePromises).then(function(data) {
46384 var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
46385 switch (data[0].imgInfo.face) {
46387 _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
46390 _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
46393 _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
46396 _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
46399 _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
46402 _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
46405 response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
46408 return response.promise;
46412 function setupCanvas(selection$$1, reset) {
46414 selection$$1.selectAll('#divForCanvasWork')
46418 // Add the Streetside working canvases. These are used for 'stitching', or combining,
46419 // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
46420 selection$$1.selectAll('#divForCanvasWork')
46424 .attr('id', 'divForCanvasWork')
46425 .attr('display', 'none')
46426 .selectAll('canvas')
46427 .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
46430 .attr('id', function(d) { return d; })
46431 .attr('width', _resolution)
46432 .attr('height', _resolution);
46439 function processFaces(imgFaceInfoGroups) {
46440 var response = q.defer();
46441 var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
46442 return loadCanvas(faceImgGroup);
46445 q.all(loadCanvasPromises).then(function() {
46446 response.resolve({status: 'processFaces done'});
46449 return response.promise;
46454 function qkToXY(qk) {
46458 for (var i = qk.length; i > 0; i--) {
46460 x += (+(key === '1' || key === '3')) * scale;
46461 y += (+(key === '2' || key === '3')) * scale;
46468 function getQuadKeys() {
46469 var dim = _resolution / 256;
46474 '0000','0001','0010','0011','0100','0101','0110','0111', '1000','1001','1010','1011','1100','1101','1110','1111',
46475 '0002','0003','0012','0013','0102','0103','0112','0113', '1002','1003','1012','1013','1102','1103','1112','1113',
46476 '0020','0021','0030','0031','0120','0121','0130','0131', '1020','1021','1030','1031','1120','1121','1130','1131',
46477 '0022','0023','0032','0033','0122','0123','0132','0133', '1022','1023','1032','1033','1122','1123','1132','1133',
46478 '0200','0201','0210','0211','0300','0301','0310','0311', '1200','1201','1210','1211','1300','1301','1310','1311',
46479 '0202','0203','0212','0213','0302','0303','0312','0313', '1202','1203','1212','1213','1302','1303','1312','1313',
46480 '0220','0221','0230','0231','0320','0321','0330','0331', '1220','1221','1230','1231','1320','1321','1330','1331',
46481 '0222','0223','0232','0233','0322','0323','0332','0333', '1222','1223','1232','1233','1322','1323','1332','1333',
46483 '2000','2001','2010','2011','2100','2101','2110','2111', '3000','3001','3010','3011','3100','3101','3110','3111',
46484 '2002','2003','2012','2013','2102','2103','2112','2113', '3002','3003','3012','3013','3102','3103','3112','3113',
46485 '2020','2021','2030','2031','2120','2121','2130','2131', '3020','3021','3030','3031','3120','3121','3130','3131',
46486 '2022','2023','2032','2033','2122','2123','2132','2133', '3022','3023','3032','3033','3122','3123','3132','3133',
46487 '2200','2201','2210','2211','2300','2301','2310','2311', '3200','3201','3210','3211','3300','3301','3310','3311',
46488 '2202','2203','2212','2213','2302','2303','2312','2313', '3202','3203','3212','3213','3302','3303','3312','3313',
46489 '2220','2221','2230','2231','2320','2321','2330','2331', '3220','3221','3230','3231','3320','3321','3330','3331',
46490 '2222','2223','2232','2233','2322','2323','2332','2333', '3222','3223','3232','3233','3322','3323','3332','3333'
46493 } else if (dim === 8) {
46495 '000','001','010','011', '100','101','110','111',
46496 '002','003','012','013', '102','103','112','113',
46497 '020','021','030','031', '120','121','130','131',
46498 '022','023','032','033', '122','123','132','133',
46500 '200','201','210','211', '300','301','310','311',
46501 '202','203','212','213', '302','303','312','313',
46502 '220','221','230','231', '320','321','330','331',
46503 '222','223','232','233', '322','323','332','333'
46506 } else if (dim === 4) {
46508 '00','01', '10','11',
46509 '02','03', '12','13',
46511 '20','21', '30','31',
46512 '22','23', '32','33'
46515 } else { // dim === 2
46527 var serviceStreetside = {
46529 * init() initialize streetside.
46531 init: function () {
46536 this.event = utilRebind(this, dispatch$4, 'on');
46540 * reset() reset the cache.
46542 reset: function () {
46543 var cache = _ssCache;
46546 if (cache.bubbles && cache.bubbles.inflight) {
46547 forEach(cache.bubbles.inflight, abortRequest$3);
46552 bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
46560 bubbles: function (projection) {
46561 var psize = 32, limit = 3;
46562 return searchLimited$2(psize, limit, projection, _ssCache.bubbles.rtree);
46566 sequences: function(projection) {
46567 var viewport = projection.clipExtent();
46568 var min$$1 = [viewport[0][0], viewport[1][1]];
46569 var max$$1 = [viewport[1][0], viewport[0][1]];
46570 var bbox = geoExtent$$1(projection.invert(min$$1), projection.invert(max$$1)).bbox();
46574 // all sequences for bubbles in viewport
46575 _ssCache.bubbles.rtree.search(bbox)
46576 .forEach(function(d) {
46577 var key = d.data.sequenceKey;
46578 if (key && !seen[key]) {
46580 results.push(_ssCache.sequences[key].geojson);
46591 loadBubbles: function (projection, margin) {
46592 // by default: request 2 nearby tiles so we can connect sequences.
46593 if (margin === undefined) margin = 2;
46595 loadTiles$2('bubbles', bubbleApi, projection, margin);
46599 viewer: function() {
46600 return _pannellumViewer;
46604 initViewer: function () {
46605 if (!window.pannellum) return;
46606 if (_pannellumViewer) return;
46608 var sceneID = ++_currScene + '';
46610 'default': { firstScene: sceneID },
46613 options.scenes[sceneID] = _sceneOptions;
46615 _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
46618 .on('mousedown', function() {
46619 select(window).on('mousemove.pannellum', function() {
46620 dispatch$4.call('viewerChanged');
46623 .on('mouseup', function() {
46624 select(window).on('mousemove.pannellum', null);
46625 // continue dispatching events for a few seconds, in case viewer has inertia.
46626 var t$$1 = timer(function(elapsed) {
46627 dispatch$4.call('viewerChanged');
46628 if (elapsed > 2000) {
46637 * loadViewer() create the streeside viewer.
46639 loadViewer: function (context) {
46642 // create ms-wrapper, a photo wrapper class
46643 var wrap = select('#photoviewer').selectAll('.ms-wrapper')
46646 // inject ms-wrapper into the photoviewer div
46647 // (used by all to house each custom photo viewer)
46648 var wrapEnter = wrap.enter()
46651 .attr('class', 'photo-wrapper ms-wrapper')
46652 .classed('hide', true);
46654 // inject div to support streetside viewer (pannellum) and attribution line
46657 .attr('id', 'viewer-streetside')
46659 .attr('class', 'photo-attribution fillD');
46661 var controlsEnter = wrapEnter
46663 .attr('class', 'photo-controls-wrap')
46665 .attr('class', 'photo-controls');
46669 .on('click.back', step(-1))
46674 .on('click.forward', step(1))
46678 // create working canvas for stitching together images
46681 .call(setupCanvas, true);
46683 // load streetside pannellum viewer css
46684 select('head').selectAll('#streetside-viewercss')
46688 .attr('id', 'streetside-viewercss')
46689 .attr('rel', 'stylesheet')
46690 .attr('href', context.asset(pannellumViewerCSS));
46692 // load streetside pannellum viewer js
46693 select('head').selectAll('#streetside-viewerjs')
46697 .attr('id', 'streetside-viewerjs')
46698 .attr('src', context.asset(pannellumViewerJS));
46701 // Register viewer resize handler
46702 context.ui().on('photoviewerResize', function() {
46703 if (_pannellumViewer) {
46704 _pannellumViewer.resize();
46709 function step(stepBy) {
46710 return function() {
46711 var viewer = select('#photoviewer');
46712 var selected = viewer.empty() ? undefined : viewer.datum();
46713 if (!selected) return;
46715 var nextID = (stepBy === 1 ? selected.ne : selected.pr);
46716 var yaw = _pannellumViewer.getYaw();
46717 var ca = selected.ca + yaw;
46718 var origin = selected.loc;
46720 // construct a search trapezoid pointing out from current bubble
46723 origin[0] + geoMetersToLon(meters / 5, origin[1]),
46727 origin[0] + geoMetersToLon(meters / 2, origin[1]),
46728 origin[1] + geoMetersToLat(meters)
46731 origin[0] - geoMetersToLon(meters / 2, origin[1]),
46732 origin[1] + geoMetersToLat(meters)
46735 origin[0] - geoMetersToLon(meters / 5, origin[1]),
46739 var poly = [p1, p2, p3, p4, p1];
46741 // rotate it to face forward/backward
46742 var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
46743 poly = geoRotate(poly, -angle, origin);
46745 var extent$$1 = poly.reduce(function(extent$$1, point$$1) {
46746 return extent$$1.extend(geoExtent$$1(point$$1));
46747 }, geoExtent$$1());
46749 // find nearest other bubble in the search polygon
46750 var minDist = Infinity;
46751 _ssCache.bubbles.rtree.search(extent$$1.bbox())
46752 .forEach(function(d) {
46753 if (d.data.key === selected.key) return;
46754 if (!geoPointInPolygon(d.data.loc, poly)) return;
46756 var dist = geoVecLength(d.data.loc, selected.loc);
46757 var theta = selected.ca - d.data.ca;
46758 var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
46759 if (minTheta > 20) {
46760 dist += 5; // penalize distance if camera angles don't match
46763 if (dist < minDist) {
46764 nextID = d.data.key;
46769 var nextBubble = nextID && _ssCache.bubbles.points[nextID];
46770 if (!nextBubble) return;
46772 context.map().centerEase(nextBubble.loc);
46774 that.selectImage(nextBubble)
46775 .then(function(r) {
46776 if (r.status === 'ok') {
46777 _sceneOptions.yaw = yaw;
46788 showViewer: function (yaw) {
46789 if (!_sceneOptions) return;
46791 if (yaw !== undefined) {
46792 _sceneOptions.yaw = yaw;
46795 if (!_pannellumViewer) {
46798 // make a new scene
46799 var sceneID = ++_currScene + '';
46801 .addScene(sceneID, _sceneOptions)
46802 .loadScene(sceneID);
46804 // remove previous scene
46805 if (_currScene > 2) {
46806 sceneID = (_currScene - 1) + '';
46808 .removeScene(sceneID);
46812 var wrap = select('#photoviewer')
46813 .classed('hide', false);
46815 var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
46819 .selectAll('.photo-wrapper:not(.ms-wrapper)')
46820 .classed('hide', true);
46823 .selectAll('.photo-wrapper.ms-wrapper')
46824 .classed('hide', false);
46833 hideViewer: function () {
46834 var viewer = select('#photoviewer');
46835 if (!viewer.empty()) viewer.datum(null);
46838 .classed('hide', true)
46839 .selectAll('.photo-wrapper')
46840 .classed('hide', true);
46842 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
46843 .classed('selected', false);
46845 return this.setStyles(null, true);
46851 selectImage: function (d) {
46852 var response = q.defer();
46855 var viewer = select('#photoviewer');
46856 if (!viewer.empty()) viewer.datum(d);
46858 this.setStyles(null, true);
46860 var wrap = select('#photoviewer .ms-wrapper');
46861 var attribution = wrap.selectAll('.photo-attribution').html('');
46863 wrap.selectAll('.pnlm-load-box') // display "loading.."
46864 .style('display', 'block');
46867 response.resolve({status: 'ok'});
46868 return response.promise;
46871 var line1 = attribution
46873 .attr('class', 'attribution-row');
46875 // Add hires checkbox
46878 .attr('class', 'streetside-hires');
46882 .attr('type', 'checkbox')
46883 .attr('id', 'streetside-hires-input')
46884 .property('checked', _hires)
46885 .on('click', function() {
46886 event.stopPropagation();
46889 _resolution = _hires ? 1024 : 512;
46890 wrap.call(setupCanvas, true);
46893 yaw: _pannellumViewer.getYaw(),
46894 pitch: _pannellumViewer.getPitch(),
46895 hfov: _pannellumViewer.getHfov()
46898 that.selectImage(d)
46899 .then(function(r) {
46900 if (r.status === 'ok') {
46901 _sceneOptions = assignIn(_sceneOptions, viewstate);
46909 .text(t('streetside.hires'));
46912 var captureInfo = line1
46914 .attr('class', 'attribution-capture-info');
46916 // Add capture date
46917 if (d.captured_by) {
46918 var yyyy = (new Date()).getFullYear();
46922 .attr('class', 'captured_by')
46923 .attr('target', '_blank')
46924 .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
46925 .text('©' + yyyy + ' Microsoft');
46932 if (d.captured_at) {
46935 .attr('class', 'captured_at')
46936 .text(localeTimestamp(d.captured_at));
46940 var line2 = attribution
46942 .attr('class', 'attribution-row');
46946 .attr('class', 'image-view-link')
46947 .attr('target', '_blank')
46948 .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
46949 '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
46950 .text(t('streetside.view_on_bing'));
46954 .attr('class', 'image-report-link')
46955 .attr('target', '_blank')
46956 .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
46957 '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
46958 .text(t('streetside.report'));
46961 var bubbleIdQuadKey = d.key.toString(4);
46962 var paddingNeeded = 16 - bubbleIdQuadKey.length;
46963 for (var i = 0; i < paddingNeeded; i++) {
46964 bubbleIdQuadKey = '0' + bubbleIdQuadKey;
46966 var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
46967 var imgUrlSuffix = '.jpg?g=6338&n=z';
46969 // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
46970 var faceKeys = ['01','02','03','10','11','12'];
46972 // Map images to cube faces
46973 var quadKeys = getQuadKeys();
46974 var faces = faceKeys.map(function(faceKey) {
46975 return quadKeys.map(function(quadKey) {
46976 var xy = qkToXY(quadKey);
46979 url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
46986 processFaces(faces).then(function() {
46988 showFullscreenCtrl: false,
47006 response.resolve({status: 'ok'});
47009 return response.promise;
47013 getSequenceKeyForBubble: function(d) {
47014 return d && d.sequenceKey;
47021 setStyles: function (hovered, reset) {
47022 if (reset) { // reset all layers
47023 d3_selectAll('.viewfield-group')
47024 .classed('highlighted', false)
47025 .classed('hovered', false)
47026 .classed('selected', false);
47028 d3_selectAll('.sequence')
47029 .classed('highlighted', false)
47030 .classed('selected', false);
47033 var hoveredBubbleKey = hovered && hovered.key;
47034 var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
47035 var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
47036 var hoveredBubbleKeys = (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
47038 var viewer = select('#photoviewer');
47039 var selected = viewer.empty() ? undefined : viewer.datum();
47040 var selectedBubbleKey = selected && selected.key;
47041 var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
47042 var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
47043 var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
47045 // highlight sibling viewfields on either the selected or the hovered sequences
47046 var highlightedBubbleKeys = union(hoveredBubbleKeys, selectedBubbleKeys);
47048 d3_selectAll('.layer-streetside-images .viewfield-group')
47049 .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
47050 .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
47051 .classed('selected', function (d) { return d.key === selectedBubbleKey; });
47053 d3_selectAll('.layer-streetside-images .sequence')
47054 .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
47055 .classed('selected', function (d) { return d.properties.key === selectedSequenceKey; });
47057 // update viewfields if needed
47058 d3_selectAll('.viewfield-group .viewfield')
47059 .attr('d', viewfieldPath);
47061 function viewfieldPath() {
47062 var d = this.parentNode.__data__;
47063 if (d.pano && d.key !== selectedBubbleKey) {
47064 return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
47066 return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
47076 cache: function () {
47081 var apibase$3 = 'https://taginfo.openstreetmap.org/api/4/',
47086 point: 'count_nodes',
47087 vertex: 'count_nodes',
47088 area: 'count_ways',
47091 tag_sort_members = {
47092 point: 'count_node_members',
47093 vertex: 'count_node_members',
47094 area: 'count_way_members',
47095 line: 'count_way_members',
47096 relation: 'count_relation_members'
47104 tag_members_fractions = {
47105 point: 'count_node_members_fraction',
47106 vertex: 'count_node_members_fraction',
47107 area: 'count_way_members_fraction',
47108 line: 'count_way_members_fraction',
47109 relation: 'count_relation_members_fraction'
47113 function sets(params, n, o) {
47114 if (params.geometry && o[params.geometry]) {
47115 params[n] = o[params.geometry];
47121 function setFilter(params) {
47122 return sets(params, 'filter', tag_filters);
47126 function setSort(params) {
47127 return sets(params, 'sortname', tag_sorts);
47131 function setSortMembers(params) {
47132 return sets(params, 'sortname', tag_sort_members);
47136 function clean(params) {
47137 return omit(params, ['geometry', 'debounce']);
47141 function filterKeys(type) {
47142 var count_type = type ? 'count_' + type : 'count_all';
47143 return function(d) {
47144 return parseFloat(d[count_type]) > 2500 || d.in_wiki;
47149 function filterMultikeys(prefix) {
47150 return function(d) {
47151 // d.key begins with prefix, and d.key contains no additional ':'s
47152 var re = new RegExp('^' + prefix + '(.*)$');
47153 var matches = d.key.match(re) || [];
47154 return (matches.length === 2 && matches[1].indexOf(':') === -1);
47159 function filterValues(allowUpperCase) {
47160 return function(d) {
47161 if (d.value.match(/[;,]/) !== null) return false; // exclude some punctuation
47162 if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false; // exclude uppercase letters
47163 return parseFloat(d.fraction) > 0.0 || d.in_wiki;
47168 function filterRoles(geometry) {
47169 return function(d) {
47170 if (d.role === '') return false; // exclude empty role
47171 if (d.role.match(/[A-Z*;,]/) !== null) return false; // exclude uppercase letters and some punctuation
47172 return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
47177 function valKey(d) {
47185 function valKeyDescription(d) {
47188 title: d.description || d.value
47193 function roleKey(d) {
47201 // sort keys with ':' lower than keys without ':'
47202 function sortKeys(a, b) {
47203 return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
47204 : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
47209 var debouncedRequest = debounce(request$1, 500, { leading: false });
47211 function request$1(url, params, exactMatch, callback, loaded) {
47212 if (inflight$1[url]) return;
47214 if (checkCache(url, params, exactMatch, callback)) return;
47216 inflight$1[url] = d3_json(url, function (err, data) {
47217 delete inflight$1[url];
47223 function checkCache(url, params, exactMatch, callback) {
47224 var rp = params.rp || 25,
47225 testQuery = params.query || '',
47229 var hit = taginfoCache[testUrl];
47231 // exact match, or shorter match yielding fewer than max results (rp)
47232 if (hit && (url === testUrl || hit.length < rp)) {
47233 callback(null, hit);
47237 // don't try to shorten the query
47238 if (exactMatch || !testQuery.length) return false;
47240 // do shorten the query to see if we already have a cached result
47241 // that has returned fewer than max results (rp)
47242 testQuery = testQuery.slice(0, -1);
47243 testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
47244 } while (testQuery.length >= 0);
47250 var serviceTaginfo = {
47257 // Fetch popular keys. We'll exclude these from `values`
47258 // lookups because they stress taginfo, and they aren't likely
47259 // to yield meaningful autocomplete results.. see #3955
47260 var params = { rp: 100, sortname: 'values_all', sortorder: 'desc', page: 1, debounce: false };
47261 this.keys(params, function(err, data) {
47263 data.forEach(function(d) {
47264 if (d.value === 'opening_hours') return; // exception
47265 popularKeys[d.value] = true;
47271 reset: function() {
47272 forEach(inflight$1, function(req) { req.abort(); });
47277 keys: function(params, callback) {
47278 var doRequest = params.debounce ? debouncedRequest : request$1;
47279 params = clean(setSort(params));
47280 params = assignIn({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
47282 var url = apibase$3 + 'keys/all?' + utilQsString(params);
47283 doRequest(url, params, false, callback, function(err, d) {
47287 var f = filterKeys(params.filter);
47288 var result = d.data.filter(f).sort(sortKeys).map(valKey);
47289 taginfoCache[url] = result;
47290 callback(null, result);
47296 multikeys: function(params, callback) {
47297 var doRequest = params.debounce ? debouncedRequest : request$1;
47298 params = clean(setSort(params));
47299 params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
47300 var prefix = params.query;
47302 var url = apibase$3 + 'keys/all?' + utilQsString(params);
47303 doRequest(url, params, true, callback, function(err, d) {
47307 var f = filterMultikeys(prefix);
47308 var result = d.data.filter(f).map(valKey);
47309 taginfoCache[url] = result;
47310 callback(null, result);
47316 values: function(params, callback) {
47317 // Exclude popular keys from values lookups.. see #3955
47318 var key = params.key;
47319 if (key && popularKeys[key]) {
47320 callback(null, []);
47324 var doRequest = params.debounce ? debouncedRequest : request$1;
47325 params = clean(setSort(setFilter(params)));
47326 params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1 }, params);
47328 var url = apibase$3 + 'key/values?' + utilQsString(params);
47329 doRequest(url, params, false, callback, function(err, d) {
47333 // In most cases we prefer taginfo value results with lowercase letters.
47334 // A few OSM keys expect values to contain uppercase values (see #3377).
47335 // This is not an exhaustive list (e.g. `name` also has uppercase values)
47336 // but these are the fields where taginfo value lookup is most useful.
47337 var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times/;
47338 var allowUpperCase = (params.key.match(re) !== null);
47339 var f = filterValues(allowUpperCase);
47341 var result = d.data.filter(f).map(valKeyDescription);
47342 taginfoCache[url] = result;
47343 callback(null, result);
47349 roles: function(params, callback) {
47350 var doRequest = params.debounce ? debouncedRequest : request$1;
47351 var geometry = params.geometry;
47352 params = clean(setSortMembers(params));
47353 params = assignIn({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1 }, params);
47355 var url = apibase$3 + 'relation/roles?' + utilQsString(params);
47356 doRequest(url, params, true, callback, function(err, d) {
47360 var f = filterRoles(geometry);
47361 var result = d.data.filter(f).map(roleKey);
47362 taginfoCache[url] = result;
47363 callback(null, result);
47369 docs: function(params, callback) {
47370 var doRequest = params.debounce ? debouncedRequest : request$1;
47371 params = clean(setSort(params));
47373 var path = 'key/wiki_pages?';
47374 if (params.value) path = 'tag/wiki_pages?';
47375 else if (params.rtype) path = 'relation/wiki_pages?';
47377 var url = apibase$3 + path + utilQsString(params);
47378 doRequest(url, params, true, callback, function(err, d) {
47382 taginfoCache[url] = d.data;
47383 callback(null, d.data);
47389 apibase: function(_) {
47390 if (!arguments.length) return apibase$3;
47397 var helpers = createCommonjsModule(function (module, exports) {
47398 Object.defineProperty(exports, "__esModule", { value: true });
47403 * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
47405 * @memberof helpers
47408 exports.earthRadius = 6371008.8;
47410 * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
47412 * @memberof helpers
47415 exports.factors = {
47416 centimeters: exports.earthRadius * 100,
47417 centimetres: exports.earthRadius * 100,
47418 degrees: exports.earthRadius / 111325,
47419 feet: exports.earthRadius * 3.28084,
47420 inches: exports.earthRadius * 39.370,
47421 kilometers: exports.earthRadius / 1000,
47422 kilometres: exports.earthRadius / 1000,
47423 meters: exports.earthRadius,
47424 metres: exports.earthRadius,
47425 miles: exports.earthRadius / 1609.344,
47426 millimeters: exports.earthRadius * 1000,
47427 millimetres: exports.earthRadius * 1000,
47428 nauticalmiles: exports.earthRadius / 1852,
47430 yards: exports.earthRadius / 1.0936,
47433 * Units of measurement factors based on 1 meter.
47435 * @memberof helpers
47438 exports.unitsFactors = {
47441 degrees: 1 / 111325,
47444 kilometers: 1 / 1000,
47445 kilometres: 1 / 1000,
47448 miles: 1 / 1609.344,
47451 nauticalmiles: 1 / 1852,
47452 radians: 1 / exports.earthRadius,
47456 * Area of measurement factors based on 1 square meter.
47458 * @memberof helpers
47461 exports.areaFactors = {
47462 acres: 0.000247105,
47463 centimeters: 10000,
47464 centimetres: 10000,
47465 feet: 10.763910417,
47466 inches: 1550.003100006,
47467 kilometers: 0.000001,
47468 kilometres: 0.000001,
47472 millimeters: 1000000,
47473 millimetres: 1000000,
47474 yards: 1.195990046,
47477 * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
47480 * @param {Geometry} geometry input geometry
47481 * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47482 * @param {Object} [options={}] Optional Parameters
47483 * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47484 * @param {string|number} [options.id] Identifier associated with the Feature
47485 * @returns {Feature} a GeoJSON Feature
47489 * "coordinates": [110, 50]
47492 * var feature = turf.feature(geometry);
47496 function feature(geom, properties, options) {
47497 if (options === void 0) { options = {}; }
47498 var feat = { type: "Feature" };
47499 if (options.id === 0 || options.id) {
47500 feat.id = options.id;
47502 if (options.bbox) {
47503 feat.bbox = options.bbox;
47505 feat.properties = properties || {};
47506 feat.geometry = geom;
47509 exports.feature = feature;
47511 * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
47512 * For GeometryCollection type use `helpers.geometryCollection`
47515 * @param {string} type Geometry Type
47516 * @param {Array<any>} coordinates Coordinates
47517 * @param {Object} [options={}] Optional Parameters
47518 * @returns {Geometry} a GeoJSON Geometry
47520 * var type = "Point";
47521 * var coordinates = [110, 50];
47522 * var geometry = turf.geometry(type, coordinates);
47525 function geometry(type, coordinates, options) {
47526 if (options === void 0) { options = {}; }
47528 case "Point": return point(coordinates).geometry;
47529 case "LineString": return lineString(coordinates).geometry;
47530 case "Polygon": return polygon(coordinates).geometry;
47531 case "MultiPoint": return multiPoint(coordinates).geometry;
47532 case "MultiLineString": return multiLineString(coordinates).geometry;
47533 case "MultiPolygon": return multiPolygon(coordinates).geometry;
47534 default: throw new Error(type + " is invalid");
47537 exports.geometry = geometry;
47539 * Creates a {@link Point} {@link Feature} from a Position.
47542 * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
47543 * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47544 * @param {Object} [options={}] Optional Parameters
47545 * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47546 * @param {string|number} [options.id] Identifier associated with the Feature
47547 * @returns {Feature<Point>} a Point feature
47549 * var point = turf.point([-75.343, 39.984]);
47553 function point(coordinates, properties, options) {
47554 if (options === void 0) { options = {}; }
47557 coordinates: coordinates,
47559 return feature(geom, properties, options);
47561 exports.point = point;
47563 * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
47566 * @param {Array<Array<number>>} coordinates an array of Points
47567 * @param {Object} [properties={}] Translate these properties to each Feature
47568 * @param {Object} [options={}] Optional Parameters
47569 * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
47570 * associated with the FeatureCollection
47571 * @param {string|number} [options.id] Identifier associated with the FeatureCollection
47572 * @returns {FeatureCollection<Point>} Point Feature
47574 * var points = turf.points([
47582 function points(coordinates, properties, options) {
47583 if (options === void 0) { options = {}; }
47584 return featureCollection(coordinates.map(function (coords) {
47585 return point(coords, properties);
47588 exports.points = points;
47590 * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
47593 * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
47594 * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47595 * @param {Object} [options={}] Optional Parameters
47596 * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47597 * @param {string|number} [options.id] Identifier associated with the Feature
47598 * @returns {Feature<Polygon>} Polygon Feature
47600 * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
47604 function polygon(coordinates, properties, options) {
47605 if (options === void 0) { options = {}; }
47606 for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
47607 var ring = coordinates_1[_i];
47608 if (ring.length < 4) {
47609 throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
47611 for (var j = 0; j < ring[ring.length - 1].length; j++) {
47612 // Check if first point of Polygon contains two numbers
47613 if (ring[ring.length - 1][j] !== ring[0][j]) {
47614 throw new Error("First and last Position are not equivalent.");
47620 coordinates: coordinates,
47622 return feature(geom, properties, options);
47624 exports.polygon = polygon;
47626 * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
47629 * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
47630 * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47631 * @param {Object} [options={}] Optional Parameters
47632 * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47633 * @param {string|number} [options.id] Identifier associated with the FeatureCollection
47634 * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
47636 * var polygons = turf.polygons([
47637 * [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
47638 * [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
47643 function polygons(coordinates, properties, options) {
47644 if (options === void 0) { options = {}; }
47645 return featureCollection(coordinates.map(function (coords) {
47646 return polygon(coords, properties);
47649 exports.polygons = polygons;
47651 * Creates a {@link LineString} {@link Feature} from an Array of Positions.
47654 * @param {Array<Array<number>>} coordinates an array of Positions
47655 * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47656 * @param {Object} [options={}] Optional Parameters
47657 * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47658 * @param {string|number} [options.id] Identifier associated with the Feature
47659 * @returns {Feature<LineString>} LineString Feature
47661 * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
47662 * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
47667 function lineString(coordinates, properties, options) {
47668 if (options === void 0) { options = {}; }
47669 if (coordinates.length < 2) {
47670 throw new Error("coordinates must be an array of two or more positions");
47673 type: "LineString",
47674 coordinates: coordinates,
47676 return feature(geom, properties, options);
47678 exports.lineString = lineString;
47680 * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
47682 * @name lineStrings
47683 * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
47684 * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47685 * @param {Object} [options={}] Optional Parameters
47686 * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
47687 * associated with the FeatureCollection
47688 * @param {string|number} [options.id] Identifier associated with the FeatureCollection
47689 * @returns {FeatureCollection<LineString>} LineString FeatureCollection
47691 * var linestrings = turf.lineStrings([
47692 * [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
47693 * [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
47698 function lineStrings(coordinates, properties, options) {
47699 if (options === void 0) { options = {}; }
47700 return featureCollection(coordinates.map(function (coords) {
47701 return lineString(coords, properties);
47704 exports.lineStrings = lineStrings;
47706 * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
47708 * @name featureCollection
47709 * @param {Feature[]} features input features
47710 * @param {Object} [options={}] Optional Parameters
47711 * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47712 * @param {string|number} [options.id] Identifier associated with the Feature
47713 * @returns {FeatureCollection} FeatureCollection of Features
47715 * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
47716 * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
47717 * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
47719 * var collection = turf.featureCollection([
47727 function featureCollection(features, options) {
47728 if (options === void 0) { options = {}; }
47729 var fc = { type: "FeatureCollection" };
47731 fc.id = options.id;
47733 if (options.bbox) {
47734 fc.bbox = options.bbox;
47736 fc.features = features;
47739 exports.featureCollection = featureCollection;
47741 * Creates a {@link Feature<MultiLineString>} based on a
47742 * coordinate array. Properties can be added optionally.
47744 * @name multiLineString
47745 * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
47746 * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47747 * @param {Object} [options={}] Optional Parameters
47748 * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47749 * @param {string|number} [options.id] Identifier associated with the Feature
47750 * @returns {Feature<MultiLineString>} a MultiLineString feature
47751 * @throws {Error} if no coordinates are passed
47753 * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
47757 function multiLineString(coordinates, properties, options) {
47758 if (options === void 0) { options = {}; }
47760 type: "MultiLineString",
47761 coordinates: coordinates,
47763 return feature(geom, properties, options);
47765 exports.multiLineString = multiLineString;
47767 * Creates a {@link Feature<MultiPoint>} based on a
47768 * coordinate array. Properties can be added optionally.
47771 * @param {Array<Array<number>>} coordinates an array of Positions
47772 * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47773 * @param {Object} [options={}] Optional Parameters
47774 * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47775 * @param {string|number} [options.id] Identifier associated with the Feature
47776 * @returns {Feature<MultiPoint>} a MultiPoint feature
47777 * @throws {Error} if no coordinates are passed
47779 * var multiPt = turf.multiPoint([[0,0],[10,10]]);
47783 function multiPoint(coordinates, properties, options) {
47784 if (options === void 0) { options = {}; }
47786 type: "MultiPoint",
47787 coordinates: coordinates,
47789 return feature(geom, properties, options);
47791 exports.multiPoint = multiPoint;
47793 * Creates a {@link Feature<MultiPolygon>} based on a
47794 * coordinate array. Properties can be added optionally.
47796 * @name multiPolygon
47797 * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
47798 * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47799 * @param {Object} [options={}] Optional Parameters
47800 * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47801 * @param {string|number} [options.id] Identifier associated with the Feature
47802 * @returns {Feature<MultiPolygon>} a multipolygon feature
47803 * @throws {Error} if no coordinates are passed
47805 * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
47810 function multiPolygon(coordinates, properties, options) {
47811 if (options === void 0) { options = {}; }
47813 type: "MultiPolygon",
47814 coordinates: coordinates,
47816 return feature(geom, properties, options);
47818 exports.multiPolygon = multiPolygon;
47820 * Creates a {@link Feature<GeometryCollection>} based on a
47821 * coordinate array. Properties can be added optionally.
47823 * @name geometryCollection
47824 * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
47825 * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47826 * @param {Object} [options={}] Optional Parameters
47827 * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47828 * @param {string|number} [options.id] Identifier associated with the Feature
47829 * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
47831 * var pt = turf.geometry("Point", [100, 0]);
47832 * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
47833 * var collection = turf.geometryCollection([pt, line]);
47837 function geometryCollection(geometries, properties, options) {
47838 if (options === void 0) { options = {}; }
47840 type: "GeometryCollection",
47841 geometries: geometries,
47843 return feature(geom, properties, options);
47845 exports.geometryCollection = geometryCollection;
47847 * Round number to precision
47849 * @param {number} num Number
47850 * @param {number} [precision=0] Precision
47851 * @returns {number} rounded number
47853 * turf.round(120.4321)
47856 * turf.round(120.4321, 2)
47859 function round(num, precision) {
47860 if (precision === void 0) { precision = 0; }
47861 if (precision && !(precision >= 0)) {
47862 throw new Error("precision must be a positive number");
47864 var multiplier = Math.pow(10, precision || 0);
47865 return Math.round(num * multiplier) / multiplier;
47867 exports.round = round;
47869 * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
47870 * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
47872 * @name radiansToLength
47873 * @param {number} radians in radians across the sphere
47874 * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
47875 * meters, kilometres, kilometers.
47876 * @returns {number} distance
47878 function radiansToLength(radians, units) {
47879 if (units === void 0) { units = "kilometers"; }
47880 var factor = exports.factors[units];
47882 throw new Error(units + " units is invalid");
47884 return radians * factor;
47886 exports.radiansToLength = radiansToLength;
47888 * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
47889 * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
47891 * @name lengthToRadians
47892 * @param {number} distance in real units
47893 * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
47894 * meters, kilometres, kilometers.
47895 * @returns {number} radians
47897 function lengthToRadians(distance, units) {
47898 if (units === void 0) { units = "kilometers"; }
47899 var factor = exports.factors[units];
47901 throw new Error(units + " units is invalid");
47903 return distance / factor;
47905 exports.lengthToRadians = lengthToRadians;
47907 * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
47908 * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
47910 * @name lengthToDegrees
47911 * @param {number} distance in real units
47912 * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
47913 * meters, kilometres, kilometers.
47914 * @returns {number} degrees
47916 function lengthToDegrees(distance, units) {
47917 return radiansToDegrees(lengthToRadians(distance, units));
47919 exports.lengthToDegrees = lengthToDegrees;
47921 * Converts any bearing angle from the north line direction (positive clockwise)
47922 * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
47924 * @name bearingToAzimuth
47925 * @param {number} bearing angle, between -180 and +180 degrees
47926 * @returns {number} angle between 0 and 360 degrees
47928 function bearingToAzimuth(bearing) {
47929 var angle = bearing % 360;
47935 exports.bearingToAzimuth = bearingToAzimuth;
47937 * Converts an angle in radians to degrees
47939 * @name radiansToDegrees
47940 * @param {number} radians angle in radians
47941 * @returns {number} degrees between 0 and 360 degrees
47943 function radiansToDegrees(radians) {
47944 var degrees = radians % (2 * Math.PI);
47945 return degrees * 180 / Math.PI;
47947 exports.radiansToDegrees = radiansToDegrees;
47949 * Converts an angle in degrees to radians
47951 * @name degreesToRadians
47952 * @param {number} degrees angle between 0 and 360 degrees
47953 * @returns {number} angle in radians
47955 function degreesToRadians(degrees) {
47956 var radians = degrees % 360;
47957 return radians * Math.PI / 180;
47959 exports.degreesToRadians = degreesToRadians;
47961 * Converts a length to the requested unit.
47962 * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
47964 * @param {number} length to be converted
47965 * @param {Units} [originalUnit="kilometers"] of the length
47966 * @param {Units} [finalUnit="kilometers"] returned unit
47967 * @returns {number} the converted length
47969 function convertLength(length, originalUnit, finalUnit) {
47970 if (originalUnit === void 0) { originalUnit = "kilometers"; }
47971 if (finalUnit === void 0) { finalUnit = "kilometers"; }
47972 if (!(length >= 0)) {
47973 throw new Error("length must be a positive number");
47975 return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
47977 exports.convertLength = convertLength;
47979 * Converts a area to the requested unit.
47980 * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
47981 * @param {number} area to be converted
47982 * @param {Units} [originalUnit="meters"] of the distance
47983 * @param {Units} [finalUnit="kilometers"] returned unit
47984 * @returns {number} the converted distance
47986 function convertArea(area, originalUnit, finalUnit) {
47987 if (originalUnit === void 0) { originalUnit = "meters"; }
47988 if (finalUnit === void 0) { finalUnit = "kilometers"; }
47989 if (!(area >= 0)) {
47990 throw new Error("area must be a positive number");
47992 var startFactor = exports.areaFactors[originalUnit];
47993 if (!startFactor) {
47994 throw new Error("invalid original units");
47996 var finalFactor = exports.areaFactors[finalUnit];
47997 if (!finalFactor) {
47998 throw new Error("invalid final units");
48000 return (area / startFactor) * finalFactor;
48002 exports.convertArea = convertArea;
48006 * @param {*} num Number to validate
48007 * @returns {boolean} true/false
48009 * turf.isNumber(123)
48011 * turf.isNumber('foo')
48014 function isNumber(num) {
48015 return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
48017 exports.isNumber = isNumber;
48021 * @param {*} input variable to validate
48022 * @returns {boolean} true/false
48024 * turf.isObject({elevation: 10})
48026 * turf.isObject('foo')
48029 function isObject(input) {
48030 return (!!input) && (input.constructor === Object);
48032 exports.isObject = isObject;
48037 * @param {Array<number>} bbox BBox to validate
48039 * @throws Error if BBox is not valid
48041 * validateBBox([-180, -40, 110, 50])
48043 * validateBBox([-180, -40])
48045 * validateBBox('Foo')
48049 * validateBBox(null)
48051 * validateBBox(undefined)
48054 function validateBBox(bbox) {
48056 throw new Error("bbox is required");
48058 if (!Array.isArray(bbox)) {
48059 throw new Error("bbox must be an Array");
48061 if (bbox.length !== 4 && bbox.length !== 6) {
48062 throw new Error("bbox must be an Array of 4 or 6 numbers");
48064 bbox.forEach(function (num) {
48065 if (!isNumber(num)) {
48066 throw new Error("bbox must only contain numbers");
48070 exports.validateBBox = validateBBox;
48075 * @param {string|number} id Id to validate
48077 * @throws Error if Id is not valid
48079 * validateId([-180, -40, 110, 50])
48081 * validateId([-180, -40])
48083 * validateId('Foo')
48089 * validateId(undefined)
48092 function validateId(id) {
48094 throw new Error("id is required");
48096 if (["string", "number"].indexOf(typeof id) === -1) {
48097 throw new Error("id must be a number or a string");
48100 exports.validateId = validateId;
48101 // Deprecated methods
48102 function radians2degrees() {
48103 throw new Error("method has been renamed to `radiansToDegrees`");
48105 exports.radians2degrees = radians2degrees;
48106 function degrees2radians() {
48107 throw new Error("method has been renamed to `degreesToRadians`");
48109 exports.degrees2radians = degrees2radians;
48110 function distanceToDegrees() {
48111 throw new Error("method has been renamed to `lengthToDegrees`");
48113 exports.distanceToDegrees = distanceToDegrees;
48114 function distanceToRadians() {
48115 throw new Error("method has been renamed to `lengthToRadians`");
48117 exports.distanceToRadians = distanceToRadians;
48118 function radiansToDistance() {
48119 throw new Error("method has been renamed to `radiansToLength`");
48121 exports.radiansToDistance = radiansToDistance;
48122 function bearingToAngle() {
48123 throw new Error("method has been renamed to `bearingToAzimuth`");
48125 exports.bearingToAngle = bearingToAngle;
48126 function convertDistance() {
48127 throw new Error("method has been renamed to `convertLength`");
48129 exports.convertDistance = convertDistance;
48132 var index$4 = unwrapExports(helpers);
48133 var helpers_1 = helpers.earthRadius;
48134 var helpers_2 = helpers.factors;
48135 var helpers_3 = helpers.unitsFactors;
48136 var helpers_4 = helpers.areaFactors;
48137 var helpers_5 = helpers.feature;
48138 var helpers_6 = helpers.geometry;
48139 var helpers_7 = helpers.point;
48140 var helpers_8 = helpers.points;
48141 var helpers_9 = helpers.polygon;
48142 var helpers_10 = helpers.polygons;
48143 var helpers_11 = helpers.lineString;
48144 var helpers_12 = helpers.lineStrings;
48145 var helpers_13 = helpers.featureCollection;
48146 var helpers_14 = helpers.multiLineString;
48147 var helpers_15 = helpers.multiPoint;
48148 var helpers_16 = helpers.multiPolygon;
48149 var helpers_17 = helpers.geometryCollection;
48150 var helpers_18 = helpers.round;
48151 var helpers_19 = helpers.radiansToLength;
48152 var helpers_20 = helpers.lengthToRadians;
48153 var helpers_21 = helpers.lengthToDegrees;
48154 var helpers_22 = helpers.bearingToAzimuth;
48155 var helpers_23 = helpers.radiansToDegrees;
48156 var helpers_24 = helpers.degreesToRadians;
48157 var helpers_25 = helpers.convertLength;
48158 var helpers_26 = helpers.convertArea;
48159 var helpers_27 = helpers.isNumber;
48160 var helpers_28 = helpers.isObject;
48161 var helpers_29 = helpers.validateBBox;
48162 var helpers_30 = helpers.validateId;
48163 var helpers_31 = helpers.radians2degrees;
48164 var helpers_32 = helpers.degrees2radians;
48165 var helpers_33 = helpers.distanceToDegrees;
48166 var helpers_34 = helpers.distanceToRadians;
48167 var helpers_35 = helpers.radiansToDistance;
48168 var helpers_36 = helpers.bearingToAngle;
48169 var helpers_37 = helpers.convertDistance;
48171 var helpers$1 = /*#__PURE__*/Object.freeze({
48173 __moduleExports: helpers,
48174 earthRadius: helpers_1,
48175 factors: helpers_2,
48176 unitsFactors: helpers_3,
48177 areaFactors: helpers_4,
48178 feature: helpers_5,
48179 geometry: helpers_6,
48182 polygon: helpers_9,
48183 polygons: helpers_10,
48184 lineString: helpers_11,
48185 lineStrings: helpers_12,
48186 featureCollection: helpers_13,
48187 multiLineString: helpers_14,
48188 multiPoint: helpers_15,
48189 multiPolygon: helpers_16,
48190 geometryCollection: helpers_17,
48192 radiansToLength: helpers_19,
48193 lengthToRadians: helpers_20,
48194 lengthToDegrees: helpers_21,
48195 bearingToAzimuth: helpers_22,
48196 radiansToDegrees: helpers_23,
48197 degreesToRadians: helpers_24,
48198 convertLength: helpers_25,
48199 convertArea: helpers_26,
48200 isNumber: helpers_27,
48201 isObject: helpers_28,
48202 validateBBox: helpers_29,
48203 validateId: helpers_30,
48204 radians2degrees: helpers_31,
48205 degrees2radians: helpers_32,
48206 distanceToDegrees: helpers_33,
48207 distanceToRadians: helpers_34,
48208 radiansToDistance: helpers_35,
48209 bearingToAngle: helpers_36,
48210 convertDistance: helpers_37
48213 var helpers_1$1 = ( helpers$1 && index$4 ) || helpers$1;
48215 var invariant = createCommonjsModule(function (module, exports) {
48216 Object.defineProperty(exports, "__esModule", { value: true });
48219 * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
48222 * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
48223 * @returns {Array<number>} coordinates
48225 * var pt = turf.point([10, 10]);
48227 * var coord = turf.getCoord(pt);
48230 function getCoord(coord) {
48232 throw new Error("coord is required");
48234 if (!Array.isArray(coord)) {
48235 if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
48236 return coord.geometry.coordinates;
48238 if (coord.type === "Point") {
48239 return coord.coordinates;
48242 if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
48245 throw new Error("coord must be GeoJSON Point or an Array of numbers");
48247 exports.getCoord = getCoord;
48249 * Unwrap coordinates from a Feature, Geometry Object or an Array
48252 * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
48253 * @returns {Array<any>} coordinates
48255 * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
48257 * var coords = turf.getCoords(poly);
48258 * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
48260 function getCoords(coords) {
48261 if (Array.isArray(coords)) {
48265 if (coords.type === "Feature") {
48266 if (coords.geometry !== null) {
48267 return coords.geometry.coordinates;
48272 if (coords.coordinates) {
48273 return coords.coordinates;
48276 throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
48278 exports.getCoords = getCoords;
48280 * Checks if coordinates contains a number
48282 * @name containsNumber
48283 * @param {Array<any>} coordinates GeoJSON Coordinates
48284 * @returns {boolean} true if Array contains a number
48286 function containsNumber(coordinates) {
48287 if (coordinates.length > 1 && helpers_1$1.isNumber(coordinates[0]) && helpers_1$1.isNumber(coordinates[1])) {
48290 if (Array.isArray(coordinates[0]) && coordinates[0].length) {
48291 return containsNumber(coordinates[0]);
48293 throw new Error("coordinates must only contain numbers");
48295 exports.containsNumber = containsNumber;
48297 * Enforce expectations about types of GeoJSON objects for Turf.
48299 * @name geojsonType
48300 * @param {GeoJSON} value any GeoJSON object
48301 * @param {string} type expected GeoJSON type
48302 * @param {string} name name of calling function
48303 * @throws {Error} if value is not the expected type.
48305 function geojsonType(value, type, name) {
48306 if (!type || !name) {
48307 throw new Error("type and name required");
48309 if (!value || value.type !== type) {
48310 throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
48313 exports.geojsonType = geojsonType;
48315 * Enforce expectations about types of {@link Feature} inputs for Turf.
48316 * Internally this uses {@link geojsonType} to judge geometry types.
48319 * @param {Feature} feature a feature with an expected geometry type
48320 * @param {string} type expected GeoJSON type
48321 * @param {string} name name of calling function
48322 * @throws {Error} error if value is not the expected type.
48324 function featureOf(feature, type, name) {
48326 throw new Error("No feature passed");
48329 throw new Error(".featureOf() requires a name");
48331 if (!feature || feature.type !== "Feature" || !feature.geometry) {
48332 throw new Error("Invalid input to " + name + ", Feature with geometry required");
48334 if (!feature.geometry || feature.geometry.type !== type) {
48335 throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
48338 exports.featureOf = featureOf;
48340 * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
48341 * Internally this uses {@link geojsonType} to judge geometry types.
48343 * @name collectionOf
48344 * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
48345 * @param {string} type expected GeoJSON type
48346 * @param {string} name name of calling function
48347 * @throws {Error} if value is not the expected type.
48349 function collectionOf(featureCollection, type, name) {
48350 if (!featureCollection) {
48351 throw new Error("No featureCollection passed");
48354 throw new Error(".collectionOf() requires a name");
48356 if (!featureCollection || featureCollection.type !== "FeatureCollection") {
48357 throw new Error("Invalid input to " + name + ", FeatureCollection required");
48359 for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
48360 var feature = _a[_i];
48361 if (!feature || feature.type !== "Feature" || !feature.geometry) {
48362 throw new Error("Invalid input to " + name + ", Feature with geometry required");
48364 if (!feature.geometry || feature.geometry.type !== type) {
48365 throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
48369 exports.collectionOf = collectionOf;
48371 * Get Geometry from Feature or Geometry Object
48373 * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
48374 * @returns {Geometry|null} GeoJSON Geometry Object
48375 * @throws {Error} if geojson is not a Feature or Geometry Object
48378 * "type": "Feature",
48379 * "properties": {},
48382 * "coordinates": [110, 40]
48385 * var geom = turf.getGeom(point)
48386 * //={"type": "Point", "coordinates": [110, 40]}
48388 function getGeom(geojson) {
48389 if (geojson.type === "Feature") {
48390 return geojson.geometry;
48394 exports.getGeom = getGeom;
48396 * Get GeoJSON object's type, Geometry type is prioritize.
48398 * @param {GeoJSON} geojson GeoJSON object
48399 * @param {string} [name="geojson"] name of the variable to display in error message
48400 * @returns {string} GeoJSON type
48403 * "type": "Feature",
48404 * "properties": {},
48407 * "coordinates": [110, 40]
48410 * var geom = turf.getType(point)
48413 function getType(geojson, name) {
48414 if (geojson.type === "FeatureCollection") {
48415 return "FeatureCollection";
48417 if (geojson.type === "GeometryCollection") {
48418 return "GeometryCollection";
48420 if (geojson.type === "Feature" && geojson.geometry !== null) {
48421 return geojson.geometry.type;
48423 return geojson.type;
48425 exports.getType = getType;
48428 var index$5 = unwrapExports(invariant);
48429 var invariant_1 = invariant.getCoord;
48430 var invariant_2 = invariant.getCoords;
48431 var invariant_3 = invariant.containsNumber;
48432 var invariant_4 = invariant.geojsonType;
48433 var invariant_5 = invariant.featureOf;
48434 var invariant_6 = invariant.collectionOf;
48435 var invariant_7 = invariant.getGeom;
48436 var invariant_8 = invariant.getType;
48438 var invariant$1 = /*#__PURE__*/Object.freeze({
48440 __moduleExports: invariant,
48441 getCoord: invariant_1,
48442 getCoords: invariant_2,
48443 containsNumber: invariant_3,
48444 geojsonType: invariant_4,
48445 featureOf: invariant_5,
48446 collectionOf: invariant_6,
48447 getGeom: invariant_7,
48448 getType: invariant_8
48451 var lineclip_1$1 = lineclip$3;
48452 var default_1$2 = lineclip$3;
48454 lineclip$3.polyline = lineclip$3;
48455 lineclip$3.polygon = polygonclip$1;
48458 // Cohen-Sutherland line clippign algorithm, adapted to efficiently
48459 // handle polylines rather than just segments
48461 function lineclip$3(points, bbox, result) {
48463 var len = points.length,
48464 codeA = bitCode$1(points[0], bbox),
48466 i, a, b, codeB, lastCode;
48468 if (!result) result = [];
48470 for (i = 1; i < len; i++) {
48473 codeB = lastCode = bitCode$1(b, bbox);
48477 if (!(codeA | codeB)) { // accept
48480 if (codeB !== lastCode) { // segment went outside
48483 if (i < len - 1) { // start a new line
48487 } else if (i === len - 1) {
48492 } else if (codeA & codeB) { // trivial reject
48495 } else if (codeA) { // a outside, intersect with clip edge
48496 a = intersect$2(a, b, codeA, bbox);
48497 codeA = bitCode$1(a, bbox);
48499 } else { // b outside
48500 b = intersect$2(a, b, codeB, bbox);
48501 codeB = bitCode$1(b, bbox);
48508 if (part.length) result.push(part);
48513 // Sutherland-Hodgeman polygon clipping algorithm
48515 function polygonclip$1(points, bbox) {
48517 var result, edge, prev, prevInside, i, p, inside;
48519 // clip against each side of the clip rectangle
48520 for (edge = 1; edge <= 8; edge *= 2) {
48522 prev = points[points.length - 1];
48523 prevInside = !(bitCode$1(prev, bbox) & edge);
48525 for (i = 0; i < points.length; i++) {
48527 inside = !(bitCode$1(p, bbox) & edge);
48529 // if segment goes through the clip window, add an intersection
48530 if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
48532 if (inside) result.push(p); // add a point if it's inside
48535 prevInside = inside;
48540 if (!points.length) break;
48546 // intersect a segment against one of the 4 lines that make up the bbox
48548 function intersect$2(a, b, edge, bbox) {
48549 return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
48550 edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
48551 edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
48552 edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
48556 // bit code reflects the point position relative to the bbox:
48559 // top 1001 1000 1010
48560 // mid 0001 0000 0010
48561 // bottom 0101 0100 0110
48563 function bitCode$1(p, bbox) {
48566 if (p[0] < bbox[0]) code |= 1; // left
48567 else if (p[0] > bbox[2]) code |= 2; // right
48569 if (p[1] < bbox[1]) code |= 4; // bottom
48570 else if (p[1] > bbox[3]) code |= 8; // top
48574 lineclip_1$1.default = default_1$2;
48576 var invariant_1$1 = ( invariant$1 && index$5 ) || invariant$1;
48578 var bboxClip_1 = createCommonjsModule(function (module, exports) {
48579 var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
48580 if (mod && mod.__esModule) return mod;
48582 if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
48583 result["default"] = mod;
48586 Object.defineProperty(exports, "__esModule", { value: true });
48589 var lineclip = __importStar(lineclip_1$1);
48591 * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
48592 * [lineclip](https://github.com/mapbox/lineclip).
48593 * May result in degenerate edges when clipping Polygons.
48596 * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
48597 * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
48598 * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
48600 * var bbox = [0, 0, 10, 10];
48601 * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
48603 * var clipped = turf.bboxClip(poly, bbox);
48606 * var addToMap = [bbox, poly, clipped]
48608 function bboxClip(feature, bbox) {
48609 var geom = invariant_1$1.getGeom(feature);
48610 var type = geom.type;
48611 var properties = feature.type === "Feature" ? feature.properties : {};
48612 var coords = geom.coordinates;
48615 case "MultiLineString":
48617 if (type === "LineString") {
48620 coords.forEach(function (line) {
48621 lineclip.polyline(line, bbox, lines_1);
48623 if (lines_1.length === 1) {
48624 return helpers_1$1.lineString(lines_1[0], properties);
48626 return helpers_1$1.multiLineString(lines_1, properties);
48628 return helpers_1$1.polygon(clipPolygon(coords, bbox), properties);
48629 case "MultiPolygon":
48630 return helpers_1$1.multiPolygon(coords.map(function (poly) {
48631 return clipPolygon(poly, bbox);
48634 throw new Error("geometry " + type + " not supported");
48637 exports.default = bboxClip;
48638 function clipPolygon(rings, bbox) {
48640 for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
48641 var ring = rings_1[_i];
48642 var clipped = lineclip.polygon(ring, bbox);
48643 if (clipped.length > 0) {
48644 if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
48645 clipped.push(clipped[0]);
48647 if (clipped.length >= 4) {
48648 outRings.push(clipped);
48656 var turf_bboxClip = unwrapExports(bboxClip_1);
48658 var martinez_umd = createCommonjsModule(function (module, exports) {
48661 * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
48663 * @author Alex Milevski <info@w8r.name>
48668 (function (global, factory) {
48670 }(commonjsGlobal, (function (exports) {
48671 function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
48673 var SplayTree = function SplayTree(compare, noDuplicates) {
48674 if ( compare === void 0 ) compare = DEFAULT_COMPARE;
48675 if ( noDuplicates === void 0 ) noDuplicates = false;
48677 this._compare = compare;
48680 this._noDuplicates = !!noDuplicates;
48683 var prototypeAccessors = { size: { configurable: true } };
48686 SplayTree.prototype.rotateLeft = function rotateLeft (x) {
48690 if (y.left) { y.left.parent = x; }
48691 y.parent = x.parent;
48694 if (!x.parent) { this._root = y; }
48695 else if (x === x.parent.left) { x.parent.left = y; }
48696 else { x.parent.right = y; }
48697 if (y) { y.left = x; }
48702 SplayTree.prototype.rotateRight = function rotateRight (x) {
48706 if (y.right) { y.right.parent = x; }
48707 y.parent = x.parent;
48710 if (!x.parent) { this._root = y; }
48711 else if(x === x.parent.left) { x.parent.left = y; }
48712 else { x.parent.right = y; }
48713 if (y) { y.right = x; }
48718 SplayTree.prototype._splay = function _splay (x) {
48724 if (p.left === x) { this$1.rotateRight(p); }
48725 else { this$1.rotateLeft(p); }
48726 } else if (p.left === x && p.parent.left === p) {
48727 this$1.rotateRight(p.parent);
48728 this$1.rotateRight(p);
48729 } else if (p.right === x && p.parent.right === p) {
48730 this$1.rotateLeft(p.parent);
48731 this$1.rotateLeft(p);
48732 } else if (p.left === x && p.parent.right === p) {
48733 this$1.rotateRight(p);
48734 this$1.rotateLeft(p);
48736 this$1.rotateLeft(p);
48737 this$1.rotateRight(p);
48743 SplayTree.prototype.splay = function splay (x) {
48746 var p, gp, ggp, l, r;
48752 if (gp && gp.parent) {
48754 if (ggp.left === gp) { ggp.left= x; }
48755 else { ggp.right = x; }
48762 l = x.left; r = x.right;
48764 if (x === p.left) { // left
48766 if (gp.left === p) {
48770 gp.left.parent = gp;
48771 } else { gp.left = null; }
48780 } else { gp.right = null; }
48789 } else { p.left = null; }
48795 if (gp.right === p) {
48799 gp.right.parent = gp;
48800 } else { gp.right = null; }
48809 } else { gp.left = null; }
48818 } else { p.right = null; }
48827 SplayTree.prototype.replace = function replace (u, v) {
48828 if (!u.parent) { this._root = v; }
48829 else if (u === u.parent.left) { u.parent.left = v; }
48830 else { u.parent.right = v; }
48831 if (v) { v.parent = u.parent; }
48835 SplayTree.prototype.minNode = function minNode (u) {
48836 if ( u === void 0 ) u = this._root;
48838 if (u) { while (u.left) { u = u.left; } }
48843 SplayTree.prototype.maxNode = function maxNode (u) {
48844 if ( u === void 0 ) u = this._root;
48846 if (u) { while (u.right) { u = u.right; } }
48851 SplayTree.prototype.insert = function insert (key, data) {
48852 var z = this._root;
48854 var comp = this._compare;
48857 if (this._noDuplicates) {
48860 cmp = comp(z.key, key);
48861 if (cmp === 0) { return; }
48862 else if (comp(z.key, key) < 0) { z = z.right; }
48863 else { z = z.left; }
48868 if (comp(z.key, key) < 0) { z = z.right; }
48869 else { z = z.left; }
48873 z = { key: key, data: data, left: null, right: null, parent: p };
48875 if (!p) { this._root = z; }
48876 else if (comp(p.key, z.key) < 0) { p.right = z; }
48877 else { p.left= z; }
48885 SplayTree.prototype.find = function find (key) {
48886 var z = this._root;
48887 var comp = this._compare;
48889 var cmp = comp(z.key, key);
48890 if (cmp < 0) { z = z.right; }
48891 else if (cmp > 0) { z = z.left; }
48898 * Whether the tree contains a node with the given key
48900 * @return {boolean} true/false
48902 SplayTree.prototype.contains = function contains (key) {
48903 var node = this._root;
48904 var comparator = this._compare;
48906 var cmp = comparator(key, node.key);
48907 if (cmp === 0) { return true; }
48908 else if (cmp < 0) { node = node.left; }
48909 else { node = node.right; }
48916 SplayTree.prototype.remove = function remove (key) {
48917 var z = this.find(key);
48919 if (!z) { return false; }
48923 if (!z.left) { this.replace(z, z.right); }
48924 else if (!z.right) { this.replace(z, z.left); }
48926 var y = this.minNode(z.right);
48927 if (y.parent !== z) {
48928 this.replace(y, y.right);
48930 y.right.parent = y;
48932 this.replace(z, y);
48942 SplayTree.prototype.removeNode = function removeNode (z) {
48943 if (!z) { return false; }
48947 if (!z.left) { this.replace(z, z.right); }
48948 else if (!z.right) { this.replace(z, z.left); }
48950 var y = this.minNode(z.right);
48951 if (y.parent !== z) {
48952 this.replace(y, y.right);
48954 y.right.parent = y;
48956 this.replace(z, y);
48966 SplayTree.prototype.erase = function erase (key) {
48967 var z = this.find(key);
48968 if (!z) { return; }
48978 sMax = this.maxNode(s);
48983 if (s) { sMax.right = t; }
48984 else { this._root = t; }
48992 * Removes and returns the node with smallest key
48995 SplayTree.prototype.pop = function pop () {
48996 var node = this._root, returnValue = null;
48998 while (node.left) { node = node.left; }
48999 returnValue = { key: node.key, data: node.data };
49000 this.remove(node.key);
49002 return returnValue;
49006 /* eslint-disable class-methods-use-this */
49010 * @param{Node} node
49013 SplayTree.prototype.next = function next (node) {
49014 var successor = node;
49016 if (successor.right) {
49017 successor = successor.right;
49018 while (successor && successor.left) { successor = successor.left; }
49020 successor = node.parent;
49021 while (successor && successor.right === node) {
49022 node = successor; successor = successor.parent;
49032 * @param{Node} node
49035 SplayTree.prototype.prev = function prev (node) {
49036 var predecessor = node;
49038 if (predecessor.left) {
49039 predecessor = predecessor.left;
49040 while (predecessor && predecessor.right) { predecessor = predecessor.right; }
49042 predecessor = node.parent;
49043 while (predecessor && predecessor.left === node) {
49044 node = predecessor;
49045 predecessor = predecessor.parent;
49049 return predecessor;
49051 /* eslint-enable class-methods-use-this */
49055 * @param{forEachCallback} callback
49056 * @return {SplayTree}
49058 SplayTree.prototype.forEach = function forEach (callback) {
49059 var current = this._root;
49060 var s = [], done = false, i = 0;
49063 // Reach the left most Node of the current Node
49065 // Place pointer to a tree node on the stack
49066 // before traversing the node's left subtree
49068 current = current.left;
49070 // BackTrack from the empty subtree and visit the Node
49071 // at the top of the stack; however, if the stack is
49072 // empty you are done
49073 if (s.length > 0) {
49075 callback(current, i++);
49077 // We have visited the node and its left
49078 // subtree. Now, it's right subtree's turn
49079 current = current.right;
49080 } else { done = true; }
49088 * Walk key range from `low` to `high`. Stops if `fn` returns a value.
49091 * @param{Function} fn
49093 * @return {SplayTree}
49095 SplayTree.prototype.range = function range (low, high, fn, ctx) {
49099 var compare = this._compare;
49100 var node = this._root, cmp;
49102 while (Q.length !== 0 || node) {
49108 cmp = compare(node.key, high);
49111 } else if (compare(node.key, low) >= 0) {
49112 if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
49121 * Returns all keys in order
49122 * @return {Array<Key>}
49124 SplayTree.prototype.keys = function keys () {
49125 var current = this._root;
49126 var s = [], r = [], done = false;
49131 current = current.left;
49133 if (s.length > 0) {
49135 r.push(current.key);
49136 current = current.right;
49137 } else { done = true; }
49145 * Returns `data` fields of all nodes in order.
49146 * @return {Array<Value>}
49148 SplayTree.prototype.values = function values () {
49149 var current = this._root;
49150 var s = [], r = [], done = false;
49155 current = current.left;
49157 if (s.length > 0) {
49159 r.push(current.data);
49160 current = current.right;
49161 } else { done = true; }
49169 * Returns node at given index
49170 * @param{number} index
49173 SplayTree.prototype.at = function at (index) {
49174 // removed after a consideration, more misleading than useful
49175 // index = index % this.size;
49176 // if (index < 0) index = this.size - index;
49178 var current = this._root;
49179 var s = [], done = false, i = 0;
49184 current = current.left;
49186 if (s.length > 0) {
49188 if (i === index) { return current; }
49190 current = current.right;
49191 } else { done = true; }
49198 * Bulk-load items. Both array have to be same size
49199 * @param{Array<Key>} keys
49200 * @param{Array<Value>}[values]
49201 * @param{Boolean} [presort=false] Pre-sort keys and values, using
49202 * tree's comparator. Sorting is done
49204 * @return {AVLTree}
49206 SplayTree.prototype.load = function load (keys, values, presort) {
49207 if ( keys === void 0 ) keys = [];
49208 if ( values === void 0 ) values = [];
49209 if ( presort === void 0 ) presort = false;
49211 if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
49212 var size = keys.length;
49213 if (presort) { sort(keys, values, 0, size - 1, this._compare); }
49214 this._root = loadRecursive(null, keys, values, 0, size);
49220 SplayTree.prototype.min = function min () {
49221 var node = this.minNode(this._root);
49222 if (node) { return node.key; }
49223 else { return null; }
49227 SplayTree.prototype.max = function max () {
49228 var node = this.maxNode(this._root);
49229 if (node) { return node.key; }
49230 else { return null; }
49233 SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
49234 prototypeAccessors.size.get = function () { return this._size; };
49238 * Create a tree and load it with items
49239 * @param{Array<Key>} keys
49240 * @param{Array<Value>?} [values]
49242 * @param{Function?} [comparator]
49243 * @param{Boolean?} [presort=false] Pre-sort keys and values, using
49244 * tree's comparator. Sorting is done
49246 * @param{Boolean?} [noDuplicates=false] Allow duplicates
49247 * @return {SplayTree}
49249 SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
49250 return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
49253 Object.defineProperties( SplayTree.prototype, prototypeAccessors );
49256 function loadRecursive (parent, keys, values, start, end) {
49257 var size = end - start;
49259 var middle = start + Math.floor(size / 2);
49260 var key = keys[middle];
49261 var data = values[middle];
49262 var node = { key: key, data: data, parent: parent };
49263 node.left = loadRecursive(node, keys, values, start, middle);
49264 node.right = loadRecursive(node, keys, values, middle + 1, end);
49271 function sort(keys, values, left, right, compare) {
49272 if (left >= right) { return; }
49274 var pivot = keys[(left + right) >> 1];
49279 do { i++; } while (compare(keys[i], pivot) < 0);
49280 do { j--; } while (compare(keys[j], pivot) > 0);
49281 if (i >= j) { break; }
49288 values[i] = values[j];
49292 sort(keys, values, left, j, compare);
49293 sort(keys, values, j + 1, right, compare);
49297 var NON_CONTRIBUTING = 1;
49298 var SAME_TRANSITION = 2;
49299 var DIFFERENT_TRANSITION = 3;
49301 var INTERSECTION = 0;
49303 var DIFFERENCE = 2;
49307 * @param {SweepEvent} event
49308 * @param {SweepEvent} prev
49309 * @param {Operation} operation
49311 function computeFields (event, prev, operation) {
49312 // compute inOut and otherInOut fields
49313 if (prev === null) {
49314 event.inOut = false;
49315 event.otherInOut = true;
49317 // previous line segment in sweepline belongs to the same polygon
49319 if (event.isSubject === prev.isSubject) {
49320 event.inOut = !prev.inOut;
49321 event.otherInOut = prev.otherInOut;
49323 // previous line segment in sweepline belongs to the clipping polygon
49325 event.inOut = !prev.otherInOut;
49326 event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
49329 // compute prevInResult field
49331 event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
49332 ? prev.prevInResult : prev;
49336 // check if the line segment belongs to the Boolean operation
49337 event.inResult = inResult(event, operation);
49341 /* eslint-disable indent */
49342 function inResult(event, operation) {
49343 switch (event.type) {
49345 switch (operation) {
49347 return !event.otherInOut;
49349 return event.otherInOut;
49351 // return (event.isSubject && !event.otherInOut) ||
49352 // (!event.isSubject && event.otherInOut);
49353 return (event.isSubject && event.otherInOut) ||
49354 (!event.isSubject && !event.otherInOut);
49359 case SAME_TRANSITION:
49360 return operation === INTERSECTION || operation === UNION;
49361 case DIFFERENT_TRANSITION:
49362 return operation === DIFFERENCE;
49363 case NON_CONTRIBUTING:
49368 /* eslint-enable indent */
49370 var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
49373 * Is left endpoint?
49379 * @type {Array.<Number>}
49381 this.point = point;
49384 * Other edge reference
49385 * @type {SweepEvent}
49387 this.otherEvent = otherEvent;
49390 * Belongs to source or clipping polygon
49393 this.isSubject = isSubject;
49396 * Edge contribution type
49399 this.type = edgeType || NORMAL;
49403 * In-out transition for the sweepline crossing polygon
49406 this.inOut = false;
49412 this.otherInOut = false;
49415 * Previous event in result?
49416 * @type {SweepEvent}
49418 this.prevInResult = null;
49421 * Does event belong to result?
49424 this.inResult = false;
49432 this.resultInOut = false;
49434 this.isExteriorRing = true;
49439 * @param{Array.<Number>}p
49440 * @return {Boolean}
49442 SweepEvent.prototype.isBelow = function isBelow (p) {
49443 var p0 = this.point, p1 = this.otherEvent.point;
49445 ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
49446 // signedArea(this.point, this.otherEvent.point, p) > 0 :
49447 : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
49448 //signedArea(this.otherEvent.point, this.point, p) > 0;
49453 * @param{Array.<Number>}p
49454 * @return {Boolean}
49456 SweepEvent.prototype.isAbove = function isAbove (p) {
49457 return !this.isBelow(p);
49462 * @return {Boolean}
49464 SweepEvent.prototype.isVertical = function isVertical () {
49465 return this.point[0] === this.otherEvent.point[0];
49469 SweepEvent.prototype.clone = function clone () {
49470 var copy = new SweepEvent(
49471 this.point, this.left, this.otherEvent, this.isSubject, this.type);
49473 copy.inResult = this.inResult;
49474 copy.prevInResult = this.prevInResult;
49475 copy.isExteriorRing = this.isExteriorRing;
49476 copy.inOut = this.inOut;
49477 copy.otherInOut = this.otherInOut;
49482 function equals(p1, p2) {
49483 if (p1[0] === p2[0]) {
49484 if (p1[1] === p2[1]) {
49493 // const EPSILON = 1e-9;
49494 // const abs = Math.abs;
49495 // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
49496 // Precision problem.
49498 // module.exports = function equals(p1, p2) {
49499 // return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
49503 * Signed area of the triangle (p0, p1, p2)
49504 * @param {Array.<Number>} p0
49505 * @param {Array.<Number>} p1
49506 * @param {Array.<Number>} p2
49509 function signedArea(p0, p1, p2) {
49510 return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
49514 * @param {SweepEvent} e1
49515 * @param {SweepEvent} e2
49518 function compareEvents(e1, e2) {
49522 // Different x-coordinate
49523 if (p1[0] > p2[0]) { return 1; }
49524 if (p1[0] < p2[0]) { return -1; }
49526 // Different points, but same x-coordinate
49527 // Event with lower y-coordinate is processed first
49528 if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
49530 return specialCases(e1, e2, p1, p2);
49534 /* eslint-disable no-unused-vars */
49535 function specialCases(e1, e2, p1, p2) {
49536 // Same coordinates, but one is a left endpoint and the other is
49537 // a right endpoint. The right endpoint is processed first
49538 if (e1.left !== e2.left)
49539 { return e1.left ? 1 : -1; }
49541 // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
49542 // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
49543 // Same coordinates, both events
49544 // are left endpoints or right endpoints.
49546 if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
49547 // the event associate to the bottom segment is processed first
49548 return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
49551 return (!e1.isSubject && e2.isSubject) ? 1 : -1;
49553 /* eslint-enable no-unused-vars */
49556 * @param {SweepEvent} se
49557 * @param {Array.<Number>} p
49558 * @param {Queue} queue
49561 function divideSegment(se, p, queue) {
49562 var r = new SweepEvent(p, false, se, se.isSubject);
49563 var l = new SweepEvent(p, true, se.otherEvent, se.isSubject);
49565 /* eslint-disable no-console */
49566 if (equals(se.point, se.otherEvent.point)) {
49568 console.warn('what is that, a collapsed segment?', se);
49570 /* eslint-enable no-console */
49572 r.contourId = l.contourId = se.contourId;
49574 // avoid a rounding error. The left event would be processed after the right event
49575 if (compareEvents(l, se.otherEvent) > 0) {
49576 se.otherEvent.left = true;
49580 // avoid a rounding error. The left event would be processed after the right event
49581 // if (compareEvents(se, r) > 0) {}
49583 se.otherEvent.otherEvent = l;
49592 //const EPS = 1e-9;
49595 * Finds the magnitude of the cross product of two vectors (if we pretend
49596 * they're in three dimensions)
49598 * @param {Object} a First vector
49599 * @param {Object} b Second vector
49601 * @returns {Number} The magnitude of the cross product
49603 function crossProduct(a, b) {
49604 return (a[0] * b[1]) - (a[1] * b[0]);
49608 * Finds the dot product of two vectors.
49610 * @param {Object} a First vector
49611 * @param {Object} b Second vector
49613 * @returns {Number} The dot product
49615 function dotProduct(a, b) {
49616 return (a[0] * b[0]) + (a[1] * b[1]);
49620 * Finds the intersection (if any) between two line segments a and b, given the
49621 * line segments' end points a1, a2 and b1, b2.
49623 * This algorithm is based on Schneider and Eberly.
49624 * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
49627 * @param {Array.<Number>} a1 point of first line
49628 * @param {Array.<Number>} a2 point of first line
49629 * @param {Array.<Number>} b1 point of second line
49630 * @param {Array.<Number>} b2 point of second line
49631 * @param {Boolean=} noEndpointTouch whether to skip single touchpoints
49632 * (meaning connected segments) as
49634 * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
49635 * intersection. If they overlap, the two end points of the overlapping segment.
49638 function intersection (a1, a2, b1, b2, noEndpointTouch) {
49639 // The algorithm expects our lines in the form P + sd, where P is a point,
49640 // s is on the interval [0, 1], and d is a vector.
49641 // We are passed two points. P can be the first point of each pair. The
49642 // vector, then, could be thought of as the distance (in x and y components)
49643 // from the first point to the second point.
49644 // So first, let's make our vectors:
49645 var va = [a2[0] - a1[0], a2[1] - a1[1]];
49646 var vb = [b2[0] - b1[0], b2[1] - b1[1]];
49647 // We also define a function to convert back to regular point form:
49649 /* eslint-disable arrow-body-style */
49651 function toPoint(p, s, d) {
49658 /* eslint-enable arrow-body-style */
49660 // The rest is pretty much a straight port of the algorithm.
49661 var e = [b1[0] - a1[0], b1[1] - a1[1]];
49662 var kross = crossProduct(va, vb);
49663 var sqrKross = kross * kross;
49664 var sqrLenA = dotProduct(va, va);
49665 //const sqrLenB = dotProduct(vb, vb);
49667 // Check for line intersection. This works because of the properties of the
49668 // cross product -- specifically, two vectors are parallel if and only if the
49669 // cross product is the 0 vector. The full calculation involves relative error
49670 // to account for possible very small line segments. See Schneider & Eberly
49672 if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
49673 // If they're not parallel, then (because these are line segments) they
49674 // still might not actually intersect. This code checks that the
49675 // intersection point of the lines is actually on both line segments.
49676 var s = crossProduct(e, vb) / kross;
49677 if (s < 0 || s > 1) {
49678 // not on line segment a
49681 var t = crossProduct(e, va) / kross;
49682 if (t < 0 || t > 1) {
49683 // not on line segment b
49686 if (s === 0 || s === 1) {
49687 // on an endpoint of line segment a
49688 return noEndpointTouch ? null : [toPoint(a1, s, va)];
49690 if (t === 0 || t === 1) {
49691 // on an endpoint of line segment b
49692 return noEndpointTouch ? null : [toPoint(b1, t, vb)];
49694 return [toPoint(a1, s, va)];
49697 // If we've reached this point, then the lines are either parallel or the
49698 // same, but the segments could overlap partially or fully, or not at all.
49699 // So we need to find the overlap, if any. To do that, we can use e, which is
49700 // the (vector) difference between the two initial points. If this is parallel
49701 // with the line itself, then the two lines are the same line, and there will
49703 //const sqrLenE = dotProduct(e, e);
49704 kross = crossProduct(e, va);
49705 sqrKross = kross * kross;
49707 if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
49708 // Lines are just parallel, not the same. No overlap.
49712 var sa = dotProduct(va, e) / sqrLenA;
49713 var sb = sa + dotProduct(va, vb) / sqrLenA;
49714 var smin = Math.min(sa, sb);
49715 var smax = Math.max(sa, sb);
49717 // this is, essentially, the FindIntersection acting on floats from
49718 // Schneider & Eberly, just inlined into this function.
49719 if (smin <= 1 && smax >= 0) {
49721 // overlap on an end point
49723 return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
49727 return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
49730 if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
49732 // There's overlap on a segment -- two points of intersection. Return both.
49734 toPoint(a1, smin > 0 ? smin : 0, va),
49735 toPoint(a1, smax < 1 ? smax : 1, va)
49743 * @param {SweepEvent} se1
49744 * @param {SweepEvent} se2
49745 * @param {Queue} queue
49748 function possibleIntersection (se1, se2, queue) {
49749 // that disallows self-intersecting polygons,
49750 // did cost us half a day, so I'll leave it
49752 // if (se1.isSubject === se2.isSubject) return;
49753 var inter = intersection(
49754 se1.point, se1.otherEvent.point,
49755 se2.point, se2.otherEvent.point
49758 var nintersections = inter ? inter.length : 0;
49759 if (nintersections === 0) { return 0; } // no intersection
49761 // the line segments intersect at an endpoint of both line segments
49762 if ((nintersections === 1) &&
49763 (equals(se1.point, se2.point) ||
49764 equals(se1.otherEvent.point, se2.otherEvent.point))) {
49768 if (nintersections === 2 && se1.isSubject === se2.isSubject) {
49769 // if(se1.contourId === se2.contourId){
49770 // console.warn('Edges of the same polygon overlap',
49771 // se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
49773 //throw new Error('Edges of the same polygon overlap');
49777 // The line segments associated to se1 and se2 intersect
49778 if (nintersections === 1) {
49780 // if the intersection point is not an endpoint of se1
49781 if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
49782 divideSegment(se1, inter[0], queue);
49785 // if the intersection point is not an endpoint of se2
49786 if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
49787 divideSegment(se2, inter[0], queue);
49792 // The line segments associated to se1 and se2 overlap
49794 var leftCoincide = false;
49795 var rightCoincide = false;
49797 if (equals(se1.point, se2.point)) {
49798 leftCoincide = true; // linked
49799 } else if (compareEvents(se1, se2) === 1) {
49800 events.push(se2, se1);
49802 events.push(se1, se2);
49805 if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
49806 rightCoincide = true;
49807 } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
49808 events.push(se2.otherEvent, se1.otherEvent);
49810 events.push(se1.otherEvent, se2.otherEvent);
49813 if ((leftCoincide && rightCoincide) || leftCoincide) {
49814 // both line segments are equal or share the left endpoint
49815 se2.type = NON_CONTRIBUTING;
49816 se1.type = (se2.inOut === se1.inOut)
49817 ? SAME_TRANSITION : DIFFERENT_TRANSITION;
49819 if (leftCoincide && !rightCoincide) {
49820 // honestly no idea, but changing events selection from [2, 1]
49821 // to [0, 1] fixes the overlapping self-intersecting polygons issue
49822 divideSegment(events[1].otherEvent, events[0].point, queue);
49827 // the line segments share the right endpoint
49828 if (rightCoincide) {
49829 divideSegment(events[0], events[1].point, queue);
49833 // no line segment includes totally the other one
49834 if (events[0] !== events[3].otherEvent) {
49835 divideSegment(events[0], events[1].point, queue);
49836 divideSegment(events[1], events[2].point, queue);
49840 // one line segment includes the other one
49841 divideSegment(events[0], events[1].point, queue);
49842 divideSegment(events[3].otherEvent, events[2].point, queue);
49848 * @param {SweepEvent} le1
49849 * @param {SweepEvent} le2
49852 function compareSegments(le1, le2) {
49853 if (le1 === le2) { return 0; }
49855 // Segments are not collinear
49856 if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
49857 signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
49859 // If they share their left endpoint use the right endpoint to sort
49860 if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
49862 // Different left endpoint: use the left endpoint to sort
49863 if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
49865 // has the line segment associated to e1 been inserted
49866 // into S after the line segment associated to e2 ?
49867 if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
49869 // The line segment associated to e2 has been inserted
49870 // into S after the line segment associated to e1
49871 return le1.isBelow(le2.point) ? -1 : 1;
49874 if (le1.isSubject === le2.isSubject) { // same polygon
49875 var p1 = le1.point, p2 = le2.point;
49876 if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
49877 p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
49878 if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
49879 else { return le1.contourId > le2.contourId ? 1 : -1; }
49881 } else { // Segments are collinear, but belong to separate polygons
49882 return le1.isSubject ? -1 : 1;
49885 return compareEvents(le1, le2) === 1 ? 1 : -1;
49888 function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
49889 var sweepLine = new SplayTree(compareSegments);
49890 var sortedEvents = [];
49892 var rightbound = Math.min(sbbox[2], cbbox[2]);
49894 var prev, next, begin;
49896 while (eventQueue.length !== 0) {
49897 var event = eventQueue.pop();
49898 sortedEvents.push(event);
49900 // optimization by bboxes for intersection and difference goes here
49901 if ((operation === INTERSECTION && event.point[0] > rightbound) ||
49902 (operation === DIFFERENCE && event.point[0] > sbbox[2])) {
49907 next = prev = sweepLine.insert(event);
49908 begin = sweepLine.minNode();
49910 if (prev !== begin) { prev = sweepLine.prev(prev); }
49911 else { prev = null; }
49913 next = sweepLine.next(next);
49915 var prevEvent = prev ? prev.key : null;
49916 var prevprevEvent = (void 0);
49917 computeFields(event, prevEvent, operation);
49919 if (possibleIntersection(event, next.key, eventQueue) === 2) {
49920 computeFields(event, prevEvent, operation);
49921 computeFields(event, next.key, operation);
49926 if (possibleIntersection(prev.key, event, eventQueue) === 2) {
49927 var prevprev = prev;
49928 if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
49929 else { prevprev = null; }
49931 prevprevEvent = prevprev ? prevprev.key : null;
49932 computeFields(prevEvent, prevprevEvent, operation);
49933 computeFields(event, prevEvent, operation);
49937 event = event.otherEvent;
49938 next = prev = sweepLine.find(event);
49940 if (prev && next) {
49942 if (prev !== begin) { prev = sweepLine.prev(prev); }
49943 else { prev = null; }
49945 next = sweepLine.next(next);
49946 sweepLine.remove(event);
49948 if (next && prev) {
49949 possibleIntersection(prev.key, next.key, eventQueue);
49954 return sortedEvents;
49958 * @param {Array.<SweepEvent>} sortedEvents
49959 * @return {Array.<SweepEvent>}
49961 function orderEvents(sortedEvents) {
49962 var event, i, len, tmp;
49963 var resultEvents = [];
49964 for (i = 0, len = sortedEvents.length; i < len; i++) {
49965 event = sortedEvents[i];
49966 if ((event.left && event.inResult) ||
49967 (!event.left && event.otherEvent.inResult)) {
49968 resultEvents.push(event);
49971 // Due to overlapping edges the resultEvents array can be not wholly sorted
49972 var sorted = false;
49975 for (i = 0, len = resultEvents.length; i < len; i++) {
49976 if ((i + 1) < len &&
49977 compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
49978 tmp = resultEvents[i];
49979 resultEvents[i] = resultEvents[i + 1];
49980 resultEvents[i + 1] = tmp;
49987 for (i = 0, len = resultEvents.length; i < len; i++) {
49988 event = resultEvents[i];
49992 // imagine, the right event is found in the beginning of the queue,
49993 // when his left counterpart is not marked yet
49994 for (i = 0, len = resultEvents.length; i < len; i++) {
49995 event = resultEvents[i];
49998 event.pos = event.otherEvent.pos;
49999 event.otherEvent.pos = tmp;
50003 return resultEvents;
50008 * @param {Number} pos
50009 * @param {Array.<SweepEvent>} resultEvents
50010 * @param {Object>} processed
50013 function nextPos(pos, resultEvents, processed, origIndex) {
50015 var newPos = pos + 1;
50016 var length = resultEvents.length;
50018 p = resultEvents[pos].point;
50020 if (newPos < length)
50021 { p1 = resultEvents[newPos].point; }
50024 // while in range and not the current one by value
50025 while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
50026 if (!processed[newPos]) {
50031 p1 = resultEvents[newPos].point;
50036 while (processed[newPos] && newPos >= origIndex) {
50044 * @param {Array.<SweepEvent>} sortedEvents
50045 * @return {Array.<*>} polygons
50047 function connectEdges(sortedEvents, operation) {
50049 var resultEvents = orderEvents(sortedEvents);
50051 // "false"-filled array
50052 var processed = {};
50056 for (i = 0, len = resultEvents.length; i < len; i++) {
50057 if (processed[i]) { continue; }
50058 var contour = [[]];
50060 if (!resultEvents[i].isExteriorRing) {
50061 if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
50062 result.push(contour);
50063 } else if (result.length === 0) {
50064 result.push([[contour]]);
50066 result[result.length - 1].push(contour[0]);
50068 } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
50069 result[result.length - 1].push(contour[0]);
50071 result.push(contour);
50074 var ringId = result.length - 1;
50077 var initial = resultEvents[i].point;
50078 contour[0].push(initial);
50081 event = resultEvents[pos];
50082 processed[pos] = true;
50085 event.resultInOut = false;
50086 event.contourId = ringId;
50088 event.otherEvent.resultInOut = true;
50089 event.otherEvent.contourId = ringId;
50093 processed[pos] = true;
50094 contour[0].push(resultEvents[pos].point);
50095 pos = nextPos(pos, resultEvents, processed, i);
50098 pos = pos === -1 ? i : pos;
50100 event = resultEvents[pos];
50101 processed[pos] = processed[event.pos] = true;
50102 event.otherEvent.resultInOut = true;
50103 event.otherEvent.contourId = ringId;
50106 // Handle if the result is a polygon (eg not multipoly)
50107 // Commented it again, let's see what do we mean by that
50108 // if (result.length === 1) result = result[0];
50112 var tinyqueue = TinyQueue;
50113 var default_1 = TinyQueue;
50115 function TinyQueue(data, compare) {
50118 if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
50120 this.data = data || [];
50121 this.length = this.data.length;
50122 this.compare = compare || defaultCompare;
50124 if (this.length > 0) {
50125 for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
50129 function defaultCompare(a, b) {
50130 return a < b ? -1 : a > b ? 1 : 0;
50133 TinyQueue.prototype = {
50135 push: function (item) {
50136 this.data.push(item);
50138 this._up(this.length - 1);
50142 if (this.length === 0) { return undefined; }
50144 var top = this.data[0];
50147 if (this.length > 0) {
50148 this.data[0] = this.data[this.length];
50156 peek: function () {
50157 return this.data[0];
50160 _up: function (pos) {
50161 var data = this.data;
50162 var compare = this.compare;
50163 var item = data[pos];
50166 var parent = (pos - 1) >> 1;
50167 var current = data[parent];
50168 if (compare(item, current) >= 0) { break; }
50169 data[pos] = current;
50176 _down: function (pos) {
50179 var data = this.data;
50180 var compare = this.compare;
50181 var halfLength = this.length >> 1;
50182 var item = data[pos];
50184 while (pos < halfLength) {
50185 var left = (pos << 1) + 1;
50186 var right = left + 1;
50187 var best = data[left];
50189 if (right < this$1.length && compare(data[right], best) < 0) {
50191 best = data[right];
50193 if (compare(best, item) >= 0) { break; }
50202 tinyqueue.default = default_1;
50204 var max = Math.max;
50205 var min = Math.min;
50210 function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
50211 var i, len, s1, s2, e1, e2;
50212 for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
50213 s1 = contourOrHole[i];
50214 s2 = contourOrHole[i + 1];
50215 e1 = new SweepEvent(s1, false, undefined, isSubject);
50216 e2 = new SweepEvent(s2, false, e1, isSubject);
50217 e1.otherEvent = e2;
50219 if (s1[0] === s2[0] && s1[1] === s2[1]) {
50220 continue; // skip collapsed edges, or it breaks
50223 e1.contourId = e2.contourId = depth;
50224 if (!isExteriorRing) {
50225 e1.isExteriorRing = false;
50226 e2.isExteriorRing = false;
50228 if (compareEvents(e1, e2) > 0) {
50234 var x = s1[0], y = s1[1];
50235 bbox[0] = min(bbox[0], x);
50236 bbox[1] = min(bbox[1], y);
50237 bbox[2] = max(bbox[2], x);
50238 bbox[3] = max(bbox[3], y);
50240 // Pushing it so the queue is sorted from left to right,
50241 // with object on the left having the highest priority.
50248 function fillQueue(subject, clipping, sbbox, cbbox, operation) {
50249 var eventQueue = new tinyqueue(null, compareEvents);
50250 var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
50252 for (i = 0, ii = subject.length; i < ii; i++) {
50253 polygonSet = subject[i];
50254 for (j = 0, jj = polygonSet.length; j < jj; j++) {
50255 isExteriorRing = j === 0;
50256 if (isExteriorRing) { contourId++; }
50257 processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
50261 for (i = 0, ii = clipping.length; i < ii; i++) {
50262 polygonSet = clipping[i];
50263 for (j = 0, jj = polygonSet.length; j < jj; j++) {
50264 isExteriorRing = j === 0;
50265 if (operation === DIFFERENCE) { isExteriorRing = false; }
50266 if (isExteriorRing) { contourId++; }
50267 processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
50277 function trivialOperation(subject, clipping, operation) {
50279 if (subject.length * clipping.length === 0) {
50280 if (operation === INTERSECTION) {
50282 } else if (operation === DIFFERENCE) {
50284 } else if (operation === UNION ||
50285 operation === XOR) {
50286 result = (subject.length === 0) ? clipping : subject;
50293 function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
50295 if (sbbox[0] > cbbox[2] ||
50296 cbbox[0] > sbbox[2] ||
50297 sbbox[1] > cbbox[3] ||
50298 cbbox[1] > sbbox[3]) {
50299 if (operation === INTERSECTION) {
50301 } else if (operation === DIFFERENCE) {
50303 } else if (operation === UNION ||
50304 operation === XOR) {
50305 result = subject.concat(clipping);
50312 function boolean(subject, clipping, operation) {
50313 if (typeof subject[0][0][0] === 'number') {
50314 subject = [subject];
50316 if (typeof clipping[0][0][0] === 'number') {
50317 clipping = [clipping];
50319 var trivial = trivialOperation(subject, clipping, operation);
50321 return trivial === EMPTY ? null : trivial;
50323 var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
50324 var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
50326 //console.time('fill queue');
50327 var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
50328 //console.timeEnd('fill queue');
50330 trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
50332 return trivial === EMPTY ? null : trivial;
50334 //console.time('subdivide edges');
50335 var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
50336 //console.timeEnd('subdivide edges');
50338 //console.time('connect vertices');
50339 var result = connectEdges(sortedEvents, operation);
50340 //console.timeEnd('connect vertices');
50344 function union (subject, clipping) {
50345 return boolean(subject, clipping, UNION);
50348 function diff (subject, clipping) {
50349 return boolean(subject, clipping, DIFFERENCE);
50352 function xor (subject, clipping){
50353 return boolean(subject, clipping, XOR);
50356 function intersection$1 (subject, clipping) {
50357 return boolean(subject, clipping, INTERSECTION);
50363 var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
50365 exports.union = union;
50366 exports.diff = diff;
50368 exports.intersection = intersection$1;
50369 exports.operations = operations;
50371 Object.defineProperty(exports, '__esModule', { value: true });
50377 var martinez = unwrapExports(martinez_umd);
50379 var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
50381 var eLen = (nBytes * 8) - mLen - 1;
50382 var eMax = (1 << eLen) - 1;
50383 var eBias = eMax >> 1;
50385 var i = isLE ? (nBytes - 1) : 0;
50386 var d = isLE ? -1 : 1;
50387 var s = buffer[offset + i];
50391 e = s & ((1 << (-nBits)) - 1);
50394 for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
50396 m = e & ((1 << (-nBits)) - 1);
50399 for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
50403 } else if (e === eMax) {
50404 return m ? NaN : ((s ? -1 : 1) * Infinity)
50406 m = m + Math.pow(2, mLen);
50409 return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
50412 var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
50414 var eLen = (nBytes * 8) - mLen - 1;
50415 var eMax = (1 << eLen) - 1;
50416 var eBias = eMax >> 1;
50417 var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
50418 var i = isLE ? 0 : (nBytes - 1);
50419 var d = isLE ? 1 : -1;
50420 var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
50422 value = Math.abs(value);
50424 if (isNaN(value) || value === Infinity) {
50425 m = isNaN(value) ? 1 : 0;
50428 e = Math.floor(Math.log(value) / Math.LN2);
50429 if (value * (c = Math.pow(2, -e)) < 1) {
50433 if (e + eBias >= 1) {
50436 value += rt * Math.pow(2, 1 - eBias);
50438 if (value * c >= 2) {
50443 if (e + eBias >= eMax) {
50446 } else if (e + eBias >= 1) {
50447 m = ((value * c) - 1) * Math.pow(2, mLen);
50450 m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
50455 for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
50457 e = (e << mLen) | m;
50459 for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
50461 buffer[offset + i - d] |= s * 128;
50469 var ieee754$1 = /*#__PURE__*/Object.freeze({
50471 __moduleExports: ieee754,
50476 var ieee754$2 = ( ieee754$1 && ieee754 ) || ieee754$1;
50482 function Pbf(buf) {
50483 this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
50486 this.length = this.buf.length;
50489 Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
50490 Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
50491 Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
50492 Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
50494 var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
50495 SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
50499 destroy: function() {
50503 // === READING =================================================================
50505 readFields: function(readField, result, end) {
50506 end = end || this.length;
50508 while (this.pos < end) {
50509 var val = this.readVarint(),
50511 startPos = this.pos;
50513 this.type = val & 0x7;
50514 readField(tag, result, this);
50516 if (this.pos === startPos) this.skip(val);
50521 readMessage: function(readField, result) {
50522 return this.readFields(readField, result, this.readVarint() + this.pos);
50525 readFixed32: function() {
50526 var val = readUInt32(this.buf, this.pos);
50531 readSFixed32: function() {
50532 var val = readInt32(this.buf, this.pos);
50537 // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
50539 readFixed64: function() {
50540 var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
50545 readSFixed64: function() {
50546 var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
50551 readFloat: function() {
50552 var val = ieee754$2.read(this.buf, this.pos, true, 23, 4);
50557 readDouble: function() {
50558 var val = ieee754$2.read(this.buf, this.pos, true, 52, 8);
50563 readVarint: function(isSigned) {
50564 var buf = this.buf,
50567 b = buf[this.pos++]; val = b & 0x7f; if (b < 0x80) return val;
50568 b = buf[this.pos++]; val |= (b & 0x7f) << 7; if (b < 0x80) return val;
50569 b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
50570 b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
50571 b = buf[this.pos]; val |= (b & 0x0f) << 28;
50573 return readVarintRemainder(val, isSigned, this);
50576 readVarint64: function() { // for compatibility with v2.0.1
50577 return this.readVarint(true);
50580 readSVarint: function() {
50581 var num = this.readVarint();
50582 return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
50585 readBoolean: function() {
50586 return Boolean(this.readVarint());
50589 readString: function() {
50590 var end = this.readVarint() + this.pos,
50591 str = readUtf8(this.buf, this.pos, end);
50596 readBytes: function() {
50597 var end = this.readVarint() + this.pos,
50598 buffer = this.buf.subarray(this.pos, end);
50603 // verbose for performance reasons; doesn't affect gzipped size
50605 readPackedVarint: function(arr, isSigned) {
50606 var end = readPackedEnd(this);
50608 while (this.pos < end) arr.push(this.readVarint(isSigned));
50611 readPackedSVarint: function(arr) {
50612 var end = readPackedEnd(this);
50614 while (this.pos < end) arr.push(this.readSVarint());
50617 readPackedBoolean: function(arr) {
50618 var end = readPackedEnd(this);
50620 while (this.pos < end) arr.push(this.readBoolean());
50623 readPackedFloat: function(arr) {
50624 var end = readPackedEnd(this);
50626 while (this.pos < end) arr.push(this.readFloat());
50629 readPackedDouble: function(arr) {
50630 var end = readPackedEnd(this);
50632 while (this.pos < end) arr.push(this.readDouble());
50635 readPackedFixed32: function(arr) {
50636 var end = readPackedEnd(this);
50638 while (this.pos < end) arr.push(this.readFixed32());
50641 readPackedSFixed32: function(arr) {
50642 var end = readPackedEnd(this);
50644 while (this.pos < end) arr.push(this.readSFixed32());
50647 readPackedFixed64: function(arr) {
50648 var end = readPackedEnd(this);
50650 while (this.pos < end) arr.push(this.readFixed64());
50653 readPackedSFixed64: function(arr) {
50654 var end = readPackedEnd(this);
50656 while (this.pos < end) arr.push(this.readSFixed64());
50660 skip: function(val) {
50661 var type = val & 0x7;
50662 if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
50663 else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
50664 else if (type === Pbf.Fixed32) this.pos += 4;
50665 else if (type === Pbf.Fixed64) this.pos += 8;
50666 else throw new Error('Unimplemented type: ' + type);
50669 // === WRITING =================================================================
50671 writeTag: function(tag, type) {
50672 this.writeVarint((tag << 3) | type);
50675 realloc: function(min) {
50676 var length = this.length || 16;
50678 while (length < this.pos + min) length *= 2;
50680 if (length !== this.length) {
50681 var buf = new Uint8Array(length);
50684 this.length = length;
50688 finish: function() {
50689 this.length = this.pos;
50691 return this.buf.subarray(0, this.length);
50694 writeFixed32: function(val) {
50696 writeInt32(this.buf, val, this.pos);
50700 writeSFixed32: function(val) {
50702 writeInt32(this.buf, val, this.pos);
50706 writeFixed64: function(val) {
50708 writeInt32(this.buf, val & -1, this.pos);
50709 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
50713 writeSFixed64: function(val) {
50715 writeInt32(this.buf, val & -1, this.pos);
50716 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
50720 writeVarint: function(val) {
50723 if (val > 0xfffffff || val < 0) {
50724 writeBigVarint(val, this);
50730 this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
50731 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
50732 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
50733 this.buf[this.pos++] = (val >>> 7) & 0x7f;
50736 writeSVarint: function(val) {
50737 this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
50740 writeBoolean: function(val) {
50741 this.writeVarint(Boolean(val));
50744 writeString: function(str) {
50746 this.realloc(str.length * 4);
50748 this.pos++; // reserve 1 byte for short string length
50750 var startPos = this.pos;
50751 // write the string directly to the buffer and see how much was written
50752 this.pos = writeUtf8(this.buf, str, this.pos);
50753 var len = this.pos - startPos;
50755 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
50757 // finally, write the message length in the reserved place and restore the position
50758 this.pos = startPos - 1;
50759 this.writeVarint(len);
50763 writeFloat: function(val) {
50765 ieee754$2.write(this.buf, val, this.pos, true, 23, 4);
50769 writeDouble: function(val) {
50771 ieee754$2.write(this.buf, val, this.pos, true, 52, 8);
50775 writeBytes: function(buffer) {
50776 var len = buffer.length;
50777 this.writeVarint(len);
50779 for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
50782 writeRawMessage: function(fn, obj) {
50783 this.pos++; // reserve 1 byte for short message length
50785 // write the message directly to the buffer and see how much was written
50786 var startPos = this.pos;
50788 var len = this.pos - startPos;
50790 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
50792 // finally, write the message length in the reserved place and restore the position
50793 this.pos = startPos - 1;
50794 this.writeVarint(len);
50798 writeMessage: function(tag, fn, obj) {
50799 this.writeTag(tag, Pbf.Bytes);
50800 this.writeRawMessage(fn, obj);
50803 writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); },
50804 writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); },
50805 writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); },
50806 writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); },
50807 writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); },
50808 writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); },
50809 writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
50810 writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); },
50811 writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },
50813 writeBytesField: function(tag, buffer) {
50814 this.writeTag(tag, Pbf.Bytes);
50815 this.writeBytes(buffer);
50817 writeFixed32Field: function(tag, val) {
50818 this.writeTag(tag, Pbf.Fixed32);
50819 this.writeFixed32(val);
50821 writeSFixed32Field: function(tag, val) {
50822 this.writeTag(tag, Pbf.Fixed32);
50823 this.writeSFixed32(val);
50825 writeFixed64Field: function(tag, val) {
50826 this.writeTag(tag, Pbf.Fixed64);
50827 this.writeFixed64(val);
50829 writeSFixed64Field: function(tag, val) {
50830 this.writeTag(tag, Pbf.Fixed64);
50831 this.writeSFixed64(val);
50833 writeVarintField: function(tag, val) {
50834 this.writeTag(tag, Pbf.Varint);
50835 this.writeVarint(val);
50837 writeSVarintField: function(tag, val) {
50838 this.writeTag(tag, Pbf.Varint);
50839 this.writeSVarint(val);
50841 writeStringField: function(tag, str) {
50842 this.writeTag(tag, Pbf.Bytes);
50843 this.writeString(str);
50845 writeFloatField: function(tag, val) {
50846 this.writeTag(tag, Pbf.Fixed32);
50847 this.writeFloat(val);
50849 writeDoubleField: function(tag, val) {
50850 this.writeTag(tag, Pbf.Fixed64);
50851 this.writeDouble(val);
50853 writeBooleanField: function(tag, val) {
50854 this.writeVarintField(tag, Boolean(val));
50858 function readVarintRemainder(l, s, p) {
50862 b = buf[p.pos++]; h = (b & 0x70) >> 4; if (b < 0x80) return toNum(l, h, s);
50863 b = buf[p.pos++]; h |= (b & 0x7f) << 3; if (b < 0x80) return toNum(l, h, s);
50864 b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
50865 b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
50866 b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
50867 b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
50869 throw new Error('Expected varint not more than 10 bytes');
50872 function readPackedEnd(pbf) {
50873 return pbf.type === Pbf.Bytes ?
50874 pbf.readVarint() + pbf.pos : pbf.pos + 1;
50877 function toNum(low, high, isSigned) {
50879 return high * 0x100000000 + (low >>> 0);
50882 return ((high >>> 0) * 0x100000000) + (low >>> 0);
50885 function writeBigVarint(val, pbf) {
50889 low = (val % 0x100000000) | 0;
50890 high = (val / 0x100000000) | 0;
50892 low = ~(-val % 0x100000000);
50893 high = ~(-val / 0x100000000);
50895 if (low ^ 0xffffffff) {
50896 low = (low + 1) | 0;
50899 high = (high + 1) | 0;
50903 if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
50904 throw new Error('Given varint doesn\'t fit into 10 bytes');
50909 writeBigVarintLow(low, high, pbf);
50910 writeBigVarintHigh(high, pbf);
50913 function writeBigVarintLow(low, high, pbf) {
50914 pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
50915 pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
50916 pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
50917 pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
50918 pbf.buf[pbf.pos] = low & 0x7f;
50921 function writeBigVarintHigh(high, pbf) {
50922 var lsb = (high & 0x07) << 4;
50924 pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
50925 pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
50926 pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
50927 pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
50928 pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
50929 pbf.buf[pbf.pos++] = high & 0x7f;
50932 function makeRoomForExtraLength(startPos, len, pbf) {
50934 len <= 0x3fff ? 1 :
50935 len <= 0x1fffff ? 2 :
50936 len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));
50938 // if 1 byte isn't enough for encoding message length, shift the data to the right
50939 pbf.realloc(extraLen);
50940 for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
50943 function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); }
50944 function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); }
50945 function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); }
50946 function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); }
50947 function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); }
50948 function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); }
50949 function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
50950 function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); }
50951 function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
50953 // Buffer code below from https://github.com/feross/buffer, MIT-licensed
50955 function readUInt32(buf, pos) {
50956 return ((buf[pos]) |
50957 (buf[pos + 1] << 8) |
50958 (buf[pos + 2] << 16)) +
50959 (buf[pos + 3] * 0x1000000);
50962 function writeInt32(buf, val, pos) {
50964 buf[pos + 1] = (val >>> 8);
50965 buf[pos + 2] = (val >>> 16);
50966 buf[pos + 3] = (val >>> 24);
50969 function readInt32(buf, pos) {
50970 return ((buf[pos]) |
50971 (buf[pos + 1] << 8) |
50972 (buf[pos + 2] << 16)) +
50973 (buf[pos + 3] << 24);
50976 function readUtf8(buf, pos, end) {
50982 var c = null; // codepoint
50983 var bytesPerSequence =
50988 if (i + bytesPerSequence > end) break;
50992 if (bytesPerSequence === 1) {
50996 } else if (bytesPerSequence === 2) {
50998 if ((b1 & 0xC0) === 0x80) {
50999 c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
51004 } else if (bytesPerSequence === 3) {
51007 if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
51008 c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
51009 if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
51013 } else if (bytesPerSequence === 4) {
51017 if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
51018 c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
51019 if (c <= 0xFFFF || c >= 0x110000) {
51027 bytesPerSequence = 1;
51029 } else if (c > 0xFFFF) {
51031 str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
51032 c = 0xDC00 | c & 0x3FF;
51035 str += String.fromCharCode(c);
51036 i += bytesPerSequence;
51042 function writeUtf8(buf, str, pos) {
51043 for (var i = 0, c, lead; i < str.length; i++) {
51044 c = str.charCodeAt(i); // code point
51046 if (c > 0xD7FF && c < 0xE000) {
51055 c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
51059 if (c > 0xDBFF || (i + 1 === str.length)) {
51079 buf[pos++] = c >> 0x6 | 0xC0;
51082 buf[pos++] = c >> 0xC | 0xE0;
51084 buf[pos++] = c >> 0x12 | 0xF0;
51085 buf[pos++] = c >> 0xC & 0x3F | 0x80;
51087 buf[pos++] = c >> 0x6 & 0x3F | 0x80;
51089 buf[pos++] = c & 0x3F | 0x80;
51095 var pointGeometry = Point;
51098 * A standalone point geometry with useful accessor, comparison, and
51099 * modification methods.
51102 * @param {Number} x the x-coordinate. this could be longitude or screen
51103 * pixels, or any other sort of unit.
51104 * @param {Number} y the y-coordinate. this could be latitude or screen
51105 * pixels, or any other sort of unit.
51107 * var point = new Point(-77, 38);
51109 function Point(x, y) {
51114 Point.prototype = {
51117 * Clone this point, returning a new point that can be modified
51118 * without affecting the old one.
51119 * @return {Point} the clone
51121 clone: function() { return new Point(this.x, this.y); },
51124 * Add this point's x & y coordinates to another point,
51125 * yielding a new point.
51126 * @param {Point} p the other point
51127 * @return {Point} output point
51129 add: function(p) { return this.clone()._add(p); },
51132 * Subtract this point's x & y coordinates to from point,
51133 * yielding a new point.
51134 * @param {Point} p the other point
51135 * @return {Point} output point
51137 sub: function(p) { return this.clone()._sub(p); },
51140 * Multiply this point's x & y coordinates by point,
51141 * yielding a new point.
51142 * @param {Point} p the other point
51143 * @return {Point} output point
51145 multByPoint: function(p) { return this.clone()._multByPoint(p); },
51148 * Divide this point's x & y coordinates by point,
51149 * yielding a new point.
51150 * @param {Point} p the other point
51151 * @return {Point} output point
51153 divByPoint: function(p) { return this.clone()._divByPoint(p); },
51156 * Multiply this point's x & y coordinates by a factor,
51157 * yielding a new point.
51158 * @param {Point} k factor
51159 * @return {Point} output point
51161 mult: function(k) { return this.clone()._mult(k); },
51164 * Divide this point's x & y coordinates by a factor,
51165 * yielding a new point.
51166 * @param {Point} k factor
51167 * @return {Point} output point
51169 div: function(k) { return this.clone()._div(k); },
51172 * Rotate this point around the 0, 0 origin by an angle a,
51174 * @param {Number} a angle to rotate around, in radians
51175 * @return {Point} output point
51177 rotate: function(a) { return this.clone()._rotate(a); },
51180 * Rotate this point around p point by an angle a,
51182 * @param {Number} a angle to rotate around, in radians
51183 * @param {Point} p Point to rotate around
51184 * @return {Point} output point
51186 rotateAround: function(a,p) { return this.clone()._rotateAround(a,p); },
51189 * Multiply this point by a 4x1 transformation matrix
51190 * @param {Array<Number>} m transformation matrix
51191 * @return {Point} output point
51193 matMult: function(m) { return this.clone()._matMult(m); },
51196 * Calculate this point but as a unit vector from 0, 0, meaning
51197 * that the distance from the resulting point to the 0, 0
51198 * coordinate will be equal to 1 and the angle from the resulting
51199 * point to the 0, 0 coordinate will be the same as before.
51200 * @return {Point} unit vector point
51202 unit: function() { return this.clone()._unit(); },
51205 * Compute a perpendicular point, where the new y coordinate
51206 * is the old x coordinate and the new x coordinate is the old y
51207 * coordinate multiplied by -1
51208 * @return {Point} perpendicular point
51210 perp: function() { return this.clone()._perp(); },
51213 * Return a version of this point with the x & y coordinates
51214 * rounded to integers.
51215 * @return {Point} rounded point
51217 round: function() { return this.clone()._round(); },
51220 * Return the magitude of this point: this is the Euclidean
51221 * distance from the 0, 0 coordinate to this point's x and y
51223 * @return {Number} magnitude
51226 return Math.sqrt(this.x * this.x + this.y * this.y);
51230 * Judge whether this point is equal to another point, returning
51232 * @param {Point} other the other point
51233 * @return {boolean} whether the points are equal
51235 equals: function(other) {
51236 return this.x === other.x &&
51237 this.y === other.y;
51241 * Calculate the distance from this point to another point
51242 * @param {Point} p the other point
51243 * @return {Number} distance
51245 dist: function(p) {
51246 return Math.sqrt(this.distSqr(p));
51250 * Calculate the distance from this point to another point,
51251 * without the square root step. Useful if you're comparing
51252 * relative distances.
51253 * @param {Point} p the other point
51254 * @return {Number} distance
51256 distSqr: function(p) {
51257 var dx = p.x - this.x,
51259 return dx * dx + dy * dy;
51263 * Get the angle from the 0, 0 coordinate to this point, in radians
51265 * @return {Number} angle
51267 angle: function() {
51268 return Math.atan2(this.y, this.x);
51272 * Get the angle from this point to another point, in radians
51273 * @param {Point} b the other point
51274 * @return {Number} angle
51276 angleTo: function(b) {
51277 return Math.atan2(this.y - b.y, this.x - b.x);
51281 * Get the angle between this point and another point, in radians
51282 * @param {Point} b the other point
51283 * @return {Number} angle
51285 angleWith: function(b) {
51286 return this.angleWithSep(b.x, b.y);
51290 * Find the angle of the two vectors, solving the formula for
51291 * the cross product a x b = |a||b|sin(θ) for θ.
51292 * @param {Number} x the x-coordinate
51293 * @param {Number} y the y-coordinate
51294 * @return {Number} the angle in radians
51296 angleWithSep: function(x, y) {
51298 this.x * y - this.y * x,
51299 this.x * x + this.y * y);
51302 _matMult: function(m) {
51303 var x = m[0] * this.x + m[1] * this.y,
51304 y = m[2] * this.x + m[3] * this.y;
51310 _add: function(p) {
51316 _sub: function(p) {
51322 _mult: function(k) {
51328 _div: function(k) {
51334 _multByPoint: function(p) {
51340 _divByPoint: function(p) {
51346 _unit: function() {
51347 this._div(this.mag());
51351 _perp: function() {
51358 _rotate: function(angle) {
51359 var cos = Math.cos(angle),
51360 sin = Math.sin(angle),
51361 x = cos * this.x - sin * this.y,
51362 y = sin * this.x + cos * this.y;
51368 _rotateAround: function(angle, p) {
51369 var cos = Math.cos(angle),
51370 sin = Math.sin(angle),
51371 x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
51372 y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
51378 _round: function() {
51379 this.x = Math.round(this.x);
51380 this.y = Math.round(this.y);
51386 * Construct a point from an array if necessary, otherwise if the input
51387 * is already a Point, or an unknown type, return it unchanged
51388 * @param {Array<Number>|Point|*} a any kind of input value
51389 * @return {Point} constructed point, or passed-through value.
51392 * var point = Point.convert([0, 1]);
51393 * // is equivalent to
51394 * var point = new Point(0, 1);
51396 Point.convert = function (a) {
51397 if (a instanceof Point) {
51400 if (Array.isArray(a)) {
51401 return new Point(a[0], a[1]);
51406 var pointGeometry$1 = /*#__PURE__*/Object.freeze({
51407 default: pointGeometry,
51408 __moduleExports: pointGeometry
51411 var Point$1 = ( pointGeometry$1 && pointGeometry ) || pointGeometry$1;
51413 var vectortilefeature = VectorTileFeature;
51415 function VectorTileFeature(pbf, end, extent, keys, values) {
51417 this.properties = {};
51418 this.extent = extent;
51423 this._geometry = -1;
51425 this._values = values;
51427 pbf.readFields(readFeature, this, end);
51430 function readFeature(tag, feature, pbf) {
51431 if (tag == 1) feature.id = pbf.readVarint();
51432 else if (tag == 2) readTag(pbf, feature);
51433 else if (tag == 3) feature.type = pbf.readVarint();
51434 else if (tag == 4) feature._geometry = pbf.pos;
51437 function readTag(pbf, feature) {
51438 var end = pbf.readVarint() + pbf.pos;
51440 while (pbf.pos < end) {
51441 var key = feature._keys[pbf.readVarint()],
51442 value = feature._values[pbf.readVarint()];
51443 feature.properties[key] = value;
51447 VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
51449 VectorTileFeature.prototype.loadGeometry = function() {
51450 var pbf = this._pbf;
51451 pbf.pos = this._geometry;
51453 var end = pbf.readVarint() + pbf.pos,
51461 while (pbf.pos < end) {
51463 var cmdLen = pbf.readVarint();
51464 cmd = cmdLen & 0x7;
51465 length = cmdLen >> 3;
51470 if (cmd === 1 || cmd === 2) {
51471 x += pbf.readSVarint();
51472 y += pbf.readSVarint();
51474 if (cmd === 1) { // moveTo
51475 if (line) lines.push(line);
51479 line.push(new Point$1(x, y));
51481 } else if (cmd === 7) {
51483 // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
51485 line.push(line[0].clone()); // closePolygon
51489 throw new Error('unknown command ' + cmd);
51493 if (line) lines.push(line);
51498 VectorTileFeature.prototype.bbox = function() {
51499 var pbf = this._pbf;
51500 pbf.pos = this._geometry;
51502 var end = pbf.readVarint() + pbf.pos,
51512 while (pbf.pos < end) {
51514 var cmdLen = pbf.readVarint();
51515 cmd = cmdLen & 0x7;
51516 length = cmdLen >> 3;
51521 if (cmd === 1 || cmd === 2) {
51522 x += pbf.readSVarint();
51523 y += pbf.readSVarint();
51524 if (x < x1) x1 = x;
51525 if (x > x2) x2 = x;
51526 if (y < y1) y1 = y;
51527 if (y > y2) y2 = y;
51529 } else if (cmd !== 7) {
51530 throw new Error('unknown command ' + cmd);
51534 return [x1, y1, x2, y2];
51537 VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
51538 var size = this.extent * Math.pow(2, z),
51539 x0 = this.extent * x,
51540 y0 = this.extent * y,
51541 coords = this.loadGeometry(),
51542 type = VectorTileFeature.types[this.type],
51545 function project(line) {
51546 for (var j = 0; j < line.length; j++) {
51547 var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
51549 (p.x + x0) * 360 / size - 180,
51550 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
51555 switch (this.type) {
51558 for (i = 0; i < coords.length; i++) {
51559 points[i] = coords[i][0];
51566 for (i = 0; i < coords.length; i++) {
51567 project(coords[i]);
51572 coords = classifyRings(coords);
51573 for (i = 0; i < coords.length; i++) {
51574 for (j = 0; j < coords[i].length; j++) {
51575 project(coords[i][j]);
51581 if (coords.length === 1) {
51582 coords = coords[0];
51584 type = 'Multi' + type;
51591 coordinates: coords
51593 properties: this.properties
51596 if ('id' in this) {
51597 result.id = this.id;
51603 // classifies an array of rings into polygons with outer rings and holes
51605 function classifyRings(rings) {
51606 var len = rings.length;
51608 if (len <= 1) return [rings];
51614 for (var i = 0; i < len; i++) {
51615 var area = signedArea(rings[i]);
51616 if (area === 0) continue;
51618 if (ccw === undefined) ccw = area < 0;
51620 if (ccw === area < 0) {
51621 if (polygon) polygons.push(polygon);
51622 polygon = [rings[i]];
51625 polygon.push(rings[i]);
51628 if (polygon) polygons.push(polygon);
51633 function signedArea(ring) {
51635 for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
51638 sum += (p2.x - p1.x) * (p1.y + p2.y);
51643 var vectortilelayer = VectorTileLayer;
51645 function VectorTileLayer(pbf, end) {
51649 this.extent = 4096;
51656 this._features = [];
51658 pbf.readFields(readLayer, this, end);
51660 this.length = this._features.length;
51663 function readLayer(tag, layer, pbf) {
51664 if (tag === 15) layer.version = pbf.readVarint();
51665 else if (tag === 1) layer.name = pbf.readString();
51666 else if (tag === 5) layer.extent = pbf.readVarint();
51667 else if (tag === 2) layer._features.push(pbf.pos);
51668 else if (tag === 3) layer._keys.push(pbf.readString());
51669 else if (tag === 4) layer._values.push(readValueMessage(pbf));
51672 function readValueMessage(pbf) {
51674 end = pbf.readVarint() + pbf.pos;
51676 while (pbf.pos < end) {
51677 var tag = pbf.readVarint() >> 3;
51679 value = tag === 1 ? pbf.readString() :
51680 tag === 2 ? pbf.readFloat() :
51681 tag === 3 ? pbf.readDouble() :
51682 tag === 4 ? pbf.readVarint64() :
51683 tag === 5 ? pbf.readVarint() :
51684 tag === 6 ? pbf.readSVarint() :
51685 tag === 7 ? pbf.readBoolean() : null;
51691 // return feature `i` from this layer as a `VectorTileFeature`
51692 VectorTileLayer.prototype.feature = function(i) {
51693 if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
51695 this._pbf.pos = this._features[i];
51697 var end = this._pbf.readVarint() + this._pbf.pos;
51698 return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
51701 var vectortile = VectorTile;
51703 function VectorTile(pbf, end) {
51704 this.layers = pbf.readFields(readTile, {}, end);
51707 function readTile(tag, layers, pbf) {
51709 var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
51710 if (layer.length) layers[layer.name] = layer;
51714 var VectorTile$1 = vectortile;
51715 var VectorTileFeature$1 = vectortilefeature;
51716 var VectorTileLayer$1 = vectortilelayer;
51719 VectorTile: VectorTile$1,
51720 VectorTileFeature: VectorTileFeature$1,
51721 VectorTileLayer: VectorTileLayer$1
51724 var tiler$4 = utilTiler().tileSize(512).margin(1);
51725 var dispatch$5 = dispatch('loadedData');
51729 function abortRequest$4(i) {
51734 function vtToGeoJSON(data, tile, mergeCache) {
51735 var vectorTile$$1 = new vectorTile.VectorTile(new pbf(data.response));
51736 var layers = Object.keys(vectorTile$$1.layers);
51737 if (!Array.isArray(layers)) { layers = [layers]; }
51740 layers.forEach(function(layerID) {
51741 var layer = vectorTile$$1.layers[layerID];
51743 for (var i = 0; i < layer.length; i++) {
51744 var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
51745 var geometry = feature.geometry;
51747 // Treat all Polygons as MultiPolygons
51748 if (geometry.type === 'Polygon') {
51749 geometry.type = 'MultiPolygon';
51750 geometry.coordinates = [geometry.coordinates];
51753 // Clip to tile bounds
51754 if (geometry.type === 'MultiPolygon') {
51755 var isClipped = false;
51756 var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
51757 if (!isEqual(feature.geometry, featureClip.geometry)) {
51758 // feature = featureClip;
51761 if (!feature.geometry.coordinates.length) continue; // not actually on this tile
51762 if (!feature.geometry.coordinates[0].length) continue; // not actually on this tile
51765 // Generate some unique IDs and add some metadata
51766 var featurehash = utilHashcode(fastJsonStableStringify(feature));
51767 var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
51768 feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
51769 feature.__featurehash__ = featurehash;
51770 feature.__propertyhash__ = propertyhash;
51771 features.push(feature);
51773 // Clipped Polygons at same zoom with identical properties can get merged
51774 if (isClipped && geometry.type === 'MultiPolygon') {
51775 var merged = mergeCache[propertyhash];
51776 if (merged && merged.length) {
51777 var other = merged[0];
51778 var coords = martinez.union(
51779 feature.geometry.coordinates, other.geometry.coordinates
51782 if (!coords || !coords.length) {
51783 continue; // something failed in martinez union
51786 merged.push(feature);
51787 for (var j = 0; j < merged.length; j++) { // all these features get...
51788 merged[j].geometry.coordinates = coords; // same coords
51789 merged[j].__featurehash__ = featurehash; // same hash, so deduplication works
51792 mergeCache[propertyhash] = [feature];
51803 function loadTile(source, tile) {
51804 if (source.loaded[tile.id] || source.inflight[tile.id]) return;
51806 var url = source.template
51807 .replace('{x}', tile.xyz[0])
51808 .replace('{y}', tile.xyz[1])
51809 // TMS-flipped y coordinate
51810 .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
51811 .replace(/\{z(oom)?\}/, tile.xyz[2])
51812 .replace(/\{switch:([^}]+)\}/, function(s, r) {
51813 var subdomains = r.split(',');
51814 return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
51817 source.inflight[tile.id] = request(url)
51818 .responseType('arraybuffer')
51819 .get(function(err, data) {
51820 source.loaded[tile.id] = [];
51821 delete source.inflight[tile.id];
51822 if (err || !data) return;
51824 var z = tile.xyz[2];
51825 if (!source.canMerge[z]) {
51826 source.canMerge[z] = {}; // initialize mergeCache
51829 source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
51830 dispatch$5.call('loadedData');
51835 var serviceVectorTile = {
51842 this.event = utilRebind(this, dispatch$5, 'on');
51846 reset: function() {
51847 for (var sourceID in _vtCache) {
51848 var source = _vtCache[sourceID];
51849 if (source && source.inflight) {
51850 forEach(source.inflight, abortRequest$4);
51858 addSource: function(sourceID, template) {
51859 _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
51860 return _vtCache[sourceID];
51864 data: function(sourceID, projection) {
51865 var source = _vtCache[sourceID];
51866 if (!source) return [];
51868 var tiles = tiler$4.getTiles(projection);
51872 for (var i = 0; i < tiles.length; i++) {
51873 var features = source.loaded[tiles[i].id];
51874 if (!features || !features.length) continue;
51876 for (var j = 0; j < features.length; j++) {
51877 var feature = features[j];
51878 var hash = feature.__featurehash__;
51879 if (seen[hash]) continue;
51882 // return a shallow clone, because the hash may change
51883 // later if this feature gets merged with another
51884 results.push(clone(feature));
51892 loadTiles: function(sourceID, template, projection) {
51893 var source = _vtCache[sourceID];
51895 source = this.addSource(sourceID, template);
51898 var tiles = tiler$4.getTiles(projection);
51900 // abort inflight requests that are no longer needed
51901 forEach(source.inflight, function(v, k) {
51902 var wanted = find$1(tiles, function(tile) { return k === tile.id; });
51906 delete source.inflight[k];
51910 tiles.forEach(function(tile) {
51911 loadTile(source, tile);
51916 cache: function() {
51922 var endpoint = 'https://www.wikidata.org/w/api.php?';
51924 var serviceWikidata = {
51926 init: function() {},
51927 reset: function() {},
51930 // Given a Wikipedia language and article title, return an array of
51931 // corresponding Wikidata entities.
51932 itemsByTitle: function(lang, title, callback) {
51938 lang = lang || 'en';
51939 d3_json(endpoint + utilQsString({
51940 action: 'wbgetentities',
51942 sites: lang.replace(/-/g, '_') + 'wiki',
51944 languages: 'en', // shrink response by filtering to one language
51946 }), function(err, data) {
51947 if (err || !data || data.error) {
51950 callback(title, data.entities || {});
51957 var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
51959 var serviceWikipedia = {
51961 init: function() {},
51962 reset: function() {},
51965 search: function(lang, query, callback) {
51971 lang = lang || 'en';
51972 d3_json(endpoint$1.replace('en', lang) +
51977 srinfo: 'suggestion',
51981 }), function(err, data) {
51982 if (err || !data || !data.query || !data.query.search || data.error) {
51985 var results = data.query.search.map(function(d) { return d.title; });
51986 callback(query, results);
51993 suggestions: function(lang, query, callback) {
51999 lang = lang || 'en';
52000 d3_json(endpoint$1.replace('en', lang) +
52002 action: 'opensearch',
52008 }), function(err, data) {
52009 if (err || !data || data.error) {
52012 callback(data[0], data[1] || []);
52019 translations: function(lang, title, callback) {
52025 d3_json(endpoint$1.replace('en', lang) +
52033 }), function(err, data) {
52034 if (err || !data || !data.query || !data.query.pages || data.error) {
52037 var list = data.query.pages[Object.keys(data.query.pages)[0]],
52039 if (list && list.langlinks) {
52040 list.langlinks.forEach(function(d) {
52041 translations[d.lang] = d['*'];
52044 callback(translations);
52053 geocoder: serviceNominatim,
52054 mapillary: serviceMapillary,
52055 openstreetcam: serviceOpenstreetcam,
52057 streetside: serviceStreetside,
52058 taginfo: serviceTaginfo,
52059 vectorTile: serviceVectorTile,
52060 wikidata: serviceWikidata,
52061 wikipedia: serviceWikipedia
52064 function modeAddNote$$1(context) {
52069 title: t('modes.add_note.title'),
52070 description: t('modes.add_note.description'),
52074 var behavior = behaviorDraw(context)
52075 .tail(t('modes.add_note.tail'))
52077 .on('cancel', cancel)
52078 .on('finish', cancel);
52081 function add(loc) {
52082 var osm = services.osm;
52085 var note = osmNote({ loc: loc, status: 'open', comments: [] });
52086 osm.replaceNote(note);
52088 // force a reraw (there is no history change that would otherwise do this)
52089 context.pan([0,0]);
52092 .selectedNoteID(note.id)
52093 .enter(modeSelectNote$$1(context, note.id).newFeature(true));
52097 function cancel() {
52098 context.enter(modeBrowse(context));
52102 mode.enter = function() {
52103 context.install(behavior);
52107 mode.exit = function() {
52108 context.uninstall(behavior);
52115 function modeDragNode$$1(context) {
52120 var hover = behaviorHover(context).altDisables(true)
52121 .on('hover', context.ui().sidebar.hover);
52122 var edit = behaviorEdit(context);
52124 var _nudgeInterval;
52125 var _restoreSelectedIDs = [];
52126 var _wasMidpoint = false;
52127 var _isCancelled = false;
52133 function startNudge(entity, nudge) {
52134 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
52135 _nudgeInterval = window.setInterval(function() {
52136 context.pan(nudge);
52137 doMove(entity, nudge);
52142 function stopNudge() {
52143 if (_nudgeInterval) {
52144 window.clearInterval(_nudgeInterval);
52145 _nudgeInterval = null;
52150 function moveAnnotation(entity) {
52151 return t('operations.move.annotation.' + entity.geometry(context.graph()));
52155 function connectAnnotation(entity) {
52156 return t('operations.connect.annotation.' + entity.geometry(context.graph()));
52160 function origin(entity) {
52161 return context.projection(entity.loc);
52165 function keydown() {
52166 if (event.keyCode === d3keybinding.modifierCodes.alt) {
52167 if (context.surface().classed('nope')) {
52169 .classed('nope-suppressed', true);
52172 .classed('nope', false)
52173 .classed('nope-disabled', true);
52179 if (event.keyCode === d3keybinding.modifierCodes.alt) {
52180 if (context.surface().classed('nope-suppressed')) {
52182 .classed('nope', true);
52185 .classed('nope-suppressed', false)
52186 .classed('nope-disabled', false);
52191 function start(entity) {
52192 _wasMidpoint = entity.type === 'midpoint';
52193 var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
52194 _isCancelled = event.sourceEvent.shiftKey || hasHidden;
52197 if (_isCancelled) {
52201 .text(t('modes.drag_node.connected_to_hidden'))();
52203 return drag.cancel();
52206 if (_wasMidpoint) {
52207 var midpoint = entity;
52208 entity = osmNode();
52209 context.perform(actionAddMidpoint(midpoint, entity));
52210 entity = context.entity(entity.id); // get post-action entity
52212 var vertex = context.surface().selectAll('.' + entity.id);
52213 drag.target(vertex.node(), entity);
52216 context.perform(actionNoop());
52219 _activeEntity = entity;
52220 _startLoc = entity.loc;
52222 context.surface().selectAll('.' + _activeEntity.id)
52223 .classed('active', true);
52225 context.enter(mode);
52230 // - `behavior/draw.js` `datum()`
52232 var event$$1 = event && event.sourceEvent;
52233 if (!event$$1 || event$$1.altKey) {
52236 // When dragging, snap only to touch targets..
52237 // (this excludes area fills and active drawing elements)
52238 var d = event$$1.target.__data__;
52239 return (d && d.properties && d.properties.target) ? d : {};
52244 function doMove(entity, nudge) {
52245 nudge = nudge || [0, 0];
52247 var currPoint = (event && event.point) || context.projection(_lastLoc);
52248 var currMouse = geoVecSubtract(currPoint, nudge);
52249 var loc = context.projection.invert(currMouse);
52251 if (!_nudgeInterval) { // If not nudging at the edge of the viewport, try to snap..
52253 // - `mode/drag_node.js` `doMode()`
52254 // - `behavior/draw.js` `click()`
52255 // - `behavior/draw_way.js` `move()`
52257 var target = d && d.properties && d.properties.entity;
52258 var targetLoc = target && target.loc;
52259 var targetNodes = d && d.properties && d.properties.nodes;
52262 if (targetLoc) { // snap to node/vertex - a point target with `.loc`
52265 } else if (targetNodes) { // snap to way - a line target with `.nodes`
52266 edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
52274 actionMoveNode(entity.id, loc),
52275 moveAnnotation(entity)
52278 // Below here: validations
52279 var isInvalid = false;
52281 // Check if this connection to `target` could cause relations to break..
52283 isInvalid = hasRelationConflict(entity, target, edge, context.graph());
52286 // Check if this drag causes the geometry to break..
52288 isInvalid = hasInvalidGeometry(entity, context.graph());
52292 var nope = context.surface().classed('nope');
52293 if (isInvalid === 'relation' || isInvalid === 'restriction') {
52294 if (!nope) { // about to nope - show hint
52297 .text(t('operations.connect.' + isInvalid,
52298 { relation: context.presets().item('type/restriction').name() }
52302 if (nope) { // about to un-nope, remove hint
52310 var nopeDisabled = context.surface().classed('nope-disabled');
52311 if (nopeDisabled) {
52313 .classed('nope', false)
52314 .classed('nope-suppressed', isInvalid);
52317 .classed('nope', isInvalid)
52318 .classed('nope-suppressed', false);
52325 // Uses `actionConnect.disabled()` to know whether this connection is ok..
52326 function hasRelationConflict(entity, target, edge, graph) {
52327 var testGraph = graph.update(); // copy
52329 // if snapping to way - add midpoint there and consider that the target..
52331 var midpoint = osmNode();
52332 var action = actionAddMidpoint({
52334 edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
52337 testGraph = action(testGraph);
52341 // can we connect to it?
52342 var ids = [entity.id, target.id];
52343 return actionConnect(ids).disabled(testGraph);
52347 function hasInvalidGeometry(entity, graph) {
52348 var parents = graph.parentWays(entity);
52351 for (i = 0; i < parents.length; i++) {
52352 var parent = parents[i];
52354 var activeIndex = null; // which multipolygon ring contains node being dragged
52356 // test any parent multipolygons for valid geometry
52357 var relations = graph.parentRelations(parent);
52358 for (j = 0; j < relations.length; j++) {
52359 if (!relations[j].isMultipolygon()) continue;
52361 var rings = osmJoinWays(relations[j].members, graph);
52363 // find active ring and test it for self intersections
52364 for (k = 0; k < rings.length; k++) {
52365 nodes = rings[k].nodes;
52366 if (find$1(nodes, function(n) { return n.id === entity.id; })) {
52368 if (geoHasSelfIntersections(nodes, entity.id)) {
52372 rings[k].coords = nodes.map(function(n) { return n.loc; });
52375 // test active ring for intersections with other rings in the multipolygon
52376 for (k = 0; k < rings.length; k++) {
52377 if (k === activeIndex) continue;
52379 // make sure active ring doesnt cross passive rings
52380 if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
52387 // If we still haven't tested this node's parent way for self-intersections.
52388 // (because it's not a member of a multipolygon), test it now.
52389 if (activeIndex === null) {
52390 nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
52391 if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
52402 function move(entity) {
52403 if (_isCancelled) return;
52404 event.sourceEvent.stopPropagation();
52406 context.surface().classed('nope-disabled', event.sourceEvent.altKey);
52408 _lastLoc = context.projection.invert(event.point);
52411 var nudge = geoViewportEdge(event.point, context.map().dimensions());
52413 startNudge(entity, nudge);
52420 function end(entity) {
52421 if (_isCancelled) return;
52424 var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
52425 var target = d && d.properties && d.properties.entity; // entity to snap to
52427 if (nope) { // bounce back
52429 _actionBounceBack(entity.id, _startLoc)
52432 } else if (target && target.type === 'way') {
52433 var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
52435 actionAddMidpoint({
52437 edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
52439 connectAnnotation(target)
52442 } else if (target && target.type === 'node') {
52444 actionConnect([target.id, entity.id]),
52445 connectAnnotation(target)
52448 } else if (_wasMidpoint) {
52451 t('operations.add.annotation.vertex')
52457 moveAnnotation(entity)
52461 var reselection = _restoreSelectedIDs.filter(function(id) {
52462 return context.graph().hasEntity(id);
52465 if (reselection.length) {
52466 context.enter(modeSelect(context, reselection));
52468 context.enter(modeBrowse(context));
52473 function _actionBounceBack(nodeID, toLoc) {
52474 var moveNode = actionMoveNode(nodeID, toLoc);
52475 var action = function(graph, t$$1) {
52476 // last time through, pop off the bounceback perform.
52477 // it will then overwrite the initial perform with a moveNode that does nothing
52478 if (t$$1 === 1) context.pop();
52479 return moveNode(graph, t$$1);
52481 action.transitionable = true;
52486 function cancel() {
52488 context.enter(modeBrowse(context));
52492 var drag = behaviorDrag()
52493 .selector('.layer-points-targets .target')
52494 .surface(select('#map').node())
52496 .on('start', start)
52501 mode.enter = function() {
52502 context.install(hover);
52503 context.install(edit);
52506 .on('keydown.drawWay', keydown)
52507 .on('keyup.drawWay', keyup);
52510 .on('undone.drag-node', cancel);
52514 mode.exit = function() {
52515 context.ui().sidebar.hover.cancel();
52516 context.uninstall(hover);
52517 context.uninstall(edit);
52520 .on('keydown.hover', null)
52521 .on('keyup.hover', null);
52524 .on('undone.drag-node', null);
52526 _activeEntity = null;
52529 .classed('nope', false)
52530 .classed('nope-suppressed', false)
52531 .classed('nope-disabled', false)
52532 .selectAll('.active')
52533 .classed('active', false);
52539 mode.selectedIDs = function() {
52540 if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
52546 mode.activeID = function() {
52547 if (!arguments.length) return _activeEntity && _activeEntity.id;
52553 mode.restoreSelectedIDs = function(_) {
52554 if (!arguments.length) return _restoreSelectedIDs;
52555 _restoreSelectedIDs = _;
52560 mode.behavior = drag;
52566 function modeDragNote$$1(context) {
52572 var edit = behaviorEdit(context);
52574 var _nudgeInterval;
52578 function startNudge(note, nudge) {
52579 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
52580 _nudgeInterval = window.setInterval(function() {
52581 context.pan(nudge);
52582 doMove(note, nudge);
52587 function stopNudge() {
52588 if (_nudgeInterval) {
52589 window.clearInterval(_nudgeInterval);
52590 _nudgeInterval = null;
52595 function origin(note) {
52596 return context.projection(note.loc);
52600 function start(note) {
52601 context.surface().selectAll('.note-' + note.id)
52602 .classed('active', true);
52604 context.perform(actionNoop());
52605 context.enter(mode);
52606 context.selectedNoteID(note.id);
52610 function move(note) {
52611 event.sourceEvent.stopPropagation();
52612 _lastLoc = context.projection.invert(event.point);
52615 var nudge = geoViewportEdge(event.point, context.map().dimensions());
52617 startNudge(note, nudge);
52624 function doMove(note, nudge) {
52625 nudge = nudge || [0, 0];
52627 var currPoint = (event && event.point) || context.projection(_lastLoc);
52628 var currMouse = geoVecSubtract(currPoint, nudge);
52629 var loc = context.projection.invert(currMouse);
52631 note = note.move(loc);
52633 var osm = services.osm;
52635 osm.replaceNote(note); // update note cache
52638 context.replace(actionNoop()); // trigger redraw
52642 function end(note) {
52643 context.replace(actionNoop()); // trigger redraw
52646 .selectedNoteID(note.id)
52647 .enter(modeSelectNote$$1(context, note.id));
52651 var drag = behaviorDrag()
52652 .selector('.layer-notes .new')
52653 .surface(select('#map').node())
52655 .on('start', start)
52660 mode.enter = function() {
52661 context.install(edit);
52665 mode.exit = function() {
52666 context.ui().sidebar.hover.cancel();
52667 context.uninstall(edit);
52670 .selectAll('.active')
52671 .classed('active', false);
52676 mode.behavior = drag;
52681 function modeBrowse(context) {
52685 title: t('modes.browse.title'),
52686 description: t('modes.browse.description')
52690 behaviorPaste(context),
52691 behaviorHover(context).on('hover', context.ui().sidebar.hover),
52692 behaviorSelect(context),
52693 behaviorLasso(context),
52694 modeDragNode$$1(context).behavior,
52695 modeDragNote$$1(context).behavior
52699 mode.enter = function() {
52700 behaviors.forEach(context.install);
52702 // Get focus on the body.
52703 if (document.activeElement && document.activeElement.blur) {
52704 document.activeElement.blur();
52708 context.ui().sidebar.show(sidebar);
52710 context.ui().sidebar.select(null);
52715 mode.exit = function() {
52716 context.ui().sidebar.hover.cancel();
52717 behaviors.forEach(context.uninstall);
52720 context.ui().sidebar.hide();
52725 mode.sidebar = function(_) {
52726 if (!arguments.length) return sidebar;
52735 function modeDrawArea(context, wayId, startGraph) {
52744 mode.enter = function() {
52745 var way = context.entity(wayId);
52747 behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
52748 .tail(t('modes.draw_area.tail'));
52750 var addNode = behavior.addNode;
52752 behavior.addNode = function(node, d) {
52753 var length = way.nodes.length;
52754 var penultimate = length > 2 ? way.nodes[length - 2] : null;
52756 if (node.id === way.first() || node.id === penultimate) {
52763 context.install(behavior);
52767 mode.exit = function() {
52768 context.uninstall(behavior);
52772 mode.selectedIDs = function() {
52777 mode.activeID = function() {
52778 return (behavior && behavior.activeID()) || [];
52785 function modeDrawLine(context, wayId, startGraph, affix) {
52794 mode.enter = function() {
52795 var way = context.entity(wayId);
52796 var index = (affix === 'prefix') ? 0 : undefined;
52797 var headId = (affix === 'prefix') ? way.first() : way.last();
52799 behavior = behaviorDrawWay(context, wayId, index, mode, startGraph)
52800 .tail(t('modes.draw_line.tail'));
52802 var addNode = behavior.addNode;
52803 behavior.addNode = function(node, d) {
52804 if (node.id === headId) {
52811 context.install(behavior);
52815 mode.exit = function() {
52816 context.uninstall(behavior);
52820 mode.selectedIDs = function() {
52825 mode.activeID = function() {
52826 return (behavior && behavior.activeID()) || [];
52832 function operationCircularize(selectedIDs, context) {
52833 var entityId = selectedIDs[0],
52834 entity = context.entity(entityId),
52835 extent = entity.extent(context.graph()),
52836 geometry = context.geometry(entityId),
52837 action = actionCircularize(entityId, context.projection);
52840 var operation = function() {
52841 context.perform(action, operation.annotation());
52845 operation.available = function() {
52846 return selectedIDs.length === 1 &&
52847 entity.type === 'way' &&
52848 uniq(entity.nodes).length > 1;
52852 operation.disabled = function() {
52854 if (extent.percentContainedIn(context.extent()) < 0.8) {
52855 reason = 'too_large';
52856 } else if (context.hasHiddenConnections(entityId)) {
52857 reason = 'connected_to_hidden';
52859 return action.disabled(context.graph()) || reason;
52863 operation.tooltip = function() {
52864 var disable = operation.disabled();
52866 t('operations.circularize.' + disable) :
52867 t('operations.circularize.description.' + geometry);
52871 operation.annotation = function() {
52872 return t('operations.circularize.annotation.' + geometry);
52876 operation.id = 'circularize';
52877 operation.keys = [t('operations.circularize.key')];
52878 operation.title = t('operations.circularize.title');
52879 operation.behavior = behaviorOperation(context).which(operation);
52884 function operationContinue(selectedIDs, context) {
52885 var graph = context.graph(),
52886 entities = selectedIDs.map(function(id) { return graph.entity(id); }),
52887 geometries = assignIn({ line: [], vertex: [] },
52888 groupBy(entities, function(entity) { return entity.geometry(graph); })),
52889 vertex = geometries.vertex[0];
52892 function candidateWays() {
52893 return graph.parentWays(vertex).filter(function(parent) {
52894 return parent.geometry(graph) === 'line' &&
52895 !parent.isClosed() &&
52896 parent.affix(vertex.id) &&
52897 (geometries.line.length === 0 || geometries.line[0] === parent);
52902 var operation = function() {
52903 var candidate = candidateWays()[0];
52905 modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
52910 operation.available = function() {
52911 return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
52912 !context.features().hasHiddenConnections(vertex, context.graph());
52916 operation.disabled = function() {
52917 var candidates = candidateWays();
52918 if (candidates.length === 0)
52919 return 'not_eligible';
52920 if (candidates.length > 1)
52925 operation.tooltip = function() {
52926 var disable = operation.disabled();
52928 t('operations.continue.' + disable) :
52929 t('operations.continue.description');
52933 operation.annotation = function() {
52934 return t('operations.continue.annotation.line');
52938 operation.id = 'continue';
52939 operation.keys = [t('operations.continue.key')];
52940 operation.title = t('operations.continue.title');
52941 operation.behavior = behaviorOperation(context).which(operation);
52946 function operationDelete(selectedIDs, context) {
52947 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
52948 action = actionDeleteMultiple(selectedIDs),
52949 extent = selectedIDs.reduce(function(extent, id) {
52950 return extent.extend(context.entity(id).extent(context.graph()));
52951 }, geoExtent$$1());
52954 var operation = function() {
52955 var nextSelectedID;
52956 var nextSelectedLoc;
52958 if (selectedIDs.length === 1) {
52959 var id = selectedIDs[0],
52960 entity = context.entity(id),
52961 geometry = context.geometry(id),
52962 parents = context.graph().parentWays(entity),
52963 parent = parents[0];
52965 // Select the next closest node in the way.
52966 if (geometry === 'vertex') {
52967 var nodes = parent.nodes,
52968 i = nodes.indexOf(id);
52972 } else if (i === nodes.length - 1) {
52975 var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
52976 b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
52977 i = a < b ? i - 1 : i + 1;
52980 nextSelectedID = nodes[i];
52981 nextSelectedLoc = context.entity(nextSelectedID).loc;
52985 context.perform(action, operation.annotation());
52987 if (nextSelectedID && nextSelectedLoc) {
52988 if (context.hasEntity(nextSelectedID)) {
52989 context.enter(modeSelect(context, [nextSelectedID]).follow(true));
52991 context.map().centerEase(nextSelectedLoc);
52992 context.enter(modeBrowse(context));
52995 context.enter(modeBrowse(context));
53001 operation.available = function() {
53006 operation.disabled = function() {
53008 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53009 reason = 'too_large';
53010 } else if (some(selectedIDs, context.hasHiddenConnections)) {
53011 reason = 'connected_to_hidden';
53012 } else if (some(selectedIDs, protectedMember)) {
53013 reason = 'part_of_relation';
53014 } else if (some(selectedIDs, incompleteRelation)) {
53015 reason = 'incomplete_relation';
53019 function incompleteRelation(id) {
53020 var entity = context.entity(id);
53021 return entity.type === 'relation' && !entity.isComplete(context.graph());
53024 function protectedMember(id) {
53025 var entity = context.entity(id);
53026 if (entity.type !== 'way') return false;
53028 var parents = context.graph().parentRelations(entity);
53029 for (var i = 0; i < parents.length; i++) {
53030 var parent = parents[i],
53031 type = parent.tags.type,
53032 role = parent.memberById(id).role || 'outer';
53033 if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
53043 operation.tooltip = function() {
53044 var disable = operation.disabled();
53046 t('operations.delete.' + disable + '.' + multi) :
53047 t('operations.delete.description' + '.' + multi);
53051 operation.annotation = function() {
53052 return selectedIDs.length === 1 ?
53053 t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
53054 t('operations.delete.annotation.multiple', { n: selectedIDs.length });
53058 operation.id = 'delete';
53059 operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
53060 operation.title = t('operations.delete.title');
53061 operation.behavior = behaviorOperation(context).which(operation);
53066 function operationDisconnect(selectedIDs, context) {
53067 var vertices = filter(selectedIDs, function(entityId) {
53068 return context.geometry(entityId) === 'vertex';
53071 var entityId = vertices[0],
53072 action = actionDisconnect(entityId);
53074 if (selectedIDs.length > 1) {
53075 action.limitWays(without(selectedIDs, entityId));
53079 var operation = function() {
53080 context.perform(action, operation.annotation());
53084 operation.available = function() {
53085 return vertices.length === 1;
53089 operation.disabled = function() {
53091 if (some(selectedIDs, context.hasHiddenConnections)) {
53092 reason = 'connected_to_hidden';
53094 return action.disabled(context.graph()) || reason;
53098 operation.tooltip = function() {
53099 var disable = operation.disabled();
53101 t('operations.disconnect.' + disable) :
53102 t('operations.disconnect.description');
53106 operation.annotation = function() {
53107 return t('operations.disconnect.annotation');
53111 operation.id = 'disconnect';
53112 operation.keys = [t('operations.disconnect.key')];
53113 operation.title = t('operations.disconnect.title');
53114 operation.behavior = behaviorOperation(context).which(operation);
53119 function operationMerge(selectedIDs, context) {
53121 function updatePresetTags(newGraph, ids) {
53123 var newEntity = newGraph.hasEntity(id);
53125 if (!newEntity) return;
53126 var newPreset = context.presets().match(newEntity, newGraph);
53127 context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
53131 var join = actionJoin(selectedIDs);
53132 var merge = actionMerge(selectedIDs);
53133 var mergePolygon = actionMergePolygon(selectedIDs);
53134 var mergeNodes = actionMergeNodes(selectedIDs);
53137 var operation = function() {
53141 if (!join.disabled(context.graph())) {
53142 doUpdateTags = false;
53144 } else if (!merge.disabled(context.graph())) {
53145 doUpdateTags = true;
53147 } else if (!mergePolygon.disabled(context.graph())) {
53148 doUpdateTags = false;
53149 action = mergePolygon;
53151 doUpdateTags = true;
53152 action = mergeNodes;
53155 context.perform(action, operation.annotation());
53157 var ids = selectedIDs.filter(function(id) {
53158 var entity = context.hasEntity(id);
53159 return entity && entity.type !== 'node';
53162 // if we merged tags, rematch preset to update tags if necessary (#3851)
53163 if (doUpdateTags) {
53164 updatePresetTags(context.graph(), ids);
53167 context.enter(modeSelect(context, ids));
53171 operation.available = function() {
53172 return selectedIDs.length >= 2;
53176 operation.disabled = function() {
53177 return join.disabled(context.graph()) &&
53178 merge.disabled(context.graph()) &&
53179 mergePolygon.disabled(context.graph()) &&
53180 mergeNodes.disabled(context.graph());
53184 operation.tooltip = function() {
53185 var j = join.disabled(context.graph()); // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
53186 var m = merge.disabled(context.graph()); // 'not_eligible'
53187 var p = mergePolygon.disabled(context.graph()); // 'not_eligible', 'incomplete_relation'
53188 var n = mergeNodes.disabled(context.graph()); // 'not_eligible', 'relation', 'restriction'
53190 // disabled for one of various reasons
53191 if (j && m && p && n) {
53192 if (j === 'restriction' || n === 'restriction') {
53193 return t('operations.merge.restriction',
53194 { relation: context.presets().item('type/restriction').name() });
53196 } else if (p === 'incomplete_relation') {
53197 return t('operations.merge.incomplete_relation');
53199 } else if (n === 'relation') {
53200 return t('operations.merge.relation');
53203 return t('operations.merge.' + j);
53207 return t('operations.merge.description');
53212 operation.annotation = function() {
53213 return t('operations.merge.annotation', { n: selectedIDs.length });
53217 operation.id = 'merge';
53218 operation.keys = [t('operations.merge.key')];
53219 operation.title = t('operations.merge.title');
53220 operation.behavior = behaviorOperation(context).which(operation);
53225 function operationMove(selectedIDs, context) {
53226 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
53227 var extent = selectedIDs.reduce(function(extent, id) {
53228 return extent.extend(context.entity(id).extent(context.graph()));
53229 }, geoExtent$$1());
53232 var operation = function() {
53233 context.enter(modeMove$$1(context, selectedIDs));
53237 operation.available = function() {
53238 return selectedIDs.length > 1 ||
53239 context.entity(selectedIDs[0]).type !== 'node';
53243 operation.disabled = function() {
53245 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53246 reason = 'too_large';
53247 } else if (some(selectedIDs, context.hasHiddenConnections)) {
53248 reason = 'connected_to_hidden';
53249 } else if (some(selectedIDs, incompleteRelation)) {
53250 reason = 'incomplete_relation';
53254 function incompleteRelation(id) {
53255 var entity = context.entity(id);
53256 return entity.type === 'relation' && !entity.isComplete(context.graph());
53261 operation.tooltip = function() {
53262 var disable = operation.disabled();
53264 t('operations.move.' + disable + '.' + multi) :
53265 t('operations.move.description.' + multi);
53269 operation.annotation = function() {
53270 return selectedIDs.length === 1 ?
53271 t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
53272 t('operations.move.annotation.multiple');
53276 operation.id = 'move';
53277 operation.keys = [t('operations.move.key')];
53278 operation.title = t('operations.move.title');
53279 operation.behavior = behaviorOperation(context).which(operation);
53284 function operationOrthogonalize(selectedIDs, context) {
53285 var entityId = selectedIDs[0],
53286 entity = context.entity(entityId),
53287 extent = entity.extent(context.graph()),
53288 geometry = context.geometry(entityId),
53289 action = actionOrthogonalize(entityId, context.projection);
53292 var operation = function() {
53293 context.perform(action, operation.annotation());
53297 operation.available = function() {
53298 return selectedIDs.length === 1 &&
53299 entity.type === 'way' &&
53300 entity.isClosed() &&
53301 uniq(entity.nodes).length > 2;
53305 operation.disabled = function() {
53307 if (extent.percentContainedIn(context.extent()) < 0.8) {
53308 reason = 'too_large';
53309 } else if (context.hasHiddenConnections(entityId)) {
53310 reason = 'connected_to_hidden';
53312 return action.disabled(context.graph()) || reason;
53316 operation.tooltip = function() {
53317 var disable = operation.disabled();
53319 t('operations.orthogonalize.' + disable) :
53320 t('operations.orthogonalize.description.' + geometry);
53324 operation.annotation = function() {
53325 return t('operations.orthogonalize.annotation.' + geometry);
53329 operation.id = 'orthogonalize';
53330 operation.keys = [t('operations.orthogonalize.key')];
53331 operation.title = t('operations.orthogonalize.title');
53332 operation.behavior = behaviorOperation(context).which(operation);
53338 * This method is like `_.uniq` except that it accepts `iteratee` which is
53339 * invoked for each element in `array` to generate the criterion by which
53340 * uniqueness is computed. The order of result values is determined by the
53341 * order they occur in the array. The iteratee is invoked with one argument:
53348 * @param {Array} array The array to inspect.
53349 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
53350 * @returns {Array} Returns the new duplicate free array.
53353 * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
53356 * // The `_.property` iteratee shorthand.
53357 * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
53358 * // => [{ 'x': 1 }, { 'x': 2 }]
53360 function uniqBy(array, iteratee) {
53361 return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
53364 function operationReflectShort(selectedIDs, context) {
53365 return operationReflect(selectedIDs, context, 'short');
53369 function operationReflectLong(selectedIDs, context) {
53370 return operationReflect(selectedIDs, context, 'long');
53374 function operationReflect(selectedIDs, context, axis) {
53375 axis = axis || 'long';
53376 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
53377 extent = selectedIDs.reduce(function(extent, id) {
53378 return extent.extend(context.entity(id).extent(context.graph()));
53379 }, geoExtent$$1());
53382 var operation = function() {
53383 var action = actionReflect(selectedIDs, context.projection)
53384 .useLongAxis(Boolean(axis === 'long'));
53385 context.perform(action, operation.annotation());
53389 operation.available = function() {
53390 var nodes = utilGetAllNodes(selectedIDs, context.graph());
53391 return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
53395 operation.disabled = function() {
53397 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53398 reason = 'too_large';
53399 } else if (some(selectedIDs, context.hasHiddenConnections)) {
53400 reason = 'connected_to_hidden';
53401 } else if (some(selectedIDs, incompleteRelation)) {
53402 reason = 'incomplete_relation';
53406 function incompleteRelation(id) {
53407 var entity = context.entity(id);
53408 return entity.type === 'relation' && !entity.isComplete(context.graph());
53413 operation.tooltip = function() {
53414 var disable = operation.disabled();
53416 t('operations.reflect.' + disable + '.' + multi) :
53417 t('operations.reflect.description.' + axis + '.' + multi);
53421 operation.annotation = function() {
53422 return t('operations.reflect.annotation.' + axis + '.' + multi);
53426 operation.id = 'reflect-' + axis;
53427 operation.keys = [t('operations.reflect.key.' + axis)];
53428 operation.title = t('operations.reflect.title.' + axis);
53429 operation.behavior = behaviorOperation(context).which(operation);
53434 function operationReverse(selectedIDs, context) {
53435 var entityId = selectedIDs[0];
53437 var operation = function() {
53438 context.perform(actionReverse(entityId), operation.annotation());
53442 operation.available = function() {
53443 return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
53447 operation.disabled = function() {
53452 operation.tooltip = function() {
53453 return t('operations.reverse.description');
53457 operation.annotation = function() {
53458 return t('operations.reverse.annotation');
53462 operation.id = 'reverse';
53463 operation.keys = [t('operations.reverse.key')];
53464 operation.title = t('operations.reverse.title');
53465 operation.behavior = behaviorOperation(context).which(operation);
53470 function operationRotate(selectedIDs, context) {
53471 var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
53472 extent = selectedIDs.reduce(function(extent, id) {
53473 return extent.extend(context.entity(id).extent(context.graph()));
53474 }, geoExtent$$1());
53477 var operation = function() {
53478 context.enter(modeRotate$$1(context, selectedIDs));
53482 operation.available = function() {
53483 var nodes = utilGetAllNodes(selectedIDs, context.graph());
53484 return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
53488 operation.disabled = function() {
53490 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53491 reason = 'too_large';
53492 } else if (some(selectedIDs, context.hasHiddenConnections)) {
53493 reason = 'connected_to_hidden';
53494 } else if (some(selectedIDs, incompleteRelation)) {
53495 reason = 'incomplete_relation';
53499 function incompleteRelation(id) {
53500 var entity = context.entity(id);
53501 return entity.type === 'relation' && !entity.isComplete(context.graph());
53506 operation.tooltip = function() {
53507 var disable = operation.disabled();
53509 t('operations.rotate.' + disable + '.' + multi) :
53510 t('operations.rotate.description.' + multi);
53514 operation.annotation = function() {
53515 return selectedIDs.length === 1 ?
53516 t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
53517 t('operations.rotate.annotation.multiple');
53521 operation.id = 'rotate';
53522 operation.keys = [t('operations.rotate.key')];
53523 operation.title = t('operations.rotate.title');
53524 operation.behavior = behaviorOperation(context).which(operation);
53529 function operationSplit(selectedIDs, context) {
53530 var vertices = filter(selectedIDs, function(entityId) {
53531 return context.geometry(entityId) === 'vertex';
53534 var entityId = vertices[0],
53535 action = actionSplit(entityId),
53538 if (vertices.length === 1) {
53539 if (selectedIDs.length > 1) {
53540 action.limitWays(without(selectedIDs, entityId));
53542 ways = action.ways(context.graph());
53546 var operation = function() {
53547 var difference = context.perform(action, operation.annotation());
53548 context.enter(modeSelect(context, difference.extantIDs()));
53552 operation.available = function() {
53553 return vertices.length === 1;
53557 operation.disabled = function() {
53559 if (some(selectedIDs, context.hasHiddenConnections)) {
53560 reason = 'connected_to_hidden';
53562 return action.disabled(context.graph()) || reason;
53566 operation.tooltip = function() {
53567 var disable = operation.disabled();
53569 return t('operations.split.' + disable);
53571 if (ways.length === 1) {
53572 return t('operations.split.description.' + context.geometry(ways[0].id));
53574 return t('operations.split.description.multiple');
53579 operation.annotation = function() {
53580 return ways.length === 1 ?
53581 t('operations.split.annotation.' + context.geometry(ways[0].id)) :
53582 t('operations.split.annotation.multiple', { n: ways.length });
53586 operation.id = 'split';
53587 operation.keys = [t('operations.split.key')];
53588 operation.title = t('operations.split.title');
53589 operation.behavior = behaviorOperation(context).which(operation);
53594 function operationStraighten(selectedIDs, context) {
53595 var entityId = selectedIDs[0],
53596 action = actionStraighten(entityId, context.projection);
53599 function operation() {
53600 context.perform(action, operation.annotation());
53604 operation.available = function() {
53605 var entity = context.entity(entityId);
53606 return selectedIDs.length === 1 &&
53607 entity.type === 'way' &&
53608 !entity.isClosed() &&
53609 uniq(entity.nodes).length > 2;
53613 operation.disabled = function() {
53615 if (context.hasHiddenConnections(entityId)) {
53616 reason = 'connected_to_hidden';
53618 return action.disabled(context.graph()) || reason;
53622 operation.tooltip = function() {
53623 var disable = operation.disabled();
53625 t('operations.straighten.' + disable) :
53626 t('operations.straighten.description');
53630 operation.annotation = function() {
53631 return t('operations.straighten.annotation');
53635 operation.id = 'straighten';
53636 operation.keys = [t('operations.straighten.key')];
53637 operation.title = t('operations.straighten.title');
53638 operation.behavior = behaviorOperation(context).which(operation);
53643 function operationDetachNode(selectedIDs, context) {
53644 var nodeID = selectedIDs.length && selectedIDs[0];
53645 var action = actionDetachNode(nodeID);
53647 var operation = function () {
53648 context.perform(action); // do the detach
53650 var mouse = context.map().mouseCoordinates();
53651 if (mouse.some(isNaN)) {
53655 // move detached node to the mouse location (transitioned)
53656 context.perform(actionMoveNode(nodeID, mouse));
53658 // after transition completes, put at final mouse location and enter move mode.
53659 window.setTimeout(function() {
53660 mouse = context.map().mouseCoordinates();
53661 context.replace(actionMoveNode(nodeID, mouse));
53666 function enterMoveMode() {
53667 var baseGraph = context.graph();
53668 context.enter(modeMove$$1(context, [nodeID], baseGraph));
53673 operation.available = function () {
53674 if (selectedIDs.length !== 1) return false;
53676 var graph = context.graph();
53677 var entity = graph.hasEntity(nodeID);
53678 if (!entity) return false;
53680 return entity.type === 'node' &&
53681 entity.hasInterestingTags() &&
53682 graph.parentWays(entity).length > 0;
53686 operation.disabled = function () {
53688 if (some(selectedIDs, context.hasHiddenConnections)) {
53689 reason = 'connected_to_hidden';
53691 return action.disabled(context.graph()) || reason;
53695 operation.tooltip = function () {
53696 var disableReason = operation.disabled();
53697 if (disableReason) {
53698 return t('operations.detach_node.' + disableReason,
53699 { relation: context.presets().item('type/restriction').name() });
53701 return t('operations.detach_node.description');
53706 operation.annotation = function () {
53707 return t('operations.detach_node.annotation');
53711 operation.id = 'detach-node';
53712 operation.keys = [t('operations.detach_node.key')];
53713 operation.title = t('operations.detach_node.title');
53714 operation.behavior = behaviorOperation(context).which(operation);
53722 var Operations = /*#__PURE__*/Object.freeze({
53723 operationCircularize: operationCircularize,
53724 operationContinue: operationContinue,
53725 operationDelete: operationDelete,
53726 operationDisconnect: operationDisconnect,
53727 operationMerge: operationMerge,
53728 operationMove: operationMove,
53729 operationOrthogonalize: operationOrthogonalize,
53730 operationReflectShort: operationReflectShort,
53731 operationReflectLong: operationReflectLong,
53732 operationReverse: operationReverse,
53733 operationRotate: operationRotate,
53734 operationSplit: operationSplit,
53735 operationStraighten: operationStraighten,
53736 operationDetachNode: operationDetachNode
53739 function modeMove$$1(context, entityIDs, baseGraph) {
53745 var keybinding = d3keybinding('move');
53747 behaviorEdit(context),
53748 operationCircularize(entityIDs, context).behavior,
53749 operationDelete(entityIDs, context).behavior,
53750 operationOrthogonalize(entityIDs, context).behavior,
53751 operationReflectLong(entityIDs, context).behavior,
53752 operationReflectShort(entityIDs, context).behavior,
53753 operationRotate(entityIDs, context).behavior
53755 var annotation = entityIDs.length === 1 ?
53756 t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
53757 t('operations.move.annotation.multiple');
53762 var _nudgeInterval;
53765 function doMove(nudge) {
53766 nudge = nudge || [0, 0];
53769 if (_prevGraph !== context.graph()) {
53771 _origin = context.map().mouseCoordinates();
53772 fn = context.perform;
53774 fn = context.overwrite;
53777 var currMouse = context.mouse();
53778 var origMouse = context.projection(_origin);
53779 var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
53781 fn(actionMove(entityIDs, delta, context.projection, _cache), annotation);
53782 _prevGraph = context.graph();
53786 function startNudge(nudge) {
53787 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
53788 _nudgeInterval = window.setInterval(function() {
53789 context.pan(nudge);
53795 function stopNudge() {
53796 if (_nudgeInterval) {
53797 window.clearInterval(_nudgeInterval);
53798 _nudgeInterval = null;
53805 var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
53814 function finish() {
53815 event.stopPropagation();
53816 context.enter(modeSelect(context, entityIDs));
53821 function cancel() {
53823 while (context.graph() !== baseGraph) context.pop();
53824 context.enter(modeBrowse(context));
53827 context.enter(modeSelect(context, entityIDs));
53833 function undone() {
53834 context.enter(modeBrowse(context));
53838 mode.enter = function() {
53839 _origin = context.map().mouseCoordinates();
53843 behaviors.forEach(function(behavior) {
53844 context.install(behavior);
53848 .on('mousemove.move', move)
53849 .on('click.move', finish);
53852 .on('undone.move', undone);
53863 mode.exit = function() {
53866 behaviors.forEach(function(behavior) {
53867 context.uninstall(behavior);
53871 .on('mousemove.move', null)
53872 .on('click.move', null);
53875 .on('undone.move', null);
53881 mode.selectedIDs = function() {
53882 if (!arguments.length) return entityIDs;
53891 function modeRotate$$1(context, entityIDs) {
53897 var keybinding = d3keybinding('rotate');
53899 behaviorEdit(context),
53900 operationCircularize(entityIDs, context).behavior,
53901 operationDelete(entityIDs, context).behavior,
53902 operationMove(entityIDs, context).behavior,
53903 operationOrthogonalize(entityIDs, context).behavior,
53904 operationReflectLong(entityIDs, context).behavior,
53905 operationReflectShort(entityIDs, context).behavior
53907 var annotation = entityIDs.length === 1 ?
53908 t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
53909 t('operations.rotate.annotation.multiple');
53913 var _prevTransform;
53917 function doRotate() {
53919 if (context.graph() !== _prevGraph) {
53920 fn = context.perform;
53922 fn = context.replace;
53925 // projection changed, recalculate _pivot
53926 var projection = context.projection;
53927 var currTransform = projection.transform();
53928 if (!_prevTransform ||
53929 currTransform.k !== _prevTransform.k ||
53930 currTransform.x !== _prevTransform.x ||
53931 currTransform.y !== _prevTransform.y) {
53933 var nodes = utilGetAllNodes(entityIDs, context.graph());
53934 var points = nodes.map(function(n) { return projection(n.loc); });
53936 if (points.length === 1) { // degenerate case
53937 _pivot = points[0];
53938 } else if (points.length === 2) {
53939 _pivot = geoVecInterp(points[0], points[1], 0.5);
53941 _pivot = d3_polygonCentroid(d3_polygonHull(points));
53943 _prevAngle = undefined;
53947 var currMouse = context.mouse();
53948 var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
53950 if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
53951 var delta = currAngle - _prevAngle;
53953 fn(actionRotate(entityIDs, _pivot, delta, projection), annotation);
53955 _prevTransform = currTransform;
53956 _prevAngle = currAngle;
53957 _prevGraph = context.graph();
53961 function finish() {
53962 event.stopPropagation();
53963 context.enter(modeSelect(context, entityIDs));
53967 function cancel() {
53969 context.enter(modeSelect(context, entityIDs));
53973 function undone() {
53974 context.enter(modeBrowse(context));
53978 mode.enter = function() {
53979 behaviors.forEach(context.install);
53982 .on('mousemove.rotate', doRotate)
53983 .on('click.rotate', finish);
53986 .on('undone.rotate', undone);
53997 mode.exit = function() {
53998 behaviors.forEach(context.uninstall);
54001 .on('mousemove.rotate', null)
54002 .on('click.rotate', null);
54005 .on('undone.rotate', null);
54011 mode.selectedIDs = function() {
54012 if (!arguments.length) return entityIDs;
54021 var _isSaving = false;
54024 function modeSave$$1(context) {
54025 var mode = { id: 'save' };
54026 var keybinding = d3keybinding('modeSave');
54028 var loading = uiLoading(context)
54029 .message(t('save.uploading'))
54032 var commit = uiCommit(context)
54033 .on('cancel', cancel)
54039 var _toLoadCount = 0;
54040 var _toLoadTotal = 0;
54042 var _conflicts = [];
54048 function cancel(selectedID) {
54050 context.enter(modeSelect(context, [selectedID]));
54052 context.enter(modeBrowse(context));
54057 function save(changeset, tryAgain, checkConflicts) {
54058 // Guard against accidentally entering save code twice - #4641
54059 if (_isSaving && !tryAgain) {
54063 var osm = context.connection();
54069 // If user somehow got logged out mid-save, try to reauthenticate..
54070 // This can happen if they were logged in from before, but the tokens are no longer valid.
54071 if (!osm.authenticated()) {
54072 osm.authenticate(function(err) {
54074 cancel(); // quit save mode..
54076 save(changeset, tryAgain, checkConflicts); // continue where we left off..
54084 context.container().call(loading); // block input
54088 var history = context.history();
54089 var localGraph = context.graph();
54090 var remoteGraph = coreGraph$$1(history.base(), true);
54095 // Store original changes, in case user wants to download them as an .osc file
54096 _origChanges = history.changes(actionDiscardTags(history.difference()));
54098 // First time, `history.perform` a no-op action.
54099 // Any conflict resolutions will be done as `history.replace`
54101 history.perform(actionNoop());
54104 // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
54105 if (!checkConflicts) {
54108 // Do the full (slow) conflict check..
54110 var modified = filter(history.difference().summary(), { changeType: 'modified' });
54111 _toCheck = map$3(map$3(modified, 'entity'), 'id');
54112 _toLoad = withChildNodes(_toCheck, localGraph);
54115 _toLoadTotal = _toLoad.length;
54117 if (_toCheck.length) {
54118 showProgress(_toLoadCount, _toLoadTotal);
54119 _toLoad.forEach(function(id) { _loaded[id] = false; });
54120 osm.loadMultiple(_toLoad, loaded);
54129 function withChildNodes(ids, graph) {
54130 return uniq(reduce(ids, function(result, id) {
54131 var entity = graph.entity(id);
54132 if (entity.type === 'way') {
54134 var children = graph.childNodes(entity);
54135 result.push.apply(result, map$3(filter(children, 'version'), 'id'));
54137 /* eslint-disable no-console */
54138 if (typeof console !== 'undefined') console.error(err);
54139 /* eslint-enable no-console */
54147 // Reload modified entities into an alternate graph and check for conflicts..
54148 function loaded(err, result) {
54149 if (_errors.length) return;
54153 msg: err.message || err.responseText,
54154 details: [ t('save.status_code', { code: err.status }) ]
54161 result.data.forEach(function(entity) {
54162 remoteGraph.replace(entity);
54163 _loaded[entity.id] = true;
54164 _toLoad = without(_toLoad, entity.id);
54166 if (!entity.visible) return;
54168 // Because loadMultiple doesn't download /full like loadEntity,
54169 // need to also load children that aren't already being checked..
54171 if (entity.type === 'way') {
54172 for (i = 0; i < entity.nodes.length; i++) {
54173 id = entity.nodes[i];
54174 if (_loaded[id] === undefined) {
54175 _loaded[id] = false;
54179 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
54180 for (i = 0; i < entity.members.length; i++) {
54181 id = entity.members[i].id;
54182 if (_loaded[id] === undefined) {
54183 _loaded[id] = false;
54190 _toLoadCount += result.data.length;
54191 _toLoadTotal += loadMore.length;
54192 showProgress(_toLoadCount, _toLoadTotal);
54194 if (loadMore.length) {
54195 _toLoad.push.apply(_toLoad, loadMore);
54196 osm.loadMultiple(loadMore, loaded);
54199 if (!_toLoad.length) {
54206 function detectConflicts() {
54207 function choice(id, text, action) {
54208 return { id: id, text: text, action: function() { history.replace(action); } };
54210 function formatUser(d) {
54211 return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
54213 function entityName(entity) {
54214 return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
54217 function sameVersions(local$$1, remote) {
54218 if (local$$1.version !== remote.version) return false;
54220 if (local$$1.type === 'way') {
54221 var children = union(local$$1.nodes, remote.nodes);
54222 for (var i = 0; i < children.length; i++) {
54223 var a = localGraph.hasEntity(children[i]);
54224 var b = remoteGraph.hasEntity(children[i]);
54225 if (a && b && a.version !== b.version) return false;
54232 _toCheck.forEach(function(id) {
54233 var local$$1 = localGraph.entity(id);
54234 var remote = remoteGraph.entity(id);
54236 if (sameVersions(local$$1, remote)) return;
54238 var action = actionMergeRemoteChanges;
54239 var merge = action(id, localGraph, remoteGraph, formatUser);
54241 history.replace(merge);
54243 var mergeConflicts = merge.conflicts();
54244 if (!mergeConflicts.length) return; // merged safely
54246 var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
54247 var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
54248 var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
54249 var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
54253 name: entityName(local$$1),
54254 details: mergeConflicts,
54257 choice(id, keepMine, forceLocal),
54258 choice(id, keepTheirs, forceRemote)
54268 function upload(changeset) {
54269 var osm = context.connection();
54271 _errors.push({ msg: 'No OSM Service' });
54274 if (_conflicts.length) {
54275 _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
54276 showConflicts(changeset);
54278 } else if (_errors.length) {
54282 var history = context.history();
54283 var changes = history.changes(actionDiscardTags(history.difference()));
54284 if (changes.modified.length || changes.created.length || changes.deleted.length) {
54285 loadLocation(); // so it is ready when we display the save screen
54286 osm.putChangeset(changeset, changes, uploadCallback);
54287 } else { // changes were insignificant or reverted by user
54288 select('.inspector-wrap *').remove();
54298 function uploadCallback(err, changeset) {
54300 if (err.status === 409) { // 409 Conflict
54301 save(changeset, true, true); // tryAgain = true, checkConflicts = true
54304 msg: err.message || err.responseText,
54305 details: [ t('save.status_code', { code: err.status }) ]
54311 context.history().clearSaved();
54312 success(changeset);
54313 // Add delay to allow for postgres replication #1646 #2678
54314 window.setTimeout(function() {
54315 select('.inspector-wrap *').remove();
54324 function showProgress(num, total) {
54325 var modal = context.container().select('.loading-modal .modal-section');
54326 var progress = modal.selectAll('.progress')
54332 .attr('class', 'progress')
54334 .text(t('save.conflict_progress', { num: num, total: total }));
54338 function showConflicts(changeset) {
54339 var history = context.history();
54340 var selection$$1 = context.container()
54341 .select('#sidebar')
54343 .attr('class','sidebar-component');
54348 var ui = uiConflicts(context)
54349 .conflictList(_conflicts)
54350 .origChanges(_origChanges)
54351 .on('cancel', function() {
54353 selection$$1.remove();
54356 .on('save', function() {
54357 for (var i = 0; i < _conflicts.length; i++) {
54358 if (_conflicts[i].chosen === 1) { // user chose "keep theirs"
54359 var entity = context.hasEntity(_conflicts[i].id);
54360 if (entity && entity.type === 'way') {
54361 var children = uniq(entity.nodes);
54362 for (var j = 0; j < children.length; j++) {
54363 history.replace(actionRevert(children[j]));
54366 history.replace(actionRevert(_conflicts[i].id));
54370 selection$$1.remove();
54371 save(changeset, true, false); // tryAgain = true, checkConflicts = false
54374 selection$$1.call(ui);
54378 function showErrors() {
54380 context.history().pop();
54384 var selection$$1 = uiConfirm(context.container());
54386 .select('.modal-section.header')
54388 .text(t('save.error'));
54390 addErrors(selection$$1, _errors);
54391 selection$$1.okButton();
54395 function addErrors(selection$$1, data) {
54396 var message = selection$$1
54397 .select('.modal-section.message-text');
54399 var items = message
54400 .selectAll('.error-container')
54403 var enter = items.enter()
54405 .attr('class', 'error-container');
54409 .attr('class', 'error-description')
54411 .classed('hide-toggle', true)
54412 .text(function(d) { return d.msg || t('save.unknown_error_details'); })
54413 .on('click', function() {
54414 event.preventDefault();
54416 var error = select(this);
54417 var detail = select(this.nextElementSibling);
54418 var exp = error.classed('expanded');
54420 detail.style('display', exp ? 'none' : 'block');
54421 error.classed('expanded', !exp);
54424 var details = enter
54426 .attr('class', 'error-detail-container')
54427 .style('display', 'none');
54431 .attr('class', 'error-detail-list')
54433 .data(function(d) { return d.details || []; })
54436 .attr('class', 'error-detail-item')
54437 .text(function(d) { return d; });
54444 function success(changeset) {
54447 var ui = uiSuccess$$1(context)
54448 .changeset(changeset)
54449 .location(_location)
54450 .on('cancel', function() { context.ui().sidebar.hide(); });
54452 context.enter(modeBrowse(context).sidebar(ui));
54456 function keybindingOn() {
54458 .call(keybinding.on('⎋', cancel, true));
54462 function keybindingOff() {
54464 .call(keybinding.off);
54468 // Reverse geocode current map location so we can display a message on
54469 // the success screen like "Thank you for editing around city, state."
54470 function loadLocation() {
54472 if (!services.geocoder) return;
54474 services.geocoder.reverse(context.map().center(), function(err, result) {
54475 if (err || !result || !result.address) return;
54478 var addr = result.address;
54479 var city = addr && (addr.town || addr.city || addr.county);
54480 if (city) parts.push(city);
54481 var region = addr && (addr.state || addr.country);
54482 if (region) parts.push(region);
54484 _location = parts.join(', ');
54489 mode.enter = function() {
54491 context.ui().sidebar.show(commit);
54496 context.container().selectAll('#content')
54497 .attr('class', 'inactive');
54499 var osm = context.connection();
54505 if (osm.authenticated()) {
54508 osm.authenticate(function(err) {
54519 mode.exit = function() {
54524 context.container().selectAll('#content')
54525 .attr('class', 'active');
54527 context.ui().sidebar.hide();
54533 /* Built-in method references for those with the same name as other `lodash` methods. */
54534 var nativeMin$1 = Math.min;
54537 * The base implementation of methods like `_.intersection`, without support
54538 * for iteratee shorthands, that accepts an array of arrays to inspect.
54541 * @param {Array} arrays The arrays to inspect.
54542 * @param {Function} [iteratee] The iteratee invoked per element.
54543 * @param {Function} [comparator] The comparator invoked per element.
54544 * @returns {Array} Returns the new array of shared values.
54546 function baseIntersection(arrays, iteratee, comparator) {
54547 var includes = comparator ? arrayIncludesWith : arrayIncludes,
54548 length = arrays[0].length,
54549 othLength = arrays.length,
54550 othIndex = othLength,
54551 caches = Array(othLength),
54552 maxLength = Infinity,
54555 while (othIndex--) {
54556 var array = arrays[othIndex];
54557 if (othIndex && iteratee) {
54558 array = arrayMap(array, baseUnary(iteratee));
54560 maxLength = nativeMin$1(array.length, maxLength);
54561 caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
54562 ? new SetCache(othIndex && array)
54571 while (++index < length && result.length < maxLength) {
54572 var value = array[index],
54573 computed = iteratee ? iteratee(value) : value;
54575 value = (comparator || value !== 0) ? value : 0;
54577 ? cacheHas(seen, computed)
54578 : includes(result, computed, comparator)
54580 othIndex = othLength;
54581 while (--othIndex) {
54582 var cache = caches[othIndex];
54584 ? cacheHas(cache, computed)
54585 : includes(arrays[othIndex], computed, comparator))
54591 seen.push(computed);
54593 result.push(value);
54600 * Casts `value` to an empty array if it's not an array like object.
54603 * @param {*} value The value to inspect.
54604 * @returns {Array|Object} Returns the cast array-like object.
54606 function castArrayLikeObject(value) {
54607 return isArrayLikeObject(value) ? value : [];
54611 * Creates an array of unique values that are included in all given arrays
54612 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
54613 * for equality comparisons. The order and references of result values are
54614 * determined by the first array.
54620 * @param {...Array} [arrays] The arrays to inspect.
54621 * @returns {Array} Returns the new array of intersecting values.
54624 * _.intersection([2, 1], [2, 3]);
54627 var intersection = baseRest(function(arrays) {
54628 var mapped = arrayMap(arrays, castArrayLikeObject);
54629 return (mapped.length && mapped[0] === arrays[0])
54630 ? baseIntersection(mapped)
54634 // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
54635 // For example, ⌘Z -> Ctrl+Z
54636 var uiCmd = function (code) {
54637 var detected = utilDetect();
54639 if (detected.os === 'mac') {
54643 if (detected.os === 'win') {
54644 if (code === '⌘⇧Z') return 'Ctrl+Y';
54656 for (var i = 0; i < code.length; i++) {
54657 if (code[i] in replacements) {
54658 result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
54668 // return a display-focused string for a given keyboard code
54669 uiCmd.display = function(code) {
54670 if (code.length !== 1) return code;
54672 var detected = utilDetect();
54673 var mac = (detected.os === 'mac');
54674 var replacements = {
54675 '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd') : t('shortcuts.key.ctrl'),
54676 '⇧': mac ? '⇧ ' + t('shortcuts.key.shift') : t('shortcuts.key.shift'),
54677 '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
54678 '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl') : t('shortcuts.key.ctrl'),
54679 '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
54680 '⌦': mac ? '⌦ ' + t('shortcuts.key.del') : t('shortcuts.key.del'),
54681 '↖': mac ? '↖ ' + t('shortcuts.key.pgup') : t('shortcuts.key.pgup'),
54682 '↘': mac ? '↘ ' + t('shortcuts.key.pgdn') : t('shortcuts.key.pgdn'),
54683 '⇞': mac ? '⇞ ' + t('shortcuts.key.home') : t('shortcuts.key.home'),
54684 '⇟': mac ? '⇟ ' + t('shortcuts.key.end') : t('shortcuts.key.end'),
54685 '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
54686 '⎋': mac ? '⎋ ' + t('shortcuts.key.esc') : t('shortcuts.key.esc'),
54689 return replacements[code] || code;
54695 function modeSelect(context, selectedIDs) {
54701 var keybinding = d3keybinding('select');
54702 var timeout = null;
54704 behaviorCopy(context),
54705 behaviorPaste(context),
54706 behaviorBreathe(context),
54707 behaviorHover(context),
54708 behaviorSelect(context),
54709 behaviorLasso(context),
54710 modeDragNode$$1(context).restoreSelectedIDs(selectedIDs).behavior,
54711 modeDragNote$$1(context).behavior
54714 var newFeature = false;
54715 var suppressMenu = true;
54716 var follow = false;
54719 var wrap = context.container()
54720 .select('.inspector-wrap');
54723 function singular() {
54724 if (selectedIDs.length === 1) {
54725 return context.hasEntity(selectedIDs[0]);
54730 function checkSelectedIDs() {
54732 if (Array.isArray(selectedIDs)) {
54733 ids = selectedIDs.filter(function(id) {
54734 return context.hasEntity(id);
54741 context.enter(modeBrowse(context));
54743 return !!ids.length;
54747 // find the common parent ways for nextVertex, previousVertex
54748 function commonParents() {
54749 var graph = context.graph();
54750 var commonParents = [];
54752 for (var i = 0; i < selectedIDs.length; i++) {
54753 var entity = context.hasEntity(selectedIDs[i]);
54754 if (!entity || entity.geometry(graph) !== 'vertex') {
54755 return []; // selection includes some not vertexes
54758 var currParents = map$3(graph.parentWays(entity), 'id');
54759 if (!commonParents.length) {
54760 commonParents = currParents;
54764 commonParents = intersection(commonParents, currParents);
54765 if (!commonParents.length) {
54770 return commonParents;
54774 function singularParent() {
54775 var parents = commonParents();
54776 if (!parents || parents.length === 0) {
54777 relatedParent = null;
54781 // relatedParent is used when we visit a vertex with multiple
54782 // parents, and we want to remember which parent line we started on.
54784 if (parents.length === 1) {
54785 relatedParent = parents[0]; // remember this parent for later
54786 return relatedParent;
54789 if (parents.indexOf(relatedParent) !== -1) {
54790 return relatedParent; // prefer the previously seen parent
54797 function closeMenu() {
54799 context.surface().call(editMenu.close);
54804 function positionMenu() {
54805 if (!editMenu) { return; }
54807 var entity = singular();
54808 if (entity && context.geometry(entity.id) === 'relation') {
54809 suppressMenu = true;
54811 var point$$1 = context.mouse();
54812 var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
54814 if (point$$1 && geoPointInPolygon(point$$1, viewport)) {
54815 editMenu.center(point$$1);
54817 suppressMenu = true;
54823 function showMenu() {
54826 context.surface().call(editMenu);
54831 function toggleMenu() {
54832 // deprecation warning - Radial Menu to be removed in iD v3
54833 if (select('.edit-menu, .radial-menu').empty()) {
54842 mode.selectedIDs = function() {
54843 return selectedIDs;
54847 mode.reselect = function() {
54848 if (!checkSelectedIDs()) return;
54850 var surfaceNode = context.surface().node();
54851 if (surfaceNode.focus) { // FF doesn't support it
54852 surfaceNode.focus();
54856 if (!suppressMenu) {
54862 mode.newFeature = function(_) {
54863 if (!arguments.length) return newFeature;
54869 mode.suppressMenu = function(_) {
54870 if (!arguments.length) return suppressMenu;
54876 mode.follow = function(_) {
54877 if (!arguments.length) return follow;
54883 mode.enter = function() {
54885 function update() {
54887 checkSelectedIDs();
54891 function dblclick() {
54892 var target = select(event.target);
54894 var datum = target.datum();
54895 var entity = datum && datum.properties && datum.properties.entity;
54896 if (!entity) return;
54898 if (entity instanceof osmWay && target.classed('target')) {
54899 var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
54900 var prev = entity.nodes[choice.index - 1];
54901 var next = entity.nodes[choice.index];
54904 actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
54905 t('operations.add.annotation.vertex')
54908 event.preventDefault();
54909 event.stopPropagation();
54911 } else if (entity.type === 'midpoint') {
54913 actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
54914 t('operations.add.annotation.vertex'));
54916 event.preventDefault();
54917 event.stopPropagation();
54922 function selectElements(drawn) {
54923 if (!checkSelectedIDs()) return;
54925 var surface = context.surface();
54926 var entity = singular();
54928 if (entity && context.geometry(entity.id) === 'relation') {
54929 suppressMenu = true;
54933 surface.selectAll('.related')
54934 .classed('related', false);
54937 if (relatedParent) {
54938 surface.selectAll(utilEntitySelector([relatedParent]))
54939 .classed('related', true);
54942 var selection$$1 = context.surface()
54943 .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
54945 if (selection$$1.empty()) {
54946 // Return to browse mode if selected DOM elements have
54947 // disappeared because the user moved them out of view..
54948 var source = event && event.type === 'zoom' && event.sourceEvent;
54949 if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
54950 context.enter(modeBrowse(context));
54954 .classed('selected', true);
54960 context.enter(modeBrowse(context));
54964 function firstVertex() {
54965 event.preventDefault();
54966 var entity = singular();
54967 var parent = singularParent();
54970 if (entity && entity.type === 'way') {
54972 } else if (parent) {
54973 way = context.entity(parent);
54978 modeSelect(context, [way.first()]).follow(true)
54984 function lastVertex() {
54985 event.preventDefault();
54986 var entity = singular();
54987 var parent = singularParent();
54990 if (entity && entity.type === 'way') {
54992 } else if (parent) {
54993 way = context.entity(parent);
54998 modeSelect(context, [way.last()]).follow(true)
55004 function previousVertex() {
55005 event.preventDefault();
55006 var parent = singularParent();
55007 if (!parent) return;
55009 var way = context.entity(parent);
55010 var length = way.nodes.length;
55011 var curr = way.nodes.indexOf(selectedIDs[0]);
55016 } else if (way.isClosed()) {
55017 index = length - 2;
55020 if (index !== -1) {
55022 modeSelect(context, [way.nodes[index]]).follow(true)
55028 function nextVertex() {
55029 event.preventDefault();
55030 var parent = singularParent();
55031 if (!parent) return;
55033 var way = context.entity(parent);
55034 var length = way.nodes.length;
55035 var curr = way.nodes.indexOf(selectedIDs[0]);
55038 if (curr < length - 1) {
55040 } else if (way.isClosed()) {
55044 if (index !== -1) {
55046 modeSelect(context, [way.nodes[index]]).follow(true)
55052 function nextParent() {
55053 event.preventDefault();
55054 var parents = uniq(commonParents());
55055 if (!parents || parents.length < 2) return;
55057 var index = parents.indexOf(relatedParent);
55058 if (index < 0 || index > parents.length - 2) {
55059 relatedParent = parents[0];
55061 relatedParent = parents[index + 1];
55064 var surface = context.surface();
55065 surface.selectAll('.related')
55066 .classed('related', false);
55068 if (relatedParent) {
55069 surface.selectAll(utilEntitySelector([relatedParent]))
55070 .classed('related', true);
55075 if (!checkSelectedIDs()) return;
55077 var operations = without(values$1(Operations), operationDelete)
55078 .map(function(o) { return o(selectedIDs, context); })
55079 .filter(function(o) { return o.available(); });
55081 // deprecation warning - Radial Menu to be removed in iD v3
55082 var isRadialMenu = context.storage('edit-menu-style') === 'radial';
55083 if (isRadialMenu) {
55084 operations = operations.slice(0,7);
55085 operations.unshift(operationDelete(selectedIDs, context));
55087 operations.push(operationDelete(selectedIDs, context));
55090 operations.forEach(function(operation) {
55091 if (operation.behavior) {
55092 behaviors.push(operation.behavior);
55096 behaviors.forEach(context.install);
55099 .on(['[', 'pgup'], previousVertex)
55100 .on([']', 'pgdown'], nextVertex)
55101 .on(['{', uiCmd('⌘['), 'home'], firstVertex)
55102 .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
55103 .on(['\\', 'pause'], nextParent)
55104 .on('⎋', esc, true)
55105 .on('space', toggleMenu);
55111 // deprecation warning - Radial Menu to be removed in iD v3
55112 editMenu = isRadialMenu
55113 ? uiRadialMenu(context, operations)
55114 : uiEditMenu(context, operations);
55116 context.ui().sidebar
55117 .select(singular() ? singular().id : null, newFeature);
55120 .on('undone.select', update)
55121 .on('redone.select', update);
55124 .on('move.select', closeMenu)
55125 .on('drawn.select', selectElements);
55128 .on('dblclick.select', dblclick);
55133 if (selectedIDs.length > 1) {
55134 var entities = uiSelectionList(context, selectedIDs);
55135 context.ui().sidebar.show(entities);
55139 var extent = geoExtent$$1();
55140 var graph = context.graph();
55141 selectedIDs.forEach(function(id) {
55142 var entity = context.entity(id);
55143 extent._extend(entity.extent(graph));
55146 var loc = extent.center();
55147 context.map().centerEase(loc);
55148 } else if (singular() && singular().type === 'way') {
55149 context.map().pan([0,0]); // full redraw, to adjust z-sorting #2914
55152 timeout = window.setTimeout(function() {
55154 if (!suppressMenu) {
55157 }, 270); /* after any centerEase completes */
55161 mode.exit = function() {
55162 if (timeout) window.clearTimeout(timeout);
55164 behaviors.forEach(context.uninstall);
55167 editMenu = undefined;
55170 .on('undone.select', null)
55171 .on('redone.select', null);
55173 var surface = context.surface();
55176 .on('dblclick.select', null);
55179 .selectAll('.selected')
55180 .classed('selected', false);
55183 .selectAll('.related')
55184 .classed('related', false);
55186 context.map().on('drawn.select', null);
55187 context.ui().sidebar.hide();
55194 function modeSelectData$$1(context, selectedDatum) {
55200 var keybinding = d3keybinding('select-data');
55201 var dataEditor = uiDataEditor$$1(context);
55204 behaviorBreathe(context),
55205 behaviorHover(context),
55206 behaviorSelect(context),
55207 behaviorLasso(context),
55208 modeDragNode$$1(context).behavior,
55209 modeDragNote$$1(context).behavior
55213 // class the data as selected, or return to browse mode if the data is gone
55214 function selectData(drawn) {
55215 var selection$$1 = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
55217 if (selection$$1.empty()) {
55218 // Return to browse mode if selected DOM elements have
55219 // disappeared because the user moved them out of view..
55220 var source = event && event.type === 'zoom' && event.sourceEvent;
55221 if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
55222 context.enter(modeBrowse(context));
55225 selection$$1.classed('selected', true);
55231 context.enter(modeBrowse(context));
55235 mode.enter = function() {
55236 behaviors.forEach(context.install);
55237 keybinding.on('⎋', esc, true);
55238 select(document).call(keybinding);
55242 context.ui().sidebar
55243 .show(dataEditor.datum(selectedDatum));
55246 .on('drawn.select-data', selectData);
55250 mode.exit = function() {
55251 behaviors.forEach(context.uninstall);
55255 .selectAll('.layer-mapdata .selected')
55256 .classed('selected hover', false);
55259 .on('drawn.select-data', null);
55261 context.ui().sidebar
55269 function modeSelectNote$$1(context, selectedNoteID) {
55275 var osm = services.osm;
55276 var keybinding = d3keybinding('select-note');
55277 var noteEditor = uiNoteEditor$$1(context)
55278 .on('change', function() {
55279 context.map().pan([0,0]); // trigger a redraw
55280 var note = checkSelectedID();
55282 context.ui().sidebar
55283 .show(noteEditor.note(note));
55287 behaviorBreathe(context),
55288 behaviorHover(context),
55289 behaviorSelect(context),
55290 behaviorLasso(context),
55291 modeDragNode$$1(context).behavior,
55292 modeDragNote$$1(context).behavior
55295 var newFeature = false;
55298 function checkSelectedID() {
55300 var note = osm.getNote(selectedNoteID);
55302 context.enter(modeBrowse(context));
55308 // class the note as selected, or return to browse mode if the note is gone
55309 function selectNote(drawn) {
55310 if (!checkSelectedID()) return;
55312 var selection$$1 = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
55314 if (selection$$1.empty()) {
55315 // Return to browse mode if selected DOM elements have
55316 // disappeared because the user moved them out of view..
55317 var source = event && event.type === 'zoom' && event.sourceEvent;
55318 if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
55319 context.enter(modeBrowse(context));
55324 .classed('selected', true);
55325 context.selectedNoteID(selectedNoteID);
55331 context.enter(modeBrowse(context));
55335 mode.newFeature = function(_) {
55336 if (!arguments.length) return newFeature;
55342 mode.enter = function() {
55343 var note = checkSelectedID();
55346 behaviors.forEach(context.install);
55347 keybinding.on('⎋', esc, true);
55348 select(document).call(keybinding);
55352 context.ui().sidebar
55353 .show(noteEditor.note(note));
55356 .on('drawn.select', selectNote);
55360 mode.exit = function() {
55361 behaviors.forEach(context.uninstall);
55365 .selectAll('.layer-notes .selected')
55366 .classed('selected hover', false);
55369 .on('drawn.select', null);
55371 context.ui().sidebar
55374 context.selectedNoteID(null);
55381 function behaviorAddWay(context) {
55382 var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode'),
55383 draw = behaviorDraw(context);
55385 var addWay = function(surface) {
55386 draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
55387 .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
55388 .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
55389 .on('cancel', addWay.cancel)
55390 .on('finish', addWay.cancel);
55393 .dblclickEnable(false);
55395 surface.call(draw);
55399 addWay.off = function(surface) {
55400 surface.call(draw.off);
55404 addWay.cancel = function() {
55405 window.setTimeout(function() {
55406 context.map().dblclickEnable(true);
55409 context.enter(modeBrowse(context));
55413 addWay.tail = function(text) {
55419 return utilRebind(addWay, dispatch$$1, 'on');
55422 function behaviorBreathe() {
55423 var duration = 800,
55425 selector$$1 = '.selected.shadow, .selected .shadow',
55426 selected = select(null),
55433 function ratchetyInterpolator(a, b, steps, units) {
55436 var sample = quantize()
55438 .range(d3_quantize(interpolateNumber(a, b), steps));
55440 return function(t) {
55441 return String(sample(t)) + (units || '');
55446 function reset(selection$$1) {
55448 .style('stroke-opacity', null)
55449 .style('stroke-width', null)
55450 .style('fill-opacity', null)
55455 function setAnimationParams(transition, fromTo) {
55456 var toFrom = (fromTo === 'from' ? 'to' : 'from');
55459 .styleTween('stroke-opacity', function(d) {
55460 return ratchetyInterpolator(
55461 params[d.id][toFrom].opacity,
55462 params[d.id][fromTo].opacity,
55466 .styleTween('stroke-width', function(d) {
55467 return ratchetyInterpolator(
55468 params[d.id][toFrom].width,
55469 params[d.id][fromTo].width,
55474 .styleTween('fill-opacity', function(d) {
55475 return ratchetyInterpolator(
55476 params[d.id][toFrom].opacity,
55477 params[d.id][fromTo].opacity,
55481 .styleTween('r', function(d) {
55482 return ratchetyInterpolator(
55483 params[d.id][toFrom].width,
55484 params[d.id][fromTo].width,
55492 function calcAnimationParams(selection$$1) {
55495 .each(function(d) {
55496 var s = select(this),
55497 tag = s.node().tagName,
55498 p = {'from': {}, 'to': {}},
55501 // determine base opacity and width
55502 if (tag === 'circle') {
55503 opacity = parseFloat(s.style('fill-opacity') || 0.5);
55504 width = parseFloat(s.style('r') || 15.5);
55506 opacity = parseFloat(s.style('stroke-opacity') || 0.7);
55507 width = parseFloat(s.style('stroke-width') || 10);
55510 // calculate from/to interpolation params..
55512 p.from.opacity = opacity * 0.6;
55513 p.to.opacity = opacity * 1.25;
55514 p.from.width = width * 0.7;
55515 p.to.width = width * (tag === 'circle' ? 1.5 : 1);
55521 function run(surface, fromTo) {
55522 var toFrom = (fromTo === 'from' ? 'to' : 'from'),
55523 currSelected = surface.selectAll(selector$$1),
55524 currClassed = surface.attr('class');
55526 if (done || currSelected.empty()) {
55527 selected.call(reset);
55531 if (!isEqual(currSelected.data(), selected.data()) || currClassed !== classed) {
55532 selected.call(reset);
55533 classed = currClassed;
55534 selected = currSelected.call(calcAnimationParams);
55539 .duration(duration)
55540 .call(setAnimationParams, fromTo)
55541 .on('end', function() {
55542 surface.call(run, toFrom);
55547 var breathe = function(surface) {
55549 timer$$1 = timer(function() {
55550 // wait for elements to actually become selected
55551 if (surface.selectAll(selector$$1).empty()) {
55555 surface.call(run, 'from');
55562 breathe.off = function() {
55576 function behaviorCopy(context) {
55577 var keybinding = d3keybinding('copy');
55580 function groupEntities(ids, graph) {
55581 var entities = ids.map(function (id) { return graph.entity(id); });
55582 return assignIn({relation: [], way: [], node: []},
55583 groupBy(entities, function(entity) { return entity.type; }));
55587 function getDescendants(id, graph, descendants) {
55588 var entity = graph.entity(id),
55591 descendants = descendants || {};
55593 if (entity.type === 'relation') {
55594 children = map$3(entity.members, 'id');
55595 } else if (entity.type === 'way') {
55596 children = entity.nodes;
55601 for (i = 0; i < children.length; i++) {
55602 if (!descendants[children[i]]) {
55603 descendants[children[i]] = true;
55604 descendants = getDescendants(children[i], graph, descendants);
55608 return descendants;
55612 function doCopy() {
55613 if (!getSelectionText()) event.preventDefault();
55615 var graph = context.graph(),
55616 selected = groupEntities(context.selectedIDs(), graph),
55621 for (i = 0; i < selected.relation.length; i++) {
55622 entity = selected.relation[i];
55623 if (!skip[entity.id] && entity.isComplete(graph)) {
55624 canCopy.push(entity.id);
55625 skip = getDescendants(entity.id, graph, skip);
55628 for (i = 0; i < selected.way.length; i++) {
55629 entity = selected.way[i];
55630 if (!skip[entity.id]) {
55631 canCopy.push(entity.id);
55632 skip = getDescendants(entity.id, graph, skip);
55635 for (i = 0; i < selected.node.length; i++) {
55636 entity = selected.node[i];
55637 if (!skip[entity.id]) {
55638 canCopy.push(entity.id);
55642 context.copyIDs(canCopy);
55647 keybinding.on(uiCmd('⌘C'), doCopy);
55648 select(document).call(keybinding);
55652 function getSelectionText() {
55653 return window.getSelection().toString();
55656 copy.off = function() {
55657 select(document).call(keybinding.off);
55665 `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
55667 * The `origin` function is expected to return an [x, y] tuple rather than an
55669 * The events are `start`, `move`, and `end`.
55670 (https://github.com/mbostock/d3/issues/563)
55671 * The `start` event is not dispatched until the first cursor movement occurs.
55672 (https://github.com/mbostock/d3/pull/368)
55673 * The `move` event has a `point` and `delta` [x, y] tuple properties rather
55674 than `x`, `y`, `dx`, and `dy` properties.
55675 * The `end` event is not dispatched if no movement occurs.
55676 * An `off` function is available that unbinds the drag's internal event handlers.
55679 function behaviorDrag() {
55680 var dispatch$$1 = dispatch('start', 'move', 'end');
55681 var _origin = null;
55682 var _selector = '';
55688 var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
55689 var d3_event_userSelectSuppress = function() {
55690 var selection$$1 = selection();
55691 var select$$1 = selection$$1.style(d3_event_userSelectProperty);
55692 selection$$1.style(d3_event_userSelectProperty, 'none');
55693 return function() {
55694 selection$$1.style(d3_event_userSelectProperty, select$$1);
55699 function d3_eventCancel() {
55700 event.stopPropagation();
55701 event.preventDefault();
55705 function eventOf(thiz, argumentz) {
55706 return function(e1) {
55708 customEvent(e1, dispatch$$1.apply, dispatch$$1, [e1.type, thiz, argumentz]);
55713 function dragstart() {
55715 _event = eventOf(_target, arguments);
55717 var eventTarget = event.target;
55718 var touchId = event.touches ? event.changedTouches[0].identifier : null;
55720 var startOrigin = point$$1();
55721 var started = false;
55722 var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
55725 .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
55726 .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
55729 offset = _origin.apply(_target, arguments);
55730 offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
55735 if (touchId === null) {
55736 event.stopPropagation();
55740 function point$$1() {
55741 var p = _surface || _target.parentNode;
55742 return touchId !== null ? d3_touches(p).filter(function(p) {
55743 return p.identifier === touchId;
55748 function dragmove() {
55749 var p = point$$1();
55750 var dx = p[0] - startOrigin[0];
55751 var dy = p[1] - startOrigin[1];
55753 if (dx === 0 && dy === 0)
55761 _event({ type: 'start' });
55765 point: [p[0] + offset[0], p[1] + offset[1]],
55772 function dragend() {
55774 _event({ type: 'end' });
55777 if (event.target === eventTarget) {
55779 .on('click.drag', click, true);
55784 .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
55785 .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
55794 .on('click.drag', null);
55799 function drag(selection$$1) {
55800 var matchesSelector = utilPrefixDOMProperty('matchesSelector');
55801 var delegate = dragstart;
55804 delegate = function() {
55806 var target = event.target;
55807 for (; target && target !== root; target = target.parentNode) {
55808 var datum = target.__data__;
55810 var entity = datum instanceof osmNote ?
55811 datum : datum && datum.properties && datum.properties.entity;
55813 if (entity && target[matchesSelector](_selector)) {
55814 return dragstart.call(target, entity);
55821 .on('mousedown.drag' + _selector, delegate)
55822 .on('touchstart.drag' + _selector, delegate);
55826 drag.off = function(selection$$1) {
55828 .on('mousedown.drag' + _selector, null)
55829 .on('touchstart.drag' + _selector, null);
55833 drag.selector = function(_) {
55834 if (!arguments.length) return _selector;
55840 drag.origin = function (_) {
55841 if (!arguments.length) return _origin;
55847 drag.cancel = function() {
55849 .on('mousemove.drag', null)
55850 .on('mouseup.drag', null);
55855 drag.target = function() {
55856 if (!arguments.length) return _target;
55857 _target = arguments[0];
55858 _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
55863 drag.surface = function() {
55864 if (!arguments.length) return _surface;
55865 _surface = arguments[0];
55870 return utilRebind(drag, dispatch$$1, 'on');
55873 function behaviorDrawWay(context, wayId, index, mode, startGraph) {
55874 var origWay = context.entity(wayId);
55875 var annotation = t((origWay.isDegenerate() ?
55876 'operations.start.annotation.' :
55877 'operations.continue.annotation.') + context.geometry(wayId)
55879 var behavior = behaviorDraw(context);
55880 var _tempEdits = 0;
55882 var end = osmNode({ loc: context.map().mouseCoordinates() });
55884 // Push an annotated state for undo to return back to.
55885 // We must make sure to remove this edit later.
55886 context.perform(actionNoop(), annotation);
55889 // Add the drawing node to the graph.
55890 // We must make sure to remove this edit later.
55891 context.perform(_actionAddDrawNode());
55896 function keydown() {
55897 if (event.keyCode === d3keybinding.modifierCodes.alt) {
55898 if (context.surface().classed('nope')) {
55900 .classed('nope-suppressed', true);
55903 .classed('nope', false)
55904 .classed('nope-disabled', true);
55910 if (event.keyCode === d3keybinding.modifierCodes.alt) {
55911 if (context.surface().classed('nope-suppressed')) {
55913 .classed('nope', true);
55916 .classed('nope-suppressed', false)
55917 .classed('nope-disabled', false);
55923 // - `mode/drag_node.js` `doMode()`
55924 // - `behavior/draw.js` `click()`
55925 // - `behavior/draw_way.js` `move()`
55926 function move(datum) {
55927 context.surface().classed('nope-disabled', event.altKey);
55929 var targetLoc = datum && datum.properties && datum.properties.entity && datum.properties.entity.loc;
55930 var targetNodes = datum && datum.properties && datum.properties.nodes;
55931 var loc = context.map().mouseCoordinates();
55933 if (targetLoc) { // snap to node/vertex - a point target with `.loc`
55936 } else if (targetNodes) { // snap to way - a line target with `.nodes`
55937 var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
55943 context.replace(actionMoveNode(end.id, loc));
55944 end = context.entity(end.id);
55945 checkGeometry(false);
55949 // Check whether this edit causes the geometry to break.
55950 // If so, class the surface with a nope cursor.
55951 // `finishDraw` - Only checks the relevant line segments if finishing drawing
55952 function checkGeometry(finishDraw) {
55953 var nopeDisabled = context.surface().classed('nope-disabled');
55954 var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
55956 if (nopeDisabled) {
55958 .classed('nope', false)
55959 .classed('nope-suppressed', isInvalid);
55962 .classed('nope', isInvalid)
55963 .classed('nope-suppressed', false);
55968 function isInvalidGeometry(entity, graph, finishDraw) {
55969 var parents = graph.parentWays(entity);
55971 for (var i = 0; i < parents.length; i++) {
55972 var parent = parents[i];
55973 var nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
55975 if (origWay.isClosed()) { // Check if Area
55977 nodes.splice(-2, 1);
55978 entity = nodes[nodes.length-2];
55988 if (geoHasSelfIntersections(nodes, entity.id)) {
55997 function undone() {
55998 // Undo popped the history back to the initial annotated no-op edit.
55999 // Remove initial no-op edit and whatever edit happened immediately before it.
56003 if (context.hasEntity(wayId)) {
56004 context.enter(mode);
56006 context.enter(modeBrowse(context));
56011 function setActiveElements() {
56012 context.surface().selectAll('.' + end.id)
56013 .classed('active', true);
56017 var drawWay = function(surface) {
56020 .on('click', drawWay.add)
56021 .on('clickWay', drawWay.addWay)
56022 .on('clickNode', drawWay.addNode)
56023 .on('undo', context.undo)
56024 .on('cancel', drawWay.cancel)
56025 .on('finish', drawWay.finish);
56028 .on('keydown.drawWay', keydown)
56029 .on('keyup.drawWay', keyup);
56032 .dblclickEnable(false)
56033 .on('drawn.draw', setActiveElements);
56035 setActiveElements();
56037 surface.call(behavior);
56040 .on('undone.draw', undone);
56044 drawWay.off = function(surface) {
56045 // Drawing was interrupted unexpectedly.
56046 // This can happen if the user changes modes,
56047 // clicks geolocate button, a hashchange event occurs, etc.
56049 context.pop(_tempEdits);
56050 while (context.graph() !== startGraph) {
56056 .on('drawn.draw', null);
56058 surface.call(behavior.off)
56059 .selectAll('.active')
56060 .classed('active', false);
56063 .classed('nope', false)
56064 .classed('nope-suppressed', false)
56065 .classed('nope-disabled', false);
56068 .on('keydown.hover', null)
56069 .on('keyup.hover', null);
56072 .on('undone.draw', null);
56076 function _actionAddDrawNode() {
56077 return function(graph) {
56080 .replace(origWay.addNode(end.id, index));
56085 function _actionReplaceDrawNode(newNode) {
56086 return function(graph) {
56088 .replace(origWay.addNode(newNode.id, index))
56094 // Accept the current position of the drawing node and continue drawing.
56095 drawWay.add = function(loc, d) {
56096 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
56097 return; // can't click here
56100 context.pop(_tempEdits);
56104 _actionAddDrawNode(),
56108 checkGeometry(false); // finishDraw = false
56109 context.enter(mode);
56113 // Connect the way to an existing way.
56114 drawWay.addWay = function(loc, edge, d) {
56115 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
56116 return; // can't click here
56119 context.pop(_tempEdits);
56123 _actionAddDrawNode(),
56124 actionAddMidpoint({ loc: loc, edge: edge }, end),
56128 checkGeometry(false); // finishDraw = false
56129 context.enter(mode);
56133 // Connect the way to an existing node and continue drawing.
56134 drawWay.addNode = function(node, d) {
56135 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
56136 return; // can't click here
56139 context.pop(_tempEdits);
56143 _actionReplaceDrawNode(node),
56147 checkGeometry(false); // finishDraw = false
56148 context.enter(mode);
56152 // Finish the draw operation, removing the temporary edits.
56153 // If the way has enough nodes to be valid, it's selected.
56154 // Otherwise, delete everything and return to browse mode.
56155 drawWay.finish = function() {
56156 checkGeometry(true); // finishDraw = true
56157 if (context.surface().classed('nope')) {
56158 return; // can't click here
56161 context.pop(_tempEdits);
56164 var way = context.hasEntity(wayId);
56165 if (!way || way.isDegenerate()) {
56170 window.setTimeout(function() {
56171 context.map().dblclickEnable(true);
56174 context.enter(modeSelect(context, [wayId]).newFeature(true));
56178 // Cancel the draw operation, delete everything, and return to browse mode.
56179 drawWay.cancel = function() {
56180 context.pop(_tempEdits);
56183 while (context.graph() !== startGraph) {
56187 window.setTimeout(function() {
56188 context.map().dblclickEnable(true);
56192 .classed('nope', false)
56193 .classed('nope-disabled', false)
56194 .classed('nope-suppressed', false);
56196 context.enter(modeBrowse(context));
56200 drawWay.activeID = function() {
56201 if (!arguments.length) return end.id;
56207 drawWay.tail = function(text) {
56208 behavior.tail(text);
56216 function behaviorHash(context) {
56217 var s0 = null; // cached window.location.hash
56218 var lat = 90 - 1e-8; // allowable latitude range
56221 var parser = function(map, s) {
56222 var q = utilStringQs(s);
56223 var args = (q.map || '').split('/').map(Number);
56225 if (args.length < 3 || args.some(isNaN)) {
56226 return true; // replace bogus hash
56228 } else if (s !== formatter(map).slice(1)) { // hash has changed
56229 var mode = context.mode(),
56230 dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
56233 // Don't allow the hash location to change too much while drawing
56234 // This can happen if the user accidently hit the back button. #3996
56235 if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
56236 context.enter(modeBrowse(context));
56239 map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
56244 var formatter = function(map) {
56245 var center = map.center();
56246 var zoom = map.zoom();
56247 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
56248 var q = omit(utilStringQs(window.location.hash.substring(1)),
56249 ['comment', 'source', 'hashtags', 'walkthrough']
56251 var newParams = {};
56254 var selected = context.selectedIDs().filter(function(id) {
56255 return !context.entity(id).isNew();
56257 if (selected.length) {
56258 newParams.id = selected.join(',');
56261 newParams.map = zoom.toFixed(2) +
56262 '/' + center[1].toFixed(precision) +
56263 '/' + center[0].toFixed(precision);
56265 return '#' + utilQsString(assign(q, newParams), true);
56269 function update() {
56270 if (context.inIntro()) return;
56271 var s1 = formatter(context.map());
56273 window.location.replace(s0 = s1); // don't recenter the map!
56278 var throttledUpdate = throttle(update, 500);
56281 function hashchange() {
56282 if (window.location.hash === s0) return; // ignore spurious hashchange events
56283 if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
56284 update(); // replace bogus hash
56291 .on('move.hash', throttledUpdate);
56294 .on('enter.hash', throttledUpdate);
56297 .on('hashchange.hash', hashchange);
56299 if (window.location.hash) {
56301 var q = utilStringQs(window.location.hash.substring(1));
56304 context.zoomToEntity(q.id.split(',')[0], !q.map);
56308 context.storage('comment', q.comment);
56309 context.storage('commentDate', Date.now());
56313 context.storage('source', q.source);
56314 context.storage('commentDate', Date.now());
56318 context.storage('hashtags', q.hashtags);
56321 if (q.walkthrough === 'true') {
56322 hash.startWalkthrough = true;
56328 hash.hadHash = true;
56334 hash.off = function() {
56335 throttledUpdate.cancel();
56338 .on('move.hash', null);
56341 .on('enter.hash', null);
56344 .on('hashchange.hash', null);
56346 window.location.hash = '';
56353 function behaviorLasso(context) {
56355 var behavior = function(selection$$1) {
56359 function mousedown() {
56360 var button = 0; // left
56361 if (event.button === button && event.shiftKey === true) {
56365 .on('mousemove.lasso', mousemove)
56366 .on('mouseup.lasso', mouseup);
56368 event.stopPropagation();
56373 function mousemove() {
56375 lasso = uiLasso(context);
56376 context.surface().call(lasso);
56379 lasso.p(context.mouse());
56383 function normalize(a, b) {
56385 [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
56386 [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
56390 function lassoed() {
56391 if (!lasso) return [];
56393 var graph = context.graph(),
56394 bounds = lasso.extent().map(context.projection.invert),
56395 extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
56397 return map$3(context.intersects(extent).filter(function(entity) {
56398 return entity.type === 'node' &&
56399 geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
56400 !context.features().isHidden(entity, graph, entity.geometry(graph));
56405 function mouseup() {
56407 .on('mousemove.lasso', null)
56408 .on('mouseup.lasso', null);
56410 if (!lasso) return;
56412 var ids = lassoed();
56416 context.enter(modeSelect(context, ids));
56421 .on('mousedown.lasso', mousedown);
56425 behavior.off = function(selection$$1) {
56426 selection$$1.on('mousedown.lasso', null);
56433 /* Creates a keybinding behavior for an operation */
56434 function behaviorOperation() {
56435 var _operation, keybinding;
56437 var behavior = function () {
56438 if (_operation && _operation.available()) {
56439 keybinding = d3keybinding('behavior.key.' + _operation.id);
56440 keybinding.on(_operation.keys, function() {
56441 event.preventDefault();
56442 var disabled = _operation.disabled();
56448 .iconName('#iD-operation-' + _operation.id)
56449 .iconClass('operation disabled')
56450 .text(_operation.tooltip);
56457 .iconName('#iD-operation-' + _operation.id)
56458 .iconClass('operation')
56459 .text(_operation.annotation() || _operation.title);
56466 select(document).call(keybinding);
56473 behavior.off = function() {
56475 select(document).call(keybinding.off);
56480 behavior.which = function (_) {
56481 if (!arguments.length) return _operation;
56491 * The base implementation of `_.invert` and `_.invertBy` which inverts
56492 * `object` with values transformed by `iteratee` and set by `setter`.
56495 * @param {Object} object The object to iterate over.
56496 * @param {Function} setter The function to set `accumulator` values.
56497 * @param {Function} iteratee The iteratee to transform values.
56498 * @param {Object} accumulator The initial inverted object.
56499 * @returns {Function} Returns `accumulator`.
56501 function baseInverter(object, setter, iteratee, accumulator) {
56502 baseForOwn(object, function(value, key, object) {
56503 setter(accumulator, iteratee(value), key, object);
56505 return accumulator;
56509 * Creates a function like `_.invertBy`.
56512 * @param {Function} setter The function to set accumulator values.
56513 * @param {Function} toIteratee The function to resolve iteratees.
56514 * @returns {Function} Returns the new inverter function.
56516 function createInverter(setter, toIteratee) {
56517 return function(object, iteratee) {
56518 return baseInverter(object, setter, toIteratee(iteratee), {});
56522 /** Used for built-in method references. */
56523 var objectProto$j = Object.prototype;
56526 * Used to resolve the
56527 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
56530 var nativeObjectToString$2 = objectProto$j.toString;
56533 * Creates an object composed of the inverted keys and values of `object`.
56534 * If `object` contains duplicate values, subsequent values overwrite
56535 * property assignments of previous values.
56541 * @param {Object} object The object to invert.
56542 * @returns {Object} Returns the new inverted object.
56545 * var object = { 'a': 1, 'b': 2, 'c': 1 };
56547 * _.invert(object);
56548 * // => { '1': 'c', '2': 'b' }
56550 var invert = createInverter(function(result, value, key) {
56551 if (value != null &&
56552 typeof value.toString != 'function') {
56553 value = nativeObjectToString$2.call(value);
56556 result[value] = key;
56557 }, constant$d(identity$8));
56560 * Creates an object with the same keys as `object` and values generated
56561 * by running each own enumerable string keyed property of `object` thru
56562 * `iteratee`. The iteratee is invoked with three arguments:
56563 * (value, key, object).
56569 * @param {Object} object The object to iterate over.
56570 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
56571 * @returns {Object} Returns the new mapped object.
56576 * 'fred': { 'user': 'fred', 'age': 40 },
56577 * 'pebbles': { 'user': 'pebbles', 'age': 1 }
56580 * _.mapValues(users, function(o) { return o.age; });
56581 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
56583 * // The `_.property` iteratee shorthand.
56584 * _.mapValues(users, 'age');
56585 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
56587 function mapValues(object, iteratee) {
56589 iteratee = baseIteratee(iteratee, 3);
56591 baseForOwn(object, function(value, key, object) {
56592 baseAssignValue(result, key, iteratee(value, key, object));
56597 function behaviorPaste(context) {
56598 var keybinding = d3keybinding('paste');
56601 function doPaste() {
56602 event.preventDefault();
56604 var baseGraph = context.graph(),
56605 mouse$$1 = context.mouse(),
56606 projection = context.projection,
56607 viewport = geoExtent$$1(projection.clipExtent()).polygon();
56609 if (!geoPointInPolygon(mouse$$1, viewport)) return;
56611 var extent = geoExtent$$1(),
56612 oldIDs = context.copyIDs(),
56613 oldGraph = context.copyGraph(),
56616 if (!oldIDs.length) return;
56618 var action = actionCopyEntities(oldIDs, oldGraph);
56619 context.perform(action);
56621 var copies = action.copies();
56622 var originals = invert(mapValues(copies, 'id'));
56623 for (var id in copies) {
56624 var oldEntity = oldGraph.entity(id),
56625 newEntity = copies[id];
56627 extent._extend(oldEntity.extent(oldGraph));
56629 // Exclude child nodes from newIDs if their parent way was also copied.
56630 var parents = context.graph().parentWays(newEntity),
56631 parentCopied = false;
56632 for (var i = 0; i < parents.length; i++) {
56633 if (originals[parents[i].id]) {
56634 parentCopied = true;
56639 if (!parentCopied) {
56640 newIDs.push(newEntity.id);
56644 // Put pasted objects where mouse pointer is..
56645 var center = projection(extent.center()),
56646 delta = [ mouse$$1[0] - center[0], mouse$$1[1] - center[1] ];
56648 context.perform(actionMove(newIDs, delta, projection));
56649 context.enter(modeMove$$1(context, newIDs, baseGraph));
56654 keybinding.on(uiCmd('⌘V'), doPaste);
56655 select(document).call(keybinding);
56660 paste.off = function() {
56661 select(document).call(keybinding.off);
56668 function behaviorSelect(context) {
56669 var lastMouse = null;
56670 var suppressMenu = true;
56675 function point$$1() {
56676 return mouse(context.container().node());
56680 function keydown() {
56682 if (e && e.shiftKey) {
56684 .classed('behavior-multiselect', true);
56687 if (e && e.keyCode === 93) { // context menu
56688 e.preventDefault();
56689 e.stopPropagation();
56696 if (!e || !e.shiftKey) {
56698 .classed('behavior-multiselect', false);
56702 if (e && e.keyCode === 93) { // context menu
56703 e.preventDefault();
56704 e.stopPropagation();
56710 function mousedown() {
56711 if (!p1) p1 = point$$1();
56713 .on('mouseup.select', mouseup, true);
56715 var isShowAlways = +context.storage('edit-menu-show-always') === 1;
56716 suppressMenu = !isShowAlways;
56720 function mousemove() {
56721 if (event) lastMouse = event;
56725 function mouseup() {
56730 function contextmenu() {
56732 e.preventDefault();
56733 e.stopPropagation();
56735 if (!+e.clientX && !+e.clientY) {
56737 e.sourceEvent = lastMouse;
56743 if (!p1) p1 = point$$1();
56744 suppressMenu = false;
56751 .on('mouseup.select', null, true);
56754 var p2 = point$$1();
56755 var dist = geoVecLength(p1, p2);
56758 if (dist > tolerance) {
56762 var isMultiselect = event.shiftKey || select('#surface .lasso').node();
56763 var isShowAlways = +context.storage('edit-menu-show-always') === 1;
56764 var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
56765 var mode = context.mode();
56767 var entity = datum && datum.properties && datum.properties.entity;
56768 if (entity) datum = entity;
56770 if (datum && datum.type === 'midpoint') {
56771 datum = datum.parents[0];
56774 if (datum instanceof osmEntity$$1) { // clicked an entity..
56775 var selectedIDs = context.selectedIDs();
56776 context.selectedNoteID(null);
56778 if (!isMultiselect) {
56779 if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
56780 // multiple things already selected, just show the menu...
56781 mode.suppressMenu(false).reselect();
56783 // select a single thing..
56784 context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
56788 if (selectedIDs.indexOf(datum.id) !== -1) {
56789 // clicked entity is already in the selectedIDs list..
56790 if (!suppressMenu && !isShowAlways) {
56791 // don't deselect clicked entity, just show the menu.
56792 mode.suppressMenu(false).reselect();
56794 // deselect clicked entity, then reenter select mode or return to browse mode..
56795 selectedIDs = without(selectedIDs, datum.id);
56796 context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
56799 // clicked entity is not in the selected list, add it..
56800 selectedIDs = selectedIDs.concat([datum.id]);
56801 context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
56805 } else if (datum && datum.__featurehash__ && !isMultiselect) { // clicked Data..
56807 .selectedNoteID(null)
56808 .enter(modeSelectData$$1(context, datum));
56810 } else if (datum instanceof osmNote && !isMultiselect) { // clicked a Note..
56812 .selectedNoteID(datum.id)
56813 .enter(modeSelectNote$$1(context, datum.id));
56815 } else { // clicked nothing..
56816 context.selectedNoteID(null);
56817 if (!isMultiselect && mode.id !== 'browse') {
56818 context.enter(modeBrowse(context));
56822 // reset for next time..
56823 suppressMenu = true;
56827 var behavior = function(selection$$1) {
56829 suppressMenu = true;
56833 .on('keydown.select', keydown)
56834 .on('keyup.select', keyup)
56835 .on('contextmenu.select-window', function() {
56836 // Edge and IE really like to show the contextmenu on the
56837 // menubar when user presses a keyboard menu button
56838 // even after we've already preventdefaulted the key event.
56840 if (+e.clientX === 0 && +e.clientY === 0) {
56841 event.preventDefault();
56842 event.stopPropagation();
56847 .on('mousedown.select', mousedown)
56848 .on('mousemove.select', mousemove)
56849 .on('contextmenu.select', contextmenu);
56851 if (event && event.shiftKey) {
56853 .classed('behavior-multiselect', true);
56858 behavior.off = function(selection$$1) {
56860 .on('keydown.select', null)
56861 .on('keyup.select', null)
56862 .on('contextmenu.select-window', null)
56863 .on('mouseup.select', null, true);
56866 .on('mousedown.select', null)
56867 .on('mousemove.select', null)
56868 .on('contextmenu.select', null);
56871 .classed('behavior-multiselect', false);
56878 function uiAccount(context) {
56879 var osm = context.connection();
56882 function update(selection$$1) {
56885 if (!osm.authenticated()) {
56886 selection$$1.selectAll('#userLink, #logoutLink')
56887 .classed('hide', true);
56891 osm.userDetails(function(err, details) {
56892 var userLink = selection$$1.select('#userLink'),
56893 logoutLink = selection$$1.select('#logoutLink');
56896 logoutLink.html('');
56900 selection$$1.selectAll('#userLink, #logoutLink')
56901 .classed('hide', false);
56904 userLink.append('a')
56905 .attr('href', osm.userURL(details.display_name))
56906 .attr('target', '_blank');
56908 // Add thumbnail or dont
56909 if (details.image_url) {
56910 userLink.append('img')
56911 .attr('class', 'icon pre-text user-icon')
56912 .attr('src', details.image_url);
56915 .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
56919 userLink.append('span')
56920 .attr('class', 'label')
56921 .text(details.display_name);
56923 logoutLink.append('a')
56924 .attr('class', 'logout')
56927 .on('click.logout', function() {
56928 event.preventDefault();
56935 return function(selection$$1) {
56936 selection$$1.append('li')
56937 .attr('id', 'logoutLink')
56938 .classed('hide', true);
56940 selection$$1.append('li')
56941 .attr('id', 'userLink')
56942 .classed('hide', true);
56945 osm.on('change.account', function() { update(selection$$1); });
56946 update(selection$$1);
56951 function uiAttribution(context) {
56955 function attribution(data, klass) {
56956 var div = selection$$1.selectAll('.' + klass)
56961 .attr('class', klass)
56965 var background = div.selectAll('.attribution')
56966 .data(data, function(d) { return d.name(); });
56971 background = background.enter()
56973 .attr('class', 'attribution')
56974 .each(function(d) {
56975 if (d.terms_html) {
56977 .html(d.terms_html);
56983 selection$$1 = select(this)
56985 .attr('href', d.terms_url)
56986 .attr('target', '_blank');
56988 selection$$1 = select(this);
56992 var id_safe = d.id.replace('.', '<TX_DOT>');
56993 var terms_text = t('imagery.' + id_safe + '.attribution.text',
56994 { default: d.terms_text || d.id || d.name() }
56997 if (d.icon && !d.overlay) {
57000 .attr('class', 'source-image')
57001 .attr('src', d.icon);
57006 .attr('class', 'attribution-text')
57009 .merge(background);
57012 var copyright = background.selectAll('.copyright-notice')
57013 .data(function(d) {
57014 var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
57015 return notice ? [notice] : [];
57021 copyright = copyright.enter()
57023 .attr('class', 'copyright-notice')
57031 function update() {
57032 attribution([context.background().baseLayerSource()], 'base-layer-attribution');
57033 attribution(context.background().overlayLayerSources().filter(function (s) {
57034 return s.validZoom(context.map().zoom());
57035 }), 'overlay-layer-attribution');
57039 return function(select$$1) {
57040 selection$$1 = select$$1;
57042 context.background()
57043 .on('change.attribution', update);
57046 .on('move.attribution', throttle(update, 400, {leading: false}));
57052 // toggles the visibility of ui elements, using a combination of the
57053 // hide class, which sets display=none, and a d3 transition for opacity.
57054 // this will cause blinking when called repeatedly, so check that the
57055 // value actually changes between calls.
57056 function uiToggle(show, callback) {
57057 return function(selection$$1) {
57059 .style('opacity', show ? 0 : 1)
57060 .classed('hide', false)
57062 .style('opacity', show ? 1 : 0)
57063 .on('end', function() {
57065 .classed('hide', !show)
57066 .style('opacity', null);
57067 if (callback) callback.apply(this);
57072 function uiDisclosure(context, key, expandedDefault) {
57073 var dispatch$$1 = dispatch('toggled');
57074 var _preference = (context.storage('disclosure.' + key + '.expanded'));
57075 var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
57077 var _updatePreference = true;
57078 var _content = function () {};
57081 var disclosure = function(selection$$1) {
57082 var hideToggle = selection$$1.selectAll('.hide-toggle-' + key)
57086 var hideToggleEnter = hideToggle.enter()
57089 .attr('class', 'hide-toggle hide-toggle-' + key)
57090 .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
57094 .attr('class', 'hide-toggle-text');
57097 hideToggle = hideToggleEnter
57098 .merge(hideToggle);
57101 .on('click', toggle)
57102 .classed('expanded', _expanded);
57104 hideToggle.selectAll('.hide-toggle-text')
57107 hideToggle.selectAll('.hide-toggle-icon')
57108 .attr('xlink:href', _expanded ? '#iD-icon-down'
57109 : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57113 var wrap = selection$$1.selectAll('.disclosure-wrap')
57116 wrap = wrap.enter()
57118 .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
57122 .classed('hide', !_expanded)
57126 function toggle() {
57127 event.preventDefault();
57129 _expanded = !_expanded;
57131 if (_updatePreference) {
57132 context.storage('disclosure.' + key + '.expanded', _expanded);
57136 .classed('expanded', _expanded);
57138 hideToggle.selectAll('.hide-toggle-icon')
57139 .attr('xlink:href', _expanded ? '#iD-icon-down'
57140 : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57144 .call(uiToggle(_expanded));
57146 dispatch$$1.call('toggled', this, _expanded);
57151 disclosure.title = function(_) {
57152 if (!arguments.length) return _title;
57158 disclosure.expanded = function(_) {
57159 if (!arguments.length) return _expanded;
57165 disclosure.updatePreference = function(_) {
57166 if (!arguments.length) return _updatePreference;
57167 _updatePreference = _;
57172 disclosure.content = function(_) {
57173 if (!arguments.length) return _content;
57179 return utilRebind(disclosure, dispatch$$1, 'on');
57182 function uiBackgroundDisplayOptions(context) {
57183 var detected = utilDetect();
57184 var storedOpacity = context.storage('background-opacity');
57186 var maxVal = detected.cssfilters ? 2 : 1;
57188 var sliders = detected.cssfilters
57189 ? ['brightness', 'contrast', 'saturation', 'sharpness']
57193 brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
57199 var _selection = select(null);
57202 function clamp(x, min, max) {
57203 return Math.max(min, Math.min(x, max));
57207 function updateValue(d, val) {
57208 if (!val && event && event.target) {
57209 val = event.target.value;
57212 val = clamp(val, minVal, maxVal);
57215 context.background()[d](val);
57217 if (d === 'brightness') {
57218 context.storage('background-opacity', val);
57226 function render(selection$$1) {
57227 var container = selection$$1.selectAll('.display-options-container')
57230 var containerEnter = container.enter()
57232 .attr('class', 'display-options-container controls-list');
57234 // add slider controls
57235 var slidersEnter = containerEnter.selectAll('.display-control')
57239 .attr('class', function(d) { return 'display-control display-control-' + d; });
57243 .text(function(d) { return t('background.' + d); })
57245 .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
57249 .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
57250 .attr('type', 'range')
57251 .attr('min', minVal)
57252 .attr('max', maxVal)
57253 .attr('step', '0.05')
57254 .on('input', function(d) {
57255 var val = select(this).property('value');
57256 updateValue(d, val);
57261 .attr('title', t('background.reset'))
57262 .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
57263 .on('click', function(d) {
57264 if (event.button !== 0) return;
57267 .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
57271 container = containerEnter
57274 container.selectAll('.display-option-input')
57275 .property('value', function(d) { return _options[d]; });
57277 container.selectAll('.display-option-value')
57278 .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
57280 container.selectAll('.display-option-reset')
57281 .classed('disabled', function(d) { return _options[d] === 1; });
57283 // first time only, set brightness if needed
57284 if (containerEnter.size() && _options.brightness !== 1) {
57285 context.background().brightness(_options.brightness);
57290 function backgroundDisplayOptions(selection$$1) {
57291 _selection = selection$$1;
57294 .call(uiDisclosure(context, 'background_display_options', true)
57295 .title(t('background.display_options'))
57301 return backgroundDisplayOptions;
57304 function uiBackgroundOffset(context) {
57306 ['right', [0.5, 0]],
57307 ['top', [0, -0.5]],
57308 ['left', [-0.5, 0]],
57309 ['bottom', [0, 0.5]]
57313 function d3_eventCancel() {
57314 event.stopPropagation();
57315 event.preventDefault();
57319 function updateValue() {
57320 var meters = geoOffsetToMeters(context.background().offset());
57321 var x = +meters[0].toFixed(2);
57322 var y = +meters[1].toFixed(2);
57324 d3_selectAll('.nudge-inner-rect')
57326 .classed('error', false)
57327 .property('value', x + ', ' + y);
57329 d3_selectAll('.nudge-reset')
57330 .classed('disabled', function() {
57331 return (x === 0 && y === 0);
57336 function resetOffset() {
57337 context.background().offset([0, 0]);
57342 function nudge(d) {
57343 context.background().nudge(d, context.map().zoom());
57348 function clickNudgeButton(d) {
57350 var timeout = window.setTimeout(function() {
57351 interval = window.setInterval(nudge.bind(null, d), 100);
57354 function doneNudge() {
57355 window.clearTimeout(timeout);
57356 window.clearInterval(interval);
57358 .on('mouseup.buttonoffset', null, true)
57359 .on('mousedown.buttonoffset', null, true);
57363 .on('mouseup.buttonoffset', doneNudge, true)
57364 .on('mousedown.buttonoffset', doneNudge, true);
57370 function inputOffset() {
57371 var input = select(this);
57372 var d = input.node().value;
57374 if (d === '') return resetOffset();
57376 d = d.replace(/;/g, ',').split(',').map(function(n) {
57377 // if n is NaN, it will always get mapped to false.
57378 return !isNaN(n) && n;
57381 if (d.length !== 2 || !d[0] || !d[1]) {
57382 input.classed('error', true);
57386 context.background().offset(geoMetersToOffset(d));
57391 function dragOffset() {
57392 event.preventDefault();
57393 if (event.button !== 0) return;
57395 var origin = [event.clientX, event.clientY];
57397 context.container()
57399 .attr('class', 'nudge-surface');
57402 .on('mousemove.offset', function() {
57403 var latest = [event.clientX, event.clientY];
57405 -(origin[0] - latest[0]) / 4,
57406 -(origin[1] - latest[1]) / 4
57412 .on('mouseup.offset', function() {
57413 if (event.button !== 0) return;
57414 d3_selectAll('.nudge-surface')
57418 .on('mousemove.offset', null)
57419 .on('mouseup.offset', null);
57424 function render(selection$$1) {
57425 var container = selection$$1.selectAll('.nudge-container')
57428 var containerEnter = container.enter()
57430 .attr('class', 'nudge-container cf');
57434 .attr('class', 'nudge-instructions')
57435 .text(t('background.offset'));
57437 var nudgeEnter = containerEnter
57439 .attr('class', 'nudge-outer-rect')
57440 .on('mousedown', dragOffset);
57444 .attr('class', 'nudge-inner-rect')
57446 .on('change', inputOffset);
57450 .selectAll('button')
57451 .data(directions).enter()
57453 .attr('class', function(d) { return d[0] + ' nudge'; })
57454 .on('contextmenu', d3_eventCancel)
57455 .on('mousedown', function(d) {
57456 if (event.button !== 0) return;
57457 clickNudgeButton(d[1]);
57462 .attr('title', t('background.reset'))
57463 .attr('class', 'nudge-reset disabled')
57464 .on('contextmenu', d3_eventCancel)
57465 .on('click', function() {
57466 if (event.button !== 0) return;
57469 .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
57475 function backgroundOffset(selection$$1) {
57477 .call(uiDisclosure(context, 'background_offset', false)
57478 .title(t('background.fix_misalignment'))
57484 context.background()
57485 .on('change.backgroundOffset-update', updateValue);
57487 return backgroundOffset;
57490 var marked = createCommonjsModule(function (module, exports) {
57494 * Block-Level Grammar
57499 code: /^( {4}[^\n]+\n*)+/,
57501 hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
57502 heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
57504 blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
57505 list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
57506 html: '^ {0,3}(?:' // optional indentation
57507 + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
57508 + '|comment[^\\n]*(\\n+|$)' // (2)
57509 + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
57510 + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
57511 + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
57512 + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
57513 + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
57514 + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
57516 def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
57518 lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
57519 paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
57523 block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
57524 block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
57525 block.def = edit(block.def)
57526 .replace('label', block._label)
57527 .replace('title', block._title)
57530 block.bullet = /(?:[*+-]|\d+\.)/;
57531 block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
57532 block.item = edit(block.item, 'gm')
57533 .replace(/bull/g, block.bullet)
57536 block.list = edit(block.list)
57537 .replace(/bull/g, block.bullet)
57538 .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
57539 .replace('def', '\\n+(?=' + block.def.source + ')')
57542 block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
57543 + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
57544 + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
57545 + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
57546 + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
57548 block._comment = /<!--(?!-?>)[\s\S]*?-->/;
57549 block.html = edit(block.html, 'i')
57550 .replace('comment', block._comment)
57551 .replace('tag', block._tag)
57552 .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
57555 block.paragraph = edit(block.paragraph)
57556 .replace('hr', block.hr)
57557 .replace('heading', block.heading)
57558 .replace('lheading', block.lheading)
57559 .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
57562 block.blockquote = edit(block.blockquote)
57563 .replace('paragraph', block.paragraph)
57567 * Normal Block Grammar
57570 block.normal = merge({}, block);
57573 * GFM Block Grammar
57576 block.gfm = merge({}, block.normal, {
57577 fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
57579 heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
57582 block.gfm.paragraph = edit(block.paragraph)
57583 .replace('(?!', '(?!'
57584 + block.gfm.fences.source.replace('\\1', '\\2') + '|'
57585 + block.list.source.replace('\\1', '\\3') + '|')
57589 * GFM + Tables Block Grammar
57592 block.tables = merge({}, block.gfm, {
57593 nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
57594 table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
57601 block.pedantic = merge({}, block.normal, {
57603 '^ *(?:comment *(?:\\n|\\s*$)'
57604 + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
57605 + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
57606 .replace('comment', block._comment)
57607 .replace(/tag/g, '(?!(?:'
57608 + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
57609 + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
57610 + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
57612 def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
57619 function Lexer(options) {
57621 this.tokens.links = Object.create(null);
57622 this.options = options || marked.defaults;
57623 this.rules = block.normal;
57625 if (this.options.pedantic) {
57626 this.rules = block.pedantic;
57627 } else if (this.options.gfm) {
57628 if (this.options.tables) {
57629 this.rules = block.tables;
57631 this.rules = block.gfm;
57637 * Expose Block Rules
57640 Lexer.rules = block;
57643 * Static Lex Method
57646 Lexer.lex = function(src, options) {
57647 var lexer = new Lexer(options);
57648 return lexer.lex(src);
57655 Lexer.prototype.lex = function(src) {
57657 .replace(/\r\n|\r/g, '\n')
57658 .replace(/\t/g, ' ')
57659 .replace(/\u00a0/g, ' ')
57660 .replace(/\u2424/g, '\n');
57662 return this.token(src, true);
57669 Lexer.prototype.token = function(src, top) {
57670 src = src.replace(/^ +$/gm, '');
57690 if (cap = this.rules.newline.exec(src)) {
57691 src = src.substring(cap[0].length);
57692 if (cap[0].length > 1) {
57700 if (cap = this.rules.code.exec(src)) {
57701 src = src.substring(cap[0].length);
57702 cap = cap[0].replace(/^ {4}/gm, '');
57705 text: !this.options.pedantic
57713 if (cap = this.rules.fences.exec(src)) {
57714 src = src.substring(cap[0].length);
57724 if (cap = this.rules.heading.exec(src)) {
57725 src = src.substring(cap[0].length);
57728 depth: cap[1].length,
57734 // table no leading pipe (gfm)
57735 if (top && (cap = this.rules.nptable.exec(src))) {
57738 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
57739 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
57740 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
57743 if (item.header.length === item.align.length) {
57744 src = src.substring(cap[0].length);
57746 for (i = 0; i < item.align.length; i++) {
57747 if (/^ *-+: *$/.test(item.align[i])) {
57748 item.align[i] = 'right';
57749 } else if (/^ *:-+: *$/.test(item.align[i])) {
57750 item.align[i] = 'center';
57751 } else if (/^ *:-+ *$/.test(item.align[i])) {
57752 item.align[i] = 'left';
57754 item.align[i] = null;
57758 for (i = 0; i < item.cells.length; i++) {
57759 item.cells[i] = splitCells(item.cells[i], item.header.length);
57762 this.tokens.push(item);
57769 if (cap = this.rules.hr.exec(src)) {
57770 src = src.substring(cap[0].length);
57778 if (cap = this.rules.blockquote.exec(src)) {
57779 src = src.substring(cap[0].length);
57782 type: 'blockquote_start'
57785 cap = cap[0].replace(/^ *> ?/gm, '');
57787 // Pass `top` to keep the current
57788 // "toplevel" state. This is exactly
57789 // how markdown.pl works.
57790 this.token(cap, top);
57793 type: 'blockquote_end'
57800 if (cap = this.rules.list.exec(src)) {
57801 src = src.substring(cap[0].length);
57803 isordered = bull.length > 1;
57806 type: 'list_start',
57807 ordered: isordered,
57808 start: isordered ? +bull : '',
57812 this.tokens.push(listStart);
57814 // Get each top-level item.
57815 cap = cap[0].match(this.rules.item);
57822 for (; i < l; i++) {
57825 // Remove the list item's bullet
57826 // so it is seen as the next token.
57827 space = item.length;
57828 item = item.replace(/^ *([*+-]|\d+\.) +/, '');
57830 // Outdent whatever the
57831 // list item contains. Hacky.
57832 if (~item.indexOf('\n ')) {
57833 space -= item.length;
57834 item = !this.options.pedantic
57835 ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
57836 : item.replace(/^ {1,4}/gm, '');
57839 // Determine whether the next list item belongs here.
57840 // Backpedal if it does not belong in this list.
57841 if (this.options.smartLists && i !== l - 1) {
57842 b = block.bullet.exec(cap[i + 1])[0];
57843 if (bull !== b && !(bull.length > 1 && b.length > 1)) {
57844 src = cap.slice(i + 1).join('\n') + src;
57849 // Determine whether item is loose or not.
57850 // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
57851 // for discount behavior.
57852 loose = next || /\n\n(?!\s*$)/.test(item);
57854 next = item.charAt(item.length - 1) === '\n';
57855 if (!loose) loose = next;
57859 listStart.loose = true;
57862 // Check for task list items
57863 istask = /^\[[ xX]\] /.test(item);
57864 ischecked = undefined;
57866 ischecked = item[1] !== ' ';
57867 item = item.replace(/^\[[ xX]\] +/, '');
57871 type: 'list_item_start',
57873 checked: ischecked,
57878 this.tokens.push(t);
57881 this.token(item, false);
57884 type: 'list_item_end'
57888 if (listStart.loose) {
57889 l = listItems.length;
57891 for (; i < l; i++) {
57892 listItems[i].loose = true;
57904 if (cap = this.rules.html.exec(src)) {
57905 src = src.substring(cap[0].length);
57907 type: this.options.sanitize
57910 pre: !this.options.sanitizer
57911 && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
57918 if (top && (cap = this.rules.def.exec(src))) {
57919 src = src.substring(cap[0].length);
57920 if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
57921 tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
57922 if (!this.tokens.links[tag]) {
57923 this.tokens.links[tag] = {
57932 if (top && (cap = this.rules.table.exec(src))) {
57935 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
57936 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
57937 cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
57940 if (item.header.length === item.align.length) {
57941 src = src.substring(cap[0].length);
57943 for (i = 0; i < item.align.length; i++) {
57944 if (/^ *-+: *$/.test(item.align[i])) {
57945 item.align[i] = 'right';
57946 } else if (/^ *:-+: *$/.test(item.align[i])) {
57947 item.align[i] = 'center';
57948 } else if (/^ *:-+ *$/.test(item.align[i])) {
57949 item.align[i] = 'left';
57951 item.align[i] = null;
57955 for (i = 0; i < item.cells.length; i++) {
57956 item.cells[i] = splitCells(
57957 item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
57958 item.header.length);
57961 this.tokens.push(item);
57968 if (cap = this.rules.lheading.exec(src)) {
57969 src = src.substring(cap[0].length);
57972 depth: cap[2] === '=' ? 1 : 2,
57978 // top-level paragraph
57979 if (top && (cap = this.rules.paragraph.exec(src))) {
57980 src = src.substring(cap[0].length);
57983 text: cap[1].charAt(cap[1].length - 1) === '\n'
57984 ? cap[1].slice(0, -1)
57991 if (cap = this.rules.text.exec(src)) {
57992 // Top-level should never reach here.
57993 src = src.substring(cap[0].length);
58002 throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
58006 return this.tokens;
58010 * Inline-Level Grammar
58014 escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
58015 autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
58018 + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
58019 + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
58020 + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
58021 + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
58022 + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
58023 link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
58024 reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
58025 nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
58026 strong: /^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
58027 em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
58028 code: /^(`+)\s*([\s\S]*?[^`]?)\s*\1(?!`)/,
58029 br: /^( {2,}|\\)\n(?!\s*$)/,
58031 text: /^[\s\S]+?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
58034 inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
58036 inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
58037 inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
58038 inline.autolink = edit(inline.autolink)
58039 .replace('scheme', inline._scheme)
58040 .replace('email', inline._email)
58043 inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
58045 inline.tag = edit(inline.tag)
58046 .replace('comment', block._comment)
58047 .replace('attribute', inline._attribute)
58050 inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
58051 inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f\\]*\)|[^\s\x00-\x1f()\\])*?)/;
58052 inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
58054 inline.link = edit(inline.link)
58055 .replace('label', inline._label)
58056 .replace('href', inline._href)
58057 .replace('title', inline._title)
58060 inline.reflink = edit(inline.reflink)
58061 .replace('label', inline._label)
58065 * Normal Inline Grammar
58068 inline.normal = merge({}, inline);
58071 * Pedantic Inline Grammar
58074 inline.pedantic = merge({}, inline.normal, {
58075 strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
58076 em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
58077 link: edit(/^!?\[(label)\]\((.*?)\)/)
58078 .replace('label', inline._label)
58080 reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
58081 .replace('label', inline._label)
58086 * GFM Inline Grammar
58089 inline.gfm = merge({}, inline.normal, {
58090 escape: edit(inline.escape).replace('])', '~|])').getRegex(),
58091 url: edit(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/)
58092 .replace('email', inline._email)
58094 _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
58095 del: /^~+(?=\S)([\s\S]*?\S)~+/,
58096 text: edit(inline.text)
58097 .replace(']|', '~]|')
58098 .replace('|', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|')
58103 * GFM + Line Breaks Inline Grammar
58106 inline.breaks = merge({}, inline.gfm, {
58107 br: edit(inline.br).replace('{2,}', '*').getRegex(),
58108 text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
58112 * Inline Lexer & Compiler
58115 function InlineLexer(links, options) {
58116 this.options = options || marked.defaults;
58117 this.links = links;
58118 this.rules = inline.normal;
58119 this.renderer = this.options.renderer || new Renderer();
58120 this.renderer.options = this.options;
58123 throw new Error('Tokens array requires a `links` property.');
58126 if (this.options.pedantic) {
58127 this.rules = inline.pedantic;
58128 } else if (this.options.gfm) {
58129 if (this.options.breaks) {
58130 this.rules = inline.breaks;
58132 this.rules = inline.gfm;
58138 * Expose Inline Rules
58141 InlineLexer.rules = inline;
58144 * Static Lexing/Compiling Method
58147 InlineLexer.output = function(src, links, options) {
58148 var inline = new InlineLexer(links, options);
58149 return inline.output(src);
58156 InlineLexer.prototype.output = function(src) {
58167 if (cap = this.rules.escape.exec(src)) {
58168 src = src.substring(cap[0].length);
58174 if (cap = this.rules.autolink.exec(src)) {
58175 src = src.substring(cap[0].length);
58176 if (cap[2] === '@') {
58177 text = escape(this.mangle(cap[1]));
58178 href = 'mailto:' + text;
58180 text = escape(cap[1]);
58183 out += this.renderer.link(href, null, text);
58188 if (!this.inLink && (cap = this.rules.url.exec(src))) {
58190 prevCapZero = cap[0];
58191 cap[0] = this.rules._backpedal.exec(cap[0])[0];
58192 } while (prevCapZero !== cap[0]);
58193 src = src.substring(cap[0].length);
58194 if (cap[2] === '@') {
58195 text = escape(cap[0]);
58196 href = 'mailto:' + text;
58198 text = escape(cap[0]);
58199 if (cap[1] === 'www.') {
58200 href = 'http://' + text;
58205 out += this.renderer.link(href, null, text);
58210 if (cap = this.rules.tag.exec(src)) {
58211 if (!this.inLink && /^<a /i.test(cap[0])) {
58212 this.inLink = true;
58213 } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
58214 this.inLink = false;
58216 src = src.substring(cap[0].length);
58217 out += this.options.sanitize
58218 ? this.options.sanitizer
58219 ? this.options.sanitizer(cap[0])
58226 if (cap = this.rules.link.exec(src)) {
58227 src = src.substring(cap[0].length);
58228 this.inLink = true;
58230 if (this.options.pedantic) {
58231 link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
58240 title = cap[3] ? cap[3].slice(1, -1) : '';
58242 href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
58243 out += this.outputLink(cap, {
58244 href: InlineLexer.escapes(href),
58245 title: InlineLexer.escapes(title)
58247 this.inLink = false;
58252 if ((cap = this.rules.reflink.exec(src))
58253 || (cap = this.rules.nolink.exec(src))) {
58254 src = src.substring(cap[0].length);
58255 link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
58256 link = this.links[link.toLowerCase()];
58257 if (!link || !link.href) {
58258 out += cap[0].charAt(0);
58259 src = cap[0].substring(1) + src;
58262 this.inLink = true;
58263 out += this.outputLink(cap, link);
58264 this.inLink = false;
58269 if (cap = this.rules.strong.exec(src)) {
58270 src = src.substring(cap[0].length);
58271 out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
58276 if (cap = this.rules.em.exec(src)) {
58277 src = src.substring(cap[0].length);
58278 out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
58283 if (cap = this.rules.code.exec(src)) {
58284 src = src.substring(cap[0].length);
58285 out += this.renderer.codespan(escape(cap[2].trim(), true));
58290 if (cap = this.rules.br.exec(src)) {
58291 src = src.substring(cap[0].length);
58292 out += this.renderer.br();
58297 if (cap = this.rules.del.exec(src)) {
58298 src = src.substring(cap[0].length);
58299 out += this.renderer.del(this.output(cap[1]));
58304 if (cap = this.rules.text.exec(src)) {
58305 src = src.substring(cap[0].length);
58306 out += this.renderer.text(escape(this.smartypants(cap[0])));
58311 throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
58318 InlineLexer.escapes = function(text) {
58319 return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
58326 InlineLexer.prototype.outputLink = function(cap, link) {
58327 var href = link.href,
58328 title = link.title ? escape(link.title) : null;
58330 return cap[0].charAt(0) !== '!'
58331 ? this.renderer.link(href, title, this.output(cap[1]))
58332 : this.renderer.image(href, title, escape(cap[1]));
58336 * Smartypants Transformations
58339 InlineLexer.prototype.smartypants = function(text) {
58340 if (!this.options.smartypants) return text;
58343 .replace(/---/g, '\u2014')
58345 .replace(/--/g, '\u2013')
58347 .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
58348 // closing singles & apostrophes
58349 .replace(/'/g, '\u2019')
58351 .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
58353 .replace(/"/g, '\u201d')
58355 .replace(/\.{3}/g, '\u2026');
58362 InlineLexer.prototype.mangle = function(text) {
58363 if (!this.options.mangle) return text;
58369 for (; i < l; i++) {
58370 ch = text.charCodeAt(i);
58371 if (Math.random() > 0.5) {
58372 ch = 'x' + ch.toString(16);
58374 out += '&#' + ch + ';';
58384 function Renderer(options) {
58385 this.options = options || marked.defaults;
58388 Renderer.prototype.code = function(code, lang, escaped) {
58389 if (this.options.highlight) {
58390 var out = this.options.highlight(code, lang);
58391 if (out != null && out !== code) {
58398 return '<pre><code>'
58399 + (escaped ? code : escape(code, true))
58403 return '<pre><code class="'
58404 + this.options.langPrefix
58405 + escape(lang, true)
58407 + (escaped ? code : escape(code, true))
58408 + '</code></pre>\n';
58411 Renderer.prototype.blockquote = function(quote) {
58412 return '<blockquote>\n' + quote + '</blockquote>\n';
58415 Renderer.prototype.html = function(html) {
58419 Renderer.prototype.heading = function(text, level, raw) {
58420 if (this.options.headerIds) {
58424 + this.options.headerPrefix
58425 + raw.toLowerCase().replace(/[^\w]+/g, '-')
58433 return '<h' + level + '>' + text + '</h' + level + '>\n';
58436 Renderer.prototype.hr = function() {
58437 return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
58440 Renderer.prototype.list = function(body, ordered, start) {
58441 var type = ordered ? 'ol' : 'ul',
58442 startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
58443 return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
58446 Renderer.prototype.listitem = function(text) {
58447 return '<li>' + text + '</li>\n';
58450 Renderer.prototype.checkbox = function(checked) {
58452 + (checked ? 'checked="" ' : '')
58453 + 'disabled="" type="checkbox"'
58454 + (this.options.xhtml ? ' /' : '')
58458 Renderer.prototype.paragraph = function(text) {
58459 return '<p>' + text + '</p>\n';
58462 Renderer.prototype.table = function(header, body) {
58463 if (body) body = '<tbody>' + body + '</tbody>';
58473 Renderer.prototype.tablerow = function(content) {
58474 return '<tr>\n' + content + '</tr>\n';
58477 Renderer.prototype.tablecell = function(content, flags) {
58478 var type = flags.header ? 'th' : 'td';
58479 var tag = flags.align
58480 ? '<' + type + ' align="' + flags.align + '">'
58481 : '<' + type + '>';
58482 return tag + content + '</' + type + '>\n';
58485 // span level renderer
58486 Renderer.prototype.strong = function(text) {
58487 return '<strong>' + text + '</strong>';
58490 Renderer.prototype.em = function(text) {
58491 return '<em>' + text + '</em>';
58494 Renderer.prototype.codespan = function(text) {
58495 return '<code>' + text + '</code>';
58498 Renderer.prototype.br = function() {
58499 return this.options.xhtml ? '<br/>' : '<br>';
58502 Renderer.prototype.del = function(text) {
58503 return '<del>' + text + '</del>';
58506 Renderer.prototype.link = function(href, title, text) {
58507 if (this.options.sanitize) {
58509 var prot = decodeURIComponent(unescape(href))
58510 .replace(/[^\w:]/g, '')
58515 if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
58519 if (this.options.baseUrl && !originIndependentUrl.test(href)) {
58520 href = resolveUrl(this.options.baseUrl, href);
58523 href = encodeURI(href).replace(/%25/g, '%');
58527 var out = '<a href="' + escape(href) + '"';
58529 out += ' title="' + title + '"';
58531 out += '>' + text + '</a>';
58535 Renderer.prototype.image = function(href, title, text) {
58536 if (this.options.baseUrl && !originIndependentUrl.test(href)) {
58537 href = resolveUrl(this.options.baseUrl, href);
58539 var out = '<img src="' + href + '" alt="' + text + '"';
58541 out += ' title="' + title + '"';
58543 out += this.options.xhtml ? '/>' : '>';
58547 Renderer.prototype.text = function(text) {
58553 * returns only the textual part of the token
58556 function TextRenderer() {}
58558 // no need for block level renderers
58560 TextRenderer.prototype.strong =
58561 TextRenderer.prototype.em =
58562 TextRenderer.prototype.codespan =
58563 TextRenderer.prototype.del =
58564 TextRenderer.prototype.text = function (text) {
58568 TextRenderer.prototype.link =
58569 TextRenderer.prototype.image = function(href, title, text) {
58573 TextRenderer.prototype.br = function() {
58578 * Parsing & Compiling
58581 function Parser(options) {
58584 this.options = options || marked.defaults;
58585 this.options.renderer = this.options.renderer || new Renderer();
58586 this.renderer = this.options.renderer;
58587 this.renderer.options = this.options;
58591 * Static Parse Method
58594 Parser.parse = function(src, options) {
58595 var parser = new Parser(options);
58596 return parser.parse(src);
58603 Parser.prototype.parse = function(src) {
58604 this.inline = new InlineLexer(src.links, this.options);
58605 // use an InlineLexer with a TextRenderer to extract pure text
58606 this.inlineText = new InlineLexer(
58608 merge({}, this.options, {renderer: new TextRenderer()})
58610 this.tokens = src.reverse();
58613 while (this.next()) {
58624 Parser.prototype.next = function() {
58625 return this.token = this.tokens.pop();
58629 * Preview Next Token
58632 Parser.prototype.peek = function() {
58633 return this.tokens[this.tokens.length - 1] || 0;
58637 * Parse Text Tokens
58640 Parser.prototype.parseText = function() {
58641 var body = this.token.text;
58643 while (this.peek().type === 'text') {
58644 body += '\n' + this.next().text;
58647 return this.inline.output(body);
58651 * Parse Current Token
58654 Parser.prototype.tok = function() {
58655 switch (this.token.type) {
58660 return this.renderer.hr();
58663 return this.renderer.heading(
58664 this.inline.output(this.token.text),
58666 unescape(this.inlineText.output(this.token.text)));
58669 return this.renderer.code(this.token.text,
58671 this.token.escaped);
58683 for (i = 0; i < this.token.header.length; i++) {
58684 cell += this.renderer.tablecell(
58685 this.inline.output(this.token.header[i]),
58686 { header: true, align: this.token.align[i] }
58689 header += this.renderer.tablerow(cell);
58691 for (i = 0; i < this.token.cells.length; i++) {
58692 row = this.token.cells[i];
58695 for (j = 0; j < row.length; j++) {
58696 cell += this.renderer.tablecell(
58697 this.inline.output(row[j]),
58698 { header: false, align: this.token.align[j] }
58702 body += this.renderer.tablerow(cell);
58704 return this.renderer.table(header, body);
58706 case 'blockquote_start': {
58709 while (this.next().type !== 'blockquote_end') {
58710 body += this.tok();
58713 return this.renderer.blockquote(body);
58715 case 'list_start': {
58717 var ordered = this.token.ordered,
58718 start = this.token.start;
58720 while (this.next().type !== 'list_end') {
58721 body += this.tok();
58724 return this.renderer.list(body, ordered, start);
58726 case 'list_item_start': {
58728 var loose = this.token.loose;
58730 if (this.token.task) {
58731 body += this.renderer.checkbox(this.token.checked);
58734 while (this.next().type !== 'list_item_end') {
58735 body += !loose && this.token.type === 'text'
58740 return this.renderer.listitem(body);
58743 // TODO parse inline content if parameter markdown=1
58744 return this.renderer.html(this.token.text);
58746 case 'paragraph': {
58747 return this.renderer.paragraph(this.inline.output(this.token.text));
58750 return this.renderer.paragraph(this.parseText());
58759 function escape(html, encode) {
58761 .replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&')
58762 .replace(/</g, '<')
58763 .replace(/>/g, '>')
58764 .replace(/"/g, '"')
58765 .replace(/'/g, ''');
58768 function unescape(html) {
58769 // explicitly match decimal, hex, and named HTML entities
58770 return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
58771 n = n.toLowerCase();
58772 if (n === 'colon') return ':';
58773 if (n.charAt(0) === '#') {
58774 return n.charAt(1) === 'x'
58775 ? String.fromCharCode(parseInt(n.substring(2), 16))
58776 : String.fromCharCode(+n.substring(1));
58782 function edit(regex, opt) {
58783 regex = regex.source || regex;
58786 replace: function(name, val) {
58787 val = val.source || val;
58788 val = val.replace(/(^|[^\[])\^/g, '$1');
58789 regex = regex.replace(name, val);
58792 getRegex: function() {
58793 return new RegExp(regex, opt);
58798 function resolveUrl(base, href) {
58799 if (!baseUrls[' ' + base]) {
58800 // we can ignore everything in base after the last slash of its path component,
58801 // but we might need to add _that_
58802 // https://tools.ietf.org/html/rfc3986#section-3
58803 if (/^[^:]+:\/*[^/]*$/.test(base)) {
58804 baseUrls[' ' + base] = base + '/';
58806 baseUrls[' ' + base] = rtrim(base, '/', true);
58809 base = baseUrls[' ' + base];
58811 if (href.slice(0, 2) === '//') {
58812 return base.replace(/:[\s\S]*/, ':') + href;
58813 } else if (href.charAt(0) === '/') {
58814 return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
58816 return base + href;
58820 var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
58825 function merge(obj) {
58830 for (; i < arguments.length; i++) {
58831 target = arguments[i];
58832 for (key in target) {
58833 if (Object.prototype.hasOwnProperty.call(target, key)) {
58834 obj[key] = target[key];
58842 function splitCells(tableRow, count) {
58843 // ensure that every cell-delimiting pipe has a space
58844 // before it to distinguish it from an escaped pipe
58845 var row = tableRow.replace(/\|/g, function (match, offset, str) {
58846 var escaped = false,
58848 while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
58850 // odd number of slashes means | is escaped
58851 // so we leave it alone
58854 // add space before unescaped |
58858 cells = row.split(/ \|/),
58861 if (cells.length > count) {
58862 cells.splice(count);
58864 while (cells.length < count) cells.push('');
58867 for (; i < cells.length; i++) {
58868 // leading or trailing whitespace is ignored per the gfm spec
58869 cells[i] = cells[i].trim().replace(/\\\|/g, '|');
58874 // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
58875 // /c*$/ is vulnerable to REDOS.
58876 // invert: Remove suffix of non-c chars instead. Default falsey.
58877 function rtrim(str, c, invert) {
58878 if (str.length === 0) {
58882 // Length of suffix matching the invert condition.
58885 // Step left until we fail to match the invert condition.
58886 while (suffLen < str.length) {
58887 var currChar = str.charAt(str.length - suffLen - 1);
58888 if (currChar === c && !invert) {
58890 } else if (currChar !== c && invert) {
58897 return str.substr(0, str.length - suffLen);
58904 function marked(src, opt, callback) {
58905 // throw error in case of non string input
58906 if (typeof src === 'undefined' || src === null) {
58907 throw new Error('marked(): input parameter is undefined or null');
58909 if (typeof src !== 'string') {
58910 throw new Error('marked(): input parameter is of type '
58911 + Object.prototype.toString.call(src) + ', string expected');
58914 if (callback || typeof opt === 'function') {
58920 opt = merge({}, marked.defaults, opt || {});
58922 var highlight = opt.highlight,
58928 tokens = Lexer.lex(src, opt);
58930 return callback(e);
58933 pending = tokens.length;
58935 var done = function(err) {
58937 opt.highlight = highlight;
58938 return callback(err);
58944 out = Parser.parse(tokens, opt);
58949 opt.highlight = highlight;
58953 : callback(null, out);
58956 if (!highlight || highlight.length < 3) {
58960 delete opt.highlight;
58962 if (!pending) return done();
58964 for (; i < tokens.length; i++) {
58966 if (token.type !== 'code') {
58967 return --pending || done();
58969 return highlight(token.text, token.lang, function(err, code) {
58970 if (err) return done(err);
58971 if (code == null || code === token.text) {
58972 return --pending || done();
58975 token.escaped = true;
58976 --pending || done();
58984 if (opt) opt = merge({}, marked.defaults, opt);
58985 return Parser.parse(Lexer.lex(src, opt), opt);
58987 e.message += '\nPlease report this to https://github.com/markedjs/marked.';
58988 if ((opt || marked.defaults).silent) {
58989 return '<p>An error occurred:</p><pre>'
58990 + escape(e.message + '', true)
59002 marked.setOptions = function(opt) {
59003 merge(marked.defaults, opt);
59007 marked.getDefaults = function () {
59015 langPrefix: 'language-',
59018 renderer: new Renderer(),
59023 smartypants: false,
59029 marked.defaults = marked.getDefaults();
59035 marked.Parser = Parser;
59036 marked.parser = Parser.parse;
59038 marked.Renderer = Renderer;
59039 marked.TextRenderer = TextRenderer;
59041 marked.Lexer = Lexer;
59042 marked.lexer = Lexer.lex;
59044 marked.InlineLexer = InlineLexer;
59045 marked.inlineLexer = InlineLexer.output;
59047 marked.parse = marked;
59050 module.exports = marked;
59052 })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
59055 function pointBox(loc, context) {
59056 var rect = context.surfaceRect();
59057 var point$$1 = context.curtainProjection(loc);
59059 left: point$$1[0] + rect.left - 40,
59060 top: point$$1[1] + rect.top - 60,
59067 function pad$1(locOrBox, padding, context) {
59069 if (locOrBox instanceof Array) {
59070 var rect = context.surfaceRect();
59071 var point$$1 = context.curtainProjection(locOrBox);
59073 left: point$$1[0] + rect.left,
59074 top: point$$1[1] + rect.top
59081 left: box.left - padding,
59082 top: box.top - padding,
59083 width: (box.width || 0) + 2 * padding,
59084 height: (box.width || 0) + 2 * padding
59089 function icon(name, svgklass, useklass) {
59090 return '<svg class="icon ' + (svgklass || '') + '">' +
59091 '<use xlink:href="' + name + '"' +
59092 (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
59096 function slugify(text) {
59097 return text.toString().toLowerCase()
59098 .replace(/\s+/g, '-') // Replace spaces with -
59099 .replace(/[^\w\-]+/g, '') // Remove all non-word chars
59100 .replace(/\-\-+/g, '-') // Replace multiple - with single -
59101 .replace(/^-+/, '') // Trim - from start of text
59102 .replace(/-+$/, ''); // Trim - from end of text
59106 // console warning for missing walkthrough names
59107 var missingStrings = {};
59108 function checkKey(key, text) {
59109 if (t(key, { default: undefined}) === undefined) {
59110 if (missingStrings.hasOwnProperty(key)) return; // warn once
59111 missingStrings[key] = text;
59112 var missing = key + ': ' + text;
59113 if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
59118 function localize(obj) {
59121 // Assign name if entity has one..
59122 var name = obj.tags && obj.tags.name;
59124 key = 'intro.graph.name.' + slugify(name);
59125 obj.tags.name = t(key, { default: name });
59126 checkKey(key, name);
59129 // Assign street name if entity has one..
59130 var street = obj.tags && obj.tags['addr:street'];
59132 key = 'intro.graph.name.' + slugify(street);
59133 obj.tags['addr:street'] = t(key, { default: street });
59134 checkKey(key, street);
59136 // Add address details common across walkthrough..
59138 'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
59139 'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
59141 addrTags.forEach(function(k) {
59142 var key = 'intro.graph.' + k,
59144 val = obj.tags && obj.tags[tag],
59145 str = t(key, { default: val });
59148 if (str.match(/^<.*>$/) !== null) {
59149 delete obj.tags[tag];
59151 obj.tags[tag] = str;
59161 // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
59162 function isMostlySquare(points) {
59163 // note: uses 15 here instead of the 12 from actionOrthogonalize because
59164 // actionOrthogonalize can actually straighten some larger angles as it iterates
59165 var threshold = 15, // degrees within right or straight
59166 lowerBound = Math.cos((90 - threshold) * Math.PI / 180), // near right
59167 upperBound = Math.cos(threshold * Math.PI / 180), // near straight
59170 for (var i = 0; i < points.length; i++) {
59171 mag = Math.abs(normalizedDotProduct(i, points));
59172 if (mag > lowerBound && mag < upperBound) {
59180 function normalizedDotProduct(i, points) {
59181 var a = points[(i - 1 + points.length) % points.length],
59183 c = points[(i + 1) % points.length],
59184 p = subtractPoints(a, b),
59185 q = subtractPoints(c, b);
59187 p = normalizePoint(p);
59188 q = normalizePoint(q);
59190 return p[0] * q[0] + p[1] * q[1];
59193 function subtractPoints(a, b) {
59194 return [a[0] - b[0], a[1] - b[1]];
59197 function normalizePoint(point$$1) {
59198 var vector = [0, 0];
59199 var length = Math.sqrt(point$$1[0] * point$$1[0] + point$$1[1] * point$$1[1]);
59200 if (length !== 0) {
59201 vector[0] = point$$1[0] / length;
59202 vector[1] = point$$1[1] / length;
59210 function selectMenuItem(operation) {
59211 var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
59212 ', .radial-menu .radial-menu-item-' + operation;
59213 return select(selector$$1);
59217 function transitionTime(point1, point2) {
59218 var distance = geoSphericalDistance(point1, point2);
59219 if (distance === 0)
59221 else if (distance < 80)
59227 var dataIntroGraph = {n1:{id:"n1",loc:[-85.631039,41.948829]},n10:{id:"n10",loc:[-85.634733,41.941588]},n100:{id:"n100",loc:[-85.637395,41.942252]},n1000:{id:"n1000",loc:[-85.632699,41.944763]},n1001:{id:"n1001",loc:[-85.632685,41.944763]},n1002:{id:"n1002",loc:[-85.632673,41.944755]},n1003:{id:"n1003",loc:[-85.632595,41.944682]},n1004:{id:"n1004",loc:[-85.632576,41.944673]},n1005:{id:"n1005",loc:[-85.632551,41.944667]},n1006:{id:"n1006",loc:[-85.63253,41.944667]},n1007:{id:"n1007",loc:[-85.632502,41.944669]},n1008:{id:"n1008",loc:[-85.632483,41.944677]},n1009:{id:"n1009",loc:[-85.632383,41.944731]},n101:{id:"n101",loc:[-85.637357,41.942252]},n1010:{id:"n1010",loc:[-85.63349,41.944976],tags:{"addr:city":"Three Rivers","addr:housenumber":"31","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Sherwin-Williams",shop:"paint"}},n1011:{id:"n1011",loc:[-85.633548,41.945034],tags:{"addr:city":"Three Rivers","addr:housenumber":"33","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Unique Jewelry",shop:"jewelry"}},n1012:{id:"n1012",loc:[-85.633683,41.945129],tags:{"addr:city":"Three Rivers","addr:housenumber":"37","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"World Fare",shop:"gift"}},n1013:{id:"n1013",loc:[-85.634563,41.945469],tags:{"addr:city":"Three Rivers","addr:housenumber":"62","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Golden Finch Framing",shop:"frame"}},n1014:{id:"n1014",loc:[-85.634469,41.945379],tags:{"addr:city":"Three Rivers","addr:housenumber":"58","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Dollar Tree",shop:"second_hand"}},n1015:{id:"n1015",loc:[-85.634227,41.945159],tags:{"addr:city":"Three Rivers","addr:housenumber":"48","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"theatre",name:"Riviera Theatre"}},n1016:{id:"n1016",loc:[-85.634057,41.945012],tags:{"addr:city":"Three Rivers","addr:housenumber":"42","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"River City Appliance",shop:"appliance"}},n1017:{id:"n1017",loc:[-85.633879,41.945325],tags:{"addr:city":"Three Rivers","addr:housenumber":"45","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Paparazzi Tattoo",shop:"tattoo"}},n1018:{id:"n1018",loc:[-85.634914,41.945839],tags:{"addr:city":"Three Rivers","addr:housenumber":"88","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"bank",name:"Southern Michigan Bank"}},n1019:{id:"n1019",loc:[-85.634514,41.946176]},n102:{id:"n102",loc:[-85.637357,41.942216]},n1020:{id:"n1020",loc:[-85.634087,41.946178]},n1021:{id:"n1021",loc:[-85.634357,41.945805]},n1022:{id:"n1022",loc:[-85.634389,41.945788]},n1023:{id:"n1023",loc:[-85.634491,41.94581]},n1024:{id:"n1024",loc:[-85.634513,41.945853]},n1025:{id:"n1025",loc:[-85.634506,41.94583]},n1026:{id:"n1026",loc:[-85.634762,41.946056],tags:{crossing:"zebra",highway:"crossing"}},n1027:{id:"n1027",loc:[-85.634767,41.946172]},n1028:{id:"n1028",loc:[-85.634622,41.946175],tags:{crossing:"zebra",highway:"crossing"}},n1029:{id:"n1029",loc:[-85.640655,41.942057]},n103:{id:"n103",loc:[-85.637386,41.942054]},n1030:{id:"n1030",loc:[-85.640947,41.942057]},n1031:{id:"n1031",loc:[-85.640957,41.942593]},n1032:{id:"n1032",loc:[-85.630953,41.960873]},n1033:{id:"n1033",loc:[-85.632174,41.960679]},n1034:{id:"n1034",loc:[-85.638785,41.943066]},n1035:{id:"n1035",loc:[-85.638853,41.943065]},n1036:{id:"n1036",loc:[-85.638855,41.943183]},n1037:{id:"n1037",loc:[-85.638552,41.943189]},n1038:{id:"n1038",loc:[-85.63855,41.943149]},n1039:{id:"n1039",loc:[-85.638638,41.943068]},n104:{id:"n104",loc:[-85.637387,41.942125]},n1040:{id:"n1040",loc:[-85.638638,41.943078]},n1041:{id:"n1041",loc:[-85.638813,41.943163]},n1042:{id:"n1042",loc:[-85.638684,41.943165]},n1043:{id:"n1043",loc:[-85.638682,41.943105]},n1044:{id:"n1044",loc:[-85.638706,41.943105]},n1045:{id:"n1045",loc:[-85.638707,41.943117]},n1046:{id:"n1046",loc:[-85.638812,41.943115]},n1047:{id:"n1047",loc:[-85.638769,41.943407]},n1048:{id:"n1048",loc:[-85.638549,41.943407]},n1049:{id:"n1049",loc:[-85.638567,41.943555]},n105:{id:"n105",loc:[-85.637319,41.942125]},n1050:{id:"n1050",loc:[-85.638426,41.943554]},n1051:{id:"n1051",loc:[-85.638427,41.94346]},n1052:{id:"n1052",loc:[-85.638568,41.943461]},n1053:{id:"n1053",loc:[-85.639264,41.943415]},n1054:{id:"n1054",loc:[-85.639082,41.943417]},n1055:{id:"n1055",loc:[-85.63908,41.943331]},n1056:{id:"n1056",loc:[-85.639136,41.94333]},n1057:{id:"n1057",loc:[-85.639158,41.943312]},n1058:{id:"n1058",loc:[-85.639188,41.943313]},n1059:{id:"n1059",loc:[-85.639211,41.943331]},n106:{id:"n106",loc:[-85.637319,41.942137]},n1060:{id:"n1060",loc:[-85.639262,41.943331]},n1061:{id:"n1061",loc:[-85.638986,41.943515]},n1062:{id:"n1062",loc:[-85.63888,41.943521]},n1063:{id:"n1063",loc:[-85.638871,41.943436]},n1064:{id:"n1064",loc:[-85.638958,41.943431]},n1065:{id:"n1065",loc:[-85.638979,41.943443]},n1066:{id:"n1066",loc:[-85.63926,41.943703]},n1067:{id:"n1067",loc:[-85.639152,41.943704]},n1068:{id:"n1068",loc:[-85.639152,41.943691]},n1069:{id:"n1069",loc:[-85.639063,41.943691]},n107:{id:"n107",loc:[-85.637259,41.942137]},n1070:{id:"n1070",loc:[-85.639062,41.943613]},n1071:{id:"n1071",loc:[-85.639259,41.943611]},n1072:{id:"n1072",loc:[-85.639117,41.943726]},n1073:{id:"n1073",loc:[-85.639118,41.943767]},n1074:{id:"n1074",loc:[-85.639051,41.943768]},n1075:{id:"n1075",loc:[-85.63905,41.943727]},n1076:{id:"n1076",loc:[-85.638627,41.943716]},n1077:{id:"n1077",loc:[-85.63863,41.943634]},n1078:{id:"n1078",loc:[-85.63844,41.943631]},n1079:{id:"n1079",loc:[-85.638437,41.943729]},n108:{id:"n108",loc:[-85.637259,41.942126]},n1080:{id:"n1080",loc:[-85.638533,41.94373]},n1081:{id:"n1081",loc:[-85.638534,41.943715]},n1082:{id:"n1082",loc:[-85.638678,41.943941]},n1083:{id:"n1083",loc:[-85.638522,41.943944]},n1084:{id:"n1084",loc:[-85.63852,41.943864]},n1085:{id:"n1085",loc:[-85.638676,41.943861]},n1086:{id:"n1086",loc:[-85.638663,41.944059]},n1087:{id:"n1087",loc:[-85.638513,41.944061]},n1088:{id:"n1088",loc:[-85.638511,41.943991]},n1089:{id:"n1089",loc:[-85.638661,41.943989]},n109:{id:"n109",loc:[-85.637193,41.942126]},n1090:{id:"n1090",loc:[-85.63865,41.944134]},n1091:{id:"n1091",loc:[-85.638429,41.944144]},n1092:{id:"n1092",loc:[-85.638426,41.944106]},n1093:{id:"n1093",loc:[-85.638476,41.944104]},n1094:{id:"n1094",loc:[-85.638475,41.94409]},n1095:{id:"n1095",loc:[-85.638594,41.944084]},n1096:{id:"n1096",loc:[-85.638595,41.944101]},n1097:{id:"n1097",loc:[-85.638647,41.944099]},n1098:{id:"n1098",loc:[-85.63829,41.944154]},n1099:{id:"n1099",loc:[-85.638558,41.944155]},n11:{id:"n11",loc:[-85.634602,41.941523]},n110:{id:"n110",loc:[-85.637192,41.942053]},n1100:{id:"n1100",loc:[-85.638558,41.944338]},n1101:{id:"n1101",loc:[-85.638851,41.944408]},n1102:{id:"n1102",loc:[-85.637771,41.943989]},n1103:{id:"n1103",loc:[-85.639345,41.943964]},n1104:{id:"n1104",loc:[-85.638515,41.94397]},n1105:{id:"n1105",loc:[-85.639256,41.943928]},n1106:{id:"n1106",loc:[-85.639157,41.943929]},n1107:{id:"n1107",loc:[-85.639156,41.9439]},n1108:{id:"n1108",loc:[-85.639118,41.9439]},n1109:{id:"n1109",loc:[-85.639116,41.94382]},n111:{id:"n111",loc:[-85.637248,41.942053]},n1110:{id:"n1110",loc:[-85.639202,41.943819]},n1111:{id:"n1111",loc:[-85.639202,41.943837]},n1112:{id:"n1112",loc:[-85.639293,41.943836]},n1113:{id:"n1113",loc:[-85.639295,41.943898]},n1114:{id:"n1114",loc:[-85.639255,41.943898]},n1115:{id:"n1115",loc:[-85.639296,41.944083]},n1116:{id:"n1116",loc:[-85.639144,41.944084]},n1117:{id:"n1117",loc:[-85.639143,41.944026]},n1118:{id:"n1118",loc:[-85.639162,41.944026]},n1119:{id:"n1119",loc:[-85.639162,41.944]},n112:{id:"n112",loc:[-85.637248,41.942042]},n1120:{id:"n1120",loc:[-85.639295,41.943999]},n1121:{id:"n1121",loc:[-85.639131,41.944139]},n1122:{id:"n1122",loc:[-85.63901,41.94414]},n1123:{id:"n1123",loc:[-85.63901,41.944076]},n1124:{id:"n1124",loc:[-85.63913,41.944075]},n1125:{id:"n1125",loc:[-85.639092,41.944155]},n1126:{id:"n1126",loc:[-85.639093,41.944308]},n1127:{id:"n1127",loc:[-85.639225,41.944308]},n1128:{id:"n1128",loc:[-85.639225,41.94429]},n1129:{id:"n1129",loc:[-85.639253,41.944289]},n113:{id:"n113",loc:[-85.637338,41.942041]},n1130:{id:"n1130",loc:[-85.639253,41.944269]},n1131:{id:"n1131",loc:[-85.639243,41.944269]},n1132:{id:"n1132",loc:[-85.639243,41.944229]},n1133:{id:"n1133",loc:[-85.639224,41.944229]},n1134:{id:"n1134",loc:[-85.639224,41.944196]},n1135:{id:"n1135",loc:[-85.639195,41.944196]},n1136:{id:"n1136",loc:[-85.639195,41.944155]},n1137:{id:"n1137",loc:[-85.639072,41.944154]},n1138:{id:"n1138",loc:[-85.638865,41.944154]},n1139:{id:"n1139",loc:[-85.638863,41.943967]},n114:{id:"n114",loc:[-85.637338,41.942055]},n1140:{id:"n1140",loc:[-85.6386,41.942698]},n1141:{id:"n1141",loc:[-85.639348,41.942698]},n1142:{id:"n1142",loc:[-85.639377,41.944984]},n1143:{id:"n1143",loc:[-85.63937,41.945013]},n1144:{id:"n1144",loc:[-85.639357,41.945033]},n1145:{id:"n1145",loc:[-85.639353,41.945053]},n1146:{id:"n1146",loc:[-85.639352,41.945084]},n1147:{id:"n1147",loc:[-85.638278,41.945516]},n1148:{id:"n1148",loc:[-85.637505,41.945801]},n1149:{id:"n1149",loc:[-85.637327,41.945857]},n115:{id:"n115",loc:[-85.637583,41.941943]},n1150:{id:"n1150",loc:[-85.637168,41.945899]},n1151:{id:"n1151",loc:[-85.637017,41.94593]},n1152:{id:"n1152",loc:[-85.637185,41.945938]},n1153:{id:"n1153",loc:[-85.63682,41.945963]},n1154:{id:"n1154",loc:[-85.636639,41.945984]},n1155:{id:"n1155",loc:[-85.636439,41.945999]},n1156:{id:"n1156",loc:[-85.635801,41.945999]},n1157:{id:"n1157",loc:[-85.635769,41.945908]},n1158:{id:"n1158",loc:[-85.635953,41.946154]},n1159:{id:"n1159",loc:[-85.635472,41.94598]},n116:{id:"n116",loc:[-85.637584,41.941983]},n1160:{id:"n1160",loc:[-85.635409,41.945981]},n1161:{id:"n1161",loc:[-85.635583,41.945987]},n1162:{id:"n1162",loc:[-85.636452,41.945805]},n1163:{id:"n1163",loc:[-85.636425,41.94582]},n1164:{id:"n1164",loc:[-85.636396,41.945817]},n1165:{id:"n1165",loc:[-85.636368,41.945797]},n1166:{id:"n1166",loc:[-85.636346,41.945767]},n1167:{id:"n1167",loc:[-85.636307,41.945745]},n1168:{id:"n1168",loc:[-85.636194,41.94565]},n1169:{id:"n1169",loc:[-85.636121,41.945579]},n117:{id:"n117",loc:[-85.63751,41.941983]},n1170:{id:"n1170",loc:[-85.635995,41.945432]},n1171:{id:"n1171",loc:[-85.637564,41.943538]},n1172:{id:"n1172",loc:[-85.63756,41.943505]},n1173:{id:"n1173",loc:[-85.637435,41.943489]},n1174:{id:"n1174",loc:[-85.637093,41.943556]},n1175:{id:"n1175",loc:[-85.634836,41.941574]},n1176:{id:"n1176",loc:[-85.634692,41.9415]},n1177:{id:"n1177",loc:[-85.634261,41.941337]},n1178:{id:"n1178",loc:[-85.634208,41.940962]},n1179:{id:"n1179",loc:[-85.635247,41.940968]},n118:{id:"n118",loc:[-85.637509,41.941944]},n1180:{id:"n1180",loc:[-85.63514,41.941205]},n1181:{id:"n1181",loc:[-85.634858,41.941511]},n1182:{id:"n1182",loc:[-85.630725,41.943465]},n1183:{id:"n1183",loc:[-85.632591,41.942826]},n1184:{id:"n1184",loc:[-85.634487,41.941928]},n1185:{id:"n1185",loc:[-85.634499,41.942056]},n1186:{id:"n1186",loc:[-85.63433,41.943102]},n1187:{id:"n1187",loc:[-85.634158,41.943151]},n1188:{id:"n1188",loc:[-85.634107,41.94305]},n1189:{id:"n1189",loc:[-85.634279,41.943002]},n119:{id:"n119",loc:[-85.637724,41.941973]},n1190:{id:"n1190",loc:[-85.634362,41.943762]},n1191:{id:"n1191",loc:[-85.634331,41.943731]},n1192:{id:"n1192",loc:[-85.634396,41.943695]},n1193:{id:"n1193",loc:[-85.634426,41.943726]},n1194:{id:"n1194",loc:[-85.621569,41.956021]},n1195:{id:"n1195",loc:[-85.621574,41.956164]},n1196:{id:"n1196",loc:[-85.621489,41.956165]},n1197:{id:"n1197",loc:[-85.621488,41.956136]},n1198:{id:"n1198",loc:[-85.621372,41.956139]},n1199:{id:"n1199",loc:[-85.621369,41.956049]},n12:{id:"n12",loc:[-85.63359,41.941093]},n120:{id:"n120",loc:[-85.637633,41.941973]},n1200:{id:"n1200",loc:[-85.621493,41.956047]},n1201:{id:"n1201",loc:[-85.621492,41.956022]},n1202:{id:"n1202",loc:[-85.619744,41.953192]},n1203:{id:"n1203",loc:[-85.619059,41.953902]},n1204:{id:"n1204",loc:[-85.623984,41.95469]},n1205:{id:"n1205",loc:[-85.630159,41.958208]},n1206:{id:"n1206",loc:[-85.63002,41.958208]},n1207:{id:"n1207",loc:[-85.630021,41.95814]},n1208:{id:"n1208",loc:[-85.63,41.95814]},n1209:{id:"n1209",loc:[-85.63,41.958043]},n121:{id:"n121",loc:[-85.637633,41.941853]},n1210:{id:"n1210",loc:[-85.630159,41.958043]},n1211:{id:"n1211",loc:[-85.630304,41.957566]},n1212:{id:"n1212",loc:[-85.630303,41.957684]},n1213:{id:"n1213",loc:[-85.630073,41.957683]},n1214:{id:"n1214",loc:[-85.630072,41.957721]},n1215:{id:"n1215",loc:[-85.629993,41.95772]},n1216:{id:"n1216",loc:[-85.629993,41.95768]},n1217:{id:"n1217",loc:[-85.629968,41.95768]},n1218:{id:"n1218",loc:[-85.629969,41.957588]},n1219:{id:"n1219",loc:[-85.630219,41.95759]},n122:{id:"n122",loc:[-85.637724,41.941853]},n1220:{id:"n1220",loc:[-85.630219,41.957566]},n1221:{id:"n1221",loc:[-85.630717,41.957744]},n1222:{id:"n1222",loc:[-85.630596,41.957745]},n1223:{id:"n1223",loc:[-85.630598,41.957553]},n1224:{id:"n1224",loc:[-85.630717,41.957555]},n1225:{id:"n1225",loc:[-85.630609,41.957745]},n1226:{id:"n1226",loc:[-85.63061,41.957789]},n1227:{id:"n1227",loc:[-85.630327,41.957791]},n1228:{id:"n1228",loc:[-85.630324,41.95752]},n1229:{id:"n1229",loc:[-85.630325,41.95756]},n123:{id:"n123",loc:[-85.637773,41.941988]},n1230:{id:"n1230",loc:[-85.63057,41.95756]},n1231:{id:"n1231",loc:[-85.63069,41.958016]},n1232:{id:"n1232",loc:[-85.630586,41.958017]},n1233:{id:"n1233",loc:[-85.630584,41.957956]},n1234:{id:"n1234",loc:[-85.630614,41.957956]},n1235:{id:"n1235",loc:[-85.630611,41.957835]},n1236:{id:"n1236",loc:[-85.630737,41.957833]},n1237:{id:"n1237",loc:[-85.630739,41.957921]},n1238:{id:"n1238",loc:[-85.630688,41.957922]},n1239:{id:"n1239",loc:[-85.630719,41.958291]},n124:{id:"n124",loc:[-85.637773,41.942046]},n1240:{id:"n1240",loc:[-85.630592,41.958291]},n1241:{id:"n1241",loc:[-85.630593,41.958108]},n1242:{id:"n1242",loc:[-85.630701,41.958109]},n1243:{id:"n1243",loc:[-85.6307,41.958173]},n1244:{id:"n1244",loc:[-85.630711,41.958173]},n1245:{id:"n1245",loc:[-85.630711,41.958233]},n1246:{id:"n1246",loc:[-85.630719,41.958233]},n1247:{id:"n1247",loc:[-85.630523,41.958329]},n1248:{id:"n1248",loc:[-85.630388,41.958329]},n1249:{id:"n1249",loc:[-85.630387,41.958262]},n125:{id:"n125",loc:[-85.637693,41.942047]},n1250:{id:"n1250",loc:[-85.630523,41.958261]},n1251:{id:"n1251",loc:[-85.63072,41.958636]},n1252:{id:"n1252",loc:[-85.630721,41.958709]},n1253:{id:"n1253",loc:[-85.630503,41.958712]},n1254:{id:"n1254",loc:[-85.630498,41.958511]},n1255:{id:"n1255",loc:[-85.630635,41.95851]},n1256:{id:"n1256",loc:[-85.630638,41.958636]},n1257:{id:"n1257",loc:[-85.630437,41.958822]},n1258:{id:"n1258",loc:[-85.630437,41.958849]},n1259:{id:"n1259",loc:[-85.630393,41.958849]},n126:{id:"n126",loc:[-85.637692,41.941988]},n1260:{id:"n1260",loc:[-85.630393,41.958822]},n1261:{id:"n1261",loc:[-85.630605,41.959102]},n1262:{id:"n1262",loc:[-85.63049,41.959104]},n1263:{id:"n1263",loc:[-85.630487,41.958996]},n1264:{id:"n1264",loc:[-85.630462,41.958996]},n1265:{id:"n1265",loc:[-85.63046,41.958922]},n1266:{id:"n1266",loc:[-85.630562,41.958921]},n1267:{id:"n1267",loc:[-85.630564,41.958992]},n1268:{id:"n1268",loc:[-85.630602,41.958992]},n1269:{id:"n1269",loc:[-85.630126,41.957096]},n127:{id:"n127",loc:[-85.637604,41.941994]},n1270:{id:"n1270",loc:[-85.630129,41.957283]},n1271:{id:"n1271",loc:[-85.629993,41.957284]},n1272:{id:"n1272",loc:[-85.629992,41.957216]},n1273:{id:"n1273",loc:[-85.630015,41.957215]},n1274:{id:"n1274",loc:[-85.630013,41.957097]},n1275:{id:"n1275",loc:[-85.630211,41.956592]},n1276:{id:"n1276",loc:[-85.630211,41.956676]},n1277:{id:"n1277",loc:[-85.630162,41.956676]},n1278:{id:"n1278",loc:[-85.630162,41.95676]},n1279:{id:"n1279",loc:[-85.630037,41.956761]},n128:{id:"n128",loc:[-85.637604,41.942057]},n1280:{id:"n1280",loc:[-85.630037,41.956592]},n1281:{id:"n1281",loc:[-85.630309,41.95653]},n1282:{id:"n1282",loc:[-85.630326,41.957065]},n1283:{id:"n1283",loc:[-85.630118,41.957065]},n1284:{id:"n1284",loc:[-85.630119,41.957096]},n1285:{id:"n1285",loc:[-85.63067,41.957307]},n1286:{id:"n1286",loc:[-85.630536,41.957308]},n1287:{id:"n1287",loc:[-85.630533,41.957111]},n1288:{id:"n1288",loc:[-85.630667,41.95711]},n1289:{id:"n1289",loc:[-85.630676,41.956808]},n129:{id:"n129",loc:[-85.63748,41.942057]},n1290:{id:"n1290",loc:[-85.630551,41.956808]},n1291:{id:"n1291",loc:[-85.630552,41.956982]},n1292:{id:"n1292",loc:[-85.63059,41.956982]},n1293:{id:"n1293",loc:[-85.63059,41.957001]},n1294:{id:"n1294",loc:[-85.630692,41.957001]},n1295:{id:"n1295",loc:[-85.630692,41.956936]},n1296:{id:"n1296",loc:[-85.630676,41.956936]},n1297:{id:"n1297",loc:[-85.630496,41.956889]},n1298:{id:"n1298",loc:[-85.630501,41.956947]},n1299:{id:"n1299",loc:[-85.630377,41.956953]},n13:{id:"n13",loc:[-85.633643,41.941143]},n130:{id:"n130",loc:[-85.63748,41.941994]},n1300:{id:"n1300",loc:[-85.630359,41.956938]},n1301:{id:"n1301",loc:[-85.630359,41.956912]},n1302:{id:"n1302",loc:[-85.63038,41.956894]},n1303:{id:"n1303",loc:[-85.630679,41.956747]},n1304:{id:"n1304",loc:[-85.630572,41.956748]},n1305:{id:"n1305",loc:[-85.63057,41.956668]},n1306:{id:"n1306",loc:[-85.630501,41.956669]},n1307:{id:"n1307",loc:[-85.630499,41.95659]},n1308:{id:"n1308",loc:[-85.630565,41.956589]},n1309:{id:"n1309",loc:[-85.630564,41.956541]},n131:{id:"n131",loc:[-85.637431,41.941832]},n1310:{id:"n1310",loc:[-85.630686,41.956539]},n1311:{id:"n1311",loc:[-85.630688,41.956631]},n1312:{id:"n1312",loc:[-85.630676,41.956631]},n1313:{id:"n1313",loc:[-85.630686,41.956487]},n1314:{id:"n1314",loc:[-85.63059,41.956487]},n1315:{id:"n1315",loc:[-85.63059,41.956396]},n1316:{id:"n1316",loc:[-85.630686,41.956396]},n1317:{id:"n1317",loc:[-85.630643,41.9563]},n1318:{id:"n1318",loc:[-85.630548,41.956301]},n1319:{id:"n1319",loc:[-85.630545,41.956217]},n132:{id:"n132",loc:[-85.637432,41.94189]},n1320:{id:"n1320",loc:[-85.630529,41.956214]},n1321:{id:"n1321",loc:[-85.630521,41.956202]},n1322:{id:"n1322",loc:[-85.63052,41.95618]},n1323:{id:"n1323",loc:[-85.630527,41.956169]},n1324:{id:"n1324",loc:[-85.630544,41.956163]},n1325:{id:"n1325",loc:[-85.630543,41.956094]},n1326:{id:"n1326",loc:[-85.630641,41.956093]},n1327:{id:"n1327",loc:[-85.630642,41.956134]},n1328:{id:"n1328",loc:[-85.630656,41.956134]},n1329:{id:"n1329",loc:[-85.630657,41.956252]},n133:{id:"n133",loc:[-85.637412,41.94189]},n1330:{id:"n1330",loc:[-85.630643,41.956252]},n1331:{id:"n1331",loc:[-85.630409,41.956044]},n1332:{id:"n1332",loc:[-85.630409,41.956075]},n1333:{id:"n1333",loc:[-85.630195,41.956078]},n1334:{id:"n1334",loc:[-85.630195,41.9561]},n1335:{id:"n1335",loc:[-85.630088,41.956101]},n1336:{id:"n1336",loc:[-85.630087,41.956048]},n1337:{id:"n1337",loc:[-85.630345,41.956114]},n1338:{id:"n1338",loc:[-85.630328,41.956113]},n1339:{id:"n1339",loc:[-85.63034,41.956189]},n134:{id:"n134",loc:[-85.637413,41.941938]},n1340:{id:"n1340",loc:[-85.630355,41.956185]},n1341:{id:"n1341",loc:[-85.630311,41.956117]},n1342:{id:"n1342",loc:[-85.630297,41.956125]},n1343:{id:"n1343",loc:[-85.630287,41.956136]},n1344:{id:"n1344",loc:[-85.630283,41.956149]},n1345:{id:"n1345",loc:[-85.630285,41.956162]},n1346:{id:"n1346",loc:[-85.630293,41.956174]},n1347:{id:"n1347",loc:[-85.630306,41.956183]},n1348:{id:"n1348",loc:[-85.630322,41.956188]},n1349:{id:"n1349",loc:[-85.630368,41.956179]},n135:{id:"n135",loc:[-85.637342,41.941939]},n1350:{id:"n1350",loc:[-85.630378,41.95617]},n1351:{id:"n1351",loc:[-85.630384,41.956159]},n1352:{id:"n1352",loc:[-85.630385,41.956147]},n1353:{id:"n1353",loc:[-85.630381,41.956136]},n1354:{id:"n1354",loc:[-85.630372,41.956126]},n1355:{id:"n1355",loc:[-85.63036,41.956118]},n1356:{id:"n1356",loc:[-85.630776,41.956041]},n1357:{id:"n1357",loc:[-85.630195,41.956036]},n1358:{id:"n1358",loc:[-85.630137,41.956037]},n1359:{id:"n1359",loc:[-85.630136,41.956006]},n136:{id:"n136",loc:[-85.637342,41.941914]},n1360:{id:"n1360",loc:[-85.630194,41.956005]},n1361:{id:"n1361",loc:[-85.629864,41.956039]},n1362:{id:"n1362",loc:[-85.629864,41.955862]},n1363:{id:"n1363",loc:[-85.629541,41.958291]},n1364:{id:"n1364",loc:[-85.629419,41.958292]},n1365:{id:"n1365",loc:[-85.629417,41.958168]},n1366:{id:"n1366",loc:[-85.629445,41.958168]},n1367:{id:"n1367",loc:[-85.629444,41.958109]},n1368:{id:"n1368",loc:[-85.629537,41.958108]},n1369:{id:"n1369",loc:[-85.629351,41.958136]},n137:{id:"n137",loc:[-85.637212,41.941916]},n1370:{id:"n1370",loc:[-85.629352,41.958202]},n1371:{id:"n1371",loc:[-85.629365,41.958202]},n1372:{id:"n1372",loc:[-85.629365,41.958223]},n1373:{id:"n1373",loc:[-85.629291,41.958224]},n1374:{id:"n1374",loc:[-85.62929,41.958137]},n1375:{id:"n1375",loc:[-85.629443,41.958073]},n1376:{id:"n1376",loc:[-85.629252,41.958075]},n1377:{id:"n1377",loc:[-85.629253,41.95827]},n1378:{id:"n1378",loc:[-85.629566,41.957585]},n1379:{id:"n1379",loc:[-85.629566,41.957692]},n138:{id:"n138",loc:[-85.637211,41.941835]},n1380:{id:"n1380",loc:[-85.629281,41.957693]},n1381:{id:"n1381",loc:[-85.62928,41.957585]},n1382:{id:"n1382",loc:[-85.629004,41.957599]},n1383:{id:"n1383",loc:[-85.629004,41.957682]},n1384:{id:"n1384",loc:[-85.628902,41.957682]},n1385:{id:"n1385",loc:[-85.628902,41.957723]},n1386:{id:"n1386",loc:[-85.628731,41.957724]},n1387:{id:"n1387",loc:[-85.628731,41.9576]},n1388:{id:"n1388",loc:[-85.62836,41.957679]},n1389:{id:"n1389",loc:[-85.628359,41.957759]},n139:{id:"n139",loc:[-85.637293,41.941834]},n1390:{id:"n1390",loc:[-85.628062,41.957757]},n1391:{id:"n1391",loc:[-85.628063,41.957657]},n1392:{id:"n1392",loc:[-85.628198,41.957657]},n1393:{id:"n1393",loc:[-85.628198,41.957678]},n1394:{id:"n1394",loc:[-85.627775,41.958095]},n1395:{id:"n1395",loc:[-85.627608,41.958095]},n1396:{id:"n1396",loc:[-85.627606,41.957829]},n1397:{id:"n1397",loc:[-85.627774,41.957829]},n1398:{id:"n1398",loc:[-85.626816,41.957636]},n1399:{id:"n1399",loc:[-85.626787,41.957681]},n14:{id:"n14",loc:[-85.633643,41.940122]},n140:{id:"n140",loc:[-85.637293,41.941823]},n1400:{id:"n1400",loc:[-85.626673,41.95764]},n1401:{id:"n1401",loc:[-85.626703,41.957594]},n1402:{id:"n1402",loc:[-85.62694,41.95752]},n1403:{id:"n1403",loc:[-85.62688,41.957611]},n1404:{id:"n1404",loc:[-85.626798,41.957582]},n1405:{id:"n1405",loc:[-85.626793,41.95759]},n1406:{id:"n1406",loc:[-85.626657,41.95754]},n1407:{id:"n1407",loc:[-85.626666,41.957526]},n1408:{id:"n1408",loc:[-85.626584,41.957497]},n1409:{id:"n1409",loc:[-85.626638,41.957415]},n141:{id:"n141",loc:[-85.637363,41.941822]},n1410:{id:"n1410",loc:[-85.626731,41.957449]},n1411:{id:"n1411",loc:[-85.626725,41.957457]},n1412:{id:"n1412",loc:[-85.626843,41.9575]},n1413:{id:"n1413",loc:[-85.626851,41.957487]},n1414:{id:"n1414",loc:[-85.626579,41.957521]},n1415:{id:"n1415",loc:[-85.626537,41.957587]},n1416:{id:"n1416",loc:[-85.626427,41.957551]},n1417:{id:"n1417",loc:[-85.626468,41.957483]},n1418:{id:"n1418",loc:[-85.626592,41.957639]},n1419:{id:"n1419",loc:[-85.626807,41.957713]},n142:{id:"n142",loc:[-85.637364,41.941833]},n1420:{id:"n1420",loc:[-85.627129,41.957401]},n1421:{id:"n1421",loc:[-85.627209,41.95742]},n1422:{id:"n1422",loc:[-85.627302,41.957435]},n1423:{id:"n1423",loc:[-85.629566,41.957048]},n1424:{id:"n1424",loc:[-85.629568,41.957215]},n1425:{id:"n1425",loc:[-85.629383,41.957216]},n1426:{id:"n1426",loc:[-85.629384,41.95727]},n1427:{id:"n1427",loc:[-85.629231,41.957271]},n1428:{id:"n1428",loc:[-85.62923,41.957198]},n1429:{id:"n1429",loc:[-85.629322,41.957198]},n143:{id:"n143",loc:[-85.637559,41.942448]},n1430:{id:"n1430",loc:[-85.629321,41.957108]},n1431:{id:"n1431",loc:[-85.629441,41.957108]},n1432:{id:"n1432",loc:[-85.62944,41.957049]},n1433:{id:"n1433",loc:[-85.629337,41.957018]},n1434:{id:"n1434",loc:[-85.629366,41.957028]},n1435:{id:"n1435",loc:[-85.629375,41.957044]},n1436:{id:"n1436",loc:[-85.629354,41.957071]},n1437:{id:"n1437",loc:[-85.629317,41.957071]},n1438:{id:"n1438",loc:[-85.62929,41.957074]},n1439:{id:"n1439",loc:[-85.62927,41.957084]},n144:{id:"n144",loc:[-85.637036,41.942454]},n1440:{id:"n1440",loc:[-85.629232,41.957081]},n1441:{id:"n1441",loc:[-85.629222,41.957057]},n1442:{id:"n1442",loc:[-85.629259,41.957025]},n1443:{id:"n1443",loc:[-85.629293,41.957017]},n1444:{id:"n1444",loc:[-85.629251,41.957085]},n1445:{id:"n1445",loc:[-85.629235,41.957041]},n1446:{id:"n1446",loc:[-85.62937,41.95706]},n1447:{id:"n1447",loc:[-85.629531,41.956909]},n1448:{id:"n1448",loc:[-85.629408,41.956909]},n1449:{id:"n1449",loc:[-85.629402,41.956681]},n145:{id:"n145",loc:[-85.636692,41.942828]},n1450:{id:"n1450",loc:[-85.62953,41.956681]},n1451:{id:"n1451",loc:[-85.629402,41.956728]},n1452:{id:"n1452",loc:[-85.629408,41.956845]},n1453:{id:"n1453",loc:[-85.629385,41.956845]},n1454:{id:"n1454",loc:[-85.629384,41.956728]},n1455:{id:"n1455",loc:[-85.629063,41.956973]},n1456:{id:"n1456",loc:[-85.629064,41.957009]},n1457:{id:"n1457",loc:[-85.62902,41.957009]},n1458:{id:"n1458",loc:[-85.629019,41.956973]},n1459:{id:"n1459",loc:[-85.629136,41.956633]},n146:{id:"n146",loc:[-85.635929,41.942826]},n1460:{id:"n1460",loc:[-85.629084,41.956632]},n1461:{id:"n1461",loc:[-85.629084,41.956605]},n1462:{id:"n1462",loc:[-85.629136,41.956605]},n1463:{id:"n1463",loc:[-85.629153,41.956657]},n1464:{id:"n1464",loc:[-85.627914,41.956661]},n1465:{id:"n1465",loc:[-85.630096,41.956101]},n1466:{id:"n1466",loc:[-85.630097,41.95612]},n1467:{id:"n1467",loc:[-85.630011,41.956121]},n1468:{id:"n1468",loc:[-85.630015,41.956374]},n1469:{id:"n1469",loc:[-85.629148,41.95626]},n147:{id:"n147",loc:[-85.636433,41.942828]},n1470:{id:"n1470",loc:[-85.629527,41.956591]},n1471:{id:"n1471",loc:[-85.629405,41.956591]},n1472:{id:"n1472",loc:[-85.629405,41.956459]},n1473:{id:"n1473",loc:[-85.629369,41.956459]},n1474:{id:"n1474",loc:[-85.629369,41.956424]},n1475:{id:"n1475",loc:[-85.629413,41.956424]},n1476:{id:"n1476",loc:[-85.629414,41.956326]},n1477:{id:"n1477",loc:[-85.629522,41.956326]},n1478:{id:"n1478",loc:[-85.629522,41.956487]},n1479:{id:"n1479",loc:[-85.629527,41.956487]},n148:{id:"n148",loc:[-85.636435,41.942864],tags:{entrance:"yes"}},n1480:{id:"n1480",loc:[-85.629414,41.95634]},n1481:{id:"n1481",loc:[-85.629149,41.956338]},n1482:{id:"n1482",loc:[-85.62931,41.956531]},n1483:{id:"n1483",loc:[-85.629291,41.95655]},n1484:{id:"n1484",loc:[-85.629255,41.95655]},n1485:{id:"n1485",loc:[-85.629236,41.956533]},n1486:{id:"n1486",loc:[-85.629237,41.956461]},n1487:{id:"n1487",loc:[-85.629257,41.956445]},n1488:{id:"n1488",loc:[-85.629257,41.956428]},n1489:{id:"n1489",loc:[-85.629287,41.956428]},n149:{id:"n149",loc:[-85.637235,41.942622]},n1490:{id:"n1490",loc:[-85.629287,41.956445]},n1491:{id:"n1491",loc:[-85.62931,41.95646]},n1492:{id:"n1492",loc:[-85.629049,41.956425]},n1493:{id:"n1493",loc:[-85.628907,41.956427]},n1494:{id:"n1494",loc:[-85.628907,41.956455]},n1495:{id:"n1495",loc:[-85.628841,41.956455]},n1496:{id:"n1496",loc:[-85.62884,41.956424]},n1497:{id:"n1497",loc:[-85.628764,41.956425]},n1498:{id:"n1498",loc:[-85.628762,41.956323]},n1499:{id:"n1499",loc:[-85.628808,41.956323]},n15:{id:"n15",loc:[-85.633477,41.940187]},n150:{id:"n150",loc:[-85.637247,41.943116]},n1500:{id:"n1500",loc:[-85.628808,41.956314]},n1501:{id:"n1501",loc:[-85.628911,41.956313]},n1502:{id:"n1502",loc:[-85.628911,41.956322]},n1503:{id:"n1503",loc:[-85.62896,41.956322]},n1504:{id:"n1504",loc:[-85.62896,41.956348]},n1505:{id:"n1505",loc:[-85.629047,41.956347]},n1506:{id:"n1506",loc:[-85.628893,41.957263]},n1507:{id:"n1507",loc:[-85.628788,41.957264]},n1508:{id:"n1508",loc:[-85.628786,41.95711]},n1509:{id:"n1509",loc:[-85.628894,41.957109]},n151:{id:"n151",loc:[-85.637564,41.943116]},n1510:{id:"n1510",loc:[-85.628893,41.957075]},n1511:{id:"n1511",loc:[-85.628965,41.957075]},n1512:{id:"n1512",loc:[-85.628965,41.957111]},n1513:{id:"n1513",loc:[-85.629035,41.95711]},n1514:{id:"n1514",loc:[-85.629036,41.957209]},n1515:{id:"n1515",loc:[-85.628893,41.95721]},n1516:{id:"n1516",loc:[-85.631348,41.95773]},n1517:{id:"n1517",loc:[-85.631101,41.957732]},n1518:{id:"n1518",loc:[-85.631099,41.957558]},n1519:{id:"n1519",loc:[-85.63123,41.957557]},n152:{id:"n152",loc:[-85.637552,41.942619]},n1520:{id:"n1520",loc:[-85.631231,41.957618]},n1521:{id:"n1521",loc:[-85.63129,41.957618]},n1522:{id:"n1522",loc:[-85.63129,41.957651]},n1523:{id:"n1523",loc:[-85.631346,41.957651]},n1524:{id:"n1524",loc:[-85.631366,41.95802]},n1525:{id:"n1525",loc:[-85.631141,41.958021]},n1526:{id:"n1526",loc:[-85.63114,41.957943]},n1527:{id:"n1527",loc:[-85.631167,41.957943]},n1528:{id:"n1528",loc:[-85.631166,41.957808]},n1529:{id:"n1529",loc:[-85.631301,41.957807]},n153:{id:"n153",loc:[-85.63763,41.942528]},n1530:{id:"n1530",loc:[-85.631302,41.95789]},n1531:{id:"n1531",loc:[-85.631364,41.95789]},n1532:{id:"n1532",loc:[-85.631539,41.957754]},n1533:{id:"n1533",loc:[-85.631069,41.957756]},n1534:{id:"n1534",loc:[-85.631536,41.957518]},n1535:{id:"n1535",loc:[-85.631543,41.957995]},n1536:{id:"n1536",loc:[-85.631531,41.957748]},n1537:{id:"n1537",loc:[-85.631485,41.957748]},n1538:{id:"n1538",loc:[-85.631484,41.957698]},n1539:{id:"n1539",loc:[-85.631531,41.957698]},n154:{id:"n154",loc:[-85.637151,41.94253]},n1540:{id:"n1540",loc:[-85.631586,41.957742]},n1541:{id:"n1541",loc:[-85.63155,41.957742]},n1542:{id:"n1542",loc:[-85.631551,41.957702]},n1543:{id:"n1543",loc:[-85.631587,41.957702]},n1544:{id:"n1544",loc:[-85.631534,41.95807]},n1545:{id:"n1545",loc:[-85.631534,41.958097]},n1546:{id:"n1546",loc:[-85.631491,41.958097]},n1547:{id:"n1547",loc:[-85.631491,41.95807]},n1548:{id:"n1548",loc:[-85.631304,41.958861]},n1549:{id:"n1549",loc:[-85.631186,41.958862]},n155:{id:"n155",loc:[-85.63715,41.942424]},n1550:{id:"n1550",loc:[-85.631182,41.958653]},n1551:{id:"n1551",loc:[-85.6313,41.958651]},n1552:{id:"n1552",loc:[-85.631293,41.95854]},n1553:{id:"n1553",loc:[-85.631176,41.958539]},n1554:{id:"n1554",loc:[-85.631176,41.958377]},n1555:{id:"n1555",loc:[-85.631297,41.958377]},n1556:{id:"n1556",loc:[-85.631297,41.958422]},n1557:{id:"n1557",loc:[-85.631333,41.958422]},n1558:{id:"n1558",loc:[-85.631333,41.958479]},n1559:{id:"n1559",loc:[-85.631293,41.958479]},n156:{id:"n156",loc:[-85.637629,41.942422]},n1560:{id:"n1560",loc:[-85.631951,41.958908]},n1561:{id:"n1561",loc:[-85.631838,41.958909]},n1562:{id:"n1562",loc:[-85.631837,41.958847]},n1563:{id:"n1563",loc:[-85.631859,41.958847]},n1564:{id:"n1564",loc:[-85.631858,41.958746]},n1565:{id:"n1565",loc:[-85.631961,41.958745]},n1566:{id:"n1566",loc:[-85.631962,41.958812]},n1567:{id:"n1567",loc:[-85.631949,41.958813]},n1568:{id:"n1568",loc:[-85.631579,41.958913]},n1569:{id:"n1569",loc:[-85.631567,41.95864]},n157:{id:"n157",loc:[-85.638232,41.942477]},n1570:{id:"n1570",loc:[-85.631942,41.958639]},n1571:{id:"n1571",loc:[-85.631543,41.958594]},n1572:{id:"n1572",loc:[-85.631543,41.958065]},n1573:{id:"n1573",loc:[-85.631888,41.958546]},n1574:{id:"n1574",loc:[-85.631804,41.958546]},n1575:{id:"n1575",loc:[-85.631803,41.95841]},n1576:{id:"n1576",loc:[-85.631886,41.958409]},n1577:{id:"n1577",loc:[-85.631897,41.958125]},n1578:{id:"n1578",loc:[-85.631755,41.958126]},n1579:{id:"n1579",loc:[-85.631756,41.958174]},n158:{id:"n158",loc:[-85.637775,41.942483]},n1580:{id:"n1580",loc:[-85.63178,41.958174]},n1581:{id:"n1581",loc:[-85.631782,41.958272]},n1582:{id:"n1582",loc:[-85.631922,41.958271]},n1583:{id:"n1583",loc:[-85.631922,41.958244]},n1584:{id:"n1584",loc:[-85.631883,41.958245]},n1585:{id:"n1585",loc:[-85.631882,41.958175]},n1586:{id:"n1586",loc:[-85.631898,41.958175]},n1587:{id:"n1587",loc:[-85.631924,41.958032]},n1588:{id:"n1588",loc:[-85.631762,41.958032]},n1589:{id:"n1589",loc:[-85.63176,41.957827]},n159:{id:"n159",loc:[-85.638107,41.942512]},n1590:{id:"n1590",loc:[-85.631888,41.957826]},n1591:{id:"n1591",loc:[-85.631888,41.957892]},n1592:{id:"n1592",loc:[-85.631871,41.957892]},n1593:{id:"n1593",loc:[-85.631872,41.957949]},n1594:{id:"n1594",loc:[-85.631923,41.957949]},n1595:{id:"n1595",loc:[-85.631695,41.95795]},n1596:{id:"n1596",loc:[-85.631666,41.957975]},n1597:{id:"n1597",loc:[-85.63163,41.957975]},n1598:{id:"n1598",loc:[-85.6316,41.957951]},n1599:{id:"n1599",loc:[-85.6316,41.95785]},n16:{id:"n16",loc:[-85.63341,41.94032]},n160:{id:"n160",loc:[-85.637763,41.942514]},n1600:{id:"n1600",loc:[-85.63166,41.95785]},n1601:{id:"n1601",loc:[-85.631696,41.957873]},n1602:{id:"n1602",loc:[-85.631924,41.957762]},n1603:{id:"n1603",loc:[-85.631762,41.957762]},n1604:{id:"n1604",loc:[-85.631762,41.957708]},n1605:{id:"n1605",loc:[-85.631785,41.957708]},n1606:{id:"n1606",loc:[-85.631785,41.957606]},n1607:{id:"n1607",loc:[-85.631734,41.957606]},n1608:{id:"n1608",loc:[-85.631734,41.957538]},n1609:{id:"n1609",loc:[-85.631821,41.957538]},n161:{id:"n161",loc:[-85.637763,41.942445]},n1610:{id:"n1610",loc:[-85.631935,41.957545]},n1611:{id:"n1611",loc:[-85.631821,41.957544]},n1612:{id:"n1612",loc:[-85.631935,41.957645]},n1613:{id:"n1613",loc:[-85.631924,41.957645]},n1614:{id:"n1614",loc:[-85.627135,41.953828]},n1615:{id:"n1615",loc:[-85.633517,41.941353],tags:{man_made:"lighthouse"}},n1616:{id:"n1616",loc:[-85.633659,41.942041],tags:{amenity:"bbq"}},n1617:{id:"n1617",loc:[-85.63662,41.942911],tags:{amenity:"toilets"}},n1618:{id:"n1618",loc:[-85.637487,41.943876],tags:{amenity:"toilets"}},n1619:{id:"n1619",loc:[-85.634938,41.941917],tags:{amenity:"toilets"}},n162:{id:"n162",loc:[-85.638107,41.942443]},n1620:{id:"n1620",loc:[-85.632427,41.941678],tags:{amenity:"bbq"}},n1621:{id:"n1621",loc:[-85.638033,41.944568],tags:{amenity:"bbq"}},n1622:{id:"n1622",loc:[-85.638052,41.944522],tags:{amenity:"bbq"}},n1623:{id:"n1623",loc:[-85.635001,41.941965]},n1624:{id:"n1624",loc:[-85.634635,41.941884]},n1625:{id:"n1625",loc:[-85.634667,41.941894]},n1626:{id:"n1626",loc:[-85.634791,41.942011]},n1627:{id:"n1627",loc:[-85.634749,41.941938]},n1628:{id:"n1628",loc:[-85.627295,41.953946],tags:{barrier:"gate"}},n1629:{id:"n1629",loc:[-85.629076,41.954689]},n163:{id:"n163",loc:[-85.638813,41.942475]},n1630:{id:"n1630",loc:[-85.640667,41.942595]},n1631:{id:"n1631",loc:[-85.639455,41.94261]},n1632:{id:"n1632",loc:[-85.643407,41.942336]},n1633:{id:"n1633",loc:[-85.641845,41.941316]},n1634:{id:"n1634",loc:[-85.643322,41.942224]},n1635:{id:"n1635",loc:[-85.643301,41.942124]},n1636:{id:"n1636",loc:[-85.640639,41.941326]},n1637:{id:"n1637",loc:[-85.640614,41.940058]},n1638:{id:"n1638",loc:[-85.639428,41.941335]},n1639:{id:"n1639",loc:[-85.643078,41.941293]},n164:{id:"n164",loc:[-85.63883,41.942422]},n1640:{id:"n1640",loc:[-85.64371,41.942302]},n1641:{id:"n1641",loc:[-85.643056,41.94001]},n1642:{id:"n1642",loc:[-85.643097,41.942575],tags:{highway:"traffic_signals",traffic_signals:"signal","traffic_signals:direction":"both"}},n1643:{id:"n1643",loc:[-85.641855,41.942586]},n1644:{id:"n1644",loc:[-85.643549,41.942209]},n1645:{id:"n1645",loc:[-85.639359,41.94007]},n1646:{id:"n1646",loc:[-85.642797,41.940522]},n1647:{id:"n1647",loc:[-85.642589,41.940523]},n1648:{id:"n1648",loc:[-85.642587,41.940287]},n1649:{id:"n1649",loc:[-85.642797,41.940286]},n165:{id:"n165",loc:[-85.63883,41.942508]},n1650:{id:"n1650",loc:[-85.642571,41.940523]},n1651:{id:"n1651",loc:[-85.642568,41.940286]},n1652:{id:"n1652",loc:[-85.642316,41.940289]},n1653:{id:"n1653",loc:[-85.642321,41.940436]},n1654:{id:"n1654",loc:[-85.642292,41.940458]},n1655:{id:"n1655",loc:[-85.642287,41.940483]},n1656:{id:"n1656",loc:[-85.642323,41.940509]},n1657:{id:"n1657",loc:[-85.642385,41.940511]},n1658:{id:"n1658",loc:[-85.642408,41.940526]},n1659:{id:"n1659",loc:[-85.641962,41.94109]},n166:{id:"n166",loc:[-85.638364,41.942508]},n1660:{id:"n1660",loc:[-85.642753,41.941084]},n1661:{id:"n1661",loc:[-85.642752,41.941004]},n1662:{id:"n1662",loc:[-85.642806,41.941003]},n1663:{id:"n1663",loc:[-85.642803,41.940731]},n1664:{id:"n1664",loc:[-85.642741,41.940732]},n1665:{id:"n1665",loc:[-85.64274,41.940645]},n1666:{id:"n1666",loc:[-85.641957,41.940651]},n1667:{id:"n1667",loc:[-85.642937,41.941241]},n1668:{id:"n1668",loc:[-85.641776,41.941253]},n1669:{id:"n1669",loc:[-85.641766,41.940598]},n167:{id:"n167",loc:[-85.638836,41.942167]},n1670:{id:"n1670",loc:[-85.64198,41.940598]},n1671:{id:"n1671",loc:[-85.641961,41.940137]},n1672:{id:"n1672",loc:[-85.642934,41.94012]},n1673:{id:"n1673",loc:[-85.643074,41.941173]},n1674:{id:"n1674",loc:[-85.642841,41.940997]},n1675:{id:"n1675",loc:[-85.642839,41.940721]},n1676:{id:"n1676",loc:[-85.643065,41.940552]},n1677:{id:"n1677",loc:[-85.642732,41.94124]},n1678:{id:"n1678",loc:[-85.641815,41.941246]},n1679:{id:"n1679",loc:[-85.641813,41.941132]},n168:{id:"n168",loc:[-85.638836,41.94229]},n1680:{id:"n1680",loc:[-85.641839,41.941111]},n1681:{id:"n1681",loc:[-85.641884,41.941098]},n1682:{id:"n1682",loc:[-85.642732,41.941092]},n1683:{id:"n1683",loc:[-85.642776,41.941302]},n1684:{id:"n1684",loc:[-85.632788,41.946236]},n1685:{id:"n1685",loc:[-85.622342,41.953127]},n1686:{id:"n1686",loc:[-85.641848,41.941167]},n1687:{id:"n1687",loc:[-85.643753,41.941503]},n1688:{id:"n1688",loc:[-85.643762,41.942119]},n1689:{id:"n1689",loc:[-85.64238,41.942262]},n169:{id:"n169",loc:[-85.638594,41.94229]},n1690:{id:"n1690",loc:[-85.642374,41.941944]},n1691:{id:"n1691",loc:[-85.642518,41.941943]},n1692:{id:"n1692",loc:[-85.642519,41.94198]},n1693:{id:"n1693",loc:[-85.642831,41.941977]},n1694:{id:"n1694",loc:[-85.642837,41.942312]},n1695:{id:"n1695",loc:[-85.642495,41.942315]},n1696:{id:"n1696",loc:[-85.642494,41.942261]},n1697:{id:"n1697",loc:[-85.641087,41.942433]},n1698:{id:"n1698",loc:[-85.641081,41.942006]},n1699:{id:"n1699",loc:[-85.641244,41.942005]},n17:{id:"n17",loc:[-85.633478,41.94081]},n170:{id:"n170",loc:[-85.638594,41.942422]},n1700:{id:"n1700",loc:[-85.64125,41.942431]},n1701:{id:"n1701",loc:[-85.641331,41.942968]},n1702:{id:"n1702",loc:[-85.641328,41.942713]},n1703:{id:"n1703",loc:[-85.641521,41.942712]},n1704:{id:"n1704",loc:[-85.641523,41.942924]},n1705:{id:"n1705",loc:[-85.641504,41.942924]},n1706:{id:"n1706",loc:[-85.641505,41.942967]},n1707:{id:"n1707",loc:[-85.638612,41.942408]},n1708:{id:"n1708",loc:[-85.638612,41.942327]},n1709:{id:"n1709",loc:[-85.638775,41.942327]},n171:{id:"n171",loc:[-85.638364,41.942356]},n1710:{id:"n1710",loc:[-85.638775,41.942299]},n1711:{id:"n1711",loc:[-85.638835,41.942298]},n1712:{id:"n1712",loc:[-85.638835,41.942407]},n1713:{id:"n1713",loc:[-85.639116,41.942444]},n1714:{id:"n1714",loc:[-85.639114,41.942362]},n1715:{id:"n1715",loc:[-85.639294,41.94236]},n1716:{id:"n1716",loc:[-85.639296,41.942442]},n1717:{id:"n1717",loc:[-85.639808,41.942385]},n1718:{id:"n1718",loc:[-85.639805,41.942285]},n1719:{id:"n1719",loc:[-85.639988,41.942283]},n172:{id:"n172",loc:[-85.638364,41.942167]},n1720:{id:"n1720",loc:[-85.63999,41.942383]},n1721:{id:"n1721",loc:[-85.639633,41.943023]},n1722:{id:"n1722",loc:[-85.639867,41.943019]},n1723:{id:"n1723",loc:[-85.639866,41.942964]},n1724:{id:"n1724",loc:[-85.639888,41.942963]},n1725:{id:"n1725",loc:[-85.639883,41.942779]},n1726:{id:"n1726",loc:[-85.639851,41.94278]},n1727:{id:"n1727",loc:[-85.63985,41.94274]},n1728:{id:"n1728",loc:[-85.639789,41.942741]},n1729:{id:"n1729",loc:[-85.639789,41.942753]},n173:{id:"n173",loc:[-85.639038,41.942463]},n1730:{id:"n1730",loc:[-85.639698,41.942754]},n1731:{id:"n1731",loc:[-85.639699,41.942788]},n1732:{id:"n1732",loc:[-85.639675,41.942789]},n1733:{id:"n1733",loc:[-85.639676,41.94283]},n1734:{id:"n1734",loc:[-85.639701,41.942829]},n1735:{id:"n1735",loc:[-85.639702,41.942869]},n1736:{id:"n1736",loc:[-85.639629,41.94287]},n1737:{id:"n1737",loc:[-85.643568,41.942946]},n1738:{id:"n1738",loc:[-85.643568,41.942777]},n1739:{id:"n1739",loc:[-85.643401,41.942777]},n174:{id:"n174",loc:[-85.638897,41.942464]},n1740:{id:"n1740",loc:[-85.643401,41.942863]},n1741:{id:"n1741",loc:[-85.643448,41.942863]},n1742:{id:"n1742",loc:[-85.643448,41.942946]},n1743:{id:"n1743",loc:[-85.642836,41.942981]},n1744:{id:"n1744",loc:[-85.642917,41.942979]},n1745:{id:"n1745",loc:[-85.642914,41.942904]},n1746:{id:"n1746",loc:[-85.642938,41.942903]},n1747:{id:"n1747",loc:[-85.642935,41.942813]},n1748:{id:"n1748",loc:[-85.642775,41.942816]},n1749:{id:"n1749",loc:[-85.642778,41.942906]},n175:{id:"n175",loc:[-85.638897,41.942423]},n1750:{id:"n1750",loc:[-85.642833,41.942905]},n1751:{id:"n1751",loc:[-85.642302,41.942886]},n1752:{id:"n1752",loc:[-85.642299,41.942721]},n1753:{id:"n1753",loc:[-85.642422,41.94272]},n1754:{id:"n1754",loc:[-85.642425,41.942868]},n1755:{id:"n1755",loc:[-85.642385,41.942869]},n1756:{id:"n1756",loc:[-85.642385,41.942885]},n1757:{id:"n1757",loc:[-85.641533,41.942939]},n1758:{id:"n1758",loc:[-85.64161,41.942877]},n1759:{id:"n1759",loc:[-85.641676,41.942922]},n176:{id:"n176",loc:[-85.638853,41.942423]},n1760:{id:"n1760",loc:[-85.6416,41.942985]},n1761:{id:"n1761",loc:[-85.64206,41.942802]},n1762:{id:"n1762",loc:[-85.642059,41.942741]},n1763:{id:"n1763",loc:[-85.642196,41.942741]},n1764:{id:"n1764",loc:[-85.642196,41.942818]},n1765:{id:"n1765",loc:[-85.642128,41.942819]},n1766:{id:"n1766",loc:[-85.642128,41.942801]},n1767:{id:"n1767",loc:[-85.640943,41.942934]},n1768:{id:"n1768",loc:[-85.641035,41.942933]},n1769:{id:"n1769",loc:[-85.641032,41.942797]},n177:{id:"n177",loc:[-85.638852,41.94237]},n1770:{id:"n1770",loc:[-85.640997,41.942798]},n1771:{id:"n1771",loc:[-85.640996,41.942764]},n1772:{id:"n1772",loc:[-85.640861,41.942766]},n1773:{id:"n1773",loc:[-85.640862,41.942848]},n1774:{id:"n1774",loc:[-85.640941,41.942847]},n1775:{id:"n1775",loc:[-85.643766,41.942226]},n1776:{id:"n1776",loc:[-85.643768,41.942407]},n1777:{id:"n1777",loc:[-85.643218,41.94177]},n1778:{id:"n1778",loc:[-85.64321,41.941327]},n1779:{id:"n1779",loc:[-85.643649,41.941323]},n178:{id:"n178",loc:[-85.638892,41.94237]},n1780:{id:"n1780",loc:[-85.643656,41.941716]},n1781:{id:"n1781",loc:[-85.64358,41.941717]},n1782:{id:"n1782",loc:[-85.64358,41.941767]},n1783:{id:"n1783",loc:[-85.64382,41.941495]},n1784:{id:"n1784",loc:[-85.643817,41.941317]},n1785:{id:"n1785",loc:[-85.643235,41.941833]},n1786:{id:"n1786",loc:[-85.64335,41.941842]},n1787:{id:"n1787",loc:[-85.643504,41.941903]},n1788:{id:"n1788",loc:[-85.643554,41.941946]},n1789:{id:"n1789",loc:[-85.643618,41.942015]},n179:{id:"n179",loc:[-85.638891,41.942334]},n1790:{id:"n1790",loc:[-85.64346,41.941971]},n1791:{id:"n1791",loc:[-85.643528,41.942468]},n1792:{id:"n1792",loc:[-85.643621,41.942363]},n1793:{id:"n1793",loc:[-85.643496,41.942297]},n1794:{id:"n1794",loc:[-85.643446,41.942246]},n1795:{id:"n1795",loc:[-85.643398,41.942177]},n1796:{id:"n1796",loc:[-85.643398,41.942031]},n1797:{id:"n1797",loc:[-85.621531,41.952693]},n1798:{id:"n1798",loc:[-85.643221,41.942028]},n1799:{id:"n1799",loc:[-85.643225,41.942276]},n18:{id:"n18",loc:[-85.63345,41.94071]},n180:{id:"n180",loc:[-85.639037,41.942334]},n1800:{id:"n1800",loc:[-85.643265,41.942347]},n1801:{id:"n1801",loc:[-85.643323,41.942413]},n1802:{id:"n1802",loc:[-85.643411,41.94247]},n1803:{id:"n1803",loc:[-85.643459,41.942435]},n1804:{id:"n1804",loc:[-85.643767,41.942307]},n1805:{id:"n1805",loc:[-85.643661,41.942293]},n1806:{id:"n1806",loc:[-85.643578,41.942247]},n1807:{id:"n1807",loc:[-85.643522,41.942125]},n1808:{id:"n1808",loc:[-85.643515,41.942061]},n1809:{id:"n1809",loc:[-85.643346,41.941924]},n181:{id:"n181",loc:[-85.638074,41.941839]},n1810:{id:"n1810",loc:[-85.643086,41.94192]},n1811:{id:"n1811",loc:[-85.643529,41.94217]},n1812:{id:"n1812",loc:[-85.643489,41.942003]},n1813:{id:"n1813",loc:[-85.643295,41.941919]},n1814:{id:"n1814",loc:[-85.643305,41.942163]},n1815:{id:"n1815",loc:[-85.643354,41.942285]},n1816:{id:"n1816",loc:[-85.643472,41.942389]},n1817:{id:"n1817",loc:[-85.643608,41.942271]},n1818:{id:"n1818",loc:[-85.643876,41.941402]},n1819:{id:"n1819",loc:[-85.643818,41.941369]},n182:{id:"n182",loc:[-85.638076,41.941942]},n1820:{id:"n1820",loc:[-85.643682,41.941304]},n1821:{id:"n1821",loc:[-85.64359,41.941286]},n1822:{id:"n1822",loc:[-85.643317,41.941727]},n1823:{id:"n1823",loc:[-85.643301,41.941286]},n1824:{id:"n1824",loc:[-85.643553,41.941698]},n1825:{id:"n1825",loc:[-85.643543,41.941286]},n1826:{id:"n1826",loc:[-85.636967,41.940118]},n1827:{id:"n1827",loc:[-85.63378,41.940114]},n1828:{id:"n1828",loc:[-85.637254,41.940075]},n1829:{id:"n1829",loc:[-85.637002,41.941355]},n183:{id:"n183",loc:[-85.637955,41.941944]},n1830:{id:"n1830",loc:[-85.643532,41.94204]},n1831:{id:"n1831",loc:[-85.638235,41.942615]},n1832:{id:"n1832",loc:[-85.637039,41.942624]},n1833:{id:"n1833",loc:[-85.636369,41.94266]},n1834:{id:"n1834",loc:[-85.63582,41.942771],tags:{highway:"traffic_signals",traffic_signals:"emergency","traffic_signals:direction":"both"}},n1835:{id:"n1835",loc:[-85.634873,41.943044]},n1836:{id:"n1836",loc:[-85.643482,41.941976]},n1837:{id:"n1837",loc:[-85.64345,41.941945]},n1838:{id:"n1838",loc:[-85.641885,41.943851]},n1839:{id:"n1839",loc:[-85.641915,41.945121]},n184:{id:"n184",loc:[-85.637953,41.94184]},n1840:{id:"n1840",loc:[-85.639454,41.943871]},n1841:{id:"n1841",loc:[-85.639491,41.945191]},n1842:{id:"n1842",loc:[-85.635768,41.940113]},n1843:{id:"n1843",loc:[-85.638206,41.941345]},n1844:{id:"n1844",loc:[-85.640721,41.94513]},n1845:{id:"n1845",loc:[-85.643137,41.945103]},n1846:{id:"n1846",loc:[-85.638199,41.940079]},n1847:{id:"n1847",loc:[-85.640688,41.943861]},n1848:{id:"n1848",loc:[-85.643397,41.941924]},n1849:{id:"n1849",loc:[-85.643117,41.943841]},n185:{id:"n185",loc:[-85.637953,41.941866]},n1850:{id:"n1850",loc:[-85.636731,41.94263]},n1851:{id:"n1851",loc:[-85.63518,41.942955],tags:{highway:"crossing"}},n1852:{id:"n1852",loc:[-85.636152,41.942695]},n1853:{id:"n1853",loc:[-85.644202,41.941499]},n1854:{id:"n1854",loc:[-85.644211,41.942116]},n1855:{id:"n1855",loc:[-85.644233,41.942404]},n1856:{id:"n1856",loc:[-85.644231,41.942223]},n1857:{id:"n1857",loc:[-85.644133,41.941315]},n1858:{id:"n1858",loc:[-85.644136,41.941493]},n1859:{id:"n1859",loc:[-85.644345,41.942307]},n186:{id:"n186",loc:[-85.637873,41.941867]},n1860:{id:"n1860",loc:[-85.644232,41.942304]},n1861:{id:"n1861",loc:[-85.644134,41.941403]},n1862:{id:"n1862",loc:[-85.63607,41.943005],tags:{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"fire_station",name:"Three Rivers Fire Department"}},n1863:{id:"n1863",loc:[-85.637,41.941236]},n1864:{id:"n1864",loc:[-85.634476,41.941475]},n1865:{id:"n1865",loc:[-85.635036,41.941858]},n1866:{id:"n1866",loc:[-85.635362,41.941962]},n1867:{id:"n1867",loc:[-85.635796,41.941962]},n1868:{id:"n1868",loc:[-85.63295,41.943006]},n1869:{id:"n1869",loc:[-85.634692,41.943098]},n187:{id:"n187",loc:[-85.637877,41.941975]},n1870:{id:"n1870",loc:[-85.633128,41.940484]},n1871:{id:"n1871",loc:[-85.633117,41.942798]},n1872:{id:"n1872",loc:[-85.633303,41.942412]},n1873:{id:"n1873",loc:[-85.633482,41.941912]},n1874:{id:"n1874",loc:[-85.633455,41.941359]},n1875:{id:"n1875",loc:[-85.633162,41.942679]},n1876:{id:"n1876",loc:[-85.634274,41.943479]},n1877:{id:"n1877",loc:[-85.634678,41.942909]},n1878:{id:"n1878",loc:[-85.6339,41.941453]},n1879:{id:"n1879",loc:[-85.634571,41.942774]},n188:{id:"n188",loc:[-85.636855,41.942488]},n1880:{id:"n1880",loc:[-85.63419,41.941732]},n1881:{id:"n1881",loc:[-85.634067,41.941565]},n1882:{id:"n1882",loc:[-85.63436,41.942358]},n1883:{id:"n1883",loc:[-85.634327,41.942247]},n1884:{id:"n1884",loc:[-85.633391,41.941231]},n1885:{id:"n1885",loc:[-85.634303,41.941972]},n1886:{id:"n1886",loc:[-85.633541,41.940147]},n1887:{id:"n1887",loc:[-85.633433,41.940252]},n1888:{id:"n1888",loc:[-85.633402,41.940411]},n1889:{id:"n1889",loc:[-85.633551,41.941023]},n189:{id:"n189",loc:[-85.636702,41.942488]},n1890:{id:"n1890",loc:[-85.633719,41.941186]},n1891:{id:"n1891",loc:[-85.633067,41.941845]},n1892:{id:"n1892",loc:[-85.634902,41.942766]},n1893:{id:"n1893",loc:[-85.634603,41.942202]},n1894:{id:"n1894",loc:[-85.634858,41.942152]},n1895:{id:"n1895",loc:[-85.634842,41.942269]},n1896:{id:"n1896",loc:[-85.634907,41.942313]},n1897:{id:"n1897",loc:[-85.635049,41.942331]},n1898:{id:"n1898",loc:[-85.635101,41.942281]},n1899:{id:"n1899",loc:[-85.635129,41.942144]},n19:{id:"n19",loc:[-85.633009,41.942229]},n190:{id:"n190",loc:[-85.636702,41.942434]},n1900:{id:"n1900",loc:[-85.635531,41.942143]},n1901:{id:"n1901",loc:[-85.635534,41.942577]},n1902:{id:"n1902",loc:[-85.635158,41.942656]},n1903:{id:"n1903",loc:[-85.635121,41.942703]},n1904:{id:"n1904",loc:[-85.635087,41.941508]},n1905:{id:"n1905",loc:[-85.63536,41.941106]},n1906:{id:"n1906",loc:[-85.635442,41.941094]},n1907:{id:"n1907",loc:[-85.635508,41.941104]},n1908:{id:"n1908",loc:[-85.635569,41.941125]},n1909:{id:"n1909",loc:[-85.635583,41.941106]},n191:{id:"n191",loc:[-85.636761,41.942434]},n1910:{id:"n1910",loc:[-85.635555,41.940976]},n1911:{id:"n1911",loc:[-85.635501,41.940915]},n1912:{id:"n1912",loc:[-85.635392,41.940922]},n1913:{id:"n1913",loc:[-85.635276,41.940974]},n1914:{id:"n1914",loc:[-85.63517,41.941204]},n1915:{id:"n1915",loc:[-85.634888,41.941517]},n1916:{id:"n1916",loc:[-85.634897,41.941576]},n1917:{id:"n1917",loc:[-85.634961,41.94164]},n1918:{id:"n1918",loc:[-85.635028,41.941659]},n1919:{id:"n1919",loc:[-85.635118,41.941621]},n192:{id:"n192",loc:[-85.636761,41.942369]},n1920:{id:"n1920",loc:[-85.635085,41.941558]},n1921:{id:"n1921",loc:[-85.63504,41.94136]},n1922:{id:"n1922",loc:[-85.635221,41.941077]},n1923:{id:"n1923",loc:[-85.634387,41.941559]},n1924:{id:"n1924",loc:[-85.634351,41.941587]},n1925:{id:"n1925",loc:[-85.634416,41.941756]},n1926:{id:"n1926",loc:[-85.634461,41.941797]},n1927:{id:"n1927",loc:[-85.634501,41.941819]},n1928:{id:"n1928",loc:[-85.634597,41.941816]},n1929:{id:"n1929",loc:[-85.634732,41.941724]},n193:{id:"n193",loc:[-85.636855,41.942369]},n1930:{id:"n1930",loc:[-85.634672,41.941775]},n1931:{id:"n1931",loc:[-85.633403,41.939101]},n1932:{id:"n1932",loc:[-85.633297,41.939397]},n1933:{id:"n1933",loc:[-85.633205,41.939674]},n1934:{id:"n1934",loc:[-85.63322,41.939777]},n1935:{id:"n1935",loc:[-85.633345,41.939936]},n1936:{id:"n1936",loc:[-85.633376,41.940002]},n1937:{id:"n1937",loc:[-85.633266,41.940228]},n1938:{id:"n1938",loc:[-85.633236,41.940352]},n1939:{id:"n1939",loc:[-85.633282,41.94063]},n194:{id:"n194",loc:[-85.636645,41.94249]},n1940:{id:"n1940",loc:[-85.633364,41.940874]},n1941:{id:"n1941",loc:[-85.633439,41.941052]},n1942:{id:"n1942",loc:[-85.633582,41.941172]},n1943:{id:"n1943",loc:[-85.633748,41.941273]},n1944:{id:"n1944",loc:[-85.634317,41.941527]},n1945:{id:"n1945",loc:[-85.634389,41.94174]},n1946:{id:"n1946",loc:[-85.634441,41.941801]},n1947:{id:"n1947",loc:[-85.634514,41.941837]},n1948:{id:"n1948",loc:[-85.634485,41.942005]},n1949:{id:"n1949",loc:[-85.63457,41.942202]},n195:{id:"n195",loc:[-85.636565,41.94249]},n1950:{id:"n1950",loc:[-85.634869,41.942769]},n1951:{id:"n1951",loc:[-85.634943,41.942792]},n1952:{id:"n1952",loc:[-85.635139,41.942882]},n1953:{id:"n1953",loc:[-85.634962,41.943161]},n1954:{id:"n1954",loc:[-85.635002,41.943131]},n1955:{id:"n1955",loc:[-85.635005,41.943091]},n1956:{id:"n1956",loc:[-85.635216,41.943033]},n1957:{id:"n1957",loc:[-85.634817,41.94267]},n1958:{id:"n1958",loc:[-85.634614,41.942599]},n1959:{id:"n1959",loc:[-85.634494,41.942381]},n196:{id:"n196",loc:[-85.636565,41.942474]},n1960:{id:"n1960",loc:[-85.634486,41.9423]},n1961:{id:"n1961",loc:[-85.634671,41.941795]},n1962:{id:"n1962",loc:[-85.634595,41.941831]},n1963:{id:"n1963",loc:[-85.634332,41.941866]},n1964:{id:"n1964",loc:[-85.634207,41.941885]},n1965:{id:"n1965",loc:[-85.634133,41.941892]},n1966:{id:"n1966",loc:[-85.634131,41.942203]},n1967:{id:"n1967",loc:[-85.634047,41.942327]},n1968:{id:"n1968",loc:[-85.634219,41.942793]},n1969:{id:"n1969",loc:[-85.634061,41.942392]},n197:{id:"n197",loc:[-85.636514,41.942474]},n1970:{id:"n1970",loc:[-85.633989,41.942407]},n1971:{id:"n1971",loc:[-85.633971,41.942356]},n1972:{id:"n1972",loc:[-85.63361,41.942423]},n1973:{id:"n1973",loc:[-85.633714,41.942682]},n1974:{id:"n1974",loc:[-85.633698,41.942863]},n1975:{id:"n1975",loc:[-85.633882,41.942865]},n1976:{id:"n1976",loc:[-85.633941,41.943007]},n1977:{id:"n1977",loc:[-85.633887,41.943035]},n1978:{id:"n1978",loc:[-85.633768,41.942815]},n1979:{id:"n1979",loc:[-85.633682,41.942351]},n198:{id:"n198",loc:[-85.636514,41.942326]},n1980:{id:"n1980",loc:[-85.634037,41.942273]},n1981:{id:"n1981",loc:[-85.634029,41.942252]},n1982:{id:"n1982",loc:[-85.633673,41.942331]},n1983:{id:"n1983",loc:[-85.634219,41.942571]},n1984:{id:"n1984",loc:[-85.634252,41.942565]},n1985:{id:"n1985",loc:[-85.634144,41.942299]},n1986:{id:"n1986",loc:[-85.634115,41.942306]},n1987:{id:"n1987",loc:[-85.634059,41.943094]},n1988:{id:"n1988",loc:[-85.633944,41.942903]},n1989:{id:"n1989",loc:[-85.634311,41.942821]},n199:{id:"n199",loc:[-85.636561,41.942326]},n1990:{id:"n1990",loc:[-85.634351,41.94277]},n1991:{id:"n1991",loc:[-85.634153,41.942254]},n1992:{id:"n1992",loc:[-85.634092,41.94222]},n1993:{id:"n1993",loc:[-85.633571,41.942336]},n1994:{id:"n1994",loc:[-85.633513,41.942387]},n1995:{id:"n1995",loc:[-85.633509,41.942455]},n1996:{id:"n1996",loc:[-85.63363,41.942665]},n1997:{id:"n1997",loc:[-85.63414,41.94286]},n1998:{id:"n1998",loc:[-85.63397,41.942449]},n1999:{id:"n1999",loc:[-85.633551,41.942529]},n2:{id:"n2",loc:[-85.627421,41.953877]},n20:{id:"n20",loc:[-85.633013,41.941438]},n200:{id:"n200",loc:[-85.636561,41.942311]},n2000:{id:"n2000",loc:[-85.633741,41.942493]},n2001:{id:"n2001",loc:[-85.633894,41.942869]},n2002:{id:"n2002",loc:[-85.634132,41.941954]},n2003:{id:"n2003",loc:[-85.634032,41.942038]},n2004:{id:"n2004",loc:[-85.633765,41.942238]},n2005:{id:"n2005",loc:[-85.63376,41.942268]},n2006:{id:"n2006",loc:[-85.633768,41.942293]},n2007:{id:"n2007",loc:[-85.633808,41.942386]},n2008:{id:"n2008",loc:[-85.634946,41.941663]},n2009:{id:"n2009",loc:[-85.63511,41.941697]},n201:{id:"n201",loc:[-85.636621,41.942311]},n2010:{id:"n2010",loc:[-85.635337,41.94168]},n2011:{id:"n2011",loc:[-85.634997,41.942251]},n2012:{id:"n2012",loc:[-85.635013,41.942173]},n2013:{id:"n2013",loc:[-85.634876,41.942157]},n2014:{id:"n2014",loc:[-85.634859,41.942235]},n2015:{id:"n2015",loc:[-85.634992,41.941951]},n2016:{id:"n2016",loc:[-85.634952,41.941877]},n2017:{id:"n2017",loc:[-85.634844,41.94191]},n2018:{id:"n2018",loc:[-85.634884,41.941983]},n2019:{id:"n2019",loc:[-85.635189,41.941691]},n202:{id:"n202",loc:[-85.636621,41.942351]},n2020:{id:"n2020",loc:[-85.635089,41.941896]},n2021:{id:"n2021",loc:[-85.635077,41.941964]},n2022:{id:"n2022",loc:[-85.635058,41.942147]},n2023:{id:"n2023",loc:[-85.635099,41.942161]},n2024:{id:"n2024",loc:[-85.635099,41.942213]},n2025:{id:"n2025",loc:[-85.635079,41.942285]},n2026:{id:"n2026",loc:[-85.635047,41.942316]},n2027:{id:"n2027",loc:[-85.634925,41.9423]},n2028:{id:"n2028",loc:[-85.634911,41.942276]},n2029:{id:"n2029",loc:[-85.634917,41.942242]},n203:{id:"n203",loc:[-85.63666,41.942351]},n2030:{id:"n2030",loc:[-85.634698,41.941898]},n2031:{id:"n2031",loc:[-85.634964,41.941878]},n2032:{id:"n2032",loc:[-85.635025,41.941929]},n2033:{id:"n2033",loc:[-85.634862,41.941887]},n2034:{id:"n2034",loc:[-85.634811,41.94181]},n2035:{id:"n2035",loc:[-85.634731,41.941745]},n2036:{id:"n2036",loc:[-85.634933,41.94176]},n2037:{id:"n2037",loc:[-85.634942,41.942145]},n2038:{id:"n2038",loc:[-85.634944,41.942065]},n2039:{id:"n2039",loc:[-85.634914,41.941996]},n204:{id:"n204",loc:[-85.63666,41.942453]},n2040:{id:"n2040",loc:[-85.634981,41.941979]},n2041:{id:"n2041",loc:[-85.633419,41.942172]},n2042:{id:"n2042",loc:[-85.633509,41.941631]},n2043:{id:"n2043",loc:[-85.633686,41.942937]},n2044:{id:"n2044",loc:[-85.633371,41.942722]},n2045:{id:"n2045",loc:[-85.633291,41.942538]},n2046:{id:"n2046",loc:[-85.633902,41.940941]},n2047:{id:"n2047",loc:[-85.635254,41.940939]},n2048:{id:"n2048",loc:[-85.635686,41.940829]},n2049:{id:"n2049",loc:[-85.635712,41.942681]},n205:{id:"n205",loc:[-85.636645,41.942453]},n2050:{id:"n2050",loc:[-85.633721,41.942118]},n2051:{id:"n2051",loc:[-85.633698,41.942057]},n2052:{id:"n2052",loc:[-85.633591,41.942079]},n2053:{id:"n2053",loc:[-85.633614,41.94214]},n2054:{id:"n2054",loc:[-85.633968,41.941099]},n2055:{id:"n2055",loc:[-85.633907,41.941138]},n2056:{id:"n2056",loc:[-85.633968,41.941197]},n2057:{id:"n2057",loc:[-85.63404,41.941162]},n2058:{id:"n2058",loc:[-85.634839,41.941665]},n2059:{id:"n2059",loc:[-85.635314,41.943035]},n206:{id:"n206",loc:[-85.636394,41.942471]},n2060:{id:"n2060",loc:[-85.634919,41.943142]},n2061:{id:"n2061",loc:[-85.636433,41.942959],tags:{"addr:city":"Three Rivers","addr:housenumber":"333","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"townhall",name:"Three Rivers City Hall"}},n2062:{id:"n2062",loc:[-85.637039,41.942789]},n2063:{id:"n2063",loc:[-85.636333,41.94279]},n2064:{id:"n2064",loc:[-85.634484,41.940726]},n2065:{id:"n2065",loc:[-85.634483,41.940603]},n2066:{id:"n2066",loc:[-85.634908,41.940601]},n2067:{id:"n2067",loc:[-85.634908,41.94053]},n2068:{id:"n2068",loc:[-85.634934,41.94053]},n2069:{id:"n2069",loc:[-85.634934,41.940496]},n207:{id:"n207",loc:[-85.636262,41.942472]},n2070:{id:"n2070",loc:[-85.63504,41.940495]},n2071:{id:"n2071",loc:[-85.63504,41.940531]},n2072:{id:"n2072",loc:[-85.635068,41.940531]},n2073:{id:"n2073",loc:[-85.635071,41.940794]},n2074:{id:"n2074",loc:[-85.635183,41.940793]},n2075:{id:"n2075",loc:[-85.635185,41.940916]},n2076:{id:"n2076",loc:[-85.634799,41.940919]},n2077:{id:"n2077",loc:[-85.634798,41.940798]},n2078:{id:"n2078",loc:[-85.634925,41.940797]},n2079:{id:"n2079",loc:[-85.634924,41.940724]},n208:{id:"n208",loc:[-85.636261,41.94233]},n2080:{id:"n2080",loc:[-85.637448,41.938233]},n2081:{id:"n2081",loc:[-85.634168,41.943279]},n2082:{id:"n2082",loc:[-85.635744,41.938248]},n2083:{id:"n2083",loc:[-85.638744,41.951211]},n2084:{id:"n2084",loc:[-85.636421,41.946392]},n2085:{id:"n2085",loc:[-85.635965,41.945809]},n2086:{id:"n2086",loc:[-85.635683,41.945449]},n2087:{id:"n2087",loc:[-85.635281,41.945025]},n2088:{id:"n2088",loc:[-85.632443,41.942574]},n2089:{id:"n2089",loc:[-85.638243,41.943674]},n209:{id:"n209",loc:[-85.636353,41.942329]},n2090:{id:"n2090",loc:[-85.638228,41.943747]},n2091:{id:"n2091",loc:[-85.638163,41.943797]},n2092:{id:"n2092",loc:[-85.638089,41.943832]},n2093:{id:"n2093",loc:[-85.637969,41.943841]},n2094:{id:"n2094",loc:[-85.637841,41.943833]},n2095:{id:"n2095",loc:[-85.637342,41.943734]},n2096:{id:"n2096",loc:[-85.637232,41.943707]},n2097:{id:"n2097",loc:[-85.637163,41.943668]},n2098:{id:"n2098",loc:[-85.637118,41.943615]},n2099:{id:"n2099",loc:[-85.637078,41.943494]},n21:{id:"n21",loc:[-85.634126,41.942228]},n210:{id:"n210",loc:[-85.636354,41.94239]},n2100:{id:"n2100",loc:[-85.632903,41.998429],tags:{railway:"level_crossing"}},n2101:{id:"n2101",loc:[-85.633616,41.943581],tags:{railway:"level_crossing"}},n2102:{id:"n2102",loc:[-85.636943,41.947311]},n2103:{id:"n2103",loc:[-85.6376,41.94854]},n2104:{id:"n2104",loc:[-85.634565,41.93631]},n2105:{id:"n2105",loc:[-85.629597,41.942562]},n2106:{id:"n2106",loc:[-85.630821,41.943077]},n2107:{id:"n2107",loc:[-85.627473,41.940659]},n2108:{id:"n2108",loc:[-85.629708,41.942872]},n2109:{id:"n2109",loc:[-85.634093,41.935448]},n211:{id:"n211",loc:[-85.636393,41.94239]},n2110:{id:"n2110",loc:[-85.630413,41.94366]},n2111:{id:"n2111",loc:[-85.630488,41.942662]},n2112:{id:"n2112",loc:[-85.63361,41.936749]},n2113:{id:"n2113",loc:[-85.630038,41.941808]},n2114:{id:"n2114",loc:[-85.632016,41.942922]},n2115:{id:"n2115",loc:[-85.631525,41.944303]},n2116:{id:"n2116",loc:[-85.626862,41.94022]},n2117:{id:"n2117",loc:[-85.629673,41.94121]},n2118:{id:"n2118",loc:[-85.632752,41.943101]},n2119:{id:"n2119",loc:[-85.631147,41.943201]},n212:{id:"n212",loc:[-85.63444,41.943176]},n2120:{id:"n2120",loc:[-85.624974,41.940579]},n2121:{id:"n2121",loc:[-85.629518,41.941783]},n2122:{id:"n2122",loc:[-85.632349,41.942699]},n2123:{id:"n2123",loc:[-85.628418,41.940356]},n2124:{id:"n2124",loc:[-85.629147,41.94129]},n2125:{id:"n2125",loc:[-85.631111,41.943979]},n2126:{id:"n2126",loc:[-85.632087,41.940013]},n2127:{id:"n2127",loc:[-85.634469,41.935057]},n2128:{id:"n2128",loc:[-85.630097,41.943449]},n2129:{id:"n2129",loc:[-85.6331,41.937878]},n213:{id:"n213",loc:[-85.63375,41.942814]},n2130:{id:"n2130",loc:[-85.625274,41.941114]},n2131:{id:"n2131",loc:[-85.632632,41.941217]},n2132:{id:"n2132",loc:[-85.632739,41.941926]},n2133:{id:"n2133",loc:[-85.631647,41.94366]},n2134:{id:"n2134",loc:[-85.635059,41.935456]},n2135:{id:"n2135",loc:[-85.631259,41.944349]},n2136:{id:"n2136",loc:[-85.626336,41.940811]},n2137:{id:"n2137",loc:[-85.631507,41.943875]},n2138:{id:"n2138",loc:[-85.625081,41.940859]},n2139:{id:"n2139",loc:[-85.625778,41.940093]},n214:{id:"n214",loc:[-85.633674,41.942869]},n2140:{id:"n2140",loc:[-85.632641,41.942436]},n2141:{id:"n2141",loc:[-85.628825,41.941034]},n2142:{id:"n2142",loc:[-85.627913,41.940292]},n2143:{id:"n2143",loc:[-85.628943,41.940516]},n2144:{id:"n2144",loc:[-85.63139,41.943941]},n2145:{id:"n2145",loc:[-85.630081,41.94204]},n2146:{id:"n2146",loc:[-85.632194,41.93963]},n2147:{id:"n2147",loc:[-85.632913,41.93939]},n2148:{id:"n2148",loc:[-85.632001,41.943492]},n2149:{id:"n2149",loc:[-85.63149,41.943154]},n215:{id:"n215",loc:[-85.633542,41.942768]},n2150:{id:"n2150",loc:[-85.625167,41.940117]},n2151:{id:"n2151",loc:[-85.63287,41.939941]},n2152:{id:"n2152",loc:[-85.630789,41.943732]},n2153:{id:"n2153",loc:[-85.632173,41.940348]},n2154:{id:"n2154",loc:[-85.626587,41.940113]},n2155:{id:"n2155",loc:[-85.62684,41.940667]},n2156:{id:"n2156",loc:[-85.632527,41.938904]},n2157:{id:"n2157",loc:[-85.624866,41.94018]},n2158:{id:"n2158",loc:[-85.633267,41.93872]},n2159:{id:"n2159",loc:[-85.62934,41.940843]},n216:{id:"n216",loc:[-85.633618,41.942714]},n2160:{id:"n2160",loc:[-85.62272,41.953817]},n2161:{id:"n2161",loc:[-85.622555,41.954453]},n2162:{id:"n2162",loc:[-85.637225,41.944128]},n2163:{id:"n2163",loc:[-85.622628,41.953683]},n2164:{id:"n2164",loc:[-85.635441,41.943989]},n2165:{id:"n2165",loc:[-85.622629,41.953807]},n2166:{id:"n2166",loc:[-85.62262,41.953807]},n2167:{id:"n2167",loc:[-85.62262,41.953837]},n2168:{id:"n2168",loc:[-85.622532,41.953838]},n2169:{id:"n2169",loc:[-85.637469,41.944579]},n217:{id:"n217",loc:[-85.634001,41.942336]},n2170:{id:"n2170",loc:[-85.63688,41.943935]},n2171:{id:"n2171",loc:[-85.638263,41.946367]},n2172:{id:"n2172",loc:[-85.622532,41.953807]},n2173:{id:"n2173",loc:[-85.622353,41.953808]},n2174:{id:"n2174",loc:[-85.622352,41.953685]},n2175:{id:"n2175",loc:[-85.622464,41.953684]},n2176:{id:"n2176",loc:[-85.622464,41.953648]},n2177:{id:"n2177",loc:[-85.637136,41.94576]},n2178:{id:"n2178",loc:[-85.622521,41.953648]},n2179:{id:"n2179",loc:[-85.637129,41.945415]},n218:{id:"n218",loc:[-85.633825,41.942376]},n2180:{id:"n2180",loc:[-85.637473,41.94607]},n2181:{id:"n2181",loc:[-85.622521,41.953683]},n2182:{id:"n2182",loc:[-85.622717,41.954104]},n2183:{id:"n2183",loc:[-85.637769,41.946095]},n2184:{id:"n2184",loc:[-85.623872,41.953515]},n2185:{id:"n2185",loc:[-85.623851,41.953588]},n2186:{id:"n2186",loc:[-85.631385,41.94433]},n2187:{id:"n2187",loc:[-85.623608,41.953543]},n2188:{id:"n2188",loc:[-85.637308,41.944882]},n2189:{id:"n2189",loc:[-85.634898,41.944041]},n219:{id:"n219",loc:[-85.633807,41.942334]},n2190:{id:"n2190",loc:[-85.623604,41.953442]},n2191:{id:"n2191",loc:[-85.623705,41.953442]},n2192:{id:"n2192",loc:[-85.623708,41.953493]},n2193:{id:"n2193",loc:[-85.624064,41.952655]},n2194:{id:"n2194",loc:[-85.62395,41.952654]},n2195:{id:"n2195",loc:[-85.623951,41.952579]},n2196:{id:"n2196",loc:[-85.637435,41.944342]},n2197:{id:"n2197",loc:[-85.624064,41.952579]},n2198:{id:"n2198",loc:[-85.623812,41.952648]},n2199:{id:"n2199",loc:[-85.623813,41.952705]},n22:{id:"n22",loc:[-85.633531,41.942357]},n220:{id:"n220",loc:[-85.633983,41.942294]},n2200:{id:"n2200",loc:[-85.637169,41.945098]},n2201:{id:"n2201",loc:[-85.623552,41.952707]},n2202:{id:"n2202",loc:[-85.623551,41.95263]},n2203:{id:"n2203",loc:[-85.623701,41.952629]},n2204:{id:"n2204",loc:[-85.635894,41.943719]},n2205:{id:"n2205",loc:[-85.637297,41.945992]},n2206:{id:"n2206",loc:[-85.623724,41.952648]},n2207:{id:"n2207",loc:[-85.623812,41.952438]},n2208:{id:"n2208",loc:[-85.625239,41.952197]},n2209:{id:"n2209",loc:[-85.625232,41.952257]},n221:{id:"n221",loc:[-85.634182,41.942495]},n2210:{id:"n2210",loc:[-85.635175,41.94408]},n2211:{id:"n2211",loc:[-85.636381,41.943761]},n2212:{id:"n2212",loc:[-85.625115,41.952249]},n2213:{id:"n2213",loc:[-85.638578,41.946644]},n2214:{id:"n2214",loc:[-85.625122,41.952189]},n2215:{id:"n2215",loc:[-85.625085,41.952031]},n2216:{id:"n2216",loc:[-85.636126,41.943713]},n2217:{id:"n2217",loc:[-85.635005,41.944041]},n2218:{id:"n2218",loc:[-85.63714,41.945328]},n2219:{id:"n2219",loc:[-85.634871,41.943292]},n222:{id:"n222",loc:[-85.634149,41.942503]},n2220:{id:"n2220",loc:[-85.635705,41.943799]},n2221:{id:"n2221",loc:[-85.634995,41.943576]},n2222:{id:"n2222",loc:[-85.635026,41.943829]},n2223:{id:"n2223",loc:[-85.632874,41.941031]},n2224:{id:"n2224",loc:[-85.632531,41.940233]},n2225:{id:"n2225",loc:[-85.634247,41.936003]},n2226:{id:"n2226",loc:[-85.62929,41.941127]},n2227:{id:"n2227",loc:[-85.630428,41.943266]},n2228:{id:"n2228",loc:[-85.631608,41.943425]},n2229:{id:"n2229",loc:[-85.632316,41.943042]},n223:{id:"n223",loc:[-85.634098,41.942373]},n2230:{id:"n2230",loc:[-85.628711,41.940744]},n2231:{id:"n2231",loc:[-85.627831,41.940536]},n2232:{id:"n2232",loc:[-85.625514,41.94052]},n2233:{id:"n2233",loc:[-85.631127,41.943545]},n2234:{id:"n2234",loc:[-85.632909,41.942531]},n2235:{id:"n2235",loc:[-85.632917,41.938796]},n2236:{id:"n2236",loc:[-85.626716,41.94044]},n2237:{id:"n2237",loc:[-85.630122,41.942852]},n2238:{id:"n2238",loc:[-85.632509,41.939674]},n2239:{id:"n2239",loc:[-85.634762,41.935237]},n224:{id:"n224",loc:[-85.634131,41.942366]},n2240:{id:"n2240",loc:[-85.63384,41.937025]},n2241:{id:"n2241",loc:[-85.629741,41.941909]},n2242:{id:"n2242",loc:[-85.635254,41.945001],tags:{railway:"level_crossing"}},n2243:{id:"n2243",loc:[-85.634005,41.938168]},n2244:{id:"n2244",loc:[-85.63393,41.938335]},n2245:{id:"n2245",loc:[-85.633859,41.93846]},n2246:{id:"n2246",loc:[-85.633663,41.938776]},n2247:{id:"n2247",loc:[-85.633513,41.938936]},n2248:{id:"n2248",loc:[-85.635295,41.943225]},n2249:{id:"n2249",loc:[-85.635393,41.943293]},n225:{id:"n225",loc:[-85.635986,41.94177]},n2250:{id:"n2250",loc:[-85.635645,41.94332]},n2251:{id:"n2251",loc:[-85.63629,41.943328]},n2252:{id:"n2252",loc:[-85.636554,41.943372]},n2253:{id:"n2253",loc:[-85.636869,41.943526]},n2254:{id:"n2254",loc:[-85.637099,41.943704]},n2255:{id:"n2255",loc:[-85.637268,41.943773]},n2256:{id:"n2256",loc:[-85.637483,41.943821]},n2257:{id:"n2257",loc:[-85.637616,41.943929]},n2258:{id:"n2258",loc:[-85.637752,41.944114]},n2259:{id:"n2259",loc:[-85.638399,41.944308]},n226:{id:"n226",loc:[-85.635982,41.941523]},n2260:{id:"n2260",loc:[-85.638573,41.944451]},n2261:{id:"n2261",loc:[-85.638702,41.944574]},n2262:{id:"n2262",loc:[-85.638718,41.944652]},n2263:{id:"n2263",loc:[-85.638715,41.944809]},n2264:{id:"n2264",loc:[-85.638766,41.944988]},n2265:{id:"n2265",loc:[-85.638773,41.945136]},n2266:{id:"n2266",loc:[-85.638705,41.945251]},n2267:{id:"n2267",loc:[-85.638335,41.944291]},n2268:{id:"n2268",loc:[-85.638474,41.944352]},n2269:{id:"n2269",loc:[-85.635408,41.943429]},n227:{id:"n227",loc:[-85.636108,41.941521]},n2270:{id:"n2270",loc:[-85.635271,41.943654]},n2271:{id:"n2271",loc:[-85.635266,41.943744]},n2272:{id:"n2272",loc:[-85.635271,41.943819]},n2273:{id:"n2273",loc:[-85.635192,41.943876]},n2274:{id:"n2274",loc:[-85.635129,41.943857]},n2275:{id:"n2275",loc:[-85.635122,41.943764]},n2276:{id:"n2276",loc:[-85.635124,41.943664]},n2277:{id:"n2277",loc:[-85.63515,41.943611]},n2278:{id:"n2278",loc:[-85.635106,41.943534]},n2279:{id:"n2279",loc:[-85.634972,41.943197]},n228:{id:"n228",loc:[-85.636109,41.941559]},n2280:{id:"n2280",loc:[-85.633978,41.938227]},n2281:{id:"n2281",loc:[-85.634216,41.943255]},n2282:{id:"n2282",loc:[-85.634434,41.943622]},n2283:{id:"n2283",loc:[-85.632406,41.940854]},n2284:{id:"n2284",loc:[-85.632488,41.941063],tags:{leisure:"slipway"}},n2285:{id:"n2285",loc:[-85.632726,41.941537]},n2286:{id:"n2286",loc:[-85.632639,41.94136]},n2287:{id:"n2287",loc:[-85.632704,41.941439]},n2288:{id:"n2288",loc:[-85.632289,41.940601]},n2289:{id:"n2289",loc:[-85.632541,41.942526]},n229:{id:"n229",loc:[-85.636145,41.941559]},n2290:{id:"n2290",loc:[-85.634058,41.943173]},n2291:{id:"n2291",loc:[-85.636175,41.945974]},n2292:{id:"n2292",loc:[-85.636528,41.945975]},n2293:{id:"n2293",loc:[-85.637092,41.945893]},n2294:{id:"n2294",loc:[-85.637881,41.945647]},n2295:{id:"n2295",loc:[-85.639329,41.945162]},n2296:{id:"n2296",loc:[-85.639323,41.945026]},n2297:{id:"n2297",loc:[-85.638826,41.945032]},n2298:{id:"n2298",loc:[-85.638817,41.944174]},n2299:{id:"n2299",loc:[-85.638291,41.94418]},n23:{id:"n23",loc:[-85.633504,41.942418]},n230:{id:"n230",loc:[-85.636145,41.941551]},n2300:{id:"n2300",loc:[-85.63828,41.943811]},n2301:{id:"n2301",loc:[-85.638195,41.943601]},n2302:{id:"n2302",loc:[-85.63719,41.943592]},n2303:{id:"n2303",loc:[-85.636697,41.943273]},n2304:{id:"n2304",loc:[-85.635375,41.943274]},n2305:{id:"n2305",loc:[-85.635091,41.943547]},n2306:{id:"n2306",loc:[-85.63442,41.944117]},n2307:{id:"n2307",loc:[-85.635117,41.943717]},n2308:{id:"n2308",loc:[-85.635601,41.945177]},n2309:{id:"n2309",loc:[-85.635819,41.945494]},n231:{id:"n231",loc:[-85.636312,41.941549]},n2310:{id:"n2310",loc:[-85.635303,41.944891]},n2311:{id:"n2311",loc:[-85.637674,41.943802]},n2312:{id:"n2312",loc:[-85.638263,41.944272]},n2313:{id:"n2313",loc:[-85.634267,41.935266]},n2314:{id:"n2314",loc:[-85.639788,41.945152]},n2315:{id:"n2315",loc:[-85.639645,41.945167]},n2316:{id:"n2316",loc:[-85.639362,41.945233]},n2317:{id:"n2317",loc:[-85.638616,41.945163]},n2318:{id:"n2318",loc:[-85.638514,41.944936]},n2319:{id:"n2319",loc:[-85.638578,41.94503]},n232:{id:"n232",loc:[-85.636314,41.941649]},n2320:{id:"n2320",loc:[-85.638578,41.945215]},n2321:{id:"n2321",loc:[-85.640495,41.947015]},n2322:{id:"n2322",loc:[-85.639577,41.946495]},n2323:{id:"n2323",loc:[-85.638935,41.946087]},n2324:{id:"n2324",loc:[-85.637535,41.94584]},n2325:{id:"n2325",loc:[-85.638357,41.945404]},n2326:{id:"n2326",loc:[-85.638051,41.94553]},n2327:{id:"n2327",loc:[-85.637732,41.945555]},n2328:{id:"n2328",loc:[-85.637657,41.945524]},n2329:{id:"n2329",loc:[-85.637598,41.945467]},n233:{id:"n233",loc:[-85.636152,41.94165]},n2330:{id:"n2330",loc:[-85.637669,41.945318]},n2331:{id:"n2331",loc:[-85.637894,41.945171]},n2332:{id:"n2332",loc:[-85.637923,41.945082]},n2333:{id:"n2333",loc:[-85.63793,41.944756]},n2334:{id:"n2334",loc:[-85.637976,41.944696]},n2335:{id:"n2335",loc:[-85.638044,41.944671]},n2336:{id:"n2336",loc:[-85.638129,41.944597]},n2337:{id:"n2337",loc:[-85.638252,41.944413]},n2338:{id:"n2338",loc:[-85.638092,41.945442]},n2339:{id:"n2339",loc:[-85.638409,41.945315]},n234:{id:"n234",loc:[-85.636152,41.941628]},n2340:{id:"n2340",loc:[-85.638325,41.944771]},n2341:{id:"n2341",loc:[-85.638103,41.944744]},n2342:{id:"n2342",loc:[-85.637976,41.944781]},n2343:{id:"n2343",loc:[-85.637983,41.944865]},n2344:{id:"n2344",loc:[-85.638063,41.945074]},n2345:{id:"n2345",loc:[-85.638041,41.945206]},n2346:{id:"n2346",loc:[-85.637907,41.945309]},n2347:{id:"n2347",loc:[-85.637925,41.94539]},n2348:{id:"n2348",loc:[-85.637998,41.94545]},n2349:{id:"n2349",loc:[-85.637135,41.946254]},n235:{id:"n235",loc:[-85.63611,41.941628]},n2350:{id:"n2350",loc:[-85.636837,41.946615]},n2351:{id:"n2351",loc:[-85.637954,41.948909]},n2352:{id:"n2352",loc:[-85.638382,41.949786]},n2353:{id:"n2353",loc:[-85.639367,41.951242]},n2354:{id:"n2354",loc:[-85.640554,41.951777]},n2355:{id:"n2355",loc:[-85.6411,41.952234]},n2356:{id:"n2356",loc:[-85.641742,41.952657]},n2357:{id:"n2357",loc:[-85.642321,41.952941]},n2358:{id:"n2358",loc:[-85.64277,41.953228]},n2359:{id:"n2359",loc:[-85.643333,41.953825]},n236:{id:"n236",loc:[-85.636113,41.941768]},n2360:{id:"n2360",loc:[-85.643579,41.954365]},n2361:{id:"n2361",loc:[-85.644439,41.954105]},n2362:{id:"n2362",loc:[-85.64506,41.954]},n2363:{id:"n2363",loc:[-85.645483,41.953911]},n2364:{id:"n2364",loc:[-85.646046,41.953853]},n2365:{id:"n2365",loc:[-85.646318,41.953717]},n2366:{id:"n2366",loc:[-85.646276,41.953414]},n2367:{id:"n2367",loc:[-85.631063,41.957478],tags:{emergency:"fire_hydrant"}},n2368:{id:"n2368",loc:[-85.630996,41.955857],tags:{emergency:"fire_hydrant"}},n2369:{id:"n2369",loc:[-85.630976,41.954608],tags:{emergency:"fire_hydrant"}},n237:{id:"n237",loc:[-85.635983,41.941589],tags:{entrance:"yes"}},n2370:{id:"n2370",loc:[-85.646,41.953154]},n2371:{id:"n2371",loc:[-85.645222,41.953193]},n2372:{id:"n2372",loc:[-85.644732,41.953181]},n2373:{id:"n2373",loc:[-85.644064,41.953298]},n2374:{id:"n2374",loc:[-85.643818,41.953177]},n2375:{id:"n2375",loc:[-85.644001,41.95284]},n2376:{id:"n2376",loc:[-85.628174,41.95456],tags:{emergency:"fire_hydrant"}},n2377:{id:"n2377",loc:[-85.644267,41.952591]},n2378:{id:"n2378",loc:[-85.644288,41.952328]},n2379:{id:"n2379",loc:[-85.627276,41.953987],tags:{emergency:"fire_hydrant"}},n238:{id:"n238",loc:[-85.635906,41.94159]},n2380:{id:"n2380",loc:[-85.644262,41.952153]},n2381:{id:"n2381",loc:[-85.644168,41.95204]},n2382:{id:"n2382",loc:[-85.64421,41.951749]},n2383:{id:"n2383",loc:[-85.64385,41.951586]},n2384:{id:"n2384",loc:[-85.62736,41.955964],tags:{emergency:"fire_hydrant"}},n2385:{id:"n2385",loc:[-85.626307,41.957198],tags:{emergency:"fire_hydrant"}},n2386:{id:"n2386",loc:[-85.643589,41.951323]},n2387:{id:"n2387",loc:[-85.62747,41.957509],tags:{emergency:"fire_hydrant"}},n2388:{id:"n2388",loc:[-85.628665,41.957492],tags:{emergency:"fire_hydrant"}},n2389:{id:"n2389",loc:[-85.642535,41.951031]},n239:{id:"n239",loc:[-85.635883,41.940182]},n2390:{id:"n2390",loc:[-85.642269,41.95088]},n2391:{id:"n2391",loc:[-85.641878,41.950814]},n2392:{id:"n2392",loc:[-85.641549,41.950806]},n2393:{id:"n2393",loc:[-85.641103,41.950549]},n2394:{id:"n2394",loc:[-85.630864,41.959046],tags:{emergency:"fire_hydrant"}},n2395:{id:"n2395",loc:[-85.632249,41.958969],tags:{emergency:"fire_hydrant"}},n2396:{id:"n2396",loc:[-85.641037,41.949821]},n2397:{id:"n2397",loc:[-85.641006,41.949433]},n2398:{id:"n2398",loc:[-85.632232,41.95859],tags:{emergency:"fire_hydrant"}},n2399:{id:"n2399",loc:[-85.632071,41.958345],tags:{emergency:"fire_hydrant"}},n24:{id:"n24",loc:[-85.634346,41.942792]},n240:{id:"n240",loc:[-85.635916,41.94264]},n2400:{id:"n2400",loc:[-85.632228,41.9573],tags:{emergency:"fire_hydrant"}},n2401:{id:"n2401",loc:[-85.641152,41.948257]},n2402:{id:"n2402",loc:[-85.641055,41.947304]},n2403:{id:"n2403",loc:[-85.638022,41.945897]},n2404:{id:"n2404",loc:[-85.638672,41.950778]},n2405:{id:"n2405",loc:[-85.63666,41.944492],tags:{name:"Memory Isle",place:"island"}},n2406:{id:"n2406",loc:[-85.635,41.946389],tags:{amenity:"post_office",name:"Three Rivers Post Office"}},n2407:{id:"n2407",loc:[-85.633676,41.946036]},n2408:{id:"n2408",loc:[-85.633736,41.946078]},n2409:{id:"n2409",loc:[-85.633997,41.946185]},n241:{id:"n241",loc:[-85.635795,41.941906]},n2410:{id:"n2410",loc:[-85.634448,41.945626],tags:{highway:"traffic_signals",traffic_signals:"signal"}},n2411:{id:"n2411",loc:[-85.63456,41.945731],tags:{crossing:"zebra",highway:"crossing"}},n2412:{id:"n2412",loc:[-85.634592,41.94578]},n2413:{id:"n2413",loc:[-85.634607,41.945815]},n2414:{id:"n2414",loc:[-85.634614,41.945864]},n2415:{id:"n2415",loc:[-85.636066,41.946185]},n2416:{id:"n2416",loc:[-85.636128,41.946352]},n2417:{id:"n2417",loc:[-85.636142,41.946452]},n2418:{id:"n2418",loc:[-85.635327,41.945292]},n2419:{id:"n2419",loc:[-85.635648,41.94558]},n242:{id:"n242",loc:[-85.635909,41.941906]},n2420:{id:"n2420",loc:[-85.635769,41.945729]},n2421:{id:"n2421",loc:[-85.637349,41.945897]},n2422:{id:"n2422",loc:[-85.632211,41.95596],tags:{emergency:"fire_hydrant"}},n2423:{id:"n2423",loc:[-85.635942,41.94598]},n2424:{id:"n2424",loc:[-85.636443,41.946042]},n2425:{id:"n2425",loc:[-85.635819,41.946052]},n2426:{id:"n2426",loc:[-85.636669,41.946025]},n2427:{id:"n2427",loc:[-85.636832,41.946005]},n2428:{id:"n2428",loc:[-85.637039,41.945968]},n2429:{id:"n2429",loc:[-85.636291,41.946046]},n243:{id:"n243",loc:[-85.636359,41.941904]},n2430:{id:"n2430",loc:[-85.634005,41.943367]},n2431:{id:"n2431",loc:[-85.633366,41.943724]},n2432:{id:"n2432",loc:[-85.634617,41.946057]},n2433:{id:"n2433",loc:[-85.636534,41.944793]},n2434:{id:"n2434",loc:[-85.637055,41.945188]},n2435:{id:"n2435",loc:[-85.636153,41.944618]},n2436:{id:"n2436",loc:[-85.636803,41.944944]},n2437:{id:"n2437",loc:[-85.633389,41.945735]},n2438:{id:"n2438",loc:[-85.633536,41.94585]},n2439:{id:"n2439",loc:[-85.63363,41.945993]},n244:{id:"n244",loc:[-85.636351,41.941438]},n2440:{id:"n2440",loc:[-85.633268,41.94568]},n2441:{id:"n2441",loc:[-85.635947,41.94546]},n2442:{id:"n2442",loc:[-85.636277,41.945268]},n2443:{id:"n2443",loc:[-85.635203,41.944287]},n2444:{id:"n2444",loc:[-85.634876,41.944477]},n2445:{id:"n2445",loc:[-85.634975,41.944419]},n2446:{id:"n2446",loc:[-85.633877,41.943438]},n2447:{id:"n2447",loc:[-85.63508,41.945113]},n2448:{id:"n2448",loc:[-85.635372,41.944932]},n2449:{id:"n2449",loc:[-85.636594,41.945935]},n245:{id:"n245",loc:[-85.635903,41.941436]},n2450:{id:"n2450",loc:[-85.636901,41.945747]},n2451:{id:"n2451",loc:[-85.636329,41.945228]},n2452:{id:"n2452",loc:[-85.636025,41.945417]},n2453:{id:"n2453",loc:[-85.634002,41.944644]},n2454:{id:"n2454",loc:[-85.63407,41.944692]},n2455:{id:"n2455",loc:[-85.634114,41.944756]},n2456:{id:"n2456",loc:[-85.633762,41.944809]},n2457:{id:"n2457",loc:[-85.634184,41.944807]},n2458:{id:"n2458",loc:[-85.634291,41.944819]},n2459:{id:"n2459",loc:[-85.634639,41.944845]},n246:{id:"n246",loc:[-85.635788,41.941436]},n2460:{id:"n2460",loc:[-85.633822,41.944861]},n2461:{id:"n2461",loc:[-85.63411,41.944855]},n2462:{id:"n2462",loc:[-85.63435,41.944872]},n2463:{id:"n2463",loc:[-85.63441,41.944903]},n2464:{id:"n2464",loc:[-85.633883,41.944913]},n2465:{id:"n2465",loc:[-85.634164,41.944896]},n2466:{id:"n2466",loc:[-85.633487,41.944926]},n2467:{id:"n2467",loc:[-85.634736,41.944929]},n2468:{id:"n2468",loc:[-85.633944,41.944965]},n2469:{id:"n2469",loc:[-85.633555,41.944983]},n247:{id:"n247",loc:[-85.635929,41.941511]},n2470:{id:"n2470",loc:[-85.633995,41.945013]},n2471:{id:"n2471",loc:[-85.633614,41.945037]},n2472:{id:"n2472",loc:[-85.634848,41.945031]},n2473:{id:"n2473",loc:[-85.634049,41.945061]},n2474:{id:"n2474",loc:[-85.633678,41.945094]},n2475:{id:"n2475",loc:[-85.63317,41.945111]},n2476:{id:"n2476",loc:[-85.633357,41.945103]},n2477:{id:"n2477",loc:[-85.633728,41.945136]},n2478:{id:"n2478",loc:[-85.634146,41.945148]},n2479:{id:"n2479",loc:[-85.633416,41.945157]},n248:{id:"n248",loc:[-85.635929,41.941317]},n2480:{id:"n2480",loc:[-85.634625,41.945172]},n2481:{id:"n2481",loc:[-85.633239,41.945174]},n2482:{id:"n2482",loc:[-85.63469,41.945185]},n2483:{id:"n2483",loc:[-85.634661,41.945203]},n2484:{id:"n2484",loc:[-85.63348,41.945214]},n2485:{id:"n2485",loc:[-85.633578,41.945221]},n2486:{id:"n2486",loc:[-85.634742,41.945231]},n2487:{id:"n2487",loc:[-85.634251,41.94525]},n2488:{id:"n2488",loc:[-85.633524,41.945254]},n2489:{id:"n2489",loc:[-85.63468,41.945271]},n249:{id:"n249",loc:[-85.636414,41.941316]},n2490:{id:"n2490",loc:[-85.633885,41.945272]},n2491:{id:"n2491",loc:[-85.634795,41.945288]},n2492:{id:"n2492",loc:[-85.634742,41.94532]},n2493:{id:"n2493",loc:[-85.633946,41.945327]},n2494:{id:"n2494",loc:[-85.634844,41.945331]},n2495:{id:"n2495",loc:[-85.63435,41.945349]},n2496:{id:"n2496",loc:[-85.633733,41.945357]},n2497:{id:"n2497",loc:[-85.633987,41.945375]},n2498:{id:"n2498",loc:[-85.634911,41.945419]},n2499:{id:"n2499",loc:[-85.634049,41.945431]},n25:{id:"n25",loc:[-85.634333,41.942809]},n250:{id:"n250",loc:[-85.636414,41.941511]},n2500:{id:"n2500",loc:[-85.633705,41.945461]},n2501:{id:"n2501",loc:[-85.633642,41.945408]},n2502:{id:"n2502",loc:[-85.634493,41.945475]},n2503:{id:"n2503",loc:[-85.634106,41.945484]},n2504:{id:"n2504",loc:[-85.635008,41.945505]},n2505:{id:"n2505",loc:[-85.633757,41.945506]},n2506:{id:"n2506",loc:[-85.634542,41.945519]},n2507:{id:"n2507",loc:[-85.634162,41.945536]},n2508:{id:"n2508",loc:[-85.633843,41.945547]},n2509:{id:"n2509",loc:[-85.634919,41.94556]},n251:{id:"n251",loc:[-85.636819,41.941617]},n2510:{id:"n2510",loc:[-85.633818,41.945561]},n2511:{id:"n2511",loc:[-85.634638,41.94559]},n2512:{id:"n2512",loc:[-85.633901,41.945598]},n2513:{id:"n2513",loc:[-85.634257,41.945626]},n2514:{id:"n2514",loc:[-85.633967,41.945652]},n2515:{id:"n2515",loc:[-85.634735,41.945676]},n2516:{id:"n2516",loc:[-85.635057,41.945683]},n2517:{id:"n2517",loc:[-85.635296,41.945703]},n2518:{id:"n2518",loc:[-85.635112,41.945703]},n2519:{id:"n2519",loc:[-85.634782,41.945729]},n252:{id:"n252",loc:[-85.636718,41.941619]},n2520:{id:"n2520",loc:[-85.634052,41.945747]},n2521:{id:"n2521",loc:[-85.635296,41.945757]},n2522:{id:"n2522",loc:[-85.635314,41.945757]},n2523:{id:"n2523",loc:[-85.635112,41.945761]},n2524:{id:"n2524",loc:[-85.63484,41.945778]},n2525:{id:"n2525",loc:[-85.635314,41.945938]},n2526:{id:"n2526",loc:[-85.63484,41.945922]},n2527:{id:"n2527",loc:[-85.635461,41.944879]},n2528:{id:"n2528",loc:[-85.636024,41.945384]},n2529:{id:"n2529",loc:[-85.636145,41.945312]},n253:{id:"n253",loc:[-85.636716,41.941509]},n2530:{id:"n2530",loc:[-85.6356,41.944797]},n2531:{id:"n2531",loc:[-85.635135,41.944354]},n2532:{id:"n2532",loc:[-85.632988,41.945369]},n2533:{id:"n2533",loc:[-85.633376,41.94563]},n2534:{id:"n2534",loc:[-85.633539,41.945534]},n2535:{id:"n2535",loc:[-85.633238,41.945248]},n2536:{id:"n2536",loc:[-85.633166,41.945216]},n2537:{id:"n2537",loc:[-85.633114,41.945188]},n2538:{id:"n2538",loc:[-85.633078,41.945127]},n2539:{id:"n2539",loc:[-85.633066,41.94508]},n254:{id:"n254",loc:[-85.636732,41.941509]},n2540:{id:"n2540",loc:[-85.633222,41.945358]},n2541:{id:"n2541",loc:[-85.633425,41.945541]},n2542:{id:"n2542",loc:[-85.63299,41.9455]},n2543:{id:"n2543",loc:[-85.634374,41.944327]},n2544:{id:"n2544",loc:[-85.633648,41.943697]},n2545:{id:"n2545",loc:[-85.633533,41.943764]},n2546:{id:"n2546",loc:[-85.634239,41.944417]},n2547:{id:"n2547",loc:[-85.634122,41.944395]},n2548:{id:"n2548",loc:[-85.634235,41.944326]},n2549:{id:"n2549",loc:[-85.633613,41.943787]},n255:{id:"n255",loc:[-85.636731,41.941461]},n2550:{id:"n2550",loc:[-85.633915,41.943613]},n2551:{id:"n2551",loc:[-85.634015,41.943555]},n2552:{id:"n2552",loc:[-85.63433,41.943839]},n2553:{id:"n2553",loc:[-85.634236,41.943894]},n2554:{id:"n2554",loc:[-85.635413,41.946052]},n2555:{id:"n2555",loc:[-85.635405,41.94569]},n2556:{id:"n2556",loc:[-85.635684,41.945925]},n2557:{id:"n2557",loc:[-85.635614,41.945742]},n2558:{id:"n2558",loc:[-85.635401,41.945745]},n2559:{id:"n2559",loc:[-85.635406,41.945928]},n256:{id:"n256",loc:[-85.636799,41.941461]},n2560:{id:"n2560",loc:[-85.633478,41.943663]},n2561:{id:"n2561",loc:[-85.633291,41.943526]},n2562:{id:"n2562",loc:[-85.633094,41.943541]},n2563:{id:"n2563",loc:[-85.633302,41.943492]},n2564:{id:"n2564",loc:[-85.633047,41.943623]},n2565:{id:"n2565",loc:[-85.633275,41.943562]},n2566:{id:"n2566",loc:[-85.633351,41.943518]},n2567:{id:"n2567",loc:[-85.633224,41.9434]},n2568:{id:"n2568",loc:[-85.633235,41.943369]},n2569:{id:"n2569",loc:[-85.635179,41.943911]},n257:{id:"n257",loc:[-85.6368,41.9415]},n2570:{id:"n2570",loc:[-85.635146,41.943918]},n2571:{id:"n2571",loc:[-85.634888,41.943905]},n2572:{id:"n2572",loc:[-85.634832,41.943911]},n2573:{id:"n2573",loc:[-85.634638,41.944007]},n2574:{id:"n2574",loc:[-85.634568,41.94405]},n2575:{id:"n2575",loc:[-85.635994,41.94501]},n2576:{id:"n2576",loc:[-85.636388,41.944608]},n2577:{id:"n2577",loc:[-85.636215,41.944787]},n2578:{id:"n2578",loc:[-85.637948,41.944587]},n2579:{id:"n2579",loc:[-85.637849,41.944567]},n258:{id:"n258",loc:[-85.636814,41.9415]},n2580:{id:"n2580",loc:[-85.637895,41.944455]},n2581:{id:"n2581",loc:[-85.637996,41.944477]},n2582:{id:"n2582",loc:[-85.635525,41.94337]},n2583:{id:"n2583",loc:[-85.637847,41.943923]},n2584:{id:"n2584",loc:[-85.637891,41.944124]},n2585:{id:"n2585",loc:[-85.638167,41.944229]},n2586:{id:"n2586",loc:[-85.638236,41.944097]},n2587:{id:"n2587",loc:[-85.638207,41.944025]},n2588:{id:"n2588",loc:[-85.638141,41.943997]},n2589:{id:"n2589",loc:[-85.638057,41.944015]},n259:{id:"n259",loc:[-85.636815,41.941538]},n2590:{id:"n2590",loc:[-85.637902,41.944231]},n2591:{id:"n2591",loc:[-85.638134,41.944307]},n2592:{id:"n2592",loc:[-85.638242,41.944294]},n2593:{id:"n2593",loc:[-85.638274,41.944222]},n2594:{id:"n2594",loc:[-85.638236,41.944174]},n2595:{id:"n2595",loc:[-85.638207,41.944157]},n2596:{id:"n2596",loc:[-85.637818,41.943984]},n2597:{id:"n2597",loc:[-85.634996,41.944439]},n2598:{id:"n2598",loc:[-85.633946,41.945804]},n2599:{id:"n2599",loc:[-85.634102,41.945864]},n26:{id:"n26",loc:[-85.634346,41.942744]},n260:{id:"n260",loc:[-85.636827,41.941538]},n2600:{id:"n2600",loc:[-85.633819,41.945756]},n2601:{id:"n2601",loc:[-85.634025,41.945975]},n2602:{id:"n2602",loc:[-85.633742,41.945867]},n2603:{id:"n2603",loc:[-85.63373,41.946004]},n2604:{id:"n2604",loc:[-85.633947,41.946081]},n2605:{id:"n2605",loc:[-85.633872,41.945917]},n2606:{id:"n2606",loc:[-85.633825,41.945985]},n2607:{id:"n2607",loc:[-85.633762,41.94596]},n2608:{id:"n2608",loc:[-85.634224,41.946037]},n2609:{id:"n2609",loc:[-85.634357,41.945851]},n261:{id:"n261",loc:[-85.636828,41.941584]},n2610:{id:"n2610",loc:[-85.634398,41.945813]},n2611:{id:"n2611",loc:[-85.634461,41.945812]},n2612:{id:"n2612",loc:[-85.634501,41.945852]},n2613:{id:"n2613",loc:[-85.634503,41.94597]},n2614:{id:"n2614",loc:[-85.634462,41.945971]},n2615:{id:"n2615",loc:[-85.634465,41.946036]},n2616:{id:"n2616",loc:[-85.634235,41.946072]},n2617:{id:"n2617",loc:[-85.634447,41.946036]},n2618:{id:"n2618",loc:[-85.634448,41.946052]},n2619:{id:"n2619",loc:[-85.634494,41.946051]},n262:{id:"n262",loc:[-85.636819,41.941585]},n2620:{id:"n2620",loc:[-85.634497,41.946144]},n2621:{id:"n2621",loc:[-85.634453,41.946144]},n2622:{id:"n2622",loc:[-85.634454,41.94616]},n2623:{id:"n2623",loc:[-85.634393,41.946161]},n2624:{id:"n2624",loc:[-85.634394,41.94618]},n2625:{id:"n2625",loc:[-85.634345,41.94618]},n2626:{id:"n2626",loc:[-85.634344,41.946162]},n2627:{id:"n2627",loc:[-85.63427,41.946163]},n2628:{id:"n2628",loc:[-85.634266,41.946071]},n2629:{id:"n2629",loc:[-85.634148,41.946163]},n263:{id:"n263",loc:[-85.636854,41.941714]},n2630:{id:"n2630",loc:[-85.634213,41.946072]},n2631:{id:"n2631",loc:[-85.633293,41.946309]},n2632:{id:"n2632",loc:[-85.633122,41.946239]},n2633:{id:"n2633",loc:[-85.633295,41.946005]},n2634:{id:"n2634",loc:[-85.633395,41.946047]},n2635:{id:"n2635",loc:[-85.633404,41.946035]},n2636:{id:"n2636",loc:[-85.633459,41.946057]},n2637:{id:"n2637",loc:[-85.633387,41.946154]},n2638:{id:"n2638",loc:[-85.633403,41.946161]},n2639:{id:"n2639",loc:[-85.634176,41.946415]},n264:{id:"n264",loc:[-85.636855,41.941774]},n2640:{id:"n2640",loc:[-85.634179,41.946339]},n2641:{id:"n2641",loc:[-85.634455,41.946345]},n2642:{id:"n2642",loc:[-85.634452,41.946422]},n2643:{id:"n2643",loc:[-85.63437,41.946421]},n2644:{id:"n2644",loc:[-85.634367,41.946497]},n2645:{id:"n2645",loc:[-85.634289,41.946495]},n2646:{id:"n2646",loc:[-85.634291,41.946448]},n2647:{id:"n2647",loc:[-85.634269,41.946448]},n2648:{id:"n2648",loc:[-85.63427,41.946417]},n2649:{id:"n2649",loc:[-85.63484,41.946328]},n265:{id:"n265",loc:[-85.636822,41.941774]},n2650:{id:"n2650",loc:[-85.634839,41.946187]},n2651:{id:"n2651",loc:[-85.635148,41.946186]},n2652:{id:"n2652",loc:[-85.635148,41.946216]},n2653:{id:"n2653",loc:[-85.63521,41.946216]},n2654:{id:"n2654",loc:[-85.63521,41.946348]},n2655:{id:"n2655",loc:[-85.635154,41.946348]},n2656:{id:"n2656",loc:[-85.635153,41.946327]},n2657:{id:"n2657",loc:[-85.634037,41.946957]},n2658:{id:"n2658",loc:[-85.634253,41.946953]},n2659:{id:"n2659",loc:[-85.63481,41.946543]},n266:{id:"n266",loc:[-85.636822,41.941778]},n2660:{id:"n2660",loc:[-85.634809,41.946459]},n2661:{id:"n2661",loc:[-85.635154,41.946458]},n2662:{id:"n2662",loc:[-85.635155,41.946554]},n2663:{id:"n2663",loc:[-85.635022,41.946547]},n2664:{id:"n2664",loc:[-85.635022,41.946573]},n2665:{id:"n2665",loc:[-85.634909,41.946574]},n2666:{id:"n2666",loc:[-85.634909,41.946561]},n2667:{id:"n2667",loc:[-85.634896,41.947159]},n2668:{id:"n2668",loc:[-85.634894,41.947032]},n2669:{id:"n2669",loc:[-85.635024,41.947031]},n267:{id:"n267",loc:[-85.636756,41.941779]},n2670:{id:"n2670",loc:[-85.635026,41.947158]},n2671:{id:"n2671",loc:[-85.635233,41.947105]},n2672:{id:"n2672",loc:[-85.635236,41.946991]},n2673:{id:"n2673",loc:[-85.635369,41.946993]},n2674:{id:"n2674",loc:[-85.635366,41.947107]},n2675:{id:"n2675",loc:[-85.634824,41.946929]},n2676:{id:"n2676",loc:[-85.634825,41.946818]},n2677:{id:"n2677",loc:[-85.63512,41.946819]},n2678:{id:"n2678",loc:[-85.635119,41.94693]},n2679:{id:"n2679",loc:[-85.634796,41.946806]},n268:{id:"n268",loc:[-85.636756,41.941774]},n2680:{id:"n2680",loc:[-85.634792,41.946604]},n2681:{id:"n2681",loc:[-85.634948,41.946602]},n2682:{id:"n2682",loc:[-85.634949,41.946645]},n2683:{id:"n2683",loc:[-85.634975,41.946644]},n2684:{id:"n2684",loc:[-85.634974,41.946599]},n2685:{id:"n2685",loc:[-85.635117,41.946598]},n2686:{id:"n2686",loc:[-85.635122,41.946801]},n2687:{id:"n2687",loc:[-85.634981,41.946803]},n2688:{id:"n2688",loc:[-85.634979,41.946752]},n2689:{id:"n2689",loc:[-85.634952,41.946752]},n269:{id:"n269",loc:[-85.636721,41.941774]},n2690:{id:"n2690",loc:[-85.634953,41.946804]},n2691:{id:"n2691",loc:[-85.634649,41.946841]},n2692:{id:"n2692",loc:[-85.634331,41.94684]},n2693:{id:"n2693",loc:[-85.634183,41.946809]},n2694:{id:"n2694",loc:[-85.633699,41.946607]},n2695:{id:"n2695",loc:[-85.634487,41.946664]},n2696:{id:"n2696",loc:[-85.634486,41.946598]},n2697:{id:"n2697",loc:[-85.63423,41.946599]},n2698:{id:"n2698",loc:[-85.634231,41.946662]},n2699:{id:"n2699",loc:[-85.634284,41.946662]},n27:{id:"n27",loc:[-85.634136,41.943183]},n270:{id:"n270",loc:[-85.63672,41.941714]},n2700:{id:"n2700",loc:[-85.634284,41.946679]},n2701:{id:"n2701",loc:[-85.634365,41.946679]},n2702:{id:"n2702",loc:[-85.634365,41.946664]},n2703:{id:"n2703",loc:[-85.635443,41.947015]},n2704:{id:"n2704",loc:[-85.635442,41.946801]},n2705:{id:"n2705",loc:[-85.63603,41.9468]},n2706:{id:"n2706",loc:[-85.636028,41.947016]},n2707:{id:"n2707",loc:[-85.635457,41.946582]},n2708:{id:"n2708",loc:[-85.635455,41.946211]},n2709:{id:"n2709",loc:[-85.635636,41.946579]},n271:{id:"n271",loc:[-85.636767,41.941713]},n2710:{id:"n2710",loc:[-85.635716,41.9468]},n2711:{id:"n2711",loc:[-85.635969,41.9468]},n2712:{id:"n2712",loc:[-85.635973,41.946295]},n2713:{id:"n2713",loc:[-85.636019,41.946484]},n2714:{id:"n2714",loc:[-85.636022,41.946388]},n2715:{id:"n2715",loc:[-85.635961,41.946493]},n2716:{id:"n2716",loc:[-85.635713,41.94621]},n2717:{id:"n2717",loc:[-85.635416,41.946142]},n2718:{id:"n2718",loc:[-85.635759,41.946203]},n2719:{id:"n2719",loc:[-85.636153,41.946747]},n272:{id:"n272",loc:[-85.636767,41.941706]},n2720:{id:"n2720",loc:[-85.635417,41.946915]},n2721:{id:"n2721",loc:[-85.636154,41.946915]},n2722:{id:"n2722",loc:[-85.635866,41.946473]},n2723:{id:"n2723",loc:[-85.635717,41.946633]},n2724:{id:"n2724",loc:[-85.635556,41.946166]},n2725:{id:"n2725",loc:[-85.63556,41.946556]},n2726:{id:"n2726",loc:[-85.635731,41.946594]},n2727:{id:"n2727",loc:[-85.635866,41.946595]},n2728:{id:"n2728",loc:[-85.635456,41.947028]},n2729:{id:"n2729",loc:[-85.635796,41.947023]},n273:{id:"n273",loc:[-85.636779,41.941698]},n2730:{id:"n2730",loc:[-85.635798,41.947091]},n2731:{id:"n2731",loc:[-85.63573,41.947092]},n2732:{id:"n2732",loc:[-85.635733,41.947233]},n2733:{id:"n2733",loc:[-85.636283,41.946863]},n2734:{id:"n2734",loc:[-85.63628,41.946706]},n2735:{id:"n2735",loc:[-85.636341,41.946705]},n2736:{id:"n2736",loc:[-85.636273,41.946584]},n2737:{id:"n2737",loc:[-85.636396,41.946545]},n2738:{id:"n2738",loc:[-85.636474,41.946684]},n2739:{id:"n2739",loc:[-85.636511,41.946861]},n274:{id:"n274",loc:[-85.636798,41.941697]},n2740:{id:"n2740",loc:[-85.633713,41.947184]},n2741:{id:"n2741",loc:[-85.633651,41.94716]},n2742:{id:"n2742",loc:[-85.633704,41.947085]},n2743:{id:"n2743",loc:[-85.6336,41.947044]},n2744:{id:"n2744",loc:[-85.633506,41.947177]},n2745:{id:"n2745",loc:[-85.629586,41.952469]},n2746:{id:"n2746",loc:[-85.634723,41.953681]},n2747:{id:"n2747",loc:[-85.63478,41.959007]},n2748:{id:"n2748",loc:[-85.632793,41.94405],tags:{highway:"traffic_signals",traffic_signals:"signal","traffic_signals:direction":"both"}},n2749:{id:"n2749",loc:[-85.634648,41.947325]},n275:{id:"n275",loc:[-85.63681,41.941705]},n2750:{id:"n2750",loc:[-85.625078,41.952097]},n2751:{id:"n2751",loc:[-85.633195,41.94734]},n2752:{id:"n2752",loc:[-85.626447,41.957168]},n2753:{id:"n2753",loc:[-85.632023,41.949012]},n2754:{id:"n2754",loc:[-85.630835,41.950656]},n2755:{id:"n2755",loc:[-85.634655,41.948612]},n2756:{id:"n2756",loc:[-85.636182,41.948605]},n2757:{id:"n2757",loc:[-85.634729,41.954667]},n2758:{id:"n2758",loc:[-85.634686,41.951159]},n2759:{id:"n2759",loc:[-85.636206,41.951146]},n276:{id:"n276",loc:[-85.63681,41.941714]},n2760:{id:"n2760",loc:[-85.634668,41.949891]},n2761:{id:"n2761",loc:[-85.634701,41.952422]},n2762:{id:"n2762",loc:[-85.634747,41.955907]},n2763:{id:"n2763",loc:[-85.627975,41.954695]},n2764:{id:"n2764",loc:[-85.626832,41.954698]},n2765:{id:"n2765",loc:[-85.632278,41.948624]},n2766:{id:"n2766",loc:[-85.628639,41.953725]},n2767:{id:"n2767",loc:[-85.636233,41.95241]},n2768:{id:"n2768",loc:[-85.631385,41.949913]},n2769:{id:"n2769",loc:[-85.630486,41.951194]},n277:{id:"n277",loc:[-85.636861,41.942041]},n2770:{id:"n2770",loc:[-85.624937,41.952088]},n2771:{id:"n2771",loc:[-85.624945,41.952022]},n2772:{id:"n2772",loc:[-85.636162,41.94731]},n2773:{id:"n2773",loc:[-85.636188,41.949881]},n2774:{id:"n2774",loc:[-85.631422,41.948294]},n2775:{id:"n2775",loc:[-85.632844,41.945547]},n2776:{id:"n2776",loc:[-85.632484,41.945344]},n2777:{id:"n2777",loc:[-85.631775,41.944636]},n2778:{id:"n2778",loc:[-85.632656,41.945471]},n2779:{id:"n2779",loc:[-85.631959,41.944827]},n278:{id:"n278",loc:[-85.636862,41.942099]},n2780:{id:"n2780",loc:[-85.631679,41.94438]},n2781:{id:"n2781",loc:[-85.625129,41.959272]},n2782:{id:"n2782",loc:[-85.632446,41.944861]},n2783:{id:"n2783",loc:[-85.632804,41.945477]},n2784:{id:"n2784",loc:[-85.632255,41.944962]},n2785:{id:"n2785",loc:[-85.632736,41.944757]},n2786:{id:"n2786",loc:[-85.632543,41.94486]},n2787:{id:"n2787",loc:[-85.632889,41.945561]},n2788:{id:"n2788",loc:[-85.632091,41.944949]},n2789:{id:"n2789",loc:[-85.632537,41.944713]},n279:{id:"n279",loc:[-85.636807,41.942099]},n2790:{id:"n2790",loc:[-85.632279,41.94485]},n2791:{id:"n2791",loc:[-85.632749,41.943247]},n2792:{id:"n2792",loc:[-85.632824,41.943152]},n2793:{id:"n2793",loc:[-85.632929,41.94317]},n2794:{id:"n2794",loc:[-85.632897,41.943078]},n2795:{id:"n2795",loc:[-85.632626,41.943231]},n2796:{id:"n2796",loc:[-85.634048,41.947257]},n2797:{id:"n2797",loc:[-85.634264,41.947252]},n2798:{id:"n2798",loc:[-85.635418,41.947317]},n2799:{id:"n2799",loc:[-85.635461,41.947237]},n28:{id:"n28",loc:[-85.63821,41.944308]},n280:{id:"n280",loc:[-85.636807,41.942126]},n2800:{id:"n2800",loc:[-85.632868,41.946229]},n2801:{id:"n2801",loc:[-85.633673,41.947242]},n2802:{id:"n2802",loc:[-85.623604,41.945881],tags:{amenity:"school",name:"Barrows School"}},n2803:{id:"n2803",loc:[-85.627401,41.943496]},n2804:{id:"n2804",loc:[-85.627403,41.943625]},n2805:{id:"n2805",loc:[-85.626409,41.943215]},n2806:{id:"n2806",loc:[-85.624884,41.943508]},n2807:{id:"n2807",loc:[-85.625191,41.943509]},n2808:{id:"n2808",loc:[-85.624882,41.94382]},n2809:{id:"n2809",loc:[-85.624893,41.945618]},n281:{id:"n281",loc:[-85.636726,41.942126]},n2810:{id:"n2810",loc:[-85.624912,41.946524]},n2811:{id:"n2811",loc:[-85.622721,41.946535]},n2812:{id:"n2812",loc:[-85.627399,41.94469]},n2813:{id:"n2813",loc:[-85.622716,41.945622]},n2814:{id:"n2814",loc:[-85.624886,41.944724]},n2815:{id:"n2815",loc:[-85.622674,41.944737]},n2816:{id:"n2816",loc:[-85.625092,41.945063]},n2817:{id:"n2817",loc:[-85.625233,41.945064]},n2818:{id:"n2818",loc:[-85.625229,41.944871]},n2819:{id:"n2819",loc:[-85.625066,41.944871]},n282:{id:"n282",loc:[-85.636726,41.942098]},n2820:{id:"n2820",loc:[-85.625024,41.944901]},n2821:{id:"n2821",loc:[-85.625025,41.944924]},n2822:{id:"n2822",loc:[-85.625087,41.944926]},n2823:{id:"n2823",loc:[-85.625349,41.944506]},n2824:{id:"n2824",loc:[-85.625347,41.944388]},n2825:{id:"n2825",loc:[-85.625152,41.94439]},n2826:{id:"n2826",loc:[-85.625152,41.944431]},n2827:{id:"n2827",loc:[-85.625134,41.944431]},n2828:{id:"n2828",loc:[-85.625136,41.944508]},n2829:{id:"n2829",loc:[-85.623236,41.946341]},n283:{id:"n283",loc:[-85.636708,41.942098]},n2830:{id:"n2830",loc:[-85.623241,41.946067]},n2831:{id:"n2831",loc:[-85.623207,41.946067]},n2832:{id:"n2832",loc:[-85.623212,41.945827]},n2833:{id:"n2833",loc:[-85.622981,41.945825]},n2834:{id:"n2834",loc:[-85.622976,41.946063]},n2835:{id:"n2835",loc:[-85.623006,41.946063]},n2836:{id:"n2836",loc:[-85.623002,41.946256]},n2837:{id:"n2837",loc:[-85.623075,41.946256]},n2838:{id:"n2838",loc:[-85.623074,41.946339]},n2839:{id:"n2839",loc:[-85.624574,41.951755]},n284:{id:"n284",loc:[-85.636708,41.942041]},n2840:{id:"n2840",loc:[-85.62498,41.951844]},n2841:{id:"n2841",loc:[-85.625086,41.95188]},n2842:{id:"n2842",loc:[-85.625135,41.951922]},n2843:{id:"n2843",loc:[-85.615273,41.945637]},n2844:{id:"n2844",loc:[-85.620172,41.945627]},n2845:{id:"n2845",loc:[-85.625167,41.951985]},n2846:{id:"n2846",loc:[-85.622741,41.947437]},n2847:{id:"n2847",loc:[-85.624907,41.947428]},n2848:{id:"n2848",loc:[-85.627046,41.940995]},n2849:{id:"n2849",loc:[-85.627295,41.941304]},n285:{id:"n285",loc:[-85.635618,41.941852]},n2850:{id:"n2850",loc:[-85.627352,41.94148]},n2851:{id:"n2851",loc:[-85.62737,41.942261]},n2852:{id:"n2852",loc:[-85.6264,41.942263]},n2853:{id:"n2853",loc:[-85.622769,41.949228]},n2854:{id:"n2854",loc:[-85.624937,41.949218]},n2855:{id:"n2855",loc:[-85.630001,41.944664]},n2856:{id:"n2856",loc:[-85.624873,41.942022]},n2857:{id:"n2857",loc:[-85.622761,41.948333]},n2858:{id:"n2858",loc:[-85.624924,41.948334]},n2859:{id:"n2859",loc:[-85.620051,41.94383]},n286:{id:"n286",loc:[-85.635621,41.94202]},n2860:{id:"n2860",loc:[-85.627629,41.946498]},n2861:{id:"n2861",loc:[-85.622757,41.950111]},n2862:{id:"n2862",loc:[-85.623685,41.954624]},n2863:{id:"n2863",loc:[-85.621459,41.944756]},n2864:{id:"n2864",loc:[-85.628637,41.944676]},n2865:{id:"n2865",loc:[-85.630125,41.944654]},n2866:{id:"n2866",loc:[-85.625196,41.952097]},n2867:{id:"n2867",loc:[-85.630257,41.944637]},n2868:{id:"n2868",loc:[-85.631247,41.944459]},n2869:{id:"n2869",loc:[-85.624867,41.94159]},n287:{id:"n287",loc:[-85.63524,41.942023]},n2870:{id:"n2870",loc:[-85.624958,41.950343]},n2871:{id:"n2871",loc:[-85.624948,41.950484]},n2872:{id:"n2872",loc:[-85.624813,41.950983]},n2873:{id:"n2873",loc:[-85.624723,41.951789]},n2874:{id:"n2874",loc:[-85.624262,41.9512]},n2875:{id:"n2875",loc:[-85.62414,41.951201]},n2876:{id:"n2876",loc:[-85.624139,41.95112]},n2877:{id:"n2877",loc:[-85.628481,41.945611]},n2878:{id:"n2878",loc:[-85.620072,41.946538]},n2879:{id:"n2879",loc:[-85.622763,41.95099]},n288:{id:"n288",loc:[-85.635237,41.941855]},n2880:{id:"n2880",loc:[-85.62814,41.946963]},n2881:{id:"n2881",loc:[-85.628245,41.947031]},n2882:{id:"n2882",loc:[-85.628331,41.947066]},n2883:{id:"n2883",loc:[-85.629722,41.944444],tags:{leisure:"park",name:"Scouter Park"}},n2884:{id:"n2884",loc:[-85.629977,41.943907]},n2885:{id:"n2885",loc:[-85.629947,41.943775]},n2886:{id:"n2886",loc:[-85.629899,41.943625]},n2887:{id:"n2887",loc:[-85.632286,41.944257]},n2888:{id:"n2888",loc:[-85.632523,41.944179]},n2889:{id:"n2889",loc:[-85.632141,41.944293]},n289:{id:"n289",loc:[-85.635568,41.940475]},n2890:{id:"n2890",loc:[-85.631571,41.9444]},n2891:{id:"n2891",loc:[-85.643236,41.941895]},n2892:{id:"n2892",loc:[-85.62865,41.945353]},n2893:{id:"n2893",loc:[-85.628594,41.945481]},n2894:{id:"n2894",loc:[-85.628581,41.947169]},n2895:{id:"n2895",loc:[-85.631843,41.943793]},n2896:{id:"n2896",loc:[-85.632299,41.943472]},n2897:{id:"n2897",loc:[-85.631519,41.944881]},n2898:{id:"n2898",loc:[-85.628429,41.947219]},n2899:{id:"n2899",loc:[-85.63145,41.945162]},n29:{id:"n29",loc:[-85.637963,41.944263]},n290:{id:"n290",loc:[-85.634584,41.940477]},n2900:{id:"n2900",loc:[-85.630939,41.945519]},n2901:{id:"n2901",loc:[-85.62903,41.945719]},n2902:{id:"n2902",loc:[-85.630521,41.945559]},n2903:{id:"n2903",loc:[-85.629294,41.945585]},n2904:{id:"n2904",loc:[-85.629845,41.945543]},n2905:{id:"n2905",loc:[-85.631497,41.944625]},n2906:{id:"n2906",loc:[-85.630281,41.945553]},n2907:{id:"n2907",loc:[-85.628553,41.946973]},n2908:{id:"n2908",loc:[-85.631383,41.945338]},n2909:{id:"n2909",loc:[-85.628843,41.946103]},n291:{id:"n291",loc:[-85.634583,41.940203]},n2910:{id:"n2910",loc:[-85.631193,41.945473]},n2911:{id:"n2911",loc:[-85.628897,41.945944]},n2912:{id:"n2912",loc:[-85.628789,41.946454]},n2913:{id:"n2913",loc:[-85.632548,41.944563]},n2914:{id:"n2914",loc:[-85.627527,41.944555]},n2915:{id:"n2915",loc:[-85.62752,41.943726]},n2916:{id:"n2916",loc:[-85.627894,41.943723]},n2917:{id:"n2917",loc:[-85.627897,41.943919]},n2918:{id:"n2918",loc:[-85.627991,41.943934]},n2919:{id:"n2919",loc:[-85.628082,41.943966]},n292:{id:"n292",loc:[-85.635567,41.940201]},n2920:{id:"n2920",loc:[-85.628177,41.944015]},n2921:{id:"n2921",loc:[-85.628193,41.944048]},n2922:{id:"n2922",loc:[-85.628167,41.944054]},n2923:{id:"n2923",loc:[-85.628193,41.944094]},n2924:{id:"n2924",loc:[-85.628213,41.944144]},n2925:{id:"n2925",loc:[-85.628214,41.944199]},n2926:{id:"n2926",loc:[-85.62833,41.944196]},n2927:{id:"n2927",loc:[-85.628328,41.944262]},n2928:{id:"n2928",loc:[-85.628173,41.944262]},n2929:{id:"n2929",loc:[-85.628171,41.944293]},n293:{id:"n293",loc:[-85.635816,41.942673],tags:{crossing:"zebra",highway:"crossing"}},n2930:{id:"n2930",loc:[-85.628039,41.944296]},n2931:{id:"n2931",loc:[-85.62804,41.944329]},n2932:{id:"n2932",loc:[-85.627829,41.944335]},n2933:{id:"n2933",loc:[-85.627835,41.94455]},n2936:{id:"n2936",loc:[-85.632823,41.945994]},n294:{id:"n294",loc:[-85.635696,41.942712]},n2940:{id:"n2940",loc:[-85.632192,41.945973]},n2941:{id:"n2941",loc:[-85.63226,41.94587]},n2942:{id:"n2942",loc:[-85.632721,41.946036]},n2943:{id:"n2943",loc:[-85.632641,41.946142]},n2944:{id:"n2944",loc:[-85.62937,41.947467]},n2945:{id:"n2945",loc:[-85.62959,41.942936]},n2946:{id:"n2946",loc:[-85.629551,41.94284]},n2947:{id:"n2947",loc:[-85.629501,41.942704]},n2948:{id:"n2948",loc:[-85.629472,41.942578]},n2949:{id:"n2949",loc:[-85.629361,41.941801]},n295:{id:"n295",loc:[-85.635679,41.941962]},n2950:{id:"n2950",loc:[-85.629339,41.941716]},n2951:{id:"n2951",loc:[-85.629315,41.94166]},n2952:{id:"n2952",loc:[-85.629279,41.941602]},n2953:{id:"n2953",loc:[-85.629227,41.941556]},n2954:{id:"n2954",loc:[-85.624261,41.95112]},n2955:{id:"n2955",loc:[-85.629153,41.941524]},n2956:{id:"n2956",loc:[-85.626904,41.941098]},n2957:{id:"n2957",loc:[-85.624588,41.951294]},n2958:{id:"n2958",loc:[-85.631844,41.942945]},n2959:{id:"n2959",loc:[-85.625854,41.949222]},n296:{id:"n296",loc:[-85.635672,41.941337]},n2960:{id:"n2960",loc:[-85.625146,41.955238]},n2961:{id:"n2961",loc:[-85.626745,41.948296]},n2962:{id:"n2962",loc:[-85.625721,41.95524]},n2963:{id:"n2963",loc:[-85.624706,41.952317]},n2964:{id:"n2964",loc:[-85.62609,41.956147]},n2965:{id:"n2965",loc:[-85.624401,41.954928]},n2966:{id:"n2966",loc:[-85.626558,41.955367]},n2967:{id:"n2967",loc:[-85.62468,41.955096]},n2968:{id:"n2968",loc:[-85.624159,41.953929]},n2969:{id:"n2969",loc:[-85.62506,41.951113]},n297:{id:"n297",loc:[-85.635658,41.941284]},n2970:{id:"n2970",loc:[-85.624942,41.951591]},n2971:{id:"n2971",loc:[-85.627399,41.947546]},n2972:{id:"n2972",loc:[-85.627695,41.947404]},n2973:{id:"n2973",loc:[-85.625925,41.94896]},n2974:{id:"n2974",loc:[-85.625725,41.950211]},n2975:{id:"n2975",loc:[-85.627008,41.947963]},n2976:{id:"n2976",loc:[-85.624373,41.953458]},n2977:{id:"n2977",loc:[-85.624137,41.954392]},n2978:{id:"n2978",loc:[-85.628257,41.947307]},n2979:{id:"n2979",loc:[-85.625281,41.95066]},n298:{id:"n298",loc:[-85.635602,41.941166]},n2980:{id:"n2980",loc:[-85.625865,41.949804]},n2981:{id:"n2981",loc:[-85.626508,41.955932]},n2982:{id:"n2982",loc:[-85.626333,41.955216]},n2983:{id:"n2983",loc:[-85.626637,41.955676]},n2984:{id:"n2984",loc:[-85.624223,41.954599]},n2985:{id:"n2985",loc:[-85.626219,41.948671]},n2986:{id:"n2986",loc:[-85.624556,41.953043]},n2987:{id:"n2987",loc:[-85.625598,41.956302]},n2988:{id:"n2988",loc:[-85.624571,41.952971]},n2989:{id:"n2989",loc:[-85.627141,41.940727]},n299:{id:"n299",loc:[-85.635598,41.941138]},n2990:{id:"n2990",loc:[-85.627102,41.939144]},n2991:{id:"n2991",loc:[-85.627127,41.940086]},n2992:{id:"n2992",loc:[-85.627116,41.940843]},n2993:{id:"n2993",loc:[-85.627132,41.9402]},n2994:{id:"n2994",loc:[-85.629734,41.940078]},n2995:{id:"n2995",loc:[-85.6276,41.937412]},n2996:{id:"n2996",loc:[-85.627451,41.937549]},n2997:{id:"n2997",loc:[-85.627375,41.937618]},n2998:{id:"n2998",loc:[-85.627278,41.937728]},n2999:{id:"n2999",loc:[-85.627199,41.937842]},n3:{id:"n3",loc:[-85.627345,41.953983]},n30:{id:"n30",loc:[-85.637882,41.944205]},n300:{id:"n300",loc:[-85.635614,41.941076]},n3000:{id:"n3000",loc:[-85.627141,41.937981]},n3001:{id:"n3001",loc:[-85.627109,41.938153]},n3002:{id:"n3002",loc:[-85.627101,41.938699]},n3003:{id:"n3003",loc:[-85.628311,41.942261]},n3004:{id:"n3004",loc:[-85.628439,41.940082]},n3005:{id:"n3005",loc:[-85.619538,41.942622],tags:{leisure:"slipway"}},n3006:{id:"n3006",loc:[-85.619872,41.942618]},n3007:{id:"n3007",loc:[-85.619755,41.942612]},n3008:{id:"n3008",loc:[-85.619647,41.942628]},n3009:{id:"n3009",loc:[-85.619415,41.942626]},n301:{id:"n301",loc:[-85.635659,41.940956]},n3010:{id:"n3010",loc:[-85.619212,41.942623]},n3011:{id:"n3011",loc:[-85.631485,41.942472]},n3012:{id:"n3012",loc:[-85.630986,41.941786]},n3013:{id:"n3013",loc:[-85.631797,41.942006]},n3014:{id:"n3014",loc:[-85.630972,41.941162]},n3015:{id:"n3015",loc:[-85.631396,41.941611],tags:{railway:"level_crossing"}},n3016:{id:"n3016",loc:[-85.631878,41.941545]},n3017:{id:"n3017",loc:[-85.630461,41.94055]},n3018:{id:"n3018",loc:[-85.629751,41.939539],tags:{railway:"level_crossing"}},n3019:{id:"n3019",loc:[-85.631663,41.941513]},n302:{id:"n302",loc:[-85.635666,41.940922]},n3020:{id:"n3020",loc:[-85.631328,41.941375]},n3021:{id:"n3021",loc:[-85.632554,41.941779]},n3022:{id:"n3022",loc:[-85.63245,41.941769]},n3023:{id:"n3023",loc:[-85.632475,41.941644]},n3024:{id:"n3024",loc:[-85.632581,41.941654]},n3025:{id:"n3025",loc:[-85.631957,41.941352]},n3026:{id:"n3026",loc:[-85.632293,41.941139]},n3027:{id:"n3027",loc:[-85.632315,41.941153]},n3028:{id:"n3028",loc:[-85.632302,41.941262]},n3029:{id:"n3029",loc:[-85.63237,41.941267]},n303:{id:"n303",loc:[-85.635667,41.940877]},n3030:{id:"n3030",loc:[-85.632356,41.941538]},n3031:{id:"n3031",loc:[-85.632134,41.941678]},n3032:{id:"n3032",loc:[-85.631942,41.941687]},n3033:{id:"n3033",loc:[-85.63203,41.941694]},n3034:{id:"n3034",loc:[-85.632166,41.941555]},n3035:{id:"n3035",loc:[-85.632412,41.941416]},n3036:{id:"n3036",loc:[-85.63248,41.941342]},n3037:{id:"n3037",loc:[-85.632502,41.941259]},n3038:{id:"n3038",loc:[-85.632453,41.941161]},n3039:{id:"n3039",loc:[-85.63235,41.941103]},n304:{id:"n304",loc:[-85.635668,41.940655]},n3040:{id:"n3040",loc:[-85.632236,41.941118]},n3041:{id:"n3041",loc:[-85.631894,41.941355]},n3042:{id:"n3042",loc:[-85.631859,41.941411]},n3043:{id:"n3043",loc:[-85.632011,41.941587]},n3044:{id:"n3044",loc:[-85.632446,41.941379]},n3045:{id:"n3045",loc:[-85.632511,41.941416]},n3046:{id:"n3046",loc:[-85.632545,41.941634]},n3047:{id:"n3047",loc:[-85.632612,41.94164]},n3048:{id:"n3048",loc:[-85.632595,41.942197]},n3049:{id:"n3049",loc:[-85.632565,41.942241]},n305:{id:"n305",loc:[-85.635628,41.940617]},n3050:{id:"n3050",loc:[-85.632515,41.942256]},n3051:{id:"n3051",loc:[-85.63245,41.94223]},n3052:{id:"n3052",loc:[-85.632401,41.942174]},n3053:{id:"n3053",loc:[-85.632391,41.942115]},n3054:{id:"n3054",loc:[-85.632029,41.941859]},n3055:{id:"n3055",loc:[-85.631828,41.941639]},n3056:{id:"n3056",loc:[-85.631829,41.941508]},n3057:{id:"n3057",loc:[-85.631281,41.94312]},n3058:{id:"n3058",loc:[-85.631421,41.943065]},n3059:{id:"n3059",loc:[-85.631339,41.942949]},n306:{id:"n306",loc:[-85.635623,41.940272]},n3060:{id:"n3060",loc:[-85.631199,41.943004]},n3061:{id:"n3061",loc:[-85.631102,41.942931]},n3062:{id:"n3062",loc:[-85.631009,41.942809]},n3063:{id:"n3063",loc:[-85.631383,41.94265]},n3064:{id:"n3064",loc:[-85.631477,41.942773]},n3065:{id:"n3065",loc:[-85.630638,41.942809]},n3066:{id:"n3066",loc:[-85.630738,41.942943]},n3067:{id:"n3067",loc:[-85.630841,41.9429]},n3068:{id:"n3068",loc:[-85.630741,41.942766]},n3069:{id:"n3069",loc:[-85.63054,41.942603]},n307:{id:"n307",loc:[-85.635651,41.940183]},n3070:{id:"n3070",loc:[-85.630498,41.942619]},n3071:{id:"n3071",loc:[-85.630567,41.942718]},n3072:{id:"n3072",loc:[-85.630616,41.942698]},n3073:{id:"n3073",loc:[-85.630642,41.94273]},n3074:{id:"n3074",loc:[-85.630686,41.942714]},n3075:{id:"n3075",loc:[-85.630715,41.942754]},n3076:{id:"n3076",loc:[-85.6309,41.942681]},n3077:{id:"n3077",loc:[-85.630843,41.942605]},n3078:{id:"n3078",loc:[-85.6309,41.942581]},n3079:{id:"n3079",loc:[-85.630832,41.942487]},n308:{id:"n308",loc:[-85.63577,41.940183],tags:{crossing:"zebra",highway:"crossing"}},n3080:{id:"n3080",loc:[-85.630773,41.942509]},n3081:{id:"n3081",loc:[-85.630718,41.942436]},n3082:{id:"n3082",loc:[-85.630485,41.942524]},n3083:{id:"n3083",loc:[-85.631468,41.941233]},n3084:{id:"n3084",loc:[-85.631334,41.94114]},n3085:{id:"n3085",loc:[-85.632052,41.940568]},n3086:{id:"n3086",loc:[-85.63219,41.940663]},n3087:{id:"n3087",loc:[-85.631323,41.940834]},n3088:{id:"n3088",loc:[-85.631122,41.941002]},n3089:{id:"n3089",loc:[-85.631321,41.941133]},n309:{id:"n309",loc:[-85.636939,41.942544]},n3090:{id:"n3090",loc:[-85.631521,41.940966]},n3091:{id:"n3091",loc:[-85.631103,41.940253]},n3092:{id:"n3092",loc:[-85.631226,41.940211]},n3093:{id:"n3093",loc:[-85.631597,41.940805]},n3094:{id:"n3094",loc:[-85.631474,41.940847]},n3095:{id:"n3095",loc:[-85.631811,41.940534]},n3096:{id:"n3096",loc:[-85.631588,41.94061]},n3097:{id:"n3097",loc:[-85.631438,41.940366]},n3098:{id:"n3098",loc:[-85.631661,41.94029]},n3099:{id:"n3099",loc:[-85.630621,41.940041]},n31:{id:"n31",loc:[-85.63827,41.944203]},n310:{id:"n310",loc:[-85.636323,41.942552]},n3100:{id:"n3100",loc:[-85.630436,41.939773]},n3101:{id:"n3101",loc:[-85.63059,41.939714]},n3102:{id:"n3102",loc:[-85.630775,41.939983]},n3103:{id:"n3103",loc:[-85.63047,41.940167]},n3104:{id:"n3104",loc:[-85.63013,41.939686]},n3105:{id:"n3105",loc:[-85.630302,41.939618]},n3106:{id:"n3106",loc:[-85.630641,41.9401]},n3107:{id:"n3107",loc:[-85.630966,41.940619]},n3108:{id:"n3108",loc:[-85.630874,41.940493]},n3109:{id:"n3109",loc:[-85.630933,41.940469]},n311:{id:"n311",loc:[-85.636257,41.942555]},n3110:{id:"n3110",loc:[-85.630763,41.940236]},n3111:{id:"n3111",loc:[-85.63088,41.940189]},n3112:{id:"n3112",loc:[-85.631142,41.940548]},n3113:{id:"n3113",loc:[-85.630958,41.940871]},n3114:{id:"n3114",loc:[-85.630874,41.940778]},n3115:{id:"n3115",loc:[-85.631062,41.940684]},n3116:{id:"n3116",loc:[-85.631146,41.940777]},n3117:{id:"n3117",loc:[-85.632031,41.940575]},n3118:{id:"n3118",loc:[-85.631777,41.940186]},n3119:{id:"n3119",loc:[-85.631346,41.940179]},n312:{id:"n312",loc:[-85.636208,41.942561]},n3120:{id:"n3120",loc:[-85.631342,41.94012]},n3121:{id:"n3121",loc:[-85.631831,41.940118]},n3122:{id:"n3122",loc:[-85.632115,41.940543]},n3123:{id:"n3123",loc:[-85.631031,41.941683]},n3124:{id:"n3124",loc:[-85.630981,41.941608]},n3125:{id:"n3125",loc:[-85.631209,41.941516]},n3126:{id:"n3126",loc:[-85.631264,41.941586]},n3127:{id:"n3127",loc:[-85.630938,41.94155]},n3128:{id:"n3128",loc:[-85.631156,41.941462]},n3129:{id:"n3129",loc:[-85.631197,41.94152]},n313:{id:"n313",loc:[-85.636159,41.942573]},n3130:{id:"n3130",loc:[-85.630895,41.941485]},n3131:{id:"n3131",loc:[-85.630824,41.941389]},n3132:{id:"n3132",loc:[-85.630986,41.941323]},n3133:{id:"n3133",loc:[-85.631057,41.941419]},n3134:{id:"n3134",loc:[-85.630777,41.941328]},n3135:{id:"n3135",loc:[-85.630907,41.941274]},n3136:{id:"n3136",loc:[-85.630953,41.941335]},n3137:{id:"n3137",loc:[-85.630797,41.941247]},n3138:{id:"n3138",loc:[-85.630701,41.94117]},n3139:{id:"n3139",loc:[-85.630829,41.941113]},n314:{id:"n314",loc:[-85.635743,41.942881]},n3140:{id:"n3140",loc:[-85.6309,41.941201]},n3141:{id:"n3141",loc:[-85.630765,41.941206]},n3142:{id:"n3142",loc:[-85.630739,41.941218]},n3143:{id:"n3143",loc:[-85.630582,41.941039]},n3144:{id:"n3144",loc:[-85.630412,41.940818]},n3145:{id:"n3145",loc:[-85.630509,41.940777]},n3146:{id:"n3146",loc:[-85.630678,41.941004]},n3147:{id:"n3147",loc:[-85.630773,41.942166]},n3148:{id:"n3148",loc:[-85.630708,41.942074]},n3149:{id:"n3149",loc:[-85.630863,41.942013]},n315:{id:"n315",loc:[-85.635452,41.942966]},n3150:{id:"n3150",loc:[-85.630928,41.942105]},n3151:{id:"n3151",loc:[-85.630701,41.942026]},n3152:{id:"n3152",loc:[-85.630665,41.941971]},n3153:{id:"n3153",loc:[-85.630793,41.941918]},n3154:{id:"n3154",loc:[-85.630837,41.94197]},n3155:{id:"n3155",loc:[-85.630757,41.941871]},n3156:{id:"n3156",loc:[-85.630629,41.941923]},n3157:{id:"n3157",loc:[-85.630694,41.941783]},n3158:{id:"n3158",loc:[-85.630534,41.941847]},n3159:{id:"n3159",loc:[-85.630598,41.941935]},n316:{id:"n316",loc:[-85.634911,41.943118]},n3160:{id:"n3160",loc:[-85.631548,41.93938]},n3161:{id:"n3161",loc:[-85.631525,41.939919]},n3162:{id:"n3162",loc:[-85.631648,41.940043]},n3163:{id:"n3163",loc:[-85.624586,41.951121]},n3164:{id:"n3164",loc:[-85.622139,41.952064]},n3165:{id:"n3165",loc:[-85.622141,41.952144]},n3166:{id:"n3166",loc:[-85.621977,41.952146]},n3167:{id:"n3167",loc:[-85.621978,41.952211]},n3168:{id:"n3168",loc:[-85.62191,41.952212]},n3169:{id:"n3169",loc:[-85.633628,41.935437]},n317:{id:"n317",loc:[-85.634743,41.943167]},n3170:{id:"n3170",loc:[-85.632849,41.935518]},n3171:{id:"n3171",loc:[-85.632376,41.93574]},n3172:{id:"n3172",loc:[-85.631517,41.935897]},n3173:{id:"n3173",loc:[-85.630433,41.936124]},n3174:{id:"n3174",loc:[-85.630207,41.936427]},n3175:{id:"n3175",loc:[-85.630346,41.936795]},n3176:{id:"n3176",loc:[-85.62996,41.936974]},n3177:{id:"n3177",loc:[-85.629916,41.937488]},n3178:{id:"n3178",loc:[-85.629946,41.937802]},n3179:{id:"n3179",loc:[-85.629977,41.937905]},n318:{id:"n318",loc:[-85.634401,41.94328]},n3180:{id:"n3180",loc:[-85.63016,41.937909]},n3181:{id:"n3181",loc:[-85.630804,41.937791]},n3182:{id:"n3182",loc:[-85.631688,41.937808]},n3183:{id:"n3183",loc:[-85.631685,41.938008]},n3184:{id:"n3184",loc:[-85.631845,41.938116]},n3185:{id:"n3185",loc:[-85.63207,41.938181]},n3186:{id:"n3186",loc:[-85.632143,41.938371]},n3187:{id:"n3187",loc:[-85.632056,41.938435]},n3188:{id:"n3188",loc:[-85.631787,41.938457]},n3189:{id:"n3189",loc:[-85.631657,41.938728]},n319:{id:"n319",loc:[-85.634345,41.943299]},n3190:{id:"n3190",loc:[-85.631595,41.93775]},n3191:{id:"n3191",loc:[-85.630264,41.937839]},n3192:{id:"n3192",loc:[-85.628591,41.948536]},n3193:{id:"n3193",loc:[-85.63205,41.951181]},n3194:{id:"n3194",loc:[-85.632034,41.949909]},n3195:{id:"n3195",loc:[-85.630841,41.951191]},n3196:{id:"n3196",loc:[-85.632083,41.9537]},n3197:{id:"n3197",loc:[-85.630929,41.959037]},n3198:{id:"n3198",loc:[-85.632151,41.959028]},n3199:{id:"n3199",loc:[-85.630911,41.957428]},n32:{id:"n32",loc:[-85.638273,41.944246]},n320:{id:"n320",loc:[-85.634287,41.943326]},n3200:{id:"n3200",loc:[-85.63213,41.957427]},n3201:{id:"n3201",loc:[-85.632072,41.952447]},n3202:{id:"n3202",loc:[-85.632095,41.954677]},n3203:{id:"n3203",loc:[-85.632111,41.955911]},n3204:{id:"n3204",loc:[-85.630855,41.952457]},n3205:{id:"n3205",loc:[-85.630869,41.953709]},n3206:{id:"n3206",loc:[-85.63088,41.954682]},n3207:{id:"n3207",loc:[-85.630894,41.955913]},n3208:{id:"n3208",loc:[-85.633214,41.948619]},n3209:{id:"n3209",loc:[-85.633253,41.951171]},n321:{id:"n321",loc:[-85.634233,41.943354]},n3210:{id:"n3210",loc:[-85.633234,41.949901]},n3211:{id:"n3211",loc:[-85.633922,41.948616]},n3212:{id:"n3212",loc:[-85.625188,41.947832]},n3213:{id:"n3213",loc:[-85.625208,41.947775]},n3214:{id:"n3214",loc:[-85.625229,41.94776]},n3215:{id:"n3215",loc:[-85.625201,41.947749]},n3216:{id:"n3216",loc:[-85.625168,41.947707]},n3217:{id:"n3217",loc:[-85.625171,41.947609]},n3218:{id:"n3218",loc:[-85.625213,41.947564]},n3219:{id:"n3219",loc:[-85.62529,41.94756]},n322:{id:"n322",loc:[-85.634099,41.943429]},n3220:{id:"n3220",loc:[-85.625303,41.947533]},n3221:{id:"n3221",loc:[-85.625344,41.947482]},n3222:{id:"n3222",loc:[-85.625442,41.947468]},n3223:{id:"n3223",loc:[-85.62565,41.947494]},n3224:{id:"n3224",loc:[-85.625726,41.947613]},n3225:{id:"n3225",loc:[-85.625703,41.947728]},n3226:{id:"n3226",loc:[-85.625534,41.94781]},n3227:{id:"n3227",loc:[-85.625391,41.947822]},n3228:{id:"n3228",loc:[-85.625304,41.947859]},n3229:{id:"n3229",loc:[-85.625203,41.947885]},n323:{id:"n323",loc:[-85.633958,41.943507],tags:{highway:"crossing"}},n3230:{id:"n3230",loc:[-85.624691,41.948659]},n3231:{id:"n3231",loc:[-85.624328,41.948661]},n3232:{id:"n3232",loc:[-85.624331,41.949046]},n3233:{id:"n3233",loc:[-85.624694,41.949045]},n3234:{id:"n3234",loc:[-85.623623,41.949606]},n3235:{id:"n3235",loc:[-85.623623,41.9497]},n3236:{id:"n3236",loc:[-85.623357,41.9497]},n3237:{id:"n3237",loc:[-85.623357,41.949614]},n3238:{id:"n3238",loc:[-85.623974,41.949429]},n3239:{id:"n3239",loc:[-85.623974,41.949605]},n324:{id:"n324",loc:[-85.633698,41.943651],tags:{railway:"crossing"}},n3240:{id:"n3240",loc:[-85.624501,41.951226]},n3241:{id:"n3241",loc:[-85.624501,41.951123]},n3242:{id:"n3242",loc:[-85.624319,41.951123]},n3243:{id:"n3243",loc:[-85.624319,41.951226]},n3244:{id:"n3244",loc:[-85.624121,41.950866]},n3245:{id:"n3245",loc:[-85.624115,41.950525]},n3246:{id:"n3246",loc:[-85.624315,41.950523]},n3247:{id:"n3247",loc:[-85.62432,41.950865]},n3248:{id:"n3248",loc:[-85.624393,41.950867]},n3249:{id:"n3249",loc:[-85.62439,41.950596]},n325:{id:"n325",loc:[-85.633508,41.943757]},n3250:{id:"n3250",loc:[-85.624673,41.950594]},n3251:{id:"n3251",loc:[-85.624675,41.95082]},n3252:{id:"n3252",loc:[-85.62451,41.950821]},n3253:{id:"n3253",loc:[-85.62451,41.950866]},n3254:{id:"n3254",loc:[-85.624101,41.949346]},n3255:{id:"n3255",loc:[-85.624244,41.949346]},n3256:{id:"n3256",loc:[-85.624244,41.949368]},n3257:{id:"n3257",loc:[-85.62434,41.949368]},n3258:{id:"n3258",loc:[-85.624342,41.949351]},n3259:{id:"n3259",loc:[-85.624725,41.949348]},n326:{id:"n326",loc:[-85.634839,41.942974]},n3260:{id:"n3260",loc:[-85.624755,41.950495]},n3261:{id:"n3261",loc:[-85.624121,41.950502]},n3262:{id:"n3262",loc:[-85.625453,41.950163]},n3263:{id:"n3263",loc:[-85.625454,41.949976]},n3264:{id:"n3264",loc:[-85.625549,41.949977]},n3265:{id:"n3265",loc:[-85.62555,41.949833]},n3266:{id:"n3266",loc:[-85.625577,41.949833]},n3267:{id:"n3267",loc:[-85.625578,41.949656]},n3268:{id:"n3268",loc:[-85.625195,41.949655]},n3269:{id:"n3269",loc:[-85.625192,41.950162]},n327:{id:"n327",loc:[-85.634657,41.943028]},n3270:{id:"n3270",loc:[-85.622992,41.949614]},n3271:{id:"n3271",loc:[-85.622991,41.949431]},n3272:{id:"n3272",loc:[-85.620103,41.951]},n3273:{id:"n3273",loc:[-85.605644,41.947468]},n3274:{id:"n3274",loc:[-85.617421,41.947457]},n3275:{id:"n3275",loc:[-85.620078,41.947444]},n3276:{id:"n3276",loc:[-85.620087,41.94924]},n3277:{id:"n3277",loc:[-85.62156,41.948333]},n3278:{id:"n3278",loc:[-85.620106,41.950132]},n3279:{id:"n3279",loc:[-85.637412,41.951136]},n328:{id:"n328",loc:[-85.634222,41.943152]},n3280:{id:"n3280",loc:[-85.635429,41.948608]},n3281:{id:"n3281",loc:[-85.635047,41.947788]},n3282:{id:"n3282",loc:[-85.635048,41.947796]},n3283:{id:"n3283",loc:[-85.635002,41.947797]},n3284:{id:"n3284",loc:[-85.635002,41.947788]},n3285:{id:"n3285",loc:[-85.634914,41.94779]},n3286:{id:"n3286",loc:[-85.634913,41.947753]},n3287:{id:"n3287",loc:[-85.63494,41.947753]},n3288:{id:"n3288",loc:[-85.634938,41.947708]},n3289:{id:"n3289",loc:[-85.635124,41.947705]},n329:{id:"n329",loc:[-85.634099,41.943202]},n3290:{id:"n3290",loc:[-85.635126,41.947787]},n3291:{id:"n3291",loc:[-85.634972,41.947599]},n3292:{id:"n3292",loc:[-85.634921,41.9476]},n3293:{id:"n3293",loc:[-85.63485,41.947546]},n3294:{id:"n3294",loc:[-85.63485,41.947508]},n3295:{id:"n3295",loc:[-85.634924,41.947457]},n3296:{id:"n3296",loc:[-85.634967,41.947456]},n3297:{id:"n3297",loc:[-85.635041,41.947512]},n3298:{id:"n3298",loc:[-85.635041,41.947542]},n3299:{id:"n3299",loc:[-85.634244,41.947839]},n33:{id:"n33",loc:[-85.638257,41.944188]},n330:{id:"n330",loc:[-85.634093,41.943138]},n3300:{id:"n3300",loc:[-85.634243,41.947793]},n3301:{id:"n3301",loc:[-85.634244,41.947686]},n3302:{id:"n3302",loc:[-85.634243,41.947657]},n3303:{id:"n3303",loc:[-85.634462,41.947653]},n3304:{id:"n3304",loc:[-85.634468,41.947835]},n3305:{id:"n3305",loc:[-85.634416,41.948006]},n3306:{id:"n3306",loc:[-85.634415,41.947898]},n3307:{id:"n3307",loc:[-85.634275,41.947899]},n3308:{id:"n3308",loc:[-85.634275,41.947927]},n3309:{id:"n3309",loc:[-85.63425,41.947927]},n331:{id:"n331",loc:[-85.633938,41.943291]},n3310:{id:"n3310",loc:[-85.63425,41.947976]},n3311:{id:"n3311",loc:[-85.634274,41.947976]},n3312:{id:"n3312",loc:[-85.634275,41.948007]},n3313:{id:"n3313",loc:[-85.634342,41.947635]},n3314:{id:"n3314",loc:[-85.634339,41.947497]},n3315:{id:"n3315",loc:[-85.634313,41.94748]},n3316:{id:"n3316",loc:[-85.634287,41.947474]},n3317:{id:"n3317",loc:[-85.63498,41.94815]},n3318:{id:"n3318",loc:[-85.634891,41.94815]},n3319:{id:"n3319",loc:[-85.634892,41.948169]},n332:{id:"n332",loc:[-85.633535,41.943511],tags:{railway:"crossing"}},n3320:{id:"n3320",loc:[-85.634852,41.948169]},n3321:{id:"n3321",loc:[-85.634853,41.948268]},n3322:{id:"n3322",loc:[-85.634832,41.948268]},n3323:{id:"n3323",loc:[-85.634832,41.948296]},n3324:{id:"n3324",loc:[-85.634965,41.948295]},n3325:{id:"n3325",loc:[-85.634966,41.948321]},n3326:{id:"n3326",loc:[-85.634999,41.948321]},n3327:{id:"n3327",loc:[-85.634999,41.948295]},n3328:{id:"n3328",loc:[-85.635175,41.948293]},n3329:{id:"n3329",loc:[-85.635175,41.948262]},n333:{id:"n333",loc:[-85.63339,41.943596]},n3330:{id:"n3330",loc:[-85.635159,41.948262]},n3331:{id:"n3331",loc:[-85.635158,41.948152]},n3332:{id:"n3332",loc:[-85.635067,41.948152]},n3333:{id:"n3333",loc:[-85.635065,41.947966]},n3334:{id:"n3334",loc:[-85.634979,41.947966]},n3335:{id:"n3335",loc:[-85.634307,41.948326]},n3336:{id:"n3336",loc:[-85.634305,41.948298]},n3337:{id:"n3337",loc:[-85.634331,41.948055]},n3338:{id:"n3338",loc:[-85.634331,41.948046]},n3339:{id:"n3339",loc:[-85.634435,41.948047]},n334:{id:"n334",loc:[-85.632842,41.943895]},n3340:{id:"n3340",loc:[-85.634434,41.948375]},n3341:{id:"n3341",loc:[-85.634463,41.948373]},n3342:{id:"n3342",loc:[-85.634464,41.948456]},n3343:{id:"n3343",loc:[-85.63443,41.948457]},n3344:{id:"n3344",loc:[-85.634432,41.948505]},n3345:{id:"n3345",loc:[-85.637386,41.94906]},n3346:{id:"n3346",loc:[-85.637113,41.9486]},n3347:{id:"n3347",loc:[-85.635448,41.949424]},n335:{id:"n335",loc:[-85.633856,41.943315]},n3352:{id:"n3352",loc:[-85.635457,41.949787]},n3353:{id:"n3353",loc:[-85.635459,41.949886]},n336:{id:"n336",loc:[-85.633697,41.943405]},n337:{id:"n337",loc:[-85.63347,41.943181]},n3372:{id:"n3372",loc:[-85.634423,41.950964]},n3373:{id:"n3373",loc:[-85.634424,41.95074]},n3374:{id:"n3374",loc:[-85.634394,41.950284]},n3375:{id:"n3375",loc:[-85.634398,41.950626]},n3376:{id:"n3376",loc:[-85.63452,41.951063]},n3377:{id:"n3377",loc:[-85.634511,41.949977]},n3378:{id:"n3378",loc:[-85.637409,41.949873]},n3379:{id:"n3379",loc:[-85.634824,41.94996]},n338:{id:"n338",loc:[-85.633597,41.943109]},n3380:{id:"n3380",loc:[-85.635437,41.949954]},n3381:{id:"n3381",loc:[-85.634844,41.951064]},n3382:{id:"n3382",loc:[-85.635458,41.951058]},n3383:{id:"n3383",loc:[-85.633921,41.947333]},n3384:{id:"n3384",loc:[-85.634208,41.947793]},n3385:{id:"n3385",loc:[-85.634204,41.947687]},n3386:{id:"n3386",loc:[-85.63424,41.947475]},n3387:{id:"n3387",loc:[-85.63424,41.947635]},n3388:{id:"n3388",loc:[-85.634089,41.948328]},n3389:{id:"n3389",loc:[-85.63424,41.948299]},n339:{id:"n339",loc:[-85.633673,41.943184]},n3390:{id:"n3390",loc:[-85.634239,41.948212]},n3391:{id:"n3391",loc:[-85.634086,41.948214]},n3392:{id:"n3392",loc:[-85.63408,41.948056]},n3393:{id:"n3393",loc:[-85.634093,41.948506]},n3394:{id:"n3394",loc:[-85.64344,41.941866]},n3395:{id:"n3395",loc:[-85.63378,41.95099]},n3396:{id:"n3396",loc:[-85.633779,41.950967]},n3397:{id:"n3397",loc:[-85.63375,41.950746]},n3398:{id:"n3398",loc:[-85.63375,41.950697]},n3399:{id:"n3399",loc:[-85.633903,41.950696]},n34:{id:"n34",loc:[-85.638176,41.944312]},n340:{id:"n340",loc:[-85.633714,41.94316]},n3400:{id:"n3400",loc:[-85.633901,41.950436]},n3401:{id:"n3401",loc:[-85.633492,41.950438]},n3402:{id:"n3402",loc:[-85.633494,41.950756]},n3403:{id:"n3403",loc:[-85.633454,41.950756]},n3404:{id:"n3404",loc:[-85.633456,41.950992]},n3405:{id:"n3405",loc:[-85.633994,41.950284]},n3406:{id:"n3406",loc:[-85.633998,41.950628]},n3407:{id:"n3407",loc:[-85.633364,41.951068]},n3408:{id:"n3408",loc:[-85.633356,41.949982]},n3409:{id:"n3409",loc:[-85.643327,41.941903]},n341:{id:"n341",loc:[-85.633811,41.943256]},n3410:{id:"n3410",loc:[-85.633292,41.953691]},n3411:{id:"n3411",loc:[-85.637432,41.952399]},n3412:{id:"n3412",loc:[-85.633349,41.957422]},n3413:{id:"n3413",loc:[-85.633326,41.955909]},n3414:{id:"n3414",loc:[-85.633307,41.954673]},n3415:{id:"n3415",loc:[-85.633273,41.952436]},n3416:{id:"n3416",loc:[-85.633361,41.95823],tags:{highway:"turning_circle"}},n3417:{id:"n3417",loc:[-85.619899,41.945527]},n3418:{id:"n3418",loc:[-85.643422,41.941946]},n3419:{id:"n3419",loc:[-85.643505,41.942033]},n342:{id:"n342",loc:[-85.633801,41.943261]},n3420:{id:"n3420",loc:[-85.620088,41.945571]},n3421:{id:"n3421",loc:[-85.620051,41.945505]},n3422:{id:"n3422",loc:[-85.62001,41.94541]},n3423:{id:"n3423",loc:[-85.620982,41.944742]},n3424:{id:"n3424",loc:[-85.621305,41.944782]},n3425:{id:"n3425",loc:[-85.621174,41.944819]},n3426:{id:"n3426",loc:[-85.621029,41.944871]},n3427:{id:"n3427",loc:[-85.620741,41.945011]},n3428:{id:"n3428",loc:[-85.620616,41.945085]},n3429:{id:"n3429",loc:[-85.620506,41.945172]},n343:{id:"n343",loc:[-85.63374,41.943514]},n3430:{id:"n3430",loc:[-85.620394,41.945273]},n3431:{id:"n3431",loc:[-85.620316,41.94536]},n3432:{id:"n3432",loc:[-85.620257,41.945452]},n3433:{id:"n3433",loc:[-85.620212,41.945535]},n3434:{id:"n3434",loc:[-85.620101,41.945811]},n3435:{id:"n3435",loc:[-85.620081,41.945937]},n3436:{id:"n3436",loc:[-85.619899,41.943718]},n3437:{id:"n3437",loc:[-85.619969,41.943211]},n3438:{id:"n3438",loc:[-85.619894,41.943292]},n3439:{id:"n3439",loc:[-85.620047,41.944738]},n344:{id:"n344",loc:[-85.633665,41.943441]},n3440:{id:"n3440",loc:[-85.620226,41.946088]},n3441:{id:"n3441",loc:[-85.620225,41.945864]},n3442:{id:"n3442",loc:[-85.620518,41.945863]},n3443:{id:"n3443",loc:[-85.620519,41.945944]},n3444:{id:"n3444",loc:[-85.620388,41.945944]},n3445:{id:"n3445",loc:[-85.620389,41.946088]},n3446:{id:"n3446",loc:[-85.618405,41.946566]},n3447:{id:"n3447",loc:[-85.619156,41.946562]},n3448:{id:"n3448",loc:[-85.619154,41.946319]},n3449:{id:"n3449",loc:[-85.618736,41.946322]},n345:{id:"n345",loc:[-85.633162,41.942947]},n3450:{id:"n3450",loc:[-85.618733,41.94612]},n3451:{id:"n3451",loc:[-85.619317,41.946116]},n3452:{id:"n3452",loc:[-85.619316,41.946023]},n3453:{id:"n3453",loc:[-85.619622,41.946021]},n3454:{id:"n3454",loc:[-85.619624,41.946171]},n3455:{id:"n3455",loc:[-85.61977,41.94617]},n3456:{id:"n3456",loc:[-85.619769,41.94602]},n3457:{id:"n3457",loc:[-85.619732,41.94602]},n3458:{id:"n3458",loc:[-85.619731,41.945856]},n3459:{id:"n3459",loc:[-85.619617,41.945857]},n346:{id:"n346",loc:[-85.633598,41.943083]},n3460:{id:"n3460",loc:[-85.619616,41.945776]},n3461:{id:"n3461",loc:[-85.619447,41.945777]},n3462:{id:"n3462",loc:[-85.619415,41.945778]},n3463:{id:"n3463",loc:[-85.618378,41.945788]},n3464:{id:"n3464",loc:[-85.618384,41.946132]},n3465:{id:"n3465",loc:[-85.618503,41.94613]},n3466:{id:"n3466",loc:[-85.618506,41.946319]},n3467:{id:"n3467",loc:[-85.6184,41.94632]},n3468:{id:"n3468",loc:[-85.618248,41.946416]},n3469:{id:"n3469",loc:[-85.618247,41.946319]},n347:{id:"n347",loc:[-85.63343,41.943179]},n3470:{id:"n3470",loc:[-85.618039,41.946321]},n3471:{id:"n3471",loc:[-85.61804,41.946418]},n3472:{id:"n3472",loc:[-85.620118,41.951895]},n3473:{id:"n3473",loc:[-85.617075,41.95469]},n3474:{id:"n3474",loc:[-85.620107,41.952113]},n3475:{id:"n3475",loc:[-85.620091,41.95232]},n3476:{id:"n3476",loc:[-85.620047,41.952505]},n3477:{id:"n3477",loc:[-85.61998,41.952715]},n3478:{id:"n3478",loc:[-85.619861,41.952986]},n3479:{id:"n3479",loc:[-85.619622,41.953365]},n348:{id:"n348",loc:[-85.633669,41.94341]},n3480:{id:"n3480",loc:[-85.619441,41.953567]},n3481:{id:"n3481",loc:[-85.619259,41.953741]},n3482:{id:"n3482",loc:[-85.618835,41.954056]},n3483:{id:"n3483",loc:[-85.618602,41.954194]},n3484:{id:"n3484",loc:[-85.618305,41.954347]},n3485:{id:"n3485",loc:[-85.618006,41.954466]},n3486:{id:"n3486",loc:[-85.617611,41.954587]},n3487:{id:"n3487",loc:[-85.615094,41.943412]},n3488:{id:"n3488",loc:[-85.619337,41.943025]},n3489:{id:"n3489",loc:[-85.610477,41.945527]},n349:{id:"n349",loc:[-85.633566,41.943466]},n3490:{id:"n3490",loc:[-85.610477,41.943718]},n3491:{id:"n3491",loc:[-85.619804,41.942976]},n3492:{id:"n3492",loc:[-85.61921,41.942672]},n3493:{id:"n3493",loc:[-85.619862,41.942836]},n3494:{id:"n3494",loc:[-85.616326,41.942769]},n3495:{id:"n3495",loc:[-85.617953,41.942917]},n3496:{id:"n3496",loc:[-85.61972,41.942728]},n3497:{id:"n3497",loc:[-85.61944,41.942784]},n3498:{id:"n3498",loc:[-85.615323,41.942841]},n3499:{id:"n3499",loc:[-85.612923,41.943718]},n35:{id:"n35",loc:[-85.637928,41.944249]},n350:{id:"n350",loc:[-85.633031,41.942986]},n3500:{id:"n3500",loc:[-85.61958,41.942756]},n3501:{id:"n3501",loc:[-85.619643,41.942647],tags:{leisure:"fishing"}},n3502:{id:"n3502",loc:[-85.619935,41.942962]},n3503:{id:"n3503",loc:[-85.629677,41.954687]},n3504:{id:"n3504",loc:[-85.629083,41.953722]},n3505:{id:"n3505",loc:[-85.621907,41.952067]},n3506:{id:"n3506",loc:[-85.621788,41.952058]},n3507:{id:"n3507",loc:[-85.629665,41.953718]},n3508:{id:"n3508",loc:[-85.624454,41.954707]},n3509:{id:"n3509",loc:[-85.634609,41.954585]},n351:{id:"n351",loc:[-85.633238,41.94283]},n3510:{id:"n3510",loc:[-85.634595,41.953772]},n3511:{id:"n3511",loc:[-85.633425,41.953783]},n3512:{id:"n3512",loc:[-85.633439,41.954596]},n3517:{id:"n3517",loc:[-85.621789,41.952179]},n3518:{id:"n3518",loc:[-85.624105,41.954704]},n3519:{id:"n3519",loc:[-85.623306,41.954542]},n352:{id:"n352",loc:[-85.633173,41.943556]},n3520:{id:"n3520",loc:[-85.623123,41.954502]},n3521:{id:"n3521",loc:[-85.622965,41.954473]},n3522:{id:"n3522",loc:[-85.622822,41.954455]},n3523:{id:"n3523",loc:[-85.62269,41.954448]},n3524:{id:"n3524",loc:[-85.622388,41.954467]},n3525:{id:"n3525",loc:[-85.62403,41.954895]},n3526:{id:"n3526",loc:[-85.623579,41.954855]},n3527:{id:"n3527",loc:[-85.623836,41.954951]},n3528:{id:"n3528",loc:[-85.622473,41.954592]},n3529:{id:"n3529",loc:[-85.622753,41.95458]},n353:{id:"n353",loc:[-85.633127,41.943552]},n3530:{id:"n3530",loc:[-85.62404,41.955078]},n3531:{id:"n3531",loc:[-85.624126,41.954999]},n3532:{id:"n3532",loc:[-85.623171,41.954687]},n3533:{id:"n3533",loc:[-85.624276,41.955206]},n3534:{id:"n3534",loc:[-85.62491,41.952801]},n3535:{id:"n3535",loc:[-85.625186,41.952756]},n3536:{id:"n3536",loc:[-85.625552,41.952792]},n3537:{id:"n3537",loc:[-85.626001,41.952948]},n3538:{id:"n3538",loc:[-85.626528,41.952984]},n3539:{id:"n3539",loc:[-85.626942,41.952886]},n354:{id:"n354",loc:[-85.632745,41.943222]},n3540:{id:"n3540",loc:[-85.627092,41.952685]},n3541:{id:"n3541",loc:[-85.627212,41.95244]},n3542:{id:"n3542",loc:[-85.627158,41.952226]},n3543:{id:"n3543",loc:[-85.627002,41.951972]},n3544:{id:"n3544",loc:[-85.626822,41.951838]},n3545:{id:"n3545",loc:[-85.626528,41.951807]},n3546:{id:"n3546",loc:[-85.625653,41.951852]},n3547:{id:"n3547",loc:[-85.625348,41.951834]},n3548:{id:"n3548",loc:[-85.625114,41.951767]},n3549:{id:"n3549",loc:[-85.620627,41.954682]},n355:{id:"n355",loc:[-85.632756,41.943199]},n3550:{id:"n3550",loc:[-85.622758,41.951884]},n3551:{id:"n3551",loc:[-85.618135,41.954734]},n3552:{id:"n3552",loc:[-85.620229,41.95472]},n3553:{id:"n3553",loc:[-85.624491,41.955573]},n3554:{id:"n3554",loc:[-85.621792,41.958314]},n3555:{id:"n3555",loc:[-85.623395,41.960001]},n3556:{id:"n3556",loc:[-85.620461,41.956212]},n3557:{id:"n3557",loc:[-85.62109,41.956766]},n3558:{id:"n3558",loc:[-85.620246,41.956224]},n3559:{id:"n3559",loc:[-85.625017,41.956068]},n356:{id:"n356",loc:[-85.632855,41.943147]},n3560:{id:"n3560",loc:[-85.622795,41.959702]},n3561:{id:"n3561",loc:[-85.621573,41.958457]},n3562:{id:"n3562",loc:[-85.619631,41.9573]},n3563:{id:"n3563",loc:[-85.62095,41.956311]},n3564:{id:"n3564",loc:[-85.619694,41.957408]},n3565:{id:"n3565",loc:[-85.621079,41.957751]},n3566:{id:"n3566",loc:[-85.622426,41.961142]},n3567:{id:"n3567",loc:[-85.623251,41.960484]},n3568:{id:"n3568",loc:[-85.619084,41.956291]},n3569:{id:"n3569",loc:[-85.622227,41.959303]},n357:{id:"n357",loc:[-85.632888,41.94315]},n3570:{id:"n3570",loc:[-85.620976,41.959104]},n3571:{id:"n3571",loc:[-85.621208,41.95653]},n3572:{id:"n3572",loc:[-85.623531,41.95951]},n3573:{id:"n3573",loc:[-85.623556,41.957935]},n3574:{id:"n3574",loc:[-85.623037,41.95746]},n3575:{id:"n3575",loc:[-85.621175,41.956427]},n3576:{id:"n3576",loc:[-85.622651,41.960109]},n3577:{id:"n3577",loc:[-85.621803,41.960747]},n3578:{id:"n3578",loc:[-85.620791,41.961874]},n3579:{id:"n3579",loc:[-85.625295,41.956786]},n358:{id:"n358",loc:[-85.633232,41.943547]},n3580:{id:"n3580",loc:[-85.619662,41.956894]},n3581:{id:"n3581",loc:[-85.622442,41.958708]},n3582:{id:"n3582",loc:[-85.621744,41.955864]},n3583:{id:"n3583",loc:[-85.621336,41.959212]},n3584:{id:"n3584",loc:[-85.622801,41.957304]},n3585:{id:"n3585",loc:[-85.619973,41.957433]},n3586:{id:"n3586",loc:[-85.619556,41.955717]},n3587:{id:"n3587",loc:[-85.622978,41.958601]},n3588:{id:"n3588",loc:[-85.625396,41.956264]},n3589:{id:"n3589",loc:[-85.623525,41.958034]},n359:{id:"n359",loc:[-85.633302,41.94351]},n3590:{id:"n3590",loc:[-85.623299,41.959631]},n3591:{id:"n3591",loc:[-85.622678,41.959873]},n3592:{id:"n3592",loc:[-85.625553,41.956179]},n3593:{id:"n3593",loc:[-85.623557,41.959231]},n3594:{id:"n3594",loc:[-85.622843,41.957373]},n3595:{id:"n3595",loc:[-85.619378,41.955677]},n3596:{id:"n3596",loc:[-85.620092,41.955425]},n3597:{id:"n3597",loc:[-85.622666,41.96044]},n3598:{id:"n3598",loc:[-85.621996,41.960256]},n3599:{id:"n3599",loc:[-85.623273,41.959997]},n36:{id:"n36",loc:[-85.637894,41.945551]},n360:{id:"n360",loc:[-85.633442,41.943794],tags:{highway:"crossing"}},n3600:{id:"n3600",loc:[-85.62477,41.95689]},n3601:{id:"n3601",loc:[-85.621641,41.955015]},n3602:{id:"n3602",loc:[-85.622495,41.960392]},n3603:{id:"n3603",loc:[-85.61918,41.955565]},n3604:{id:"n3604",loc:[-85.620017,41.955505]},n3605:{id:"n3605",loc:[-85.621739,41.956315]},n3606:{id:"n3606",loc:[-85.622957,41.959837]},n3607:{id:"n3607",loc:[-85.620912,41.960919]},n3608:{id:"n3608",loc:[-85.625231,41.956235]},n3609:{id:"n3609",loc:[-85.620976,41.961868]},n361:{id:"n361",loc:[-85.633381,41.94383]},n3610:{id:"n3610",loc:[-85.620956,41.958908]},n3611:{id:"n3611",loc:[-85.619035,41.956139]},n3612:{id:"n3612",loc:[-85.623643,41.958669]},n3613:{id:"n3613",loc:[-85.61949,41.956539]},n3614:{id:"n3614",loc:[-85.621927,41.958242]},n3615:{id:"n3615",loc:[-85.620826,41.955721]},n3616:{id:"n3616",loc:[-85.621202,41.961321]},n3617:{id:"n3617",loc:[-85.624877,41.95594]},n3618:{id:"n3618",loc:[-85.62065,41.958369]},n3619:{id:"n3619",loc:[-85.621524,41.956279]},n362:{id:"n362",loc:[-85.632977,41.944053]},n3620:{id:"n3620",loc:[-85.624662,41.955932]},n3621:{id:"n3621",loc:[-85.623048,41.958509]},n3622:{id:"n3622",loc:[-85.62111,41.95754]},n3623:{id:"n3623",loc:[-85.621508,41.954847]},n3624:{id:"n3624",loc:[-85.620655,41.958601]},n3625:{id:"n3625",loc:[-85.62154,41.954971]},n3626:{id:"n3626",loc:[-85.621691,41.955521]},n3627:{id:"n3627",loc:[-85.62154,41.954739]},n3628:{id:"n3628",loc:[-85.621996,41.959913]},n3629:{id:"n3629",loc:[-85.622286,41.960699]},n363:{id:"n363",loc:[-85.632915,41.943981],tags:{crossing:"zebra",highway:"crossing"}},n3630:{id:"n3630",loc:[-85.622844,41.9572]},n3631:{id:"n3631",loc:[-85.620252,41.955446]},n3632:{id:"n3632",loc:[-85.623434,41.957528]},n3633:{id:"n3633",loc:[-85.623429,41.956858]},n3634:{id:"n3634",loc:[-85.622957,41.957137]},n3635:{id:"n3635",loc:[-85.622554,41.959027]},n3636:{id:"n3636",loc:[-85.623289,41.958314]},n3637:{id:"n3637",loc:[-85.622977,41.960855]},n3638:{id:"n3638",loc:[-85.624008,41.956953]},n3639:{id:"n3639",loc:[-85.621278,41.960855]},n364:{id:"n364",loc:[-85.632724,41.943969],tags:{crossing:"zebra",highway:"crossing"}},n3640:{id:"n3640",loc:[-85.623128,41.956993]},n3641:{id:"n3641",loc:[-85.622452,41.959183]},n3642:{id:"n3642",loc:[-85.621095,41.961082]},n3643:{id:"n3643",loc:[-85.622011,41.960544]},n3644:{id:"n3644",loc:[-85.621637,41.955385]},n3645:{id:"n3645",loc:[-85.620999,41.959271]},n3646:{id:"n3646",loc:[-85.620044,41.956347]},n3647:{id:"n3647",loc:[-85.621936,41.959682]},n3648:{id:"n3648",loc:[-85.623761,41.95685]},n3649:{id:"n3649",loc:[-85.621239,41.959343]},n365:{id:"n365",loc:[-85.632621,41.944034]},n3650:{id:"n3650",loc:[-85.621073,41.956012]},n3651:{id:"n3651",loc:[-85.621271,41.956184]},n3652:{id:"n3652",loc:[-85.623444,41.95778]},n3653:{id:"n3653",loc:[-85.62125,41.96186]},n3654:{id:"n3654",loc:[-85.62169,41.961059]},n3655:{id:"n3655",loc:[-85.620012,41.955637]},n3656:{id:"n3656",loc:[-85.621058,41.9573]},n3657:{id:"n3657",loc:[-85.621138,41.957663]},n3658:{id:"n3658",loc:[-85.620773,41.957895]},n3659:{id:"n3659",loc:[-85.62007,41.957157]},n366:{id:"n366",loc:[-85.632684,41.944109],tags:{crossing:"zebra",highway:"crossing"}},n3660:{id:"n3660",loc:[-85.624534,41.955844]},n3661:{id:"n3661",loc:[-85.621932,41.960807]},n3662:{id:"n3662",loc:[-85.623358,41.958138]},n3663:{id:"n3663",loc:[-85.620456,41.955514]},n3664:{id:"n3664",loc:[-85.623504,41.957607]},n3665:{id:"n3665",loc:[-85.621444,41.960751]},n3666:{id:"n3666",loc:[-85.623492,41.960213]},n3667:{id:"n3667",loc:[-85.621669,41.954655]},n3668:{id:"n3668",loc:[-85.623106,41.958685]},n3669:{id:"n3669",loc:[-85.620922,41.957867]},n367:{id:"n367",loc:[-85.632738,41.944172]},n3670:{id:"n3670",loc:[-85.620092,41.957296]},n3671:{id:"n3671",loc:[-85.621669,41.955222]},n3672:{id:"n3672",loc:[-85.621614,41.960967]},n3673:{id:"n3673",loc:[-85.621691,41.955732]},n3674:{id:"n3674",loc:[-85.619207,41.956419]},n3675:{id:"n3675",loc:[-85.621116,41.956603]},n3676:{id:"n3676",loc:[-85.623311,41.956929]},n3677:{id:"n3677",loc:[-85.625671,41.956499]},n3678:{id:"n3678",loc:[-85.623525,41.956738]},n3679:{id:"n3679",loc:[-85.625381,41.956634]},n368:{id:"n368",loc:[-85.63287,41.944135],tags:{crossing:"zebra",highway:"crossing"}},n3680:{id:"n3680",loc:[-85.620096,41.95677]},n3681:{id:"n3681",loc:[-85.623803,41.958745]},n3682:{id:"n3682",loc:[-85.623498,41.958457]},n3683:{id:"n3683",loc:[-85.624223,41.957009]},n3684:{id:"n3684",loc:[-85.620026,41.956946]},n3685:{id:"n3685",loc:[-85.623005,41.960124]},n3686:{id:"n3686",loc:[-85.619073,41.955832]},n3687:{id:"n3687",loc:[-85.621744,41.95501]},n3688:{id:"n3688",loc:[-85.620804,41.958781]},n3689:{id:"n3689",loc:[-85.619844,41.957448]},n369:{id:"n369",loc:[-85.63298,41.944076]},n3690:{id:"n3690",loc:[-85.623713,41.958872]},n3691:{id:"n3691",loc:[-85.622329,41.960507]},n3692:{id:"n3692",loc:[-85.620804,41.956244]},n3693:{id:"n3693",loc:[-85.621818,41.955968]},n3694:{id:"n3694",loc:[-85.621405,41.958697]},n3695:{id:"n3695",loc:[-85.620998,41.960996]},n3696:{id:"n3696",loc:[-85.621621,41.960444]},n3697:{id:"n3697",loc:[-85.620941,41.961637]},n3698:{id:"n3698",loc:[-85.622195,41.958333]},n3699:{id:"n3699",loc:[-85.621668,41.961529]},n37:{id:"n37",loc:[-85.637611,41.945383]},n370:{id:"n370",loc:[-85.633191,41.944471]},n3700:{id:"n3700",loc:[-85.621015,41.957049]},n3701:{id:"n3701",loc:[-85.619368,41.955521]},n3702:{id:"n3702",loc:[-85.651578,41.942534]},n3703:{id:"n3703",loc:[-85.651541,41.943847]},n3704:{id:"n3704",loc:[-85.651365,41.944817]},n3705:{id:"n3705",loc:[-85.651076,41.945985]},n3706:{id:"n3706",loc:[-85.650626,41.947213]},n3707:{id:"n3707",loc:[-85.649669,41.949161]},n3708:{id:"n3708",loc:[-85.641802,41.961801]},n3709:{id:"n3709",loc:[-85.623333,41.961987]},n371:{id:"n371",loc:[-85.633132,41.94372]},n3710:{id:"n3710",loc:[-85.620621,41.965658]},n3711:{id:"n3711",loc:[-85.605673,41.965764]},n3712:{id:"n3712",loc:[-85.605664,41.962094]},n3713:{id:"n3713",loc:[-85.583774,41.962178]},n3714:{id:"n3714",loc:[-85.583774,41.961789]},n3715:{id:"n3715",loc:[-85.581303,41.961783]},n3716:{id:"n3716",loc:[-85.581245,41.958394]},n3717:{id:"n3717",loc:[-85.585299,41.955483]},n3718:{id:"n3718",loc:[-85.585588,41.955331]},n3719:{id:"n3719",loc:[-85.586053,41.955163]},n372:{id:"n372",loc:[-85.633011,41.943788]},n3720:{id:"n3720",loc:[-85.58632,41.955076]},n3721:{id:"n3721",loc:[-85.586478,41.955025]},n3722:{id:"n3722",loc:[-85.58692,41.954947]},n3723:{id:"n3723",loc:[-85.587345,41.954913]},n3724:{id:"n3724",loc:[-85.605592,41.954766]},n3725:{id:"n3725",loc:[-85.605303,41.936236]},n3726:{id:"n3726",loc:[-85.606941,41.936117]},n3727:{id:"n3727",loc:[-85.60876,41.935856]},n3728:{id:"n3728",loc:[-85.610092,41.935451]},n3729:{id:"n3729",loc:[-85.610681,41.935247]},n373:{id:"n373",loc:[-85.632854,41.943632]},n3730:{id:"n3730",loc:[-85.611446,41.934955]},n3731:{id:"n3731",loc:[-85.612057,41.934696]},n3732:{id:"n3732",loc:[-85.613256,41.934084]},n3733:{id:"n3733",loc:[-85.613948,41.933682]},n3734:{id:"n3734",loc:[-85.614638,41.933212]},n3735:{id:"n3735",loc:[-85.619801,41.929305]},n3736:{id:"n3736",loc:[-85.619768,41.925548]},n3737:{id:"n3737",loc:[-85.625761,41.925597]},n3738:{id:"n3738",loc:[-85.6263,41.927323]},n3739:{id:"n3739",loc:[-85.633708,41.927402]},n374:{id:"n374",loc:[-85.632974,41.943565]},n3740:{id:"n3740",loc:[-85.633927,41.929109]},n3741:{id:"n3741",loc:[-85.639213,41.929088]},n3742:{id:"n3742",loc:[-85.639204,41.925488]},n3743:{id:"n3743",loc:[-85.651425,41.925406]},n3744:{id:"n3744",loc:[-85.643386,41.941933]},n3745:{id:"n3745",loc:[-85.642776,41.941161]},n3746:{id:"n3746",loc:[-85.637277,41.948812]},n3747:{id:"n3747",loc:[-85.637366,41.94897]},n3748:{id:"n3748",loc:[-85.637329,41.94889]},n3749:{id:"n3749",loc:[-85.629649,41.952596]},n375:{id:"n375",loc:[-85.632741,41.943351]},n3750:{id:"n3750",loc:[-85.630291,41.954684]},n3751:{id:"n3751",loc:[-85.630284,41.953713]},n3752:{id:"n3752",loc:[-85.630269,41.952463]},n3753:{id:"n3753",loc:[-85.633933,41.949896]},n3754:{id:"n3754",loc:[-85.629339,41.941467]},n3755:{id:"n3755",loc:[-85.629857,41.94316]},n3756:{id:"n3756",loc:[-85.629987,41.944025]},n3757:{id:"n3757",loc:[-85.628538,41.948604]},n3758:{id:"n3758",loc:[-85.627415,41.957442]},n3759:{id:"n3759",loc:[-85.627019,41.957369]},n376:{id:"n376",loc:[-85.63251,41.943481]},n3760:{id:"n3760",loc:[-85.62167,41.952179]},n3761:{id:"n3761",loc:[-85.62167,41.952138]},n3762:{id:"n3762",loc:[-85.621562,41.952139]},n3763:{id:"n3763",loc:[-85.621562,41.952058]},n3764:{id:"n3764",loc:[-85.621476,41.952043]},n3765:{id:"n3765",loc:[-85.621477,41.952132]},n3766:{id:"n3766",loc:[-85.621386,41.952132]},n3767:{id:"n3767",loc:[-85.621387,41.95214]},n3768:{id:"n3768",loc:[-85.621262,41.95214]},n3769:{id:"n3769",loc:[-85.621261,41.952038]},n377:{id:"n377",loc:[-85.632706,41.943715]},n3770:{id:"n3770",loc:[-85.621389,41.952038]},n3771:{id:"n3771",loc:[-85.621389,41.952043]},n3772:{id:"n3772",loc:[-85.620898,41.952024]},n3773:{id:"n3773",loc:[-85.620898,41.952085]},n3774:{id:"n3774",loc:[-85.620774,41.952084]},n3775:{id:"n3775",loc:[-85.620774,41.952023]},n3776:{id:"n3776",loc:[-85.620749,41.952036]},n3777:{id:"n3777",loc:[-85.620723,41.952097]},n3778:{id:"n3778",loc:[-85.626158,41.958996]},n3779:{id:"n3779",loc:[-85.626319,41.958686]},n378:{id:"n378",loc:[-85.638683,41.943295]},n3780:{id:"n3780",loc:[-85.626119,41.958629]},n3781:{id:"n3781",loc:[-85.626064,41.958733]},n3782:{id:"n3782",loc:[-85.626155,41.958759]},n3783:{id:"n3783",loc:[-85.626048,41.958965]},n3784:{id:"n3784",loc:[-85.620648,41.952079]},n3785:{id:"n3785",loc:[-85.63826,41.961213]},n3786:{id:"n3786",loc:[-85.638003,41.961614]},n3787:{id:"n3787",loc:[-85.638817,41.961902]},n3788:{id:"n3788",loc:[-85.639073,41.961501]},n3789:{id:"n3789",loc:[-85.620674,41.952018]},n379:{id:"n379",loc:[-85.638684,41.94323]},n3790:{id:"n3790",loc:[-85.62082,41.952106]},n3791:{id:"n3791",loc:[-85.620819,41.952143]},n3792:{id:"n3792",loc:[-85.620778,41.952143]},n3793:{id:"n3793",loc:[-85.620778,41.952106]},n3794:{id:"n3794",loc:[-85.620563,41.952276]},n3795:{id:"n3795",loc:[-85.620543,41.95238]},n3796:{id:"n3796",loc:[-85.620422,41.952367]},n3797:{id:"n3797",loc:[-85.620441,41.952263]},n3798:{id:"n3798",loc:[-85.620561,41.952266]},n3799:{id:"n3799",loc:[-85.620444,41.952254]},n38:{id:"n38",loc:[-85.63879,41.943295]},n380:{id:"n380",loc:[-85.638627,41.94322]},n3800:{id:"n3800",loc:[-85.620773,41.955585]},n3801:{id:"n3801",loc:[-85.621265,41.955989]},n3802:{id:"n3802",loc:[-85.620692,41.954969]},n3803:{id:"n3803",loc:[-85.620691,41.955367]},n3804:{id:"n3804",loc:[-85.620458,41.952178]},n3805:{id:"n3805",loc:[-85.620575,41.95219]},n3806:{id:"n3806",loc:[-85.617609,41.952712]},n3807:{id:"n3807",loc:[-85.617533,41.952801],tags:{entrance:"yes"}},n3808:{id:"n3808",loc:[-85.616816,41.952911]},n3809:{id:"n3809",loc:[-85.616797,41.952901]},n381:{id:"n381",loc:[-85.638624,41.943294]},n3810:{id:"n3810",loc:[-85.616343,41.952694]},n3811:{id:"n3811",loc:[-85.616336,41.952729]},n3812:{id:"n3812",loc:[-85.616343,41.952772]},n3813:{id:"n3813",loc:[-85.628479,41.948649]},n3814:{id:"n3814",loc:[-85.628413,41.948679]},n3815:{id:"n3815",loc:[-85.628336,41.948694]},n3816:{id:"n3816",loc:[-85.62826,41.948694]},n3817:{id:"n3817",loc:[-85.628185,41.948679]},n3818:{id:"n3818",loc:[-85.628103,41.948649]},n3819:{id:"n3819",loc:[-85.627482,41.948395]},n382:{id:"n382",loc:[-85.638437,41.943291]},n3820:{id:"n3820",loc:[-85.619957,41.951168]},n3821:{id:"n3821",loc:[-85.619955,41.952077]},n3822:{id:"n3822",loc:[-85.619843,41.952666]},n3823:{id:"n3823",loc:[-85.619513,41.95324]},n3824:{id:"n3824",loc:[-85.619163,41.953668]},n3825:{id:"n3825",loc:[-85.618813,41.953947]},n3826:{id:"n3826",loc:[-85.618265,41.954252]},n3827:{id:"n3827",loc:[-85.617691,41.954458]},n3828:{id:"n3828",loc:[-85.616978,41.95459]},n3829:{id:"n3829",loc:[-85.615408,41.954628]},n383:{id:"n383",loc:[-85.63844,41.943209]},n3830:{id:"n3830",loc:[-85.615374,41.951076]},n3831:{id:"n3831",loc:[-85.61932,41.947564]},n3832:{id:"n3832",loc:[-85.610553,41.94755]},n3833:{id:"n3833",loc:[-85.610572,41.951065]},n3834:{id:"n3834",loc:[-85.617548,41.94757]},n3835:{id:"n3835",loc:[-85.619842,41.947939]},n3836:{id:"n3836",loc:[-85.619874,41.950905]},n3837:{id:"n3837",loc:[-85.619695,41.950911]},n3838:{id:"n3838",loc:[-85.617591,41.951078]},n3839:{id:"n3839",loc:[-85.619551,41.951065]},n384:{id:"n384",loc:[-85.632616,41.944021]},n3840:{id:"n3840",loc:[-85.626813,41.947337]},n3841:{id:"n3841",loc:[-85.616371,41.952814]},n3842:{id:"n3842",loc:[-85.617205,41.951308]},n3843:{id:"n3843",loc:[-85.616795,41.950953]},n3844:{id:"n3844",loc:[-85.617441,41.950889]},n3845:{id:"n3845",loc:[-85.619155,41.949377]},n3846:{id:"n3846",loc:[-85.618556,41.949377]},n3847:{id:"n3847",loc:[-85.618557,41.948372]},n3848:{id:"n3848",loc:[-85.619156,41.948372]},n3849:{id:"n3849",loc:[-85.61927,41.949796]},n385:{id:"n385",loc:[-85.632319,41.944172]},n3850:{id:"n3850",loc:[-85.61926,41.948344]},n3851:{id:"n3851",loc:[-85.619219,41.948264]},n3852:{id:"n3852",loc:[-85.619147,41.948196]},n3853:{id:"n3853",loc:[-85.619049,41.948144]},n3854:{id:"n3854",loc:[-85.618942,41.948116]},n3855:{id:"n3855",loc:[-85.618822,41.948109]},n3856:{id:"n3856",loc:[-85.618699,41.94813]},n3857:{id:"n3857",loc:[-85.618937,41.951943]},n3858:{id:"n3858",loc:[-85.616762,41.952222]},n3859:{id:"n3859",loc:[-85.616799,41.95472]},n386:{id:"n386",loc:[-85.63221,41.944066]},n3860:{id:"n3860",loc:[-85.616458,41.954735]},n3861:{id:"n3861",loc:[-85.61763,41.951515]},n3862:{id:"n3862",loc:[-85.617735,41.951572]},n3863:{id:"n3863",loc:[-85.61929,41.951573]},n3864:{id:"n3864",loc:[-85.617134,41.951348]},n3865:{id:"n3865",loc:[-85.616598,41.95192]},n3866:{id:"n3866",loc:[-85.616557,41.951997]},n3867:{id:"n3867",loc:[-85.61658,41.952093]},n3868:{id:"n3868",loc:[-85.616636,41.952145]},n3869:{id:"n3869",loc:[-85.616918,41.952276]},n387:{id:"n387",loc:[-85.632524,41.943912]},n3870:{id:"n3870",loc:[-85.617098,41.952235]},n3871:{id:"n3871",loc:[-85.61892,41.951467]},n3872:{id:"n3872",loc:[-85.618035,41.951473]},n3873:{id:"n3873",loc:[-85.618036,41.951572]},n3874:{id:"n3874",loc:[-85.61892,41.951573]},n3875:{id:"n3875",loc:[-85.618919,41.951957]},n3876:{id:"n3876",loc:[-85.619457,41.952237]},n3877:{id:"n3877",loc:[-85.618178,41.953618]},n3878:{id:"n3878",loc:[-85.617658,41.953366]},n3879:{id:"n3879",loc:[-85.617987,41.953024]},n388:{id:"n388",loc:[-85.632268,41.943621]},n3880:{id:"n3880",loc:[-85.618429,41.953248]},n3881:{id:"n3881",loc:[-85.618554,41.953119]},n3882:{id:"n3882",loc:[-85.618077,41.952868]},n3883:{id:"n3883",loc:[-85.618039,41.952886]},n3884:{id:"n3884",loc:[-85.619375,41.952169]},n3885:{id:"n3885",loc:[-85.618137,41.953538]},n3886:{id:"n3886",loc:[-85.61799,41.953555]},n3887:{id:"n3887",loc:[-85.617729,41.953423]},n3888:{id:"n3888",loc:[-85.618101,41.953029]},n3889:{id:"n3889",loc:[-85.618516,41.953119]},n389:{id:"n389",loc:[-85.631951,41.943773]},n3890:{id:"n3890",loc:[-85.619132,41.952042]},n3891:{id:"n3891",loc:[-85.618235,41.952981]},n3892:{id:"n3892",loc:[-85.618485,41.952425]},n3893:{id:"n3893",loc:[-85.618676,41.952519]},n3894:{id:"n3894",loc:[-85.618942,41.952648]},n3895:{id:"n3895",loc:[-85.618287,41.953122]},n3896:{id:"n3896",loc:[-85.617914,41.953516]},n3897:{id:"n3897",loc:[-85.617836,41.953573]},n3898:{id:"n3898",loc:[-85.616477,41.95289]},n3899:{id:"n3899",loc:[-85.618441,41.953201]},n39:{id:"n39",loc:[-85.619931,41.951013]},n390:{id:"n390",loc:[-85.631981,41.943654]},n3900:{id:"n3900",loc:[-85.617537,41.953335]},n3901:{id:"n3901",loc:[-85.617221,41.953166]},n3902:{id:"n3902",loc:[-85.617253,41.953135]},n3903:{id:"n3903",loc:[-85.617211,41.953114]},n3904:{id:"n3904",loc:[-85.617197,41.95313]},n3905:{id:"n3905",loc:[-85.616802,41.952925]},n3906:{id:"n3906",loc:[-85.616771,41.952928]},n3907:{id:"n3907",loc:[-85.616493,41.952785]},n3908:{id:"n3908",loc:[-85.616823,41.952426]},n3909:{id:"n3909",loc:[-85.617191,41.952616]},n391:{id:"n391",loc:[-85.631886,41.943699]},n3910:{id:"n3910",loc:[-85.61724,41.952559]},n3911:{id:"n3911",loc:[-85.61721,41.952542]},n3912:{id:"n3912",loc:[-85.617395,41.952351]},n3913:{id:"n3913",loc:[-85.617426,41.952368]},n3914:{id:"n3914",loc:[-85.617483,41.952309]},n3915:{id:"n3915",loc:[-85.617332,41.952229]},n3916:{id:"n3916",loc:[-85.617451,41.952102]},n3917:{id:"n3917",loc:[-85.617477,41.952115]},n3918:{id:"n3918",loc:[-85.617658,41.951923]},n3919:{id:"n3919",loc:[-85.617634,41.95191]},n392:{id:"n392",loc:[-85.631807,41.943606]},n3920:{id:"n3920",loc:[-85.617747,41.951786]},n3921:{id:"n3921",loc:[-85.618268,41.952056]},n3922:{id:"n3922",loc:[-85.618211,41.952122]},n3923:{id:"n3923",loc:[-85.618386,41.95222]},n3924:{id:"n3924",loc:[-85.618098,41.952527]},n3925:{id:"n3925",loc:[-85.617916,41.95243]},n3926:{id:"n3926",loc:[-85.617854,41.952498]},n3927:{id:"n3927",loc:[-85.617769,41.952453]},n3928:{id:"n3928",loc:[-85.617476,41.952773]},n3929:{id:"n3929",loc:[-85.617876,41.952973]},n393:{id:"n393",loc:[-85.631902,41.943561]},n3930:{id:"n3930",loc:[-85.617174,41.953638]},n3931:{id:"n3931",loc:[-85.618016,41.953578]},n3932:{id:"n3932",loc:[-85.618107,41.953628]},n3933:{id:"n3933",loc:[-85.618067,41.954268]},n3934:{id:"n3934",loc:[-85.617864,41.954263]},n3935:{id:"n3935",loc:[-85.61762,41.954205]},n3936:{id:"n3936",loc:[-85.617437,41.954103]},n3937:{id:"n3937",loc:[-85.617294,41.953978]},n3938:{id:"n3938",loc:[-85.617217,41.95384]},n3939:{id:"n3939",loc:[-85.616814,41.954327]},n394:{id:"n394",loc:[-85.63236,41.943543]},n3940:{id:"n3940",loc:[-85.616778,41.95381]},n3941:{id:"n3941",loc:[-85.616585,41.953707]},n3942:{id:"n3942",loc:[-85.616458,41.954318]},n3943:{id:"n3943",loc:[-85.616643,41.954345]},n3944:{id:"n3944",loc:[-85.618133,41.951412]},n3945:{id:"n3945",loc:[-85.618326,41.951411]},n3946:{id:"n3946",loc:[-85.618503,41.95141]},n3947:{id:"n3947",loc:[-85.618681,41.951409]},n3948:{id:"n3948",loc:[-85.618868,41.951408]},n3949:{id:"n3949",loc:[-85.617047,41.95136]},n395:{id:"n395",loc:[-85.633839,41.944082]},n3950:{id:"n3950",loc:[-85.616502,41.951946]},n3951:{id:"n3951",loc:[-85.616497,41.952072]},n3952:{id:"n3952",loc:[-85.616565,41.952165]},n3953:{id:"n3953",loc:[-85.616663,41.952218]},n3954:{id:"n3954",loc:[-85.616733,41.952255]},n3955:{id:"n3955",loc:[-85.617238,41.952512],tags:{entrance:"yes"}},n3956:{id:"n3956",loc:[-85.617043,41.952406]},n3957:{id:"n3957",loc:[-85.617691,41.951711]},n3958:{id:"n3958",loc:[-85.617773,41.951679]},n3959:{id:"n3959",loc:[-85.619085,41.951681]},n396:{id:"n396",loc:[-85.63376,41.944097]},n3960:{id:"n3960",loc:[-85.617943,41.952895]},n3961:{id:"n3961",loc:[-85.618039,41.952938]},n3962:{id:"n3962",loc:[-85.61763,41.95336]},n3963:{id:"n3963",loc:[-85.617554,41.95344]},n3964:{id:"n3964",loc:[-85.617381,41.952366],tags:{entrance:"yes"}},n3965:{id:"n3965",loc:[-85.617184,41.952254]},n3966:{id:"n3966",loc:[-85.617208,41.952496]},n3967:{id:"n3967",loc:[-85.617124,41.952581],tags:{entrance:"yes"}},n3968:{id:"n3968",loc:[-85.618094,41.952735]},n3969:{id:"n3969",loc:[-85.617702,41.952525],tags:{entrance:"yes"}},n397:{id:"n397",loc:[-85.63361,41.943957]},n3970:{id:"n3970",loc:[-85.617554,41.952686],tags:{entrance:"yes"}},n3971:{id:"n3971",loc:[-85.617959,41.952878]},n3972:{id:"n3972",loc:[-85.616367,41.952655]},n3973:{id:"n3973",loc:[-85.616416,41.952851]},n3974:{id:"n3974",loc:[-85.619777,41.951075]},n3975:{id:"n3975",loc:[-85.618611,41.94817]},n3976:{id:"n3976",loc:[-85.618538,41.948229]},n3977:{id:"n3977",loc:[-85.617421,41.947559]},n3978:{id:"n3978",loc:[-85.617395,41.951039]},n3979:{id:"n3979",loc:[-85.618488,41.94829]},n398:{id:"n398",loc:[-85.633309,41.943886]},n3980:{id:"n3980",loc:[-85.610238,41.954774]},n3981:{id:"n3981",loc:[-85.617449,41.950756]},n3982:{id:"n3982",loc:[-85.617288,41.951286]},n3983:{id:"n3983",loc:[-85.61745,41.950197]},n3984:{id:"n3984",loc:[-85.617436,41.948908]},n3985:{id:"n3985",loc:[-85.615915,41.953804]},n3986:{id:"n3986",loc:[-85.615953,41.953968]},n3987:{id:"n3987",loc:[-85.616031,41.954085]},n3988:{id:"n3988",loc:[-85.616135,41.954181]},n3989:{id:"n3989",loc:[-85.616273,41.954263]},n399:{id:"n399",loc:[-85.633226,41.943931]},n3990:{id:"n3990",loc:[-85.618327,41.951083]},n3991:{id:"n3991",loc:[-85.618135,41.951084]},n3992:{id:"n3992",loc:[-85.618503,41.951082]},n3993:{id:"n3993",loc:[-85.618682,41.951081]},n3994:{id:"n3994",loc:[-85.618864,41.951082]},n3995:{id:"n3995",loc:[-85.616761,41.950101]},n3996:{id:"n3996",loc:[-85.617317,41.947558]},n3997:{id:"n3997",loc:[-85.617336,41.948883]},n3998:{id:"n3998",loc:[-85.616779,41.949295]},n3999:{id:"n3999",loc:[-85.616754,41.949349]},n4:{id:"n4",loc:[-85.622764,41.950892],tags:{highway:"stop",direction:"forward",stop:"minor"}},n40:{id:"n40",loc:[-85.619841,41.951037]},n400:{id:"n400",loc:[-85.63326,41.943966]},n4000:{id:"n4000",loc:[-85.616761,41.950865]},n4001:{id:"n4001",loc:[-85.616883,41.951041]},n4002:{id:"n4002",loc:[-85.617004,41.951142]},n4003:{id:"n4003",loc:[-85.617062,41.951248]},n4004:{id:"n4004",loc:[-85.616809,41.949273]},n4005:{id:"n4005",loc:[-85.616755,41.949489]},n4006:{id:"n4006",loc:[-85.616759,41.949971]},n4007:{id:"n4007",loc:[-85.616757,41.949702]},n4008:{id:"n4008",loc:[-85.618456,41.94836]},n4009:{id:"n4009",loc:[-85.618447,41.948428]},n401:{id:"n401",loc:[-85.63324,41.943976]},n4010:{id:"n4010",loc:[-85.618437,41.949322]},n4011:{id:"n4011",loc:[-85.618447,41.949418]},n4012:{id:"n4012",loc:[-85.618478,41.949491]},n4013:{id:"n4013",loc:[-85.618535,41.949559]},n4014:{id:"n4014",loc:[-85.618623,41.94962]},n4015:{id:"n4015",loc:[-85.618721,41.94966]},n4016:{id:"n4016",loc:[-85.618838,41.949674]},n4017:{id:"n4017",loc:[-85.618967,41.949667]},n4018:{id:"n4018",loc:[-85.619065,41.949632]},n4019:{id:"n4019",loc:[-85.61915,41.949578]},n402:{id:"n402",loc:[-85.63327,41.944006]},n4020:{id:"n4020",loc:[-85.619216,41.949507]},n4021:{id:"n4021",loc:[-85.61927,41.949399]},n4022:{id:"n4022",loc:[-85.619074,41.947639]},n4023:{id:"n4023",loc:[-85.619073,41.947793]},n4024:{id:"n4024",loc:[-85.618912,41.947793]},n4025:{id:"n4025",loc:[-85.618911,41.947947]},n4026:{id:"n4026",loc:[-85.618752,41.947947]},n4027:{id:"n4027",loc:[-85.618754,41.947637]},n4028:{id:"n4028",loc:[-85.617896,41.947599]},n4029:{id:"n4029",loc:[-85.617898,41.947811]},n403:{id:"n403",loc:[-85.633278,41.944002]},n4030:{id:"n4030",loc:[-85.617717,41.947812]},n4031:{id:"n4031",loc:[-85.617715,41.9476]},n4032:{id:"n4032",loc:[-85.619003,41.949828]},n4033:{id:"n4033",loc:[-85.619003,41.949882]},n4034:{id:"n4034",loc:[-85.618926,41.949882]},n4035:{id:"n4035",loc:[-85.618926,41.949828]},n4036:{id:"n4036",loc:[-85.618861,41.949809]},n4037:{id:"n4037",loc:[-85.618861,41.949898]},n4038:{id:"n4038",loc:[-85.618688,41.949898]},n4039:{id:"n4039",loc:[-85.618687,41.94981]},n404:{id:"n404",loc:[-85.63331,41.944036]},n4040:{id:"n4040",loc:[-85.618349,41.949473]},n4041:{id:"n4041",loc:[-85.618287,41.949473]},n4042:{id:"n4042",loc:[-85.618287,41.94942]},n4043:{id:"n4043",loc:[-85.618348,41.949419]},n4044:{id:"n4044",loc:[-85.62316,41.951604]},n4045:{id:"n4045",loc:[-85.623026,41.951605]},n4046:{id:"n4046",loc:[-85.623023,41.951466]},n4047:{id:"n4047",loc:[-85.623134,41.951465]},n4048:{id:"n4048",loc:[-85.623136,41.951539]},n4049:{id:"n4049",loc:[-85.623159,41.951539]},n405:{id:"n405",loc:[-85.633348,41.944015]},n4050:{id:"n4050",loc:[-85.623025,41.95155]},n4051:{id:"n4051",loc:[-85.622955,41.951551]},n4052:{id:"n4052",loc:[-85.622953,41.951507]},n4053:{id:"n4053",loc:[-85.623024,41.951506]},n4054:{id:"n4054",loc:[-85.623318,41.951242]},n4055:{id:"n4055",loc:[-85.623175,41.951241]},n4056:{id:"n4056",loc:[-85.623176,41.951153]},n4057:{id:"n4057",loc:[-85.623319,41.951154]},n4058:{id:"n4058",loc:[-85.623077,41.951191]},n4059:{id:"n4059",loc:[-85.622973,41.951191]},n406:{id:"n406",loc:[-85.63338,41.944048]},n4060:{id:"n4060",loc:[-85.622972,41.951349]},n4061:{id:"n4061",loc:[-85.623059,41.95135]},n4062:{id:"n4062",loc:[-85.62306,41.951301]},n4063:{id:"n4063",loc:[-85.623077,41.951301]},n4064:{id:"n4064",loc:[-85.623117,41.951405]},n4065:{id:"n4065",loc:[-85.62312,41.951087]},n4066:{id:"n4066",loc:[-85.623118,41.951274]},n4067:{id:"n4067",loc:[-85.62328,41.951275]},n4068:{id:"n4068",loc:[-85.62328,41.951242]},n4069:{id:"n4069",loc:[-85.623179,41.951392]},n407:{id:"n407",loc:[-85.633431,41.94402]},n4070:{id:"n4070",loc:[-85.623141,41.951392]},n4071:{id:"n4071",loc:[-85.623142,41.95136]},n4072:{id:"n4072",loc:[-85.623179,41.951361]},n4073:{id:"n4073",loc:[-85.622565,41.951639]},n4074:{id:"n4074",loc:[-85.622565,41.951741]},n4075:{id:"n4075",loc:[-85.622463,41.95174]},n4076:{id:"n4076",loc:[-85.622463,41.95173]},n4077:{id:"n4077",loc:[-85.622442,41.95173]},n4078:{id:"n4078",loc:[-85.622442,41.951742]},n4079:{id:"n4079",loc:[-85.622361,41.951742]},n408:{id:"n408",loc:[-85.633425,41.944014]},n4080:{id:"n4080",loc:[-85.622362,41.951667]},n4081:{id:"n4081",loc:[-85.622441,41.951667]},n4082:{id:"n4082",loc:[-85.622441,41.951688]},n4083:{id:"n4083",loc:[-85.622461,41.951688]},n4084:{id:"n4084",loc:[-85.622461,41.951638]},n4085:{id:"n4085",loc:[-85.62255,41.951587]},n4086:{id:"n4086",loc:[-85.622449,41.95159]},n4087:{id:"n4087",loc:[-85.622441,41.951448]},n4088:{id:"n4088",loc:[-85.62253,41.951445]},n4089:{id:"n4089",loc:[-85.622532,41.951486]},n409:{id:"n409",loc:[-85.633457,41.943997]},n4090:{id:"n4090",loc:[-85.622555,41.951485]},n4091:{id:"n4091",loc:[-85.622558,41.951531]},n4092:{id:"n4092",loc:[-85.622547,41.951531]},n4093:{id:"n4093",loc:[-85.622451,41.95159]},n4094:{id:"n4094",loc:[-85.622452,41.95161]},n4095:{id:"n4095",loc:[-85.622106,41.951617]},n4096:{id:"n4096",loc:[-85.622133,41.951443]},n4097:{id:"n4097",loc:[-85.622552,41.951379]},n4098:{id:"n4098",loc:[-85.622443,41.95138]},n4099:{id:"n4099",loc:[-85.622441,41.951281]},n41:{id:"n41",loc:[-85.636233,41.942764]},n410:{id:"n410",loc:[-85.633429,41.943969]},n4100:{id:"n4100",loc:[-85.62255,41.95128]},n4101:{id:"n4101",loc:[-85.622541,41.951437]},n4102:{id:"n4102",loc:[-85.622441,41.951438]},n4103:{id:"n4103",loc:[-85.621561,41.951444]},n4104:{id:"n4104",loc:[-85.622302,41.951479]},n4105:{id:"n4105",loc:[-85.6223,41.95152]},n4106:{id:"n4106",loc:[-85.622169,41.951517]},n4107:{id:"n4107",loc:[-85.622171,41.951476]},n4108:{id:"n4108",loc:[-85.622543,41.951228]},n4109:{id:"n4109",loc:[-85.622433,41.951228]},n411:{id:"n411",loc:[-85.633442,41.943962]},n4110:{id:"n4110",loc:[-85.622433,41.951133]},n4111:{id:"n4111",loc:[-85.622543,41.951133]},n4112:{id:"n4112",loc:[-85.622356,41.951256]},n4113:{id:"n4113",loc:[-85.622293,41.951256]},n4114:{id:"n4114",loc:[-85.622292,41.9512]},n4115:{id:"n4115",loc:[-85.622313,41.9512]},n4116:{id:"n4116",loc:[-85.622312,41.951173]},n4117:{id:"n4117",loc:[-85.622364,41.951173]},n4118:{id:"n4118",loc:[-85.622365,41.951231]},n4119:{id:"n4119",loc:[-85.622355,41.951231]},n412:{id:"n412",loc:[-85.633411,41.943932]},n4120:{id:"n4120",loc:[-85.62197,41.951155]},n4121:{id:"n4121",loc:[-85.62197,41.951213]},n4122:{id:"n4122",loc:[-85.621848,41.951213]},n4123:{id:"n4123",loc:[-85.621848,41.951155]},n4124:{id:"n4124",loc:[-85.622193,41.951268]},n4125:{id:"n4125",loc:[-85.622194,41.951305]},n4126:{id:"n4126",loc:[-85.622121,41.951306]},n4127:{id:"n4127",loc:[-85.622121,41.951322]},n4128:{id:"n4128",loc:[-85.621984,41.951324]},n4129:{id:"n4129",loc:[-85.621983,41.951271]},n413:{id:"n413",loc:[-85.633421,41.943926]},n4130:{id:"n4130",loc:[-85.622171,41.9514]},n4131:{id:"n4131",loc:[-85.622148,41.951382]},n4132:{id:"n4132",loc:[-85.6221,41.951414]},n4133:{id:"n4133",loc:[-85.622122,41.951433]},n4134:{id:"n4134",loc:[-85.621782,41.951148]},n4135:{id:"n4135",loc:[-85.621783,41.951219]},n4136:{id:"n4136",loc:[-85.62164,41.951221]},n4137:{id:"n4137",loc:[-85.62164,41.951236]},n4138:{id:"n4138",loc:[-85.621556,41.951237]},n4139:{id:"n4139",loc:[-85.621555,41.95117]},n414:{id:"n414",loc:[-85.633376,41.94388]},n4140:{id:"n4140",loc:[-85.621644,41.951169]},n4141:{id:"n4141",loc:[-85.621643,41.951139]},n4142:{id:"n4142",loc:[-85.621719,41.951138]},n4143:{id:"n4143",loc:[-85.621719,41.951148]},n4144:{id:"n4144",loc:[-85.621409,41.951322]},n4145:{id:"n4145",loc:[-85.621338,41.951322]},n4146:{id:"n4146",loc:[-85.621336,41.95115]},n4147:{id:"n4147",loc:[-85.621521,41.951149]},n4148:{id:"n4148",loc:[-85.621522,41.951228]},n4149:{id:"n4149",loc:[-85.621408,41.951228]},n415:{id:"n415",loc:[-85.633348,41.943895]},n4150:{id:"n4150",loc:[-85.621284,41.951219]},n4151:{id:"n4151",loc:[-85.621153,41.951219]},n4152:{id:"n4152",loc:[-85.621152,41.951152]},n4153:{id:"n4153",loc:[-85.621283,41.951152]},n4154:{id:"n4154",loc:[-85.621159,41.951241]},n4155:{id:"n4155",loc:[-85.62116,41.951301]},n4156:{id:"n4156",loc:[-85.621088,41.951302]},n4157:{id:"n4157",loc:[-85.621088,41.951241]},n4158:{id:"n4158",loc:[-85.621049,41.951158]},n4159:{id:"n4159",loc:[-85.62105,41.951229]},n416:{id:"n416",loc:[-85.633341,41.943888]},n4160:{id:"n4160",loc:[-85.620976,41.951229]},n4161:{id:"n4161",loc:[-85.620977,41.951295]},n4162:{id:"n4162",loc:[-85.620887,41.951296]},n4163:{id:"n4163",loc:[-85.620886,41.951229]},n4164:{id:"n4164",loc:[-85.620862,41.951229]},n4165:{id:"n4165",loc:[-85.620861,41.951159]},n4166:{id:"n4166",loc:[-85.620626,41.951133]},n4167:{id:"n4167",loc:[-85.620626,41.951205]},n4168:{id:"n4168",loc:[-85.620412,41.951206]},n4169:{id:"n4169",loc:[-85.620411,41.951134]},n417:{id:"n417",loc:[-85.633321,41.943898]},n4170:{id:"n4170",loc:[-85.621775,41.951443]},n4171:{id:"n4171",loc:[-85.621777,41.951264]},n4172:{id:"n4172",loc:[-85.621565,41.951654]},n4173:{id:"n4173",loc:[-85.621331,41.951439]},n4174:{id:"n4174",loc:[-85.621031,41.951443]},n4175:{id:"n4175",loc:[-85.621836,41.951724]},n4176:{id:"n4176",loc:[-85.621834,41.951621]},n4177:{id:"n4177",loc:[-85.62197,41.951619]},n4178:{id:"n4178",loc:[-85.621972,41.951722]},n4179:{id:"n4179",loc:[-85.621772,41.951638]},n418:{id:"n418",loc:[-85.633547,41.943896]},n4180:{id:"n4180",loc:[-85.621772,41.951715]},n4181:{id:"n4181",loc:[-85.621699,41.951716]},n4182:{id:"n4182",loc:[-85.6217,41.951722]},n4183:{id:"n4183",loc:[-85.621641,41.951722]},n4184:{id:"n4184",loc:[-85.62164,41.951639]},n4185:{id:"n4185",loc:[-85.621505,41.951655]},n4186:{id:"n4186",loc:[-85.621505,41.951729]},n4187:{id:"n4187",loc:[-85.621389,41.951729]},n4188:{id:"n4188",loc:[-85.62139,41.951654]},n4189:{id:"n4189",loc:[-85.621105,41.951635]},n419:{id:"n419",loc:[-85.633467,41.944075]},n4190:{id:"n4190",loc:[-85.621104,41.951576]},n4191:{id:"n4191",loc:[-85.621168,41.951576]},n4192:{id:"n4192",loc:[-85.621168,41.951595]},n4193:{id:"n4193",loc:[-85.621261,41.951595]},n4194:{id:"n4194",loc:[-85.621261,41.951646]},n4195:{id:"n4195",loc:[-85.621294,41.951646]},n4196:{id:"n4196",loc:[-85.621294,41.951732]},n4197:{id:"n4197",loc:[-85.621251,41.951732]},n4198:{id:"n4198",loc:[-85.621251,41.95174]},n4199:{id:"n4199",loc:[-85.621175,41.951741]},n42:{id:"n42",loc:[-85.635996,41.942727]},n420:{id:"n420",loc:[-85.633578,41.944055]},n4200:{id:"n4200",loc:[-85.621175,41.951651]},n4201:{id:"n4201",loc:[-85.621189,41.951651]},n4202:{id:"n4202",loc:[-85.621189,41.951635]},n4203:{id:"n4203",loc:[-85.620554,41.951641]},n4204:{id:"n4204",loc:[-85.620555,41.951742]},n4205:{id:"n4205",loc:[-85.620719,41.951742]},n4206:{id:"n4206",loc:[-85.620719,41.951731]},n4207:{id:"n4207",loc:[-85.620803,41.95173]},n4208:{id:"n4208",loc:[-85.620803,41.951603]},n4209:{id:"n4209",loc:[-85.62072,41.951603]},n421:{id:"n421",loc:[-85.633462,41.944125]},n4210:{id:"n4210",loc:[-85.620721,41.951641]},n4211:{id:"n4211",loc:[-85.620269,41.953053]},n4212:{id:"n4212",loc:[-85.620229,41.953051]},n4213:{id:"n4213",loc:[-85.620231,41.953013]},n4214:{id:"n4214",loc:[-85.620271,41.953015]},n4215:{id:"n4215",loc:[-85.620215,41.953133]},n4216:{id:"n4216",loc:[-85.62013,41.953134]},n4217:{id:"n4217",loc:[-85.620129,41.953083]},n4218:{id:"n4218",loc:[-85.620214,41.953082]},n4219:{id:"n4219",loc:[-85.62016,41.953272]},n422:{id:"n422",loc:[-85.633372,41.944061]},n4220:{id:"n4220",loc:[-85.620046,41.953273]},n4221:{id:"n4221",loc:[-85.620045,41.953171]},n4222:{id:"n4222",loc:[-85.620088,41.953171]},n4223:{id:"n4223",loc:[-85.620087,41.953162]},n4224:{id:"n4224",loc:[-85.620121,41.953162]},n4225:{id:"n4225",loc:[-85.620121,41.953173]},n4226:{id:"n4226",loc:[-85.620157,41.953173]},n4227:{id:"n4227",loc:[-85.620158,41.953196]},n4228:{id:"n4228",loc:[-85.620189,41.953196]},n4229:{id:"n4229",loc:[-85.620189,41.953246]},n423:{id:"n423",loc:[-85.633509,41.943981]},n4230:{id:"n4230",loc:[-85.62016,41.953246]},n4231:{id:"n4231",loc:[-85.6195,41.954012]},n4232:{id:"n4232",loc:[-85.619438,41.954057]},n4233:{id:"n4233",loc:[-85.619418,41.954043]},n4234:{id:"n4234",loc:[-85.619381,41.954069]},n4235:{id:"n4235",loc:[-85.619399,41.954083]},n4236:{id:"n4236",loc:[-85.619339,41.954126]},n4237:{id:"n4237",loc:[-85.619584,41.954313]},n4238:{id:"n4238",loc:[-85.619743,41.954198]},n4239:{id:"n4239",loc:[-85.619453,41.954727]},n424:{id:"n424",loc:[-85.635421,41.945367]},n4240:{id:"n4240",loc:[-85.619503,41.954581]},n4241:{id:"n4241",loc:[-85.619597,41.954472]},n4242:{id:"n4242",loc:[-85.619862,41.95419]},n4243:{id:"n4243",loc:[-85.619506,41.953907]},n4244:{id:"n4244",loc:[-85.619261,41.9541]},n4245:{id:"n4245",loc:[-85.619246,41.954139]},n4246:{id:"n4246",loc:[-85.619244,41.9542]},n4247:{id:"n4247",loc:[-85.619259,41.954243]},n4248:{id:"n4248",loc:[-85.619285,41.954274]},n4249:{id:"n4249",loc:[-85.619123,41.954381]},n425:{id:"n425",loc:[-85.634425,41.943552]},n4250:{id:"n4250",loc:[-85.619641,41.954607]},n4251:{id:"n4251",loc:[-85.619383,41.954615]},n4252:{id:"n4252",loc:[-85.61896,41.954391]},n4253:{id:"n4253",loc:[-85.619211,41.954178]},n4254:{id:"n4254",loc:[-85.619115,41.954102]},n4255:{id:"n4255",loc:[-85.619519,41.953821]},n4256:{id:"n4256",loc:[-85.619956,41.954156]},n4257:{id:"n4257",loc:[-85.619851,41.954266]},n4258:{id:"n4258",loc:[-85.619779,41.95436]},n4259:{id:"n4259",loc:[-85.620525,41.954364]},n426:{id:"n426",loc:[-85.634248,41.943654]},n4260:{id:"n4260",loc:[-85.620398,41.954365]},n4261:{id:"n4261",loc:[-85.620398,41.954324]},n4262:{id:"n4262",loc:[-85.620525,41.954323]},n4263:{id:"n4263",loc:[-85.620359,41.954588]},n4264:{id:"n4264",loc:[-85.620321,41.954588]},n4265:{id:"n4265",loc:[-85.620321,41.954599]},n4266:{id:"n4266",loc:[-85.620296,41.954599]},n4267:{id:"n4267",loc:[-85.620296,41.954587]},n4268:{id:"n4268",loc:[-85.620262,41.954588]},n4269:{id:"n4269",loc:[-85.620261,41.954516]},n427:{id:"n427",loc:[-85.634177,41.943585]},n4270:{id:"n4270",loc:[-85.620282,41.954516]},n4271:{id:"n4271",loc:[-85.620282,41.954373]},n4272:{id:"n4272",loc:[-85.620378,41.954373]},n4273:{id:"n4273",loc:[-85.620379,41.954486]},n4274:{id:"n4274",loc:[-85.620348,41.954486]},n4275:{id:"n4275",loc:[-85.620348,41.954537]},n4276:{id:"n4276",loc:[-85.620359,41.954537]},n4277:{id:"n4277",loc:[-85.620463,41.95521]},n4278:{id:"n4278",loc:[-85.620409,41.955273]},n4279:{id:"n4279",loc:[-85.620205,41.955177]},n428:{id:"n428",loc:[-85.634354,41.943484]},n4280:{id:"n4280",loc:[-85.620288,41.955079]},n4281:{id:"n4281",loc:[-85.620379,41.955121]},n4282:{id:"n4282",loc:[-85.620349,41.955157]},n4283:{id:"n4283",loc:[-85.620083,41.955101]},n4284:{id:"n4284",loc:[-85.620083,41.954986]},n4285:{id:"n4285",loc:[-85.620016,41.954986]},n4286:{id:"n4286",loc:[-85.620016,41.954999]},n4287:{id:"n4287",loc:[-85.619941,41.954999]},n4288:{id:"n4288",loc:[-85.619941,41.954988]},n4289:{id:"n4289",loc:[-85.619815,41.954988]},n429:{id:"n429",loc:[-85.638577,41.943212]},n4290:{id:"n4290",loc:[-85.619815,41.955075]},n4291:{id:"n4291",loc:[-85.619948,41.955075]},n4292:{id:"n4292",loc:[-85.619948,41.955082]},n4293:{id:"n4293",loc:[-85.620004,41.955082]},n4294:{id:"n4294",loc:[-85.620004,41.955101]},n4295:{id:"n4295",loc:[-85.619293,41.955127]},n4296:{id:"n4296",loc:[-85.619208,41.955124]},n4297:{id:"n4297",loc:[-85.619212,41.955061]},n4298:{id:"n4298",loc:[-85.619297,41.955064]},n4299:{id:"n4299",loc:[-85.619068,41.954936]},n43:{id:"n43",loc:[-85.637047,41.943054]},n430:{id:"n430",loc:[-85.638576,41.943219]},n4300:{id:"n4300",loc:[-85.619003,41.954936]},n4301:{id:"n4301",loc:[-85.619004,41.955003]},n4302:{id:"n4302",loc:[-85.618994,41.955003]},n4303:{id:"n4303",loc:[-85.618994,41.955016]},n4304:{id:"n4304",loc:[-85.618973,41.955016]},n4305:{id:"n4305",loc:[-85.618973,41.955071]},n4306:{id:"n4306",loc:[-85.619061,41.955071]},n4307:{id:"n4307",loc:[-85.61906,41.955024]},n4308:{id:"n4308",loc:[-85.619105,41.955024]},n4309:{id:"n4309",loc:[-85.619105,41.954956]},n431:{id:"n431",loc:[-85.638653,41.943078]},n4310:{id:"n4310",loc:[-85.619068,41.954956]},n4311:{id:"n4311",loc:[-85.618294,41.954596]},n4312:{id:"n4312",loc:[-85.618235,41.954602]},n4313:{id:"n4313",loc:[-85.618222,41.954535]},n4314:{id:"n4314",loc:[-85.618281,41.954529]},n4315:{id:"n4315",loc:[-85.618593,41.954556]},n4316:{id:"n4316",loc:[-85.618551,41.954565]},n4317:{id:"n4317",loc:[-85.618545,41.954552]},n4318:{id:"n4318",loc:[-85.618493,41.954563]},n4319:{id:"n4319",loc:[-85.618449,41.954455]},n432:{id:"n432",loc:[-85.638654,41.943148]},n4320:{id:"n4320",loc:[-85.618544,41.954434]},n4321:{id:"n4321",loc:[-85.622545,41.950775]},n4322:{id:"n4322",loc:[-85.622546,41.950843]},n4323:{id:"n4323",loc:[-85.622503,41.950844]},n4324:{id:"n4324",loc:[-85.622503,41.950853]},n4325:{id:"n4325",loc:[-85.622479,41.950853]},n4326:{id:"n4326",loc:[-85.622478,41.950843]},n4327:{id:"n4327",loc:[-85.622425,41.950843]},n4328:{id:"n4328",loc:[-85.622425,41.950808]},n4329:{id:"n4329",loc:[-85.622366,41.950809]},n433:{id:"n433",loc:[-85.638387,41.943151]},n4330:{id:"n4330",loc:[-85.622364,41.950673]},n4331:{id:"n4331",loc:[-85.622448,41.950673]},n4332:{id:"n4332",loc:[-85.622449,41.950732]},n4333:{id:"n4333",loc:[-85.622479,41.950731]},n4334:{id:"n4334",loc:[-85.622479,41.950775]},n4335:{id:"n4335",loc:[-85.621909,41.950641]},n4336:{id:"n4336",loc:[-85.621864,41.950641]},n4337:{id:"n4337",loc:[-85.621865,41.950567]},n4338:{id:"n4338",loc:[-85.62191,41.950567]},n4339:{id:"n4339",loc:[-85.621787,41.950829]},n434:{id:"n434",loc:[-85.638386,41.94308]},n4340:{id:"n4340",loc:[-85.621786,41.950775]},n4341:{id:"n4341",loc:[-85.621588,41.950776]},n4342:{id:"n4342",loc:[-85.621589,41.950848]},n4343:{id:"n4343",loc:[-85.621737,41.950847]},n4344:{id:"n4344",loc:[-85.621737,41.950829]},n4345:{id:"n4345",loc:[-85.621509,41.950846]},n4346:{id:"n4346",loc:[-85.621399,41.950846]},n4347:{id:"n4347",loc:[-85.621398,41.95073]},n4348:{id:"n4348",loc:[-85.621509,41.95073]},n4349:{id:"n4349",loc:[-85.621217,41.950841]},n435:{id:"n435",loc:[-85.634427,41.943533]},n4350:{id:"n4350",loc:[-85.6211,41.95084]},n4351:{id:"n4351",loc:[-85.6211,41.950777]},n4352:{id:"n4352",loc:[-85.621218,41.950778]},n4353:{id:"n4353",loc:[-85.621055,41.950764]},n4354:{id:"n4354",loc:[-85.621054,41.950826]},n4355:{id:"n4355",loc:[-85.620988,41.950826]},n4356:{id:"n4356",loc:[-85.620988,41.950843]},n4357:{id:"n4357",loc:[-85.620842,41.950843]},n4358:{id:"n4358",loc:[-85.620842,41.950764]},n4359:{id:"n4359",loc:[-85.620825,41.950922]},n436:{id:"n436",loc:[-85.63428,41.943229]},n4360:{id:"n4360",loc:[-85.620824,41.950553]},n4361:{id:"n4361",loc:[-85.620543,41.950771]},n4362:{id:"n4362",loc:[-85.620431,41.950772]},n4363:{id:"n4363",loc:[-85.62043,41.950585]},n4364:{id:"n4364",loc:[-85.620542,41.950585]},n4365:{id:"n4365",loc:[-85.62068,41.950505]},n4366:{id:"n4366",loc:[-85.620681,41.950552]},n4367:{id:"n4367",loc:[-85.620589,41.950553]},n4368:{id:"n4368",loc:[-85.620588,41.950506]},n4369:{id:"n4369",loc:[-85.620539,41.950407]},n437:{id:"n437",loc:[-85.634499,41.943461]},n4370:{id:"n4370",loc:[-85.62054,41.950504]},n4371:{id:"n4371",loc:[-85.620416,41.950504]},n4372:{id:"n4372",loc:[-85.620416,41.950408]},n4373:{id:"n4373",loc:[-85.620742,41.95038]},n4374:{id:"n4374",loc:[-85.620527,41.95038]},n4375:{id:"n4375",loc:[-85.620528,41.950408]},n4376:{id:"n4376",loc:[-85.622449,41.950373]},n4377:{id:"n4377",loc:[-85.622452,41.950397]},n4378:{id:"n4378",loc:[-85.622336,41.950404]},n4379:{id:"n4379",loc:[-85.622333,41.950379]},n438:{id:"n438",loc:[-85.634514,41.943486]},n4380:{id:"n4380",loc:[-85.622263,41.950324]},n4381:{id:"n4381",loc:[-85.622261,41.950256]},n4382:{id:"n4382",loc:[-85.62236,41.950254]},n4383:{id:"n4383",loc:[-85.62236,41.95027]},n4384:{id:"n4384",loc:[-85.622402,41.950281]},n4385:{id:"n4385",loc:[-85.622403,41.9503]},n4386:{id:"n4386",loc:[-85.622439,41.950299]},n4387:{id:"n4387",loc:[-85.62244,41.950334]},n4388:{id:"n4388",loc:[-85.622414,41.950335]},n4389:{id:"n4389",loc:[-85.622414,41.95036]},n439:{id:"n439",loc:[-85.63452,41.943511]},n4390:{id:"n4390",loc:[-85.62231,41.950362]},n4391:{id:"n4391",loc:[-85.622309,41.950323]},n4392:{id:"n4392",loc:[-85.622015,41.950539]},n4393:{id:"n4393",loc:[-85.621909,41.95054]},n4394:{id:"n4394",loc:[-85.621909,41.950472]},n4395:{id:"n4395",loc:[-85.622015,41.950471]},n4396:{id:"n4396",loc:[-85.62199,41.950439]},n4397:{id:"n4397",loc:[-85.621956,41.95044]},n4398:{id:"n4398",loc:[-85.621955,41.950405]},n4399:{id:"n4399",loc:[-85.621988,41.950404]},n44:{id:"n44",loc:[-85.636799,41.943055]},n440:{id:"n440",loc:[-85.63451,41.943534]},n4400:{id:"n4400",loc:[-85.621668,41.950418]},n4401:{id:"n4401",loc:[-85.621667,41.950343]},n4402:{id:"n4402",loc:[-85.621745,41.950342]},n4403:{id:"n4403",loc:[-85.621744,41.950306]},n4404:{id:"n4404",loc:[-85.621764,41.950306]},n4405:{id:"n4405",loc:[-85.621763,41.950254]},n4406:{id:"n4406",loc:[-85.621861,41.950253]},n4407:{id:"n4407",loc:[-85.621861,41.950274]},n4408:{id:"n4408",loc:[-85.621896,41.950273]},n4409:{id:"n4409",loc:[-85.621898,41.950389]},n441:{id:"n441",loc:[-85.634483,41.943556]},n4410:{id:"n4410",loc:[-85.621843,41.95039]},n4411:{id:"n4411",loc:[-85.621843,41.950425]},n4412:{id:"n4412",loc:[-85.621789,41.950425]},n4413:{id:"n4413",loc:[-85.621789,41.950386]},n4414:{id:"n4414",loc:[-85.621752,41.950387]},n4415:{id:"n4415",loc:[-85.621753,41.950417]},n4416:{id:"n4416",loc:[-85.621556,41.950562]},n4417:{id:"n4417",loc:[-85.621552,41.950217]},n4418:{id:"n4418",loc:[-85.621788,41.950562]},n4419:{id:"n4419",loc:[-85.621155,41.950562]},n442:{id:"n442",loc:[-85.63419,41.943713]},n4420:{id:"n4420",loc:[-85.622473,41.950551]},n4421:{id:"n4421",loc:[-85.622043,41.950551]},n4422:{id:"n4422",loc:[-85.62142,41.950454]},n4423:{id:"n4423",loc:[-85.621315,41.950455]},n4424:{id:"n4424",loc:[-85.621313,41.950311]},n4425:{id:"n4425",loc:[-85.621388,41.950311]},n4426:{id:"n4426",loc:[-85.621387,41.950261]},n4427:{id:"n4427",loc:[-85.621468,41.95026]},n4428:{id:"n4428",loc:[-85.621468,41.950271]},n4429:{id:"n4429",loc:[-85.621503,41.95027]},n443:{id:"n443",loc:[-85.634462,41.943294]},n4430:{id:"n4430",loc:[-85.621505,41.950353]},n4431:{id:"n4431",loc:[-85.621483,41.950354]},n4432:{id:"n4432",loc:[-85.621483,41.950392]},n4433:{id:"n4433",loc:[-85.621419,41.950393]},n4434:{id:"n4434",loc:[-85.621213,41.95039]},n4435:{id:"n4435",loc:[-85.621127,41.950391]},n4436:{id:"n4436",loc:[-85.621126,41.950357]},n4437:{id:"n4437",loc:[-85.621094,41.950357]},n4438:{id:"n4438",loc:[-85.621094,41.950391]},n4439:{id:"n4439",loc:[-85.620977,41.950392]},n444:{id:"n444",loc:[-85.634298,41.943389]},n4440:{id:"n4440",loc:[-85.620975,41.950278]},n4441:{id:"n4441",loc:[-85.621087,41.950277]},n4442:{id:"n4442",loc:[-85.621088,41.950331]},n4443:{id:"n4443",loc:[-85.621211,41.950312]},n4444:{id:"n4444",loc:[-85.621104,41.950313]},n4445:{id:"n4445",loc:[-85.621105,41.950331]},n4446:{id:"n4446",loc:[-85.620706,41.950328]},n4447:{id:"n4447",loc:[-85.620606,41.950327]},n4448:{id:"n4448",loc:[-85.620607,41.950261]},n4449:{id:"n4449",loc:[-85.620707,41.950262]},n445:{id:"n445",loc:[-85.634527,41.943623]},n4450:{id:"n4450",loc:[-85.620599,41.950336]},n4451:{id:"n4451",loc:[-85.620559,41.950336]},n4452:{id:"n4452",loc:[-85.620559,41.950299]},n4453:{id:"n4453",loc:[-85.620599,41.950299]},n4454:{id:"n4454",loc:[-85.620545,41.950357]},n4455:{id:"n4455",loc:[-85.620418,41.950357]},n4456:{id:"n4456",loc:[-85.620417,41.950257]},n4457:{id:"n4457",loc:[-85.620544,41.950256]},n4458:{id:"n4458",loc:[-85.620246,41.950131],tags:{highway:"crossing"}},n4459:{id:"n4459",loc:[-85.620252,41.950956]},n446:{id:"n446",loc:[-85.634608,41.943577]},n4460:{id:"n4460",loc:[-85.620245,41.950179]},n4461:{id:"n4461",loc:[-85.620246,41.950088]},n4462:{id:"n4462",loc:[-85.620251,41.950885]},n4463:{id:"n4463",loc:[-85.620103,41.950884],tags:{crossing:"zebra",highway:"crossing"}},n4464:{id:"n4464",loc:[-85.619992,41.950884]},n4465:{id:"n4465",loc:[-85.619704,41.951008]},n4466:{id:"n4466",loc:[-85.619599,41.951122]},n4467:{id:"n4467",loc:[-85.619264,41.951486]},n4468:{id:"n4468",loc:[-85.619179,41.951573],tags:{highway:"crossing"}},n4469:{id:"n4469",loc:[-85.620251,41.950999],tags:{highway:"crossing"}},n447:{id:"n447",loc:[-85.634555,41.943531]},n4470:{id:"n4470",loc:[-85.620249,41.951066]},n4471:{id:"n4471",loc:[-85.620256,41.951374]},n4472:{id:"n4472",loc:[-85.620249,41.951389]},n4473:{id:"n4473",loc:[-85.620249,41.951407]},n4474:{id:"n4474",loc:[-85.620255,41.951423]},n4475:{id:"n4475",loc:[-85.62026,41.951853]},n4476:{id:"n4476",loc:[-85.620262,41.951894],tags:{highway:"crossing"}},n4477:{id:"n4477",loc:[-85.620265,41.951957]},n4478:{id:"n4478",loc:[-85.620262,41.952135]},n4479:{id:"n4479",loc:[-85.620241,41.952424]},n448:{id:"n448",loc:[-85.634555,41.943482]},n4480:{id:"n4480",loc:[-85.620213,41.952583]},n4481:{id:"n4481",loc:[-85.620158,41.952754]},n4482:{id:"n4482",loc:[-85.620065,41.952942]},n4483:{id:"n4483",loc:[-85.619753,41.953439]},n4484:{id:"n4484",loc:[-85.619605,41.953626]},n4485:{id:"n4485",loc:[-85.619381,41.953834]},n4486:{id:"n4486",loc:[-85.619069,41.954066]},n4487:{id:"n4487",loc:[-85.618674,41.95429]},n4488:{id:"n4488",loc:[-85.621816,41.952389]},n4489:{id:"n4489",loc:[-85.6217,41.952386]},n449:{id:"n449",loc:[-85.634509,41.943427]},n4490:{id:"n4490",loc:[-85.621705,41.952306]},n4491:{id:"n4491",loc:[-85.621821,41.95231]},n4492:{id:"n4492",loc:[-85.621819,41.952272]},n4493:{id:"n4493",loc:[-85.621778,41.952272]},n4494:{id:"n4494",loc:[-85.621778,41.952199]},n4495:{id:"n4495",loc:[-85.621818,41.952199]},n4496:{id:"n4496",loc:[-85.621754,41.952281]},n4497:{id:"n4497",loc:[-85.621701,41.95228]},n4498:{id:"n4498",loc:[-85.621702,41.952197]},n4499:{id:"n4499",loc:[-85.621755,41.952197]},n45:{id:"n45",loc:[-85.636791,41.942792]},n450:{id:"n450",loc:[-85.63453,41.943365]},n4500:{id:"n4500",loc:[-85.628201,41.954694],tags:{highway:"stop",stop:"all",direction:"forward"}},n4501:{id:"n4501",loc:[-85.627921,41.954783],tags:{highway:"stop",stop:"all",direction:"backward"}},n4502:{id:"n4502",loc:[-85.62775,41.954696],tags:{highway:"stop",stop:"all",direction:"backward"}},n4503:{id:"n4503",loc:[-85.628046,41.954591],tags:{highway:"stop",stop:"all",direction:"forward"}},n4504:{id:"n4504",loc:[-85.631074,41.957428],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4505:{id:"n4505",loc:[-85.630768,41.957429],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4506:{id:"n4506",loc:[-85.629888,41.957432],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4507:{id:"n4507",loc:[-85.629565,41.957433],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4508:{id:"n4508",loc:[-85.629559,41.957343]},n4509:{id:"n4509",loc:[-85.628723,41.95735]},n451:{id:"n451",loc:[-85.634356,41.943468]},n4510:{id:"n4510",loc:[-85.62842,41.957515]},n4511:{id:"n4511",loc:[-85.627561,41.957525]},n4512:{id:"n4512",loc:[-85.630323,41.957508]},n4513:{id:"n4513",loc:[-85.630811,41.957506]},n4514:{id:"n4514",loc:[-85.630839,41.960874]},n4515:{id:"n4515",loc:[-85.631035,41.957506]},n4516:{id:"n4516",loc:[-85.632027,41.9575]},n4517:{id:"n4517",loc:[-85.631038,41.958066]},n4518:{id:"n4518",loc:[-85.630787,41.954769]},n4519:{id:"n4519",loc:[-85.630806,41.957342]},n452:{id:"n452",loc:[-85.634123,41.943596]},n4520:{id:"n4520",loc:[-85.630809,41.957428],tags:{highway:"crossing"}},n4521:{id:"n4521",loc:[-85.630912,41.957506],tags:{highway:"crossing"}},n4522:{id:"n4522",loc:[-85.631033,41.957428],tags:{highway:"crossing"}},n4523:{id:"n4523",loc:[-85.631032,41.957341]},n4524:{id:"n4524",loc:[-85.63091,41.957341],tags:{highway:"crossing"}},n4525:{id:"n4525",loc:[-85.631027,41.95597]},n4526:{id:"n4526",loc:[-85.631027,41.955913],tags:{highway:"crossing"}},n4527:{id:"n4527",loc:[-85.631025,41.955873]},n4528:{id:"n4528",loc:[-85.631073,41.955913],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4529:{id:"n4529",loc:[-85.631007,41.954766]},n453:{id:"n453",loc:[-85.634709,41.943926]},n4530:{id:"n4530",loc:[-85.630881,41.954768],tags:{highway:"crossing"}},n4531:{id:"n4531",loc:[-85.628022,41.954776]},n4532:{id:"n4532",loc:[-85.627385,41.95584]},n4533:{id:"n4533",loc:[-85.627329,41.955937]},n4534:{id:"n4534",loc:[-85.626583,41.957153]},n4535:{id:"n4535",loc:[-85.629675,41.954564],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4536:{id:"n4536",loc:[-85.630881,41.954806],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4537:{id:"n4537",loc:[-85.630879,41.954564],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4538:{id:"n4538",loc:[-85.630784,41.954682],tags:{highway:"crossing"}},n4539:{id:"n4539",loc:[-85.63078,41.954595]},n454:{id:"n454",loc:[-85.63525,41.943855]},n4540:{id:"n4540",loc:[-85.630879,41.954595],tags:{highway:"crossing"}},n4541:{id:"n4541",loc:[-85.631004,41.954594]},n4542:{id:"n4542",loc:[-85.631006,41.954681],tags:{highway:"crossing"}},n4543:{id:"n4543",loc:[-85.631045,41.959036],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4544:{id:"n4544",loc:[-85.632071,41.959029],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4545:{id:"n4545",loc:[-85.632257,41.959027],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4546:{id:"n4546",loc:[-85.631966,41.957427],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4547:{id:"n4547",loc:[-85.632297,41.957426],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4548:{id:"n4548",loc:[-85.631976,41.955911],tags:{highway:"give_way",direction:"forward"}},n4549:{id:"n4549",loc:[-85.632272,41.955911],tags:{highway:"give_way",direction:"backward"}},n455:{id:"n455",loc:[-85.635224,41.943869]},n4550:{id:"n4550",loc:[-85.632097,41.954805],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4551:{id:"n4551",loc:[-85.632094,41.954566],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4552:{id:"n4552",loc:[-85.626519,41.957256]},n4553:{id:"n4553",loc:[-85.625334,41.959165]},n4554:{id:"n4554",loc:[-85.626483,41.95806]},n4555:{id:"n4555",loc:[-85.626481,41.958175]},n4556:{id:"n4556",loc:[-85.626412,41.958174]},n4557:{id:"n4557",loc:[-85.626412,41.958202]},n4558:{id:"n4558",loc:[-85.62628,41.958201]},n4559:{id:"n4559",loc:[-85.626283,41.958057]},n456:{id:"n456",loc:[-85.638854,41.943104]},n4560:{id:"n4560",loc:[-85.622763,41.95109],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4561:{id:"n4561",loc:[-85.622858,41.950876],tags:{emergency:"fire_hydrant"}},n4562:{id:"n4562",loc:[-85.624073,41.950393]},n4563:{id:"n4563",loc:[-85.624077,41.950924]},n4564:{id:"n4564",loc:[-85.624599,41.950984],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4565:{id:"n4565",loc:[-85.624831,41.95119],tags:{emergency:"fire_hydrant"}},n4566:{id:"n4566",loc:[-85.624437,41.952568],tags:{emergency:"fire_hydrant"}},n4567:{id:"n4567",loc:[-85.624077,41.954606],tags:{emergency:"fire_hydrant"}},n4568:{id:"n4568",loc:[-85.624263,41.954888]},n4569:{id:"n4569",loc:[-85.624206,41.954919]},n457:{id:"n457",loc:[-85.635186,41.943901]},n4570:{id:"n4570",loc:[-85.624154,41.954865]},n4571:{id:"n4571",loc:[-85.624212,41.954835]},n4572:{id:"n4572",loc:[-85.622442,41.954401],tags:{emergency:"fire_hydrant"}},n4573:{id:"n4573",loc:[-85.619751,41.954658],tags:{emergency:"fire_hydrant"}},n4574:{id:"n4574",loc:[-85.617785,41.954534]},n4575:{id:"n4575",loc:[-85.617416,41.954721]},n4576:{id:"n4576",loc:[-85.617662,41.95474]},n4577:{id:"n4577",loc:[-85.618014,41.954717]},n4578:{id:"n4578",loc:[-85.617886,41.954671]},n4579:{id:"n4579",loc:[-85.617831,41.954612]},n458:{id:"n458",loc:[-85.635162,41.943917]},n4580:{id:"n4580",loc:[-85.617968,41.954752]},n4581:{id:"n4581",loc:[-85.617815,41.954752]},n4582:{id:"n4582",loc:[-85.617938,41.954695]},n4583:{id:"n4583",loc:[-85.617856,41.954642],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4584:{id:"n4584",loc:[-85.619116,41.954164],tags:{man_made:"flagpole"}},n4585:{id:"n4585",loc:[-85.619569,41.953255],tags:{emergency:"fire_hydrant"}},n4586:{id:"n4586",loc:[-85.620352,41.951894],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4587:{id:"n4587",loc:[-85.620485,41.951948],tags:{emergency:"fire_hydrant"}},n4588:{id:"n4588",loc:[-85.620316,41.950999],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4589:{id:"n4589",loc:[-85.620311,41.950131],tags:{highway:"stop",direction:"backward",stop:"minor"}},n459:{id:"n459",loc:[-85.634856,41.943905]},n4590:{id:"n4590",loc:[-85.620374,41.95018],tags:{emergency:"fire_hydrant"}},n4591:{id:"n4591",loc:[-85.620301,41.949239],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4592:{id:"n4592",loc:[-85.620278,41.947443],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4593:{id:"n4593",loc:[-85.619844,41.947444],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4594:{id:"n4594",loc:[-85.620191,41.947352],tags:{emergency:"fire_hydrant"}},n4595:{id:"n4595",loc:[-85.622819,41.947493],tags:{emergency:"fire_hydrant"}},n4596:{id:"n4596",loc:[-85.622744,41.947541],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4597:{id:"n4597",loc:[-85.622739,41.947316],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4598:{id:"n4598",loc:[-85.622909,41.948333],tags:{highway:"give_way"}},n4599:{id:"n4599",loc:[-85.622593,41.948333],tags:{highway:"give_way"}},n46:{id:"n46",loc:[-85.637131,41.94307]},n460:{id:"n460",loc:[-85.634811,41.944007]},n4600:{id:"n4600",loc:[-85.622835,41.948387],tags:{emergency:"fire_hydrant"}},n4601:{id:"n4601",loc:[-85.622768,41.949125],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4602:{id:"n4602",loc:[-85.622769,41.949325],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4603:{id:"n4603",loc:[-85.622837,41.949329],tags:{emergency:"fire_hydrant"}},n4604:{id:"n4604",loc:[-85.622614,41.950113],tags:{highway:"give_way",direction:"forward"}},n4605:{id:"n4605",loc:[-85.624777,41.949219],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4606:{id:"n4606",loc:[-85.624849,41.949106],tags:{emergency:"fire_hydrant"}},n4607:{id:"n4607",loc:[-85.624858,41.950119],tags:{emergency:"fire_hydrant"}},n4608:{id:"n4608",loc:[-85.624752,41.948334],tags:{highway:"give_way"}},n4609:{id:"n4609",loc:[-85.624845,41.948422],tags:{emergency:"fire_hydrant"}},n461:{id:"n461",loc:[-85.634987,41.943112]},n4610:{id:"n4610",loc:[-85.62484,41.947539],tags:{emergency:"fire_hydrant"}},n4611:{id:"n4611",loc:[-85.62476,41.947428],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4612:{id:"n4612",loc:[-85.620286,41.950926]},n4613:{id:"n4613",loc:[-85.618237,41.950963]},n4614:{id:"n4614",loc:[-85.618107,41.950876]},n4615:{id:"n4615",loc:[-85.618131,41.950393]},n4616:{id:"n4616",loc:[-85.618232,41.949913]},n4617:{id:"n4617",loc:[-85.619138,41.950212]},n4618:{id:"n4618",loc:[-85.619299,41.950388]},n4619:{id:"n4619",loc:[-85.619306,41.950897]},n462:{id:"n462",loc:[-85.634698,41.943194]},n4620:{id:"n4620",loc:[-85.619155,41.950958]},n4621:{id:"n4621",loc:[-85.620079,41.947715]},n4622:{id:"n4622",loc:[-85.619674,41.947728]},n4623:{id:"n4623",loc:[-85.619634,41.947735]},n4624:{id:"n4624",loc:[-85.619587,41.947756],tags:{barrier:"gate"}},n4625:{id:"n4625",loc:[-85.61953,41.947796]},n4626:{id:"n4626",loc:[-85.619475,41.947847]},n4627:{id:"n4627",loc:[-85.619433,41.947903]},n4628:{id:"n4628",loc:[-85.619402,41.947982]},n4629:{id:"n4629",loc:[-85.619394,41.948043]},n463:{id:"n463",loc:[-85.634632,41.943219]},n4630:{id:"n4630",loc:[-85.619395,41.948476]},n4631:{id:"n4631",loc:[-85.618367,41.947452]},n4632:{id:"n4632",loc:[-85.618371,41.947567],tags:{barrier:"gate"}},n4633:{id:"n4633",loc:[-85.618341,41.947622]},n4634:{id:"n4634",loc:[-85.618138,41.94773]},n4635:{id:"n4635",loc:[-85.618078,41.947814]},n4636:{id:"n4636",loc:[-85.618072,41.948009]},n4637:{id:"n4637",loc:[-85.618269,41.947666]},n4638:{id:"n4638",loc:[-85.618099,41.947765]},n4639:{id:"n4639",loc:[-85.618378,41.954453]},n464:{id:"n464",loc:[-85.63459,41.943239]},n4640:{id:"n4640",loc:[-85.618198,41.95453]},n4641:{id:"n4641",loc:[-85.618212,41.954623]},n4642:{id:"n4642",loc:[-85.635211,41.943103],tags:{leisure:"picnic_table"}},n4643:{id:"n4643",loc:[-85.635345,41.943448],tags:{leisure:"picnic_table"}},n4644:{id:"n4644",loc:[-85.635901,41.943353],tags:{amenity:"bench"}},n4645:{id:"n4645",loc:[-85.635815,41.942638],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4646:{id:"n4646",loc:[-85.635355,41.942044],tags:{leisure:"picnic_table"}},n4647:{id:"n4647",loc:[-85.635206,41.942045],tags:{leisure:"picnic_table"}},n4648:{id:"n4648",loc:[-85.63504,41.941992],tags:{leisure:"picnic_table"}},n4649:{id:"n4649",loc:[-85.635185,41.942001]},n465:{id:"n465",loc:[-85.634555,41.943263]},n4650:{id:"n4650",loc:[-85.635176,41.942021]},n4651:{id:"n4651",loc:[-85.635127,41.942008]},n4652:{id:"n4652",loc:[-85.635136,41.941988]},n4653:{id:"n4653",loc:[-85.635,41.941709],tags:{emergency:"fire_hydrant"}},n4654:{id:"n4654",loc:[-85.634893,41.941801]},n4655:{id:"n4655",loc:[-85.634937,41.941843]},n4656:{id:"n4656",loc:[-85.634963,41.941859]},n4657:{id:"n4657",loc:[-85.635027,41.941904]},n4658:{id:"n4658",loc:[-85.63494,41.94187]},n4659:{id:"n4659",loc:[-85.634951,41.941871]},n466:{id:"n466",loc:[-85.634526,41.943289]},n4660:{id:"n4660",loc:[-85.634753,41.941701],tags:{amenity:"drinking_water"}},n4661:{id:"n4661",loc:[-85.634717,41.941804],tags:{amenity:"bench"}},n4662:{id:"n4662",loc:[-85.634554,41.941883],tags:{amenity:"bench"}},n4663:{id:"n4663",loc:[-85.635002,41.941579],tags:{amenity:"fountain"}},n4664:{id:"n4664",loc:[-85.635258,41.94188],tags:{amenity:"waste_basket"}},n4665:{id:"n4665",loc:[-85.635262,41.941581],tags:{amenity:"bench"}},n4666:{id:"n4666",loc:[-85.635319,41.941744],tags:{amenity:"bench"}},n4667:{id:"n4667",loc:[-85.634702,41.941473],tags:{amenity:"waste_basket"}},n4668:{id:"n4668",loc:[-85.633981,41.941966],tags:{amenity:"bench"}},n4669:{id:"n4669",loc:[-85.63388,41.941743]},n467:{id:"n467",loc:[-85.635163,41.944985]},n4670:{id:"n4670",loc:[-85.633746,41.941741]},n4671:{id:"n4671",loc:[-85.633749,41.941664]},n4672:{id:"n4672",loc:[-85.633883,41.941667]},n4673:{id:"n4673",loc:[-85.634283,41.941183],tags:{leisure:"picnic_table"}},n4674:{id:"n4674",loc:[-85.634046,41.941102],tags:{amenity:"bbq"}},n4675:{id:"n4675",loc:[-85.63401,41.941093],tags:{amenity:"bbq"}},n4676:{id:"n4676",loc:[-85.633408,41.940862],tags:{amenity:"bench"}},n4677:{id:"n4677",loc:[-85.633359,41.940651],tags:{amenity:"bench"}},n4678:{id:"n4678",loc:[-85.634109,41.940831]},n4679:{id:"n4679",loc:[-85.63396,41.940867]},n468:{id:"n468",loc:[-85.635095,41.945035]},n4680:{id:"n4680",loc:[-85.633816,41.940913]},n4681:{id:"n4681",loc:[-85.633237,41.940455]},n4682:{id:"n4682",loc:[-85.634453,41.940025],tags:{emergency:"fire_hydrant"}},n4683:{id:"n4683",loc:[-85.635692,41.940218],tags:{emergency:"fire_hydrant"}},n4684:{id:"n4684",loc:[-85.635566,41.940102],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4685:{id:"n4685",loc:[-85.635961,41.940125],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4686:{id:"n4686",loc:[-85.635883,41.94012],tags:{crossing:"zebra",highway:"crossing"}},n4687:{id:"n4687",loc:[-85.635883,41.94006]},n4688:{id:"n4688",loc:[-85.635768,41.940051],tags:{crossing:"zebra",highway:"crossing"}},n4689:{id:"n4689",loc:[-85.635669,41.940043]},n469:{id:"n469",loc:[-85.634269,41.944431]},n4690:{id:"n4690",loc:[-85.635661,41.940107],tags:{crossing:"zebra",highway:"crossing"}},n4691:{id:"n4691",loc:[-85.635424,41.941005],tags:{amenity:"fountain"}},n4692:{id:"n4692",loc:[-85.635542,41.941371],tags:{amenity:"bench"}},n4693:{id:"n4693",loc:[-85.635709,41.941341],tags:{emergency:"fire_hydrant"}},n4694:{id:"n4694",loc:[-85.637038,41.942513],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4695:{id:"n4695",loc:[-85.637174,41.941354],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4696:{id:"n4696",loc:[-85.637091,41.941273],tags:{emergency:"fire_hydrant"}},n4697:{id:"n4697",loc:[-85.638058,41.941346],tags:{highway:"give_way",direction:"forward"}},n4698:{id:"n4698",loc:[-85.638359,41.941344],tags:{highway:"give_way",direction:"backward"}},n4699:{id:"n4699",loc:[-85.638288,41.941236],tags:{emergency:"fire_hydrant"}},n47:{id:"n47",loc:[-85.636693,41.943073]},n470:{id:"n470",loc:[-85.634352,41.944376]},n4700:{id:"n4700",loc:[-85.63935,41.94128],tags:{emergency:"fire_hydrant"}},n4701:{id:"n4701",loc:[-85.639277,41.941337],tags:{highway:"give_way",direction:"forward"}},n4702:{id:"n4702",loc:[-85.639548,41.941334],tags:{highway:"give_way",direction:"backward"}},n4703:{id:"n4703",loc:[-85.642191,41.940039]},n4704:{id:"n4704",loc:[-85.640585,41.941263],tags:{emergency:"fire_hydrant"}},n4705:{id:"n4705",loc:[-85.64049,41.941327],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4706:{id:"n4706",loc:[-85.640803,41.941324],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4707:{id:"n4707",loc:[-85.641717,41.941317],tags:{highway:"stop",direction:"forward",stop:"all"}},n4708:{id:"n4708",loc:[-85.641846,41.941415],tags:{highway:"stop",direction:"backward",stop:"all"}},n4709:{id:"n4709",loc:[-85.641756,41.941392],tags:{emergency:"fire_hydrant"}},n471:{id:"n471",loc:[-85.634747,41.944561],tags:{railway:"crossing"}},n4710:{id:"n4710",loc:[-85.642014,41.941313],tags:{highway:"stop",direction:"forward",stop:"all"}},n4711:{id:"n4711",loc:[-85.641854,41.942455],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4712:{id:"n4712",loc:[-85.641859,41.942739],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4713:{id:"n4713",loc:[-85.640754,41.942707],tags:{emergency:"fire_hydrant"}},n4714:{id:"n4714",loc:[-85.640669,41.942716],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4715:{id:"n4715",loc:[-85.640664,41.942478],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4716:{id:"n4716",loc:[-85.63964,41.94274],tags:{man_made:"flagpole"}},n4717:{id:"n4717",loc:[-85.639455,41.942731],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4718:{id:"n4718",loc:[-85.63945,41.942492],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4719:{id:"n4719",loc:[-85.639527,41.942505],tags:{emergency:"fire_hydrant"}},n472:{id:"n472",loc:[-85.634667,41.944613]},n4720:{id:"n4720",loc:[-85.638238,41.942745],tags:{highway:"stop",direction:"backward",stop:"minor"}},n4721:{id:"n4721",loc:[-85.638233,41.942511],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4722:{id:"n4722",loc:[-85.638018,41.94299],tags:{amenity:"waste_disposal"}},n4723:{id:"n4723",loc:[-85.637918,41.944152],tags:{amenity:"waste_basket"}},n4724:{id:"n4724",loc:[-85.635902,41.943291],tags:{leisure:"picnic_table"}},n4725:{id:"n4725",loc:[-85.63704,41.942741],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4726:{id:"n4726",loc:[-85.633467,41.943818],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4727:{id:"n4727",loc:[-85.633987,41.943531],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4728:{id:"n4728",loc:[-85.632154,41.943539],tags:{emergency:"fire_hydrant"}},n4729:{id:"n4729",loc:[-85.633567,41.944641],tags:{amenity:"bench"}},n473:{id:"n473",loc:[-85.634161,41.944371]},n4730:{id:"n4730",loc:[-85.633127,41.944574],tags:{amenity:"bench"}},n4731:{id:"n4731",loc:[-85.633439,41.944871],tags:{amenity:"bench"}},n4732:{id:"n4732",loc:[-85.633676,41.944799],tags:{amenity:"waste_basket"}},n4733:{id:"n4733",loc:[-85.633466,41.944862],tags:{amenity:"waste_basket"}},n4734:{id:"n4734",loc:[-85.633451,41.944847],tags:{emergency:"fire_hydrant"}},n4735:{id:"n4735",loc:[-85.634202,41.945543],tags:{amenity:"waste_basket"}},n4736:{id:"n4736",loc:[-85.634652,41.945472],tags:{leisure:"picnic_table"}},n4737:{id:"n4737",loc:[-85.6347,41.945445],tags:{leisure:"picnic_table"}},n4738:{id:"n4738",loc:[-85.634646,41.945662],tags:{emergency:"fire_hydrant"}},n4739:{id:"n4739",loc:[-85.634673,41.945687],tags:{amenity:"waste_basket"}},n474:{id:"n474",loc:[-85.633861,41.944117]},n4740:{id:"n4740",loc:[-85.63449,41.945827],tags:{amenity:"clock",display:"analog"}},n4741:{id:"n4741",loc:[-85.63481,41.946056],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4742:{id:"n4742",loc:[-85.634814,41.946176],tags:{amenity:"post_box"}},n4743:{id:"n4743",loc:[-85.638744,41.945328]},n4744:{id:"n4744",loc:[-85.63867,41.945228],tags:{amenity:"bench"}},n4745:{id:"n4745",loc:[-85.639487,41.945042],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4746:{id:"n4746",loc:[-85.639635,41.94387],tags:{highway:"stop",stop:"minor",direction:"backward"}},n4747:{id:"n4747",loc:[-85.639549,41.943756],tags:{emergency:"fire_hydrant"}},n4748:{id:"n4748",loc:[-85.64055,41.943862],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4749:{id:"n4749",loc:[-85.640864,41.943859],tags:{highway:"stop",stop:"minor",direction:"backward"}},n475:{id:"n475",loc:[-85.633906,41.943535]},n4750:{id:"n4750",loc:[-85.640718,41.945022],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4751:{id:"n4751",loc:[-85.640664,41.945076],tags:{emergency:"fire_hydrant"}},n4752:{id:"n4752",loc:[-85.641913,41.94502],tags:{highway:"stop",direction:"forward",stop:"minor"}},n4753:{id:"n4753",loc:[-85.641838,41.945076],tags:{emergency:"fire_hydrant"}},n4754:{id:"n4754",loc:[-85.642045,41.94385],tags:{highway:"give_way",direction:"backward"}},n4755:{id:"n4755",loc:[-85.641738,41.943852],tags:{highway:"give_way",direction:"forward"}},n4756:{id:"n4756",loc:[-85.642928,41.943843],tags:{highway:"stop",stop:"minor",direction:"forward"}},n4757:{id:"n4757",loc:[-85.64305,41.943902],tags:{emergency:"fire_hydrant"}},n4758:{id:"n4758",loc:[-85.642986,41.945105],tags:{highway:"stop",direction:"backward",stop:"all"}},n4759:{id:"n4759",loc:[-85.643136,41.94502],tags:{highway:"stop",stop:"all",direction:"forward"}},n476:{id:"n476",loc:[-85.63423,41.943692]},n4760:{id:"n4760",loc:[-85.63169,41.947812]},n4761:{id:"n4761",loc:[-85.631307,41.947655]},n4762:{id:"n4762",loc:[-85.631407,41.947413]},n4763:{id:"n4763",loc:[-85.631173,41.947306]},n4764:{id:"n4764",loc:[-85.631316,41.947145]},n4765:{id:"n4765",loc:[-85.631476,41.947087]},n4766:{id:"n4766",loc:[-85.631793,41.946871]},n4767:{id:"n4767",loc:[-85.631884,41.946723]},n4768:{id:"n4768",loc:[-85.631814,41.946397]},n4769:{id:"n4769",loc:[-85.631382,41.947685]},n477:{id:"n477",loc:[-85.635096,41.942814]},n4770:{id:"n4770",loc:[-85.63109,41.947819]},n4771:{id:"n4771",loc:[-85.630921,41.947961]},n4772:{id:"n4772",loc:[-85.630249,41.947709]},n4773:{id:"n4773",loc:[-85.630149,41.947451]},n4774:{id:"n4774",loc:[-85.629733,41.947339]},n4775:{id:"n4775",loc:[-85.629755,41.946948]},n4776:{id:"n4776",loc:[-85.630457,41.947103]},n4777:{id:"n4777",loc:[-85.630934,41.946939]},n4778:{id:"n4778",loc:[-85.631277,41.946852]},n4779:{id:"n4779",loc:[-85.63142,41.946781]},n478:{id:"n478",loc:[-85.635058,41.942795]},n4780:{id:"n4780",loc:[-85.631116,41.946474]},n4781:{id:"n4781",loc:[-85.63073,41.945965]},n4782:{id:"n4782",loc:[-85.631337,41.94571]},n4783:{id:"n4783",loc:[-85.631589,41.945487]},n4784:{id:"n4784",loc:[-85.632278,41.945784]},n4785:{id:"n4785",loc:[-85.632105,41.946034]},n4786:{id:"n4786",loc:[-85.632532,41.946198]},n4787:{id:"n4787",loc:[-85.632566,41.946151]},n4788:{id:"n4788",loc:[-85.632684,41.946196]},n4789:{id:"n4789",loc:[-85.628676,41.947106]},n479:{id:"n479",loc:[-85.635002,41.94279]},n4790:{id:"n4790",loc:[-85.628973,41.946476]},n4791:{id:"n4791",loc:[-85.629094,41.946079]},n4792:{id:"n4792",loc:[-85.629226,41.94578]},n4793:{id:"n4793",loc:[-85.629479,41.945682]},n4794:{id:"n4794",loc:[-85.630606,41.94569]},n4795:{id:"n4795",loc:[-85.631255,41.945588]},n4796:{id:"n4796",loc:[-85.631546,41.945281]},n4797:{id:"n4797",loc:[-85.631629,41.944823]},n4798:{id:"n4798",loc:[-85.631766,41.944958]},n4799:{id:"n4799",loc:[-85.631689,41.945318]},n48:{id:"n48",loc:[-85.636689,41.94276]},n480:{id:"n480",loc:[-85.634908,41.94279]},n4800:{id:"n4800",loc:[-85.615069,41.945527]},n4801:{id:"n4801",loc:[-85.615058,41.946677]},n4802:{id:"n4802",loc:[-85.613692,41.946689]},n4803:{id:"n4803",loc:[-85.613475,41.946531]},n4804:{id:"n4804",loc:[-85.611717,41.946252]},n4805:{id:"n4805",loc:[-85.611353,41.946385]},n4806:{id:"n4806",loc:[-85.611304,41.947397]},n4807:{id:"n4807",loc:[-85.610564,41.947401]},n4808:{id:"n4808",loc:[-85.610553,41.947122]},n4809:{id:"n4809",loc:[-85.610194,41.946992]},n481:{id:"n481",loc:[-85.634478,41.942342]},n4810:{id:"n4810",loc:[-85.609976,41.946628]},n4811:{id:"n4811",loc:[-85.609769,41.946523]},n4812:{id:"n4812",loc:[-85.609307,41.946523]},n4813:{id:"n4813",loc:[-85.609035,41.946462]},n4814:{id:"n4814",loc:[-85.609018,41.943277]},n4815:{id:"n4815",loc:[-85.609617,41.943423]},n4816:{id:"n4816",loc:[-85.610471,41.943447]},n4817:{id:"n4817",loc:[-85.621491,41.949168]},n4818:{id:"n4818",loc:[-85.620266,41.94917]},n4819:{id:"n4819",loc:[-85.620262,41.947557]},n482:{id:"n482",loc:[-85.634521,41.942254]},n4820:{id:"n4820",loc:[-85.620825,41.947556]},n4821:{id:"n4821",loc:[-85.620827,41.948371]},n4822:{id:"n4822",loc:[-85.621489,41.94837]},n4823:{id:"n4823",loc:[-85.622865,41.950928]},n4824:{id:"n4824",loc:[-85.622858,41.949744]},n4825:{id:"n4825",loc:[-85.623696,41.949714]},n4826:{id:"n4826",loc:[-85.623696,41.949647]},n4827:{id:"n4827",loc:[-85.624019,41.949647]},n4828:{id:"n4828",loc:[-85.624024,41.950093]},n4829:{id:"n4829",loc:[-85.622885,41.949711]},n483:{id:"n483",loc:[-85.63425,41.941819]},n4830:{id:"n4830",loc:[-85.624584,41.951049]},n4831:{id:"n4831",loc:[-85.624669,41.9511]},n4832:{id:"n4832",loc:[-85.624316,41.952218]},n4833:{id:"n4833",loc:[-85.623819,41.952094]},n4834:{id:"n4834",loc:[-85.623385,41.952101]},n4835:{id:"n4835",loc:[-85.623456,41.951238]},n4836:{id:"n4836",loc:[-85.623535,41.951051]},n4837:{id:"n4837",loc:[-85.624693,41.950921]},n4838:{id:"n4838",loc:[-85.624727,41.950897]},n4839:{id:"n4839",loc:[-85.624869,41.950341]},n484:{id:"n484",loc:[-85.634324,41.942131]},n4840:{id:"n4840",loc:[-85.624859,41.949284]},n4841:{id:"n4841",loc:[-85.624788,41.949262]},n4842:{id:"n4842",loc:[-85.62402,41.949265]},n4843:{id:"n4843",loc:[-85.610382,41.954663]},n4844:{id:"n4844",loc:[-85.605675,41.954667]},n4845:{id:"n4845",loc:[-85.605669,41.949407]},n4846:{id:"n4846",loc:[-85.610376,41.949404]},n4847:{id:"n4847",loc:[-85.605552,41.958536]},n4848:{id:"n4848",loc:[-85.595755,41.958588]},n4849:{id:"n4849",loc:[-85.595732,41.956419]},n485:{id:"n485",loc:[-85.634211,41.941374]},n4850:{id:"n4850",loc:[-85.596908,41.955605]},n4851:{id:"n4851",loc:[-85.597723,41.955596]},n4852:{id:"n4852",loc:[-85.597715,41.954967]},n4853:{id:"n4853",loc:[-85.5874,41.955018]},n4854:{id:"n4854",loc:[-85.586615,41.955124]},n4855:{id:"n4855",loc:[-85.58613,41.955293]},n4856:{id:"n4856",loc:[-85.586166,41.962122]},n4857:{id:"n4857",loc:[-85.587008,41.955052]},n4858:{id:"n4858",loc:[-85.591685,41.95499]},n4859:{id:"n4859",loc:[-85.591718,41.956649]},n486:{id:"n486",loc:[-85.634085,41.940704]},n4860:{id:"n4860",loc:[-85.591133,41.956649]},n4861:{id:"n4861",loc:[-85.591061,41.95582]},n4862:{id:"n4862",loc:[-85.590677,41.95613]},n4863:{id:"n4863",loc:[-85.590826,41.956369]},n4864:{id:"n4864",loc:[-85.591016,41.954991]},n4865:{id:"n4865",loc:[-85.587656,41.954855]},n4866:{id:"n4866",loc:[-85.5964,41.955274]},n4867:{id:"n4867",loc:[-85.58776,41.96178]},n4868:{id:"n4868",loc:[-85.601172,41.960448]},n4869:{id:"n4869",loc:[-85.589489,41.960478]},n487:{id:"n487",loc:[-85.635567,41.940944]},n4870:{id:"n4870",loc:[-85.586664,41.960493]},n4871:{id:"n4871",loc:[-85.591227,41.95676]},n4872:{id:"n4872",loc:[-85.589424,41.958093]},n4873:{id:"n4873",loc:[-85.588779,41.957611]},n4874:{id:"n4874",loc:[-85.590583,41.956278]},n4875:{id:"n4875",loc:[-85.590759,41.957106]},n4876:{id:"n4876",loc:[-85.592213,41.958218]},n4877:{id:"n4877",loc:[-85.592262,41.958279]},n4878:{id:"n4878",loc:[-85.592304,41.958358]},n4879:{id:"n4879",loc:[-85.592351,41.95849]},n488:{id:"n488",loc:[-85.635542,41.940919]},n4880:{id:"n4880",loc:[-85.592363,41.958605]},n4881:{id:"n4881",loc:[-85.592383,41.96047]},n4882:{id:"n4882",loc:[-85.592376,41.959808]},n4883:{id:"n4883",loc:[-85.600825,41.959779]},n4884:{id:"n4884",loc:[-85.601084,41.959844]},n4885:{id:"n4885",loc:[-85.601144,41.959908]},n4886:{id:"n4886",loc:[-85.601164,41.960008]},n4887:{id:"n4887",loc:[-85.601162,41.960125]},n4888:{id:"n4888",loc:[-85.601134,41.960221]},n4889:{id:"n4889",loc:[-85.600993,41.960353]},n489:{id:"n489",loc:[-85.635514,41.940906]},n4890:{id:"n4890",loc:[-85.600794,41.960449]},n4891:{id:"n4891",loc:[-85.60098,41.959792]},n4892:{id:"n4892",loc:[-85.601067,41.960294]},n4893:{id:"n4893",loc:[-85.596829,41.959793]},n4894:{id:"n4894",loc:[-85.596839,41.960459]},n4895:{id:"n4895",loc:[-85.589364,41.958048]},n4896:{id:"n4896",loc:[-85.587374,41.959511]},n4897:{id:"n4897",loc:[-85.587286,41.959564]},n4898:{id:"n4898",loc:[-85.587163,41.959632]},n4899:{id:"n4899",loc:[-85.586694,41.959865]},n49:{id:"n49",loc:[-85.637127,41.942757]},n490:{id:"n490",loc:[-85.635469,41.940896]},n4900:{id:"n4900",loc:[-85.586634,41.959921]},n4901:{id:"n4901",loc:[-85.586607,41.960001]},n4902:{id:"n4902",loc:[-85.586599,41.960099]},n4903:{id:"n4903",loc:[-85.586602,41.96034]},n4904:{id:"n4904",loc:[-85.586669,41.960439]},n4905:{id:"n4905",loc:[-85.586758,41.960493]},n4906:{id:"n4906",loc:[-85.586618,41.960391]},n4907:{id:"n4907",loc:[-85.591201,41.956352]},n4908:{id:"n4908",loc:[-85.59112,41.954843]},n4909:{id:"n4909",loc:[-85.591536,41.956349]},n491:{id:"n491",loc:[-85.635667,41.940826]},n4910:{id:"n4910",loc:[-85.590953,41.956354]},n4911:{id:"n4911",loc:[-85.591468,41.956406]},n4912:{id:"n4912",loc:[-85.591469,41.956478]},n4913:{id:"n4913",loc:[-85.591123,41.956481]},n4914:{id:"n4914",loc:[-85.591121,41.956409]},n4915:{id:"n4915",loc:[-85.590826,41.955954]},n4916:{id:"n4916",loc:[-85.590612,41.956115]},n4917:{id:"n4917",loc:[-85.590402,41.955962]},n4918:{id:"n4918",loc:[-85.590622,41.955804]},n4919:{id:"n4919",loc:[-85.59011,41.956502]},n492:{id:"n492",loc:[-85.636197,41.940599]},n4920:{id:"n4920",loc:[-85.589877,41.956668]},n4921:{id:"n4921",loc:[-85.589777,41.95659]},n4922:{id:"n4922",loc:[-85.59001,41.956424]},n4923:{id:"n4923",loc:[-85.589595,41.956427]},n4924:{id:"n4924",loc:[-85.589434,41.956549]},n4925:{id:"n4925",loc:[-85.589262,41.956424]},n4926:{id:"n4926",loc:[-85.589422,41.956302]},n4927:{id:"n4927",loc:[-85.589358,41.956286]},n4928:{id:"n4928",loc:[-85.5892,41.956408]},n4929:{id:"n4929",loc:[-85.589032,41.956288]},n493:{id:"n493",loc:[-85.6362,41.940686]},n4930:{id:"n4930",loc:[-85.58919,41.956166]},n4931:{id:"n4931",loc:[-85.589165,41.956132]},n4932:{id:"n4932",loc:[-85.589002,41.956253]},n4933:{id:"n4933",loc:[-85.588826,41.956122]},n4934:{id:"n4934",loc:[-85.588989,41.956001]},n4935:{id:"n4935",loc:[-85.588673,41.955757]},n4936:{id:"n4936",loc:[-85.588502,41.955882]},n4937:{id:"n4937",loc:[-85.588339,41.955759]},n4938:{id:"n4938",loc:[-85.58851,41.955633]},n4939:{id:"n4939",loc:[-85.590382,41.955892]},n494:{id:"n494",loc:[-85.635969,41.94069]},n4940:{id:"n4940",loc:[-85.589923,41.956231]},n4941:{id:"n4941",loc:[-85.58984,41.956168]},n4942:{id:"n4942",loc:[-85.5903,41.95583]},n4943:{id:"n4943",loc:[-85.589636,41.956038]},n4944:{id:"n4944",loc:[-85.589546,41.956105]},n4945:{id:"n4945",loc:[-85.589045,41.955729]},n4946:{id:"n4946",loc:[-85.589135,41.955662]},n4947:{id:"n4947",loc:[-85.590718,41.955293]},n4948:{id:"n4948",loc:[-85.590718,41.955374]},n4949:{id:"n4949",loc:[-85.589211,41.955369]},n495:{id:"n495",loc:[-85.635965,41.940561]},n4950:{id:"n4950",loc:[-85.589212,41.955287]},n4951:{id:"n4951",loc:[-85.589675,41.956817]},n4952:{id:"n4952",loc:[-85.58947,41.95697]},n4953:{id:"n4953",loc:[-85.589219,41.956784]},n4954:{id:"n4954",loc:[-85.589425,41.95663]},n4955:{id:"n4955",loc:[-85.589373,41.95702]},n4956:{id:"n4956",loc:[-85.589171,41.957172]},n4957:{id:"n4957",loc:[-85.588962,41.957019]},n4958:{id:"n4958",loc:[-85.589164,41.956867]},n4959:{id:"n4959",loc:[-85.588881,41.955006]},n496:{id:"n496",loc:[-85.636031,41.94056]},n4960:{id:"n4960",loc:[-85.588804,41.955006]},n4961:{id:"n4961",loc:[-85.604773,41.954521]},n4962:{id:"n4962",loc:[-85.601603,41.954527]},n4963:{id:"n4963",loc:[-85.600823,41.954169]},n4964:{id:"n4964",loc:[-85.600828,41.950191]},n4965:{id:"n4965",loc:[-85.601673,41.949457]},n4966:{id:"n4966",loc:[-85.604464,41.949488]},n4967:{id:"n4967",loc:[-85.60538,41.950212]},n4968:{id:"n4968",loc:[-85.605395,41.954108]},n4969:{id:"n4969",loc:[-85.604771,41.954109]},n497:{id:"n497",loc:[-85.636032,41.940602]},n4970:{id:"n4970",loc:[-85.600613,41.953916]},n4971:{id:"n4971",loc:[-85.599758,41.954649]},n4972:{id:"n4972",loc:[-85.591194,41.954663]},n4973:{id:"n4973",loc:[-85.591182,41.950465]},n4974:{id:"n4974",loc:[-85.591871,41.950464]},n4975:{id:"n4975",loc:[-85.591868,41.949209]},n4976:{id:"n4976",loc:[-85.592155,41.949209]},n4977:{id:"n4977",loc:[-85.592155,41.94848]},n4978:{id:"n4978",loc:[-85.600615,41.948482]},n4979:{id:"n4979",loc:[-85.605421,41.949378]},n498:{id:"n498",loc:[-85.635776,41.940583]},n4980:{id:"n4980",loc:[-85.600614,41.949373]},n4981:{id:"n4981",loc:[-85.601316,41.94849]},n4982:{id:"n4982",loc:[-85.601592,41.947641]},n4983:{id:"n4983",loc:[-85.60395,41.947618]},n4984:{id:"n4984",loc:[-85.603973,41.948114]},n4985:{id:"n4985",loc:[-85.605398,41.948103]},n4986:{id:"n4986",loc:[-85.614017,41.965566]},n4987:{id:"n4987",loc:[-85.605787,41.965619]},n4988:{id:"n4988",loc:[-85.60577,41.963821]},n4989:{id:"n4989",loc:[-85.612886,41.963808]},n499:{id:"n499",loc:[-85.63589,41.940578]},n4990:{id:"n4990",loc:[-85.613207,41.963705]},n4991:{id:"n4991",loc:[-85.613511,41.963525]},n4992:{id:"n4992",loc:[-85.613667,41.963305]},n4993:{id:"n4993",loc:[-85.613779,41.962983]},n4994:{id:"n4994",loc:[-85.613797,41.959709]},n4995:{id:"n4995",loc:[-85.613663,41.95936]},n4996:{id:"n4996",loc:[-85.61339,41.959064]},n4997:{id:"n4997",loc:[-85.610503,41.956898]},n4998:{id:"n4998",loc:[-85.610485,41.956595]},n4999:{id:"n4999",loc:[-85.613892,41.956621]},n5:{id:"n5",loc:[-85.622744,41.95268]},n50:{id:"n50",loc:[-85.636673,41.943143]},n500:{id:"n500",loc:[-85.636198,41.940578]},n5000:{id:"n5000",loc:[-85.613866,41.958574]},n5001:{id:"n5001",loc:[-85.615262,41.958561]},n5002:{id:"n5002",loc:[-85.615279,41.959541]},n5003:{id:"n5003",loc:[-85.615314,41.95597]},n5004:{id:"n5004",loc:[-85.613887,41.955988]},n5005:{id:"n5005",loc:[-85.613074,41.962244]},n5006:{id:"n5006",loc:[-85.611678,41.963354]},n5007:{id:"n5007",loc:[-85.611678,41.963487]},n5008:{id:"n5008",loc:[-85.606906,41.963502]},n5009:{id:"n5009",loc:[-85.605777,41.962657]},n501:{id:"n501",loc:[-85.636251,41.940584]},n5010:{id:"n5010",loc:[-85.605711,41.9599]},n5011:{id:"n5011",loc:[-85.608139,41.9585]},n5012:{id:"n5012",loc:[-85.60814,41.956306]},n5013:{id:"n5013",loc:[-85.608854,41.95581]},n5014:{id:"n5014",loc:[-85.610039,41.955883]},n5015:{id:"n5015",loc:[-85.610068,41.956754]},n5016:{id:"n5016",loc:[-85.613058,41.959411]},n5017:{id:"n5017",loc:[-85.610234,41.957068]},n5018:{id:"n5018",loc:[-85.609826,41.95581]},n5019:{id:"n5019",loc:[-85.606987,41.958505]},n502:{id:"n502",loc:[-85.636279,41.940605]},n5020:{id:"n5020",loc:[-85.606498,41.958846]},n5021:{id:"n5021",loc:[-85.606013,41.959342]},n5022:{id:"n5022",loc:[-85.614553,41.961581]},n5023:{id:"n5023",loc:[-85.61465,41.96214]},n5024:{id:"n5024",loc:[-85.615277,41.962442]},n5025:{id:"n5025",loc:[-85.615451,41.962972]},n5026:{id:"n5026",loc:[-85.614355,41.964826]},n5027:{id:"n5027",loc:[-85.615133,41.964589]},n5028:{id:"n5028",loc:[-85.615342,41.963818]},n5029:{id:"n5029",loc:[-85.615971,41.963792]},n503:{id:"n503",loc:[-85.636285,41.940633]},n5030:{id:"n5030",loc:[-85.615751,41.963122]},n5031:{id:"n5031",loc:[-85.616575,41.963123]},n5032:{id:"n5032",loc:[-85.612527,41.963846]},n5033:{id:"n5033",loc:[-85.630653,41.940709]},n5034:{id:"n5034",loc:[-85.629858,41.939568]},n5035:{id:"n5035",loc:[-85.629847,41.937926]},n504:{id:"n504",loc:[-85.636281,41.940662]},n505:{id:"n505",loc:[-85.636266,41.940688]},n506:{id:"n506",loc:[-85.636236,41.940701]},n507:{id:"n507",loc:[-85.63619,41.940706]},n508:{id:"n508",loc:[-85.635892,41.940707]},n509:{id:"n509",loc:[-85.635777,41.9407]},n51:{id:"n51",loc:[-85.636673,41.942864]},n510:{id:"n510",loc:[-85.636044,41.940578]},n511:{id:"n511",loc:[-85.635946,41.940578]},n512:{id:"n512",loc:[-85.636475,41.940732]},n513:{id:"n513",loc:[-85.636475,41.940777]},n514:{id:"n514",loc:[-85.636405,41.940777]},n515:{id:"n515",loc:[-85.636405,41.940732]},n516:{id:"n516",loc:[-85.636471,41.940916]},n517:{id:"n517",loc:[-85.636471,41.940961]},n518:{id:"n518",loc:[-85.636404,41.940961]},n519:{id:"n519",loc:[-85.636404,41.940916]},n52:{id:"n52",loc:[-85.636227,41.942864]},n520:{id:"n520",loc:[-85.636286,41.941127]},n521:{id:"n521",loc:[-85.636203,41.941126]},n522:{id:"n522",loc:[-85.636204,41.941083]},n523:{id:"n523",loc:[-85.636287,41.941083]},n524:{id:"n524",loc:[-85.636124,41.941064]},n525:{id:"n525",loc:[-85.636,41.941065]},n526:{id:"n526",loc:[-85.636,41.940964]},n527:{id:"n527",loc:[-85.636045,41.940964]},n528:{id:"n528",loc:[-85.636045,41.940928]},n529:{id:"n529",loc:[-85.636111,41.940928]},n53:{id:"n53",loc:[-85.636227,41.943143]},n530:{id:"n530",loc:[-85.636111,41.940961]},n531:{id:"n531",loc:[-85.636123,41.940961]},n532:{id:"n532",loc:[-85.636124,41.940997]},n533:{id:"n533",loc:[-85.636164,41.940997]},n534:{id:"n534",loc:[-85.636164,41.941044]},n535:{id:"n535",loc:[-85.636124,41.941044]},n536:{id:"n536",loc:[-85.636534,41.941256]},n537:{id:"n537",loc:[-85.63645,41.941246]},n538:{id:"n538",loc:[-85.636462,41.941189]},n539:{id:"n539",loc:[-85.636546,41.941199]},n54:{id:"n54",loc:[-85.636198,41.943119]},n540:{id:"n540",loc:[-85.636802,41.941226]},n541:{id:"n541",loc:[-85.636701,41.941215]},n542:{id:"n542",loc:[-85.636709,41.941174]},n543:{id:"n543",loc:[-85.636656,41.941168]},n544:{id:"n544",loc:[-85.636666,41.941122]},n545:{id:"n545",loc:[-85.636781,41.941136]},n546:{id:"n546",loc:[-85.636774,41.94117]},n547:{id:"n547",loc:[-85.636812,41.941175]},n548:{id:"n548",loc:[-85.636803,41.941047]},n549:{id:"n549",loc:[-85.636785,41.941047]},n55:{id:"n55",loc:[-85.635945,41.94312]},n550:{id:"n550",loc:[-85.636785,41.941058]},n551:{id:"n551",loc:[-85.636644,41.941059]},n552:{id:"n552",loc:[-85.636644,41.941038]},n553:{id:"n553",loc:[-85.636581,41.941039]},n554:{id:"n554",loc:[-85.636581,41.940995]},n555:{id:"n555",loc:[-85.636746,41.940995]},n556:{id:"n556",loc:[-85.636746,41.940978]},n557:{id:"n557",loc:[-85.636803,41.940978]},n558:{id:"n558",loc:[-85.636781,41.940768]},n559:{id:"n559",loc:[-85.636783,41.940828]},n56:{id:"n56",loc:[-85.635943,41.942909]},n560:{id:"n560",loc:[-85.636761,41.940828]},n561:{id:"n561",loc:[-85.636762,41.940857]},n562:{id:"n562",loc:[-85.636641,41.940859]},n563:{id:"n563",loc:[-85.63664,41.940805]},n564:{id:"n564",loc:[-85.636676,41.940804]},n565:{id:"n565",loc:[-85.636675,41.940769]},n566:{id:"n566",loc:[-85.636733,41.94033]},n567:{id:"n567",loc:[-85.636471,41.940334]},n568:{id:"n568",loc:[-85.636469,41.940262]},n569:{id:"n569",loc:[-85.636731,41.940257]},n57:{id:"n57",loc:[-85.636227,41.942909]},n570:{id:"n570",loc:[-85.636798,41.940419]},n571:{id:"n571",loc:[-85.6368,41.940524]},n572:{id:"n572",loc:[-85.63664,41.940526]},n573:{id:"n573",loc:[-85.636638,41.940421]},n574:{id:"n574",loc:[-85.636372,41.940551]},n575:{id:"n575",loc:[-85.636338,41.94055]},n576:{id:"n576",loc:[-85.636339,41.940524]},n577:{id:"n577",loc:[-85.636373,41.940525]},n578:{id:"n578",loc:[-85.636388,41.940435]},n579:{id:"n579",loc:[-85.636222,41.940436]},n58:{id:"n58",loc:[-85.63627,41.943175]},n580:{id:"n580",loc:[-85.636222,41.940366]},n581:{id:"n581",loc:[-85.636387,41.940365]},n582:{id:"n582",loc:[-85.636158,41.940482]},n583:{id:"n583",loc:[-85.635963,41.940484]},n584:{id:"n584",loc:[-85.635961,41.940399]},n585:{id:"n585",loc:[-85.636156,41.940397]},n586:{id:"n586",loc:[-85.635987,41.940314]},n587:{id:"n587",loc:[-85.635987,41.940268]},n588:{id:"n588",loc:[-85.635968,41.940268]},n589:{id:"n589",loc:[-85.635967,41.940212]},n59:{id:"n59",loc:[-85.635531,41.943176]},n590:{id:"n590",loc:[-85.636082,41.940211]},n591:{id:"n591",loc:[-85.636083,41.94027]},n592:{id:"n592",loc:[-85.636064,41.94027]},n593:{id:"n593",loc:[-85.636064,41.940313]},n594:{id:"n594",loc:[-85.638071,41.941562]},n595:{id:"n595",loc:[-85.637953,41.941562]},n596:{id:"n596",loc:[-85.637952,41.941522]},n597:{id:"n597",loc:[-85.637876,41.941523]},n598:{id:"n598",loc:[-85.637876,41.941471]},n599:{id:"n599",loc:[-85.638035,41.94147]},n6:{id:"n6",loc:[-85.624925,41.950604]},n60:{id:"n60",loc:[-85.63542,41.942883]},n600:{id:"n600",loc:[-85.638035,41.941513]},n601:{id:"n601",loc:[-85.638071,41.941512]},n602:{id:"n602",loc:[-85.637038,41.942543],tags:{crossing:"zebra",highway:"crossing"}},n603:{id:"n603",loc:[-85.637134,41.942542]},n604:{id:"n604",loc:[-85.638122,41.942532]},n605:{id:"n605",loc:[-85.638121,41.942478]},n606:{id:"n606",loc:[-85.638104,41.941424]},n607:{id:"n607",loc:[-85.637115,41.941438]},n608:{id:"n608",loc:[-85.637133,41.942453]},n609:{id:"n609",loc:[-85.637429,41.942004]},n61:{id:"n61",loc:[-85.635701,41.942802]},n610:{id:"n610",loc:[-85.637125,41.942004]},n611:{id:"n611",loc:[-85.637022,41.942004]},n612:{id:"n612",loc:[-85.635952,41.943579]},n613:{id:"n613",loc:[-85.635872,41.943594]},n614:{id:"n614",loc:[-85.635857,41.943551]},n615:{id:"n615",loc:[-85.635937,41.943535]},n616:{id:"n616",loc:[-85.63671,41.94344]},n617:{id:"n617",loc:[-85.636427,41.94334]},n618:{id:"n618",loc:[-85.635353,41.943279]},n619:{id:"n619",loc:[-85.635319,41.943257]},n62:{id:"n62",loc:[-85.6358,41.942997]},n620:{id:"n620",loc:[-85.638786,41.943105]},n621:{id:"n621",loc:[-85.634957,41.943146]},n622:{id:"n622",loc:[-85.635012,41.943119]},n623:{id:"n623",loc:[-85.632409,41.944222]},n624:{id:"n624",loc:[-85.631863,41.944749]},n625:{id:"n625",loc:[-85.631915,41.944722]},n626:{id:"n626",loc:[-85.631884,41.94464]},n627:{id:"n627",loc:[-85.631792,41.944359]},n628:{id:"n628",loc:[-85.631817,41.944703]},n629:{id:"n629",loc:[-85.633464,41.945787]},n63:{id:"n63",loc:[-85.635808,41.943176]},n630:{id:"n630",loc:[-85.633583,41.945919]},n631:{id:"n631",loc:[-85.63382,41.945698]},n632:{id:"n632",loc:[-85.633681,41.945571]},n633:{id:"n633",loc:[-85.634217,41.946824]},n634:{id:"n634",loc:[-85.634271,41.946836]},n635:{id:"n635",loc:[-85.634319,41.94573]},n636:{id:"n636",loc:[-85.634377,41.945672]},n637:{id:"n637",loc:[-85.634909,41.945354]},n638:{id:"n638",loc:[-85.634726,41.945493],tags:{artwork_type:"mural",tourism:"artwork"}},n639:{id:"n639",loc:[-85.63546,41.945612]},n64:{id:"n64",loc:[-85.63631,41.943253]},n640:{id:"n640",loc:[-85.635561,41.945493]},n641:{id:"n641",loc:[-85.635417,41.945565]},n642:{id:"n642",loc:[-85.635315,41.945583]},n643:{id:"n643",loc:[-85.63506,41.945383]},n644:{id:"n644",loc:[-85.635198,41.945199]},n645:{id:"n645",loc:[-85.635361,41.94558]},n646:{id:"n646",loc:[-85.635017,41.945066]},n647:{id:"n647",loc:[-85.634779,41.945206]},n648:{id:"n648",loc:[-85.63425,41.945655]},n649:{id:"n649",loc:[-85.634247,41.945631]},n65:{id:"n65",loc:[-85.635398,41.943259]},n650:{id:"n650",loc:[-85.634889,41.945921]},n651:{id:"n651",loc:[-85.634889,41.945939]},n652:{id:"n652",loc:[-85.634889,41.945761]},n653:{id:"n653",loc:[-85.634889,41.945778]},n654:{id:"n654",loc:[-85.635112,41.945715]},n655:{id:"n655",loc:[-85.635025,41.945714]},n656:{id:"n656",loc:[-85.635027,41.945761]},n657:{id:"n657",loc:[-85.635438,41.945665]},n658:{id:"n658",loc:[-85.635416,41.945676]},n659:{id:"n659",loc:[-85.635401,41.945709]},n66:{id:"n66",loc:[-85.635336,41.943036]},n660:{id:"n660",loc:[-85.635271,41.945566]},n661:{id:"n661",loc:[-85.636106,41.946268]},n662:{id:"n662",loc:[-85.635867,41.946747]},n663:{id:"n663",loc:[-85.636476,41.946797]},n664:{id:"n664",loc:[-85.63651,41.946796]},n665:{id:"n665",loc:[-85.635367,41.946389]},n666:{id:"n666",loc:[-85.635367,41.946437]},n667:{id:"n667",loc:[-85.634787,41.946441]},n668:{id:"n668",loc:[-85.6358,41.946243]},n669:{id:"n669",loc:[-85.635784,41.94622]},n67:{id:"n67",loc:[-85.635911,41.942899]},n670:{id:"n670",loc:[-85.635727,41.946195]},n671:{id:"n671",loc:[-85.635708,41.946588]},n672:{id:"n672",loc:[-85.635648,41.946561]},n673:{id:"n673",loc:[-85.635624,41.946555]},n674:{id:"n674",loc:[-85.635417,41.946559]},n675:{id:"n675",loc:[-85.634866,41.946561]},n676:{id:"n676",loc:[-85.634866,41.946543]},n677:{id:"n677",loc:[-85.635085,41.946546]},n678:{id:"n678",loc:[-85.635085,41.946554]},n679:{id:"n679",loc:[-85.634584,41.94488]},n68:{id:"n68",loc:[-85.635915,41.943156]},n680:{id:"n680",loc:[-85.634557,41.944882]},n681:{id:"n681",loc:[-85.634455,41.944943]},n682:{id:"n682",loc:[-85.634305,41.944968]},n683:{id:"n683",loc:[-85.634261,41.944927]},n684:{id:"n684",loc:[-85.634132,41.944741]},n685:{id:"n685",loc:[-85.633705,41.944759]},n686:{id:"n686",loc:[-85.633918,41.944616]},n687:{id:"n687",loc:[-85.633974,41.944663]},n688:{id:"n688",loc:[-85.6336,41.944665]},n689:{id:"n689",loc:[-85.633817,41.944528]},n69:{id:"n69",loc:[-85.63631,41.943157]},n690:{id:"n690",loc:[-85.633889,41.944485]},n691:{id:"n691",loc:[-85.633931,41.944525]},n692:{id:"n692",loc:[-85.633864,41.944563]},n693:{id:"n693",loc:[-85.633456,41.944524]},n694:{id:"n694",loc:[-85.633676,41.944399]},n695:{id:"n695",loc:[-85.633352,41.944415]},n696:{id:"n696",loc:[-85.633655,41.944234]},n697:{id:"n697",loc:[-85.633761,41.94435]},n698:{id:"n698",loc:[-85.633254,41.944318]},n699:{id:"n699",loc:[-85.633472,41.944188]},n7:{id:"n7",loc:[-85.638791,41.943231]},n70:{id:"n70",loc:[-85.63579,41.942967]},n700:{id:"n700",loc:[-85.633524,41.944237]},n701:{id:"n701",loc:[-85.633583,41.944202]},n702:{id:"n702",loc:[-85.633632,41.944247]},n703:{id:"n703",loc:[-85.633165,41.944228]},n704:{id:"n704",loc:[-85.633388,41.944105]},n705:{id:"n705",loc:[-85.633117,41.944175]},n706:{id:"n706",loc:[-85.633302,41.944077]},n707:{id:"n707",loc:[-85.633352,41.944126]},n708:{id:"n708",loc:[-85.633052,41.944107]},n709:{id:"n709",loc:[-85.633237,41.944009]},n71:{id:"n71",loc:[-85.637506,41.942824]},n710:{id:"n710",loc:[-85.633187,41.943955]},n711:{id:"n711",loc:[-85.633,41.944054]},n712:{id:"n712",loc:[-85.633155,41.944265]},n713:{id:"n713",loc:[-85.633669,41.944765]},n714:{id:"n714",loc:[-85.634468,41.945503]},n715:{id:"n715",loc:[-85.63455,41.945566]},n716:{id:"n716",loc:[-85.634737,41.945729]},n717:{id:"n717",loc:[-85.634753,41.945752]},n718:{id:"n718",loc:[-85.634756,41.945781]},n719:{id:"n719",loc:[-85.634758,41.945978]},n72:{id:"n72",loc:[-85.637511,41.943056]},n720:{id:"n720",loc:[-85.634363,41.945548],tags:{crossing:"zebra",highway:"crossing"}},n721:{id:"n721",loc:[-85.634245,41.945599]},n722:{id:"n722",loc:[-85.633474,41.944889]},n723:{id:"n723",loc:[-85.632997,41.944418]},n724:{id:"n724",loc:[-85.63278,41.944183]},n725:{id:"n725",loc:[-85.63331,41.944429]},n726:{id:"n726",loc:[-85.633568,41.944829],tags:{crossing:"zebra",highway:"crossing"}},n727:{id:"n727",loc:[-85.634669,41.94567]},n728:{id:"n728",loc:[-85.634462,41.945787]},n729:{id:"n729",loc:[-85.634272,41.945625]},n73:{id:"n73",loc:[-85.637361,41.943058]},n730:{id:"n730",loc:[-85.634344,41.945699],tags:{crossing:"zebra",highway:"crossing"}},n731:{id:"n731",loc:[-85.634426,41.945783]},n732:{id:"n732",loc:[-85.632425,41.944137]},n733:{id:"n733",loc:[-85.632302,41.944192]},n734:{id:"n734",loc:[-85.632762,41.944174]},n735:{id:"n735",loc:[-85.632713,41.944179]},n736:{id:"n736",loc:[-85.632411,41.944327]},n737:{id:"n737",loc:[-85.632362,41.944341]},n738:{id:"n738",loc:[-85.632236,41.944204]},n739:{id:"n739",loc:[-85.634939,41.942165]},n74:{id:"n74",loc:[-85.637356,41.942825]},n740:{id:"n740",loc:[-85.635079,41.941535]},n741:{id:"n741",loc:[-85.635112,41.941595]},n742:{id:"n742",loc:[-85.635113,41.941633]},n743:{id:"n743",loc:[-85.635067,41.941652]},n744:{id:"n744",loc:[-85.634989,41.941651]},n745:{id:"n745",loc:[-85.634921,41.941609]},n746:{id:"n746",loc:[-85.634881,41.941544]},n747:{id:"n747",loc:[-85.635537,41.940939]},n748:{id:"n748",loc:[-85.635573,41.941048]},n749:{id:"n749",loc:[-85.635453,41.94091]},n75:{id:"n75",loc:[-85.638097,41.942833]},n750:{id:"n750",loc:[-85.635319,41.940943]},n751:{id:"n751",loc:[-85.637057,41.943224]},n752:{id:"n752",loc:[-85.636989,41.943296]},n753:{id:"n753",loc:[-85.636851,41.943299]},n754:{id:"n754",loc:[-85.636848,41.94322]},n755:{id:"n755",loc:[-85.636986,41.943217]},n756:{id:"n756",loc:[-85.637569,41.943454]},n757:{id:"n757",loc:[-85.637437,41.943458]},n758:{id:"n758",loc:[-85.637432,41.943384]},n759:{id:"n759",loc:[-85.637564,41.94338]},n76:{id:"n76",loc:[-85.638098,41.942912]},n760:{id:"n760",loc:[-85.637213,41.943378]},n761:{id:"n761",loc:[-85.637217,41.943435]},n762:{id:"n762",loc:[-85.637235,41.943434]},n763:{id:"n763",loc:[-85.637237,41.943465]},n764:{id:"n764",loc:[-85.637424,41.943459]},n765:{id:"n765",loc:[-85.637418,41.943371]},n766:{id:"n766",loc:[-85.638094,41.943149]},n767:{id:"n767",loc:[-85.638096,41.943201]},n768:{id:"n768",loc:[-85.638041,41.943202]},n769:{id:"n769",loc:[-85.638042,41.943216]},n77:{id:"n77",loc:[-85.637705,41.942913]},n770:{id:"n770",loc:[-85.637927,41.943218]},n771:{id:"n771",loc:[-85.637926,41.943201]},n772:{id:"n772",loc:[-85.637897,41.943201]},n773:{id:"n773",loc:[-85.637896,41.943155]},n774:{id:"n774",loc:[-85.637962,41.943153]},n775:{id:"n775",loc:[-85.637962,41.943134]},n776:{id:"n776",loc:[-85.638017,41.943132]},n777:{id:"n777",loc:[-85.638018,41.943151]},n778:{id:"n778",loc:[-85.638045,41.943289]},n779:{id:"n779",loc:[-85.638048,41.943363]},n78:{id:"n78",loc:[-85.637705,41.942834]},n780:{id:"n780",loc:[-85.637842,41.943367]},n781:{id:"n781",loc:[-85.637839,41.943296]},n782:{id:"n782",loc:[-85.637896,41.943295]},n783:{id:"n783",loc:[-85.637897,41.943314]},n784:{id:"n784",loc:[-85.637957,41.943312]},n785:{id:"n785",loc:[-85.637957,41.943291]},n786:{id:"n786",loc:[-85.637816,41.943375]},n787:{id:"n787",loc:[-85.637815,41.943416]},n788:{id:"n788",loc:[-85.637715,41.943415]},n789:{id:"n789",loc:[-85.637716,41.943374]},n79:{id:"n79",loc:[-85.638071,41.942298]},n790:{id:"n790",loc:[-85.637912,41.943545]},n791:{id:"n791",loc:[-85.637909,41.943479]},n792:{id:"n792",loc:[-85.637967,41.943477]},n793:{id:"n793",loc:[-85.637967,41.94346]},n794:{id:"n794",loc:[-85.638077,41.943457]},n795:{id:"n795",loc:[-85.638078,41.943473]},n796:{id:"n796",loc:[-85.638124,41.943471]},n797:{id:"n797",loc:[-85.638126,41.943514]},n798:{id:"n798",loc:[-85.638079,41.943515]},n799:{id:"n799",loc:[-85.638079,41.943532]},n8:{id:"n8",loc:[-85.635241,41.941948]},n80:{id:"n80",loc:[-85.638074,41.942431]},n800:{id:"n800",loc:[-85.638028,41.943534]},n801:{id:"n801",loc:[-85.638028,41.943542]},n802:{id:"n802",loc:[-85.638845,41.942983]},n803:{id:"n803",loc:[-85.638846,41.94305]},n804:{id:"n804",loc:[-85.638661,41.943052]},n805:{id:"n805",loc:[-85.63866,41.942984]},n806:{id:"n806",loc:[-85.638579,41.942753]},n807:{id:"n807",loc:[-85.638445,41.942755]},n808:{id:"n808",loc:[-85.638452,41.942978]},n809:{id:"n809",loc:[-85.638545,41.942976]},n81:{id:"n81",loc:[-85.637836,41.942433]},n810:{id:"n810",loc:[-85.638543,41.942935]},n811:{id:"n811",loc:[-85.638571,41.942934]},n812:{id:"n812",loc:[-85.63857,41.942901]},n813:{id:"n813",loc:[-85.638611,41.9429]},n814:{id:"n814",loc:[-85.638607,41.942769]},n815:{id:"n815",loc:[-85.63858,41.94277]},n816:{id:"n816",loc:[-85.638597,41.942614]},n817:{id:"n817",loc:[-85.638601,41.94273]},n818:{id:"n818",loc:[-85.638686,41.942731]},n819:{id:"n819",loc:[-85.638689,41.942917]},n82:{id:"n82",loc:[-85.637835,41.94242]},n820:{id:"n820",loc:[-85.638558,41.943018]},n821:{id:"n821",loc:[-85.638243,41.943019]},n822:{id:"n822",loc:[-85.637536,41.943887]},n823:{id:"n823",loc:[-85.63749,41.943926]},n824:{id:"n824",loc:[-85.63743,41.943886]},n825:{id:"n825",loc:[-85.637476,41.943847]},n826:{id:"n826",loc:[-85.637527,41.943846]},n827:{id:"n827",loc:[-85.637141,41.943728]},n828:{id:"n828",loc:[-85.637201,41.943755]},n829:{id:"n829",loc:[-85.636987,41.943608]},n83:{id:"n83",loc:[-85.63776,41.942421]},n830:{id:"n830",loc:[-85.637441,41.943807]},n831:{id:"n831",loc:[-85.637673,41.94399]},n832:{id:"n832",loc:[-85.637783,41.944137]},n833:{id:"n833",loc:[-85.63845,41.944333]},n834:{id:"n834",loc:[-85.638159,41.944248]},n835:{id:"n835",loc:[-85.637859,41.94416]},n836:{id:"n836",loc:[-85.638685,41.944542]},n837:{id:"n837",loc:[-85.638714,41.944611]},n838:{id:"n838",loc:[-85.638711,41.944757]},n839:{id:"n839",loc:[-85.638774,41.945069]},n84:{id:"n84",loc:[-85.637758,41.942339]},n840:{id:"n840",loc:[-85.638742,41.945205]},n841:{id:"n841",loc:[-85.640267,41.942403]},n842:{id:"n842",loc:[-85.640154,41.942404]},n843:{id:"n843",loc:[-85.640152,41.942249]},n844:{id:"n844",loc:[-85.640266,41.942248]},n845:{id:"n845",loc:[-85.640366,41.942599]},n846:{id:"n846",loc:[-85.640362,41.942192]},n847:{id:"n847",loc:[-85.640146,41.942191]},n848:{id:"n848",loc:[-85.640122,41.942196]},n849:{id:"n849",loc:[-85.640108,41.942211]},n85:{id:"n85",loc:[-85.637836,41.942339]},n850:{id:"n850",loc:[-85.640101,41.942236]},n851:{id:"n851",loc:[-85.640103,41.94241]},n852:{id:"n852",loc:[-85.64011,41.942435]},n853:{id:"n853",loc:[-85.640126,41.942445]},n854:{id:"n854",loc:[-85.640153,41.942451]},n855:{id:"n855",loc:[-85.640183,41.942452]},n856:{id:"n856",loc:[-85.640364,41.942452]},n857:{id:"n857",loc:[-85.640007,41.942452]},n858:{id:"n858",loc:[-85.639449,41.942461]},n859:{id:"n859",loc:[-85.640049,41.942391]},n86:{id:"n86",loc:[-85.637835,41.942301]},n860:{id:"n860",loc:[-85.640052,41.942503]},n861:{id:"n861",loc:[-85.639575,41.94251]},n862:{id:"n862",loc:[-85.639572,41.942398]},n863:{id:"n863",loc:[-85.638782,41.942227]},n864:{id:"n864",loc:[-85.63843,41.942226]},n865:{id:"n865",loc:[-85.63823,41.942183]},n866:{id:"n866",loc:[-85.638363,41.942216],tags:{barrier:"gate"}},n867:{id:"n867",loc:[-85.6384,41.942223]},n868:{id:"n868",loc:[-85.636042,41.942797]},n869:{id:"n869",loc:[-85.636308,41.942752]},n87:{id:"n87",loc:[-85.637566,41.942367]},n870:{id:"n870",loc:[-85.636516,41.942729]},n871:{id:"n871",loc:[-85.636782,41.942712]},n872:{id:"n872",loc:[-85.636944,41.942706]},n873:{id:"n873",loc:[-85.63704,41.942706]},n874:{id:"n874",loc:[-85.637237,41.942703]},n875:{id:"n875",loc:[-85.637553,41.9427]},n876:{id:"n876",loc:[-85.638236,41.942697]},n877:{id:"n877",loc:[-85.636284,41.942781]},n878:{id:"n878",loc:[-85.636551,41.942641]},n879:{id:"n879",loc:[-85.633914,41.943693]},n88:{id:"n88",loc:[-85.637566,41.94241]},n880:{id:"n880",loc:[-85.63389,41.943708]},n881:{id:"n881",loc:[-85.633866,41.943686]},n882:{id:"n882",loc:[-85.63389,41.943671]},n883:{id:"n883",loc:[-85.633857,41.943609]},n884:{id:"n884",loc:[-85.634858,41.944474]},n885:{id:"n885",loc:[-85.633988,41.943234]},n886:{id:"n886",loc:[-85.633999,41.943485]},n887:{id:"n887",loc:[-85.634109,41.943449],tags:{emergency:"fire_hydrant"}},n888:{id:"n888",loc:[-85.635728,41.942655],tags:{emergency:"fire_hydrant"}},n889:{id:"n889",loc:[-85.636499,41.942845],tags:{man_made:"flagpole"}},n89:{id:"n89",loc:[-85.637455,41.94241]},n890:{id:"n890",loc:[-85.636197,41.943073]},n891:{id:"n891",loc:[-85.636227,41.943073]},n892:{id:"n892",loc:[-85.637433,41.942933],tags:{"addr:city":"Three Rivers","addr:housenumber":"401","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"restaurant",cuisine:"pizza",name:"Pizza Hut"}},n893:{id:"n893",loc:[-85.637907,41.942879],tags:{amenity:"car_wash"}},n894:{id:"n894",loc:[-85.637661,41.943018]},n895:{id:"n895",loc:[-85.636933,41.942733],tags:{emergency:"fire_hydrant"}},n896:{id:"n896",loc:[-85.637661,41.94304]},n897:{id:"n897",loc:[-85.637562,41.943041]},n898:{id:"n898",loc:[-85.637556,41.942725]},n899:{id:"n899",loc:[-85.637656,41.942724]},n9:{id:"n9",loc:[-85.635159,41.941926]},n90:{id:"n90",loc:[-85.637454,41.942367]},n900:{id:"n900",loc:[-85.637657,41.942779]},n901:{id:"n901",loc:[-85.637983,41.942777]},n902:{id:"n902",loc:[-85.637982,41.942616]},n903:{id:"n903",loc:[-85.637777,41.942778]},n904:{id:"n904",loc:[-85.637775,41.942699]},n905:{id:"n905",loc:[-85.637772,41.942618]},n906:{id:"n906",loc:[-85.637982,41.942698]},n907:{id:"n907",loc:[-85.637941,41.942378],tags:{"addr:city":"Three Rivers","addr:housenumber":"416","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",name:"Gem Pawnbroker",shop:"pawnbroker"}},n908:{id:"n908",loc:[-85.637515,41.942394],tags:{second_hand:"only",shop:"car"}},n909:{id:"n909",loc:[-85.638743,41.942374],tags:{"addr:city":"Three Rivers","addr:housenumber":"500","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",name:"William Towing","service:vehicle:towing":"yes","service:vehicle:tyres":"yes",shop:"car_repair"}},n91:{id:"n91",loc:[-85.637565,41.942341]},n910:{id:"n910",loc:[-85.638594,41.942357]},n911:{id:"n911",loc:[-85.634312,41.943562],tags:{"addr:city":"Three Rivers","addr:housenumber":"145","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",amenity:"cafe",cuisine:"coffee_shop",name:"L.A.'s Coffee Cafe",outdoor_seating:"yes"}},n912:{id:"n912",loc:[-85.634404,41.943512]},n913:{id:"n913",loc:[-85.634391,41.943519],tags:{entrance:"yes"}},n914:{id:"n914",loc:[-85.634259,41.943538],tags:{entrance:"yes"}},n915:{id:"n915",loc:[-85.634247,41.943528]},n916:{id:"n916",loc:[-85.633747,41.943322],tags:{"addr:city":"Three Rivers","addr:housenumber":"132","addr:postcode":"49093","addr:state":"MI","addr:street":"Michigan Avenue",name:"Preferred Insurance Services",office:"insurance"}},n917:{id:"n917",loc:[-85.63299,41.943686],tags:{"addr:city":"Three Rivers","addr:housenumber":"101","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Lynn's Garage","service:vehicle:tyres":"yes",shop:"car_repair"}},n918:{id:"n918",loc:[-85.633438,41.944883]},n919:{id:"n919",loc:[-85.633265,41.944983]},n92:{id:"n92",loc:[-85.637481,41.942341]},n920:{id:"n920",loc:[-85.633315,41.945027]},n921:{id:"n921",loc:[-85.633376,41.944827]},n922:{id:"n922",loc:[-85.633199,41.944922]},n923:{id:"n923",loc:[-85.633316,41.944772]},n924:{id:"n924",loc:[-85.633147,41.944867]},n925:{id:"n925",loc:[-85.633261,41.944719]},n926:{id:"n926",loc:[-85.633096,41.944812]},n927:{id:"n927",loc:[-85.633191,41.944645]},n928:{id:"n928",loc:[-85.632981,41.94476]},n929:{id:"n929",loc:[-85.633062,41.94483]},n93:{id:"n93",loc:[-85.637481,41.94226]},n930:{id:"n930",loc:[-85.633146,41.944602]},n931:{id:"n931",loc:[-85.632969,41.944703]},n932:{id:"n932",loc:[-85.633008,41.944745]},n933:{id:"n933",loc:[-85.633088,41.944545]},n934:{id:"n934",loc:[-85.632868,41.944655]},n935:{id:"n935",loc:[-85.632941,41.944718]},n936:{id:"n936",loc:[-85.633028,41.944483]},n937:{id:"n937",loc:[-85.632817,41.944605]},n938:{id:"n938",loc:[-85.632923,41.944373]},n939:{id:"n939",loc:[-85.632692,41.944485]},n94:{id:"n94",loc:[-85.637565,41.94226]},n940:{id:"n940",loc:[-85.632871,41.944316]},n941:{id:"n941",loc:[-85.632655,41.944421]},n942:{id:"n942",loc:[-85.632711,41.944478]},n943:{id:"n943",loc:[-85.632825,41.94426]},n944:{id:"n944",loc:[-85.632606,41.944363]},n945:{id:"n945",loc:[-85.63275,41.94418]},n946:{id:"n946",loc:[-85.632588,41.944256]},n947:{id:"n947",loc:[-85.632611,41.944279]},n948:{id:"n948",loc:[-85.632548,41.944306]},n949:{id:"n949",loc:[-85.632512,41.944406]},n95:{id:"n95",loc:[-85.637188,41.942217]},n950:{id:"n950",loc:[-85.632565,41.944463]},n951:{id:"n951",loc:[-85.632579,41.944456]},n952:{id:"n952",loc:[-85.632634,41.944518]},n953:{id:"n953",loc:[-85.632686,41.944569]},n954:{id:"n954",loc:[-85.632745,41.944537]},n955:{id:"n955",loc:[-85.632659,41.944587]},n956:{id:"n956",loc:[-85.632778,41.944705]},n957:{id:"n957",loc:[-85.632815,41.944301],tags:{"addr:city":"Three Rivers","addr:housenumber":"5","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Access Point Employment",office:"employment_agency"}},n958:{id:"n958",loc:[-85.6332,41.944174],tags:{"addr:city":"Three Rivers","addr:housenumber":"6","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Paisley Emporium",shop:"second_hand"}},n959:{id:"n959",loc:[-85.633578,41.944568],tags:{"addr:city":"Three Rivers","addr:housenumber":"22","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",name:"Lowry's Books",shop:"books"}},n96:{id:"n96",loc:[-85.637189,41.942303]},n960:{id:"n960",loc:[-85.63344,41.944443],tags:{"addr:city":"Three Rivers","addr:housenumber":"16","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"restaurant",cuisine:"pizza",name:"Paisano's Bar and Grill"}},n961:{id:"n961",loc:[-85.633009,41.944542],tags:{"addr:city":"Three Rivers","addr:housenumber":"13","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",amenity:"cafe",cuisine:"american",internet_access:"yes",name:"Main Street Cafe"}},n962:{id:"n962",loc:[-85.633674,41.944682],tags:{"addr:city":"Three Rivers","addr:housenumber":"28","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",leisure:"fitness_centre",name:"Main Street Fitness"}},n963:{id:"n963",loc:[-85.633376,41.944868],tags:{"addr:city":"Three Rivers","addr:housenumber":"27","addr:postcode":"49093","addr:state":"MI","addr:street":"Main Street",leisure:"fitness_centre",name:"Main Street Barbell"}},n964:{id:"n964",loc:[-85.633366,41.944783]},n965:{id:"n965",loc:[-85.633296,41.94482]},n966:{id:"n966",loc:[-85.633214,41.94487]},n967:{id:"n967",loc:[-85.633005,41.944988]},n968:{id:"n968",loc:[-85.633269,41.944816]},n969:{id:"n969",loc:[-85.633215,41.944842]},n97:{id:"n97",loc:[-85.637299,41.942302]},n970:{id:"n970",loc:[-85.633245,41.944871]},n971:{id:"n971",loc:[-85.633296,41.944845]},n972:{id:"n972",loc:[-85.633254,41.944845],tags:{natural:"tree"}},n973:{id:"n973",loc:[-85.633557,41.945515]},n974:{id:"n974",loc:[-85.633279,41.945246]},n975:{id:"n975",loc:[-85.63324,41.945226]},n976:{id:"n976",loc:[-85.6332,41.945213]},n977:{id:"n977",loc:[-85.633133,41.945164]},n978:{id:"n978",loc:[-85.63312,41.945132]},n979:{id:"n979",loc:[-85.633095,41.945081]},n98:{id:"n98",loc:[-85.637299,41.942314]},n980:{id:"n980",loc:[-85.633064,41.945047]},n981:{id:"n981",loc:[-85.632739,41.944742]},n982:{id:"n982",loc:[-85.633281,41.945026]},n983:{id:"n983",loc:[-85.633155,41.944903]},n984:{id:"n984",loc:[-85.633079,41.944829]},n985:{id:"n985",loc:[-85.63304,41.944853]},n986:{id:"n986",loc:[-85.632949,41.944776]},n987:{id:"n987",loc:[-85.632921,41.944725]},n988:{id:"n988",loc:[-85.632859,41.944673]},n989:{id:"n989",loc:[-85.632895,41.94505]},n99:{id:"n99",loc:[-85.637396,41.942313]},n990:{id:"n990",loc:[-85.633336,41.945138]},n991:{id:"n991",loc:[-85.633466,41.945265]},n992:{id:"n992",loc:[-85.633367,41.945327]},n993:{id:"n993",loc:[-85.633163,41.945189]},n994:{id:"n994",loc:[-85.633678,41.945309]},n995:{id:"n995",loc:[-85.633619,41.945261]},n996:{id:"n996",loc:[-85.63355,41.945301]},n997:{id:"n997",loc:[-85.633607,41.945352]},n998:{id:"n998",loc:[-85.633579,41.945327],tags:{entrance:"yes"}},n999:{id:"n999",loc:[-85.633445,41.945404]},r2:{id:"r2",members:[{id:"w225",role:"outer",type:"way"}],tags:{type:"multipolygon",waterway:"riverbank"}},r5:{id:"r5",members:[{id:"w642",role:"outer",type:"way"}],tags:{admin_level:"8",border_type:"city",boundary:"administrative",name:"Three Rivers",place:"city",type:"boundary"}},w1:{id:"w1",nodes:["n5","n1797"],tags:{highway:"residential",name:"12th Avenue"}},w10:{id:"w10",nodes:["n54","n55","n56","n57","n891","n890","n54"],tags:{building:"yes"}},w100:{id:"w100",nodes:["n451","n915","n452"],tags:{highway:"footway"}},w101:{id:"w101",nodes:["n461","n462","n463","n464","n465","n466"],tags:{barrier:"fence"}},w102:{id:"w102",nodes:["n467","n468","n469","n470","n472","n467"],tags:{amenity:"parking"}},w103:{id:"w103",nodes:["n2597","n2444","n471","n472"],tags:{highway:"footway"}},w104:{id:"w104",nodes:["n473","n474","n325"],tags:{footway:"sidewalk",highway:"footway"}},w105:{id:"w105",nodes:["n475","n324","n325"],tags:{footway:"sidewalk",highway:"footway"}},w106:{id:"w106",nodes:["n886","n452","n476"],tags:{footway:"sidewalk",highway:"footway"}},w107:{id:"w107",nodes:["n485","n4678","n486","n18"],tags:{highway:"service"}},w108:{id:"w108",nodes:["n300","n487","n488","n489","n490"],tags:{highway:"footway"}},w109:{id:"w109",nodes:["n490","n491"],tags:{highway:"footway"}},w11:{id:"w11",nodes:["n58","n63","n59","n315","n60"],tags:{highway:"service"}},w110:{id:"w110",nodes:["n492","n493","n494","n495","n496","n497","n492"],tags:{building:"yes"}},w111:{id:"w111",nodes:["n498","n499","n511"],tags:{highway:"service"}},w112:{id:"w112",nodes:["n510","n500","n501","n502","n503","n504","n505","n506","n507","n508","n509"],tags:{highway:"service"}},w113:{id:"w113",nodes:["n511","n510"],tags:{covered:"yes",highway:"service"}},w114:{id:"w114",nodes:["n512","n513","n514","n515","n512"],tags:{building:"yes"}},w115:{id:"w115",nodes:["n516","n517","n518","n519","n516"],tags:{building:"yes"}},w116:{id:"w116",nodes:["n520","n521","n522","n523","n520"],tags:{building:"yes"}},w117:{id:"w117",nodes:["n524","n525","n526","n527","n528","n529","n530","n531","n532","n533","n534","n535","n524"],tags:{building:"yes"}},w118:{id:"w118",nodes:["n536","n537","n538","n539","n536"],tags:{building:"yes"}},w119:{id:"w119",nodes:["n540","n541","n542","n543","n544","n545","n546","n547","n540"],tags:{building:"yes"}},w12:{id:"w12",nodes:["n61","n314","n70","n62","n63"],tags:{highway:"service"}},w120:{id:"w120",nodes:["n548","n549","n550","n551","n552","n553","n554","n555","n556","n557","n548"],tags:{building:"yes"}},w121:{id:"w121",nodes:["n558","n559","n560","n561","n562","n563","n564","n565","n558"],tags:{building:"yes"}},w122:{id:"w122",nodes:["n566","n567","n568","n569","n566"],tags:{building:"yes"}},w123:{id:"w123",nodes:["n570","n571","n572","n573","n570"],tags:{building:"yes"}},w124:{id:"w124",nodes:["n574","n575","n576","n577","n574"],tags:{building:"yes"}},w125:{id:"w125",nodes:["n578","n579","n580","n581","n578"],tags:{building:"yes"}},w126:{id:"w126",nodes:["n582","n583","n584","n585","n582"],tags:{building:"yes"}},w127:{id:"w127",nodes:["n586","n587","n588","n589","n590","n591","n592","n593","n586"],tags:{building:"yes"}},w128:{id:"w128",nodes:["n594","n595","n596","n597","n598","n599","n600","n601","n594"],tags:{building:"yes"}},w129:{id:"w129",nodes:["n309","n602","n603"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w13:{id:"w13",nodes:["n64","n65","n66","n67","n68","n69","n64"],tags:{amenity:"parking"}},w130:{id:"w130",nodes:["n603","n604"],tags:{footway:"sidewalk",highway:"footway"}},w131:{id:"w131",nodes:["n604","n605","n606"],tags:{footway:"sidewalk",highway:"footway"}},w132:{id:"w132",nodes:["n606","n607"],tags:{footway:"sidewalk",highway:"footway"}},w133:{id:"w133",nodes:["n607","n610","n608","n603"],tags:{footway:"sidewalk",highway:"footway"}},w134:{id:"w134",nodes:["n609","n610","n611"],tags:{highway:"service",service:"driveway",surface:"unpaved"}},w135:{id:"w135",nodes:["n244","n245","n246"],tags:{highway:"service"}},w136:{id:"w136",nodes:["n612","n613","n614","n615","n612"],tags:{amenity:"shelter",building:"yes"}},w137:{id:"w137",nodes:["n2779","n2788","n2776","n2778","n2775","n2787","n2440","n2437","n629","n2438","n630","n2439","n2407","n2408","n2409"],tags:{highway:"residential",name:"Foster Street"}},w138:{id:"w138",nodes:["n2779","n625","n626","n627"],tags:{highway:"residential",name:"Foster Street",oneway:"yes"}},w139:{id:"w139",nodes:["n630","n631","n632","n2437"],tags:{highway:"service"}},w14:{id:"w14",nodes:["n71","n72","n73","n74","n71"],tags:{building:"yes"}},w140:{id:"w140",nodes:["n643","n637","n715","n2410"],tags:{highway:"footway",name:"Mural Mall"}},w141:{id:"w141",nodes:["n639","n2516"],tags:{barrier:"wall"}},w142:{id:"w142",nodes:["n640","n641","n645","n642","n660","n643","n644"],tags:{highway:"service"}},w143:{id:"w143",nodes:["n646","n647"],tags:{highway:"service"}},w144:{id:"w144",nodes:["n654","n655","n656"],tags:{barrier:"wall"}},w145:{id:"w145",nodes:["n665","n666","n667"],tags:{barrier:"wall"}},w146:{id:"w146",nodes:["n2727","n662","n2719"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w147:{id:"w147",nodes:["n2725","n674"],tags:{highway:"service",oneway:"yes"}},w148:{id:"w148",nodes:["n2464","n2460","n2454","n684","n2455","n2464"],tags:{building:"yes"}},w149:{id:"w149",nodes:["n2456","n685","n686","n687","n2456"],tags:{building:"yes"}},w15:{id:"w15",nodes:["n75","n76","n77","n78","n75"],tags:{building:"yes"}},w150:{id:"w150",nodes:["n685","n688","n689","n690","n691","n692","n686","n685"],tags:{building:"yes"}},w151:{id:"w151",nodes:["n688","n693","n694","n689","n688"],tags:{building:"yes"}},w152:{id:"w152",nodes:["n693","n695","n702","n696","n697","n694","n693"],tags:{building:"yes"}},w153:{id:"w153",nodes:["n695","n698","n699","n700","n701","n702","n695"],tags:{building:"yes"}},w154:{id:"w154",nodes:["n698","n703","n707","n704","n699","n698"],tags:{building:"yes"}},w155:{id:"w155",nodes:["n703","n705","n706","n707","n703"],tags:{building:"yes"}},w156:{id:"w156",nodes:["n705","n708","n709","n706","n705"],tags:{building:"yes"}},w157:{id:"w157",nodes:["n709","n710","n711","n708","n709"],tags:{building:"yes"}},w158:{id:"w158",nodes:["n369","n712","n725","n713","n714","n715","n727","n716","n717","n718","n719"],tags:{footway:"sidewalk",highway:"footway"}},w159:{id:"w159",nodes:["n714","n720","n721"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w16:{id:"w16",nodes:["n79","n80","n81","n82","n83","n84","n85","n86","n79"],tags:{building:"yes"}},w160:{id:"w160",nodes:["n729","n721","n722","n964","n723","n724"],tags:{footway:"sidewalk",highway:"footway"}},w161:{id:"w161",nodes:["n713","n726","n722"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w162:{id:"w162",nodes:["n727","n2411","n728"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w163:{id:"w163",nodes:["n729","n730","n731"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w164:{id:"w164",nodes:["n365","n732","n733","n738"],tags:{footway:"sidewalk",highway:"footway"}},w165:{id:"w165",nodes:["n724","n734","n367","n735","n736","n737"],tags:{footway:"sidewalk",highway:"footway"}},w166:{id:"w166",nodes:["n739","n2037","n2038","n2039","n2040","n1623","n2032"],tags:{highway:"footway"}},w167:{id:"w167",nodes:["n150","n751"],tags:{highway:"service"}},w168:{id:"w168",nodes:["n752","n753","n754","n755","n752"],tags:{building:"yes"}},w169:{id:"w169",nodes:["n756","n757","n758","n759","n756"],tags:{building:"yes"}},w17:{id:"w17",nodes:["n87","n88","n89","n90","n87"],tags:{building:"yes"}},w170:{id:"w170",nodes:["n760","n761","n762","n763","n764","n765","n760"],tags:{building:"yes"}},w171:{id:"w171",nodes:["n766","n767","n768","n769","n770","n771","n772","n773","n774","n775","n776","n777","n766"],tags:{building:"yes"}},w172:{id:"w172",nodes:["n778","n779","n780","n781","n782","n783","n784","n785","n778"],tags:{building:"yes"}},w173:{id:"w173",nodes:["n786","n787","n788","n789","n786"],tags:{building:"yes"}},w174:{id:"w174",nodes:["n790","n791","n792","n793","n794","n795","n796","n797","n798","n799","n800","n801","n790"],tags:{building:"yes"}},w175:{id:"w175",nodes:["n802","n803","n804","n805","n802"],tags:{building:"yes"}},w176:{id:"w176",nodes:["n806","n807","n808","n809","n810","n811","n812","n813","n814","n815","n806"],tags:{building:"yes"}},w177:{id:"w177",nodes:["n816","n1140","n817","n818","n819","n820","n821"],tags:{highway:"service"}},w178:{id:"w178",nodes:["n822","n823","n824","n825","n822"],tags:{building:"yes"}},w179:{id:"w179",nodes:["n841","n842","n843","n844","n841"],tags:{building:"yes"}},w18:{id:"w18",nodes:["n91","n92","n93","n94","n91"],tags:{building:"yes"}},w180:{id:"w180",nodes:["n845","n856","n846"],tags:{highway:"service"}},w181:{id:"w181",nodes:["n846","n847","n848","n849","n850","n851","n852","n853","n854","n855","n856"],tags:{highway:"service",oneway:"yes",service:"drive-through"}},w182:{id:"w182",nodes:["n857","n858"],tags:{highway:"service"}},w183:{id:"w183",nodes:["n859","n860","n861","n862","n859"],tags:{amenity:"parking"}},w184:{id:"w184",nodes:["n863","n864","n867","n866","n865"],tags:{highway:"service"}},w185:{id:"w185",nodes:["n883","n884"],tags:{barrier:"fence"}},w186:{id:"w186",nodes:["n1954","n622","n1955"],tags:{highway:"path",name:"Riverwalk Trail"}},w187:{id:"w187",nodes:["n621","n1954"],tags:{highway:"steps",incline:"up",name:"Riverwalk Trail",surface:"wood"}},w188:{id:"w188",nodes:["n2274","n2275","n2276","n2277","n2278","n2279","n1953","n621"],tags:{highway:"path",name:"Riverwalk Trail",surface:"wood"}},w189:{id:"w189",nodes:["n2273","n2274"],tags:{highway:"steps",incline:"down",name:"Riverwalk Trail",surface:"wood"}},w19:{id:"w19",nodes:["n95","n96","n97","n98","n99","n100","n101","n102","n95"],tags:{building:"yes"}},w190:{id:"w190",nodes:["n821","n894","n900","n903","n901"],tags:{highway:"service"}},w191:{id:"w191",nodes:["n896","n897","n898","n899","n900","n894","n896"],tags:{amenity:"parking"}},w192:{id:"w192",nodes:["n903","n904","n905"],tags:{highway:"service"}},w193:{id:"w193",nodes:["n901","n906","n902"],tags:{highway:"service"}},w194:{id:"w194",nodes:["n912","n913"],tags:{highway:"footway"}},w195:{id:"w195",nodes:["n914","n915"],tags:{highway:"footway"}},w196:{id:"w196",nodes:["n2466","n918","n919","n920","n2466"],tags:{building:"yes"}},w197:{id:"w197",nodes:["n918","n921","n922","n919","n918"],tags:{building:"yes"}},w198:{id:"w198",nodes:["n923","n925","n926","n924","n923"],tags:{building:"yes"}},w199:{id:"w199",nodes:["n925","n927","n932","n928","n929","n926","n925"],tags:{building:"yes"}},w2:{id:"w2",nodes:["n3523","n2182","n2160"],tags:{highway:"service"}},w20:{id:"w20",nodes:["n103","n104","n105","n106","n107","n108","n109","n110","n111","n112","n113","n114","n103"],tags:{building:"yes"}},w200:{id:"w200",nodes:["n927","n930","n931","n932","n927"],tags:{building:"yes"}},w201:{id:"w201",nodes:["n930","n933","n934","n935","n931","n930"],tags:{building:"yes"}},w202:{id:"w202",nodes:["n933","n936","n937","n934","n933"],tags:{building:"yes"}},w203:{id:"w203",nodes:["n936","n938","n942","n939","n954","n937","n936"],tags:{building:"yes"}},w204:{id:"w204",nodes:["n938","n940","n941","n942","n938"],tags:{building:"yes"}},w205:{id:"w205",nodes:["n940","n943","n944","n941","n940"],tags:{building:"yes"}},w206:{id:"w206",nodes:["n943","n945","n946","n947","n948","n944","n943"],tags:{building:"yes"}},w207:{id:"w207",nodes:["n944","n949","n950","n951","n941","n944"],tags:{building:"yes"}},w208:{id:"w208",nodes:["n941","n951","n952","n939","n942","n941"],tags:{building:"yes"}},w209:{id:"w209",nodes:["n952","n953","n954","n939","n952"],tags:{building:"yes"}},w21:{id:"w21",nodes:["n115","n116","n117","n118","n115"],tags:{building:"yes"}},w210:{id:"w210",nodes:["n953","n955","n956","n934","n937","n954","n953"],tags:{building:"yes"}},w211:{id:"w211",nodes:["n964","n965"],tags:{highway:"footway"}},w212:{id:"w212",nodes:["n966","n983","n967","n989"],tags:{highway:"footway"}},w213:{id:"w213",nodes:["n965","n968","n969","n966","n970","n971","n965"],tags:{highway:"footway"}},w214:{id:"w214",nodes:["n973","n999","n992","n974","n975","n976","n993","n977","n978","n979","n980","n967","n981","n1000","n1001","n1002","n1003","n1004","n1005","n1006","n1007","n1008","n1009"],tags:{footway:"sidewalk",highway:"footway"}},w215:{id:"w215",nodes:["n978","n982","n983","n984","n985","n986","n987","n988","n981"],tags:{highway:"footway"}},w216:{id:"w216",nodes:["n976","n990","n991","n992"],tags:{highway:"footway"}},w217:{id:"w217",nodes:["n998","n999"],tags:{highway:"footway"}},w218:{id:"w218",nodes:["n1019","n1020","n1021","n1022","n731","n728","n1023","n1025","n1024","n1019"],tags:{footway:"sidewalk",highway:"footway"}},w219:{id:"w219",nodes:["n719","n1026","n1027"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w22:{id:"w22",nodes:["n119","n120","n121","n122","n119"],tags:{building:"yes"}},w220:{id:"w220",nodes:["n1027","n1028","n1019"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w221:{id:"w221",nodes:["n2080","n1828","n1863","n1829"],tags:{highway:"tertiary",name:"Constantine Street"}},w222:{id:"w222",nodes:["n1029","n1030","n1031"],tags:{highway:"service"}},w223:{id:"w223",nodes:["n2213","n2171","n2183","n2180","n2205","n2177","n2179","n2218","n2200","n2188","n2169","n2196","n2162","n2170","n2211","n2216","n2204","n2220","n2164","n2210","n2217","n2189","n460","n453","n2282"],tags:{name:"Rocky River",waterway:"river"}},w224:{id:"w224",nodes:["n3750","n3751","n3752"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w225:{id:"w225",nodes:["n2134","n2127","n2313","n2109","n2112","n2129","n2156","n2146","n2126","n2153","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n2122","n2114","n2149","n2119","n2106","n2111","n2145","n2113","n2117","n2159","n2143","n2123","n2142","n2116","n2154","n2139","n2150","n2157","n2120","n2138","n2130","n2136","n2155","n2107","n2141","n2124","n3754","n2121","n2105","n2108","n3755","n2128","n2110","n2152","n2125","n2135","n2186","n2115","n2144","n2137","n2133","n2148","n2118","n1871","n1875","n1872","n2041","n1873","n2042","n1874","n1884","n1870","n2151","n2147","n2158","n2104","n2134"]},w226:{id:"w226",nodes:["n2243","n2280","n2244","n2245","n2246","n2247","n1931","n1932","n1933","n1934","n1935","n1936","n1937","n1938","n4681","n1939","n1940","n1941","n1942","n1943","n1944","n1945","n1946","n1947"],tags:{highway:"path",name:"Riverwalk Trail",surface:"asphalt",width:"3"}},w227:{id:"w227",nodes:["n2994","n3012","n3011","n2958"],tags:{highway:"secondary",name:"Main Street"}},w228:{id:"w228",nodes:["n2747","n2762","n2757","n2746","n2761","n2758","n2760","n2755","n2749","n2691","n1028","n2432","n2414","n2413","n2412","n2411","n2410","n720","n726","n370","n368","n2748"],tags:{highway:"primary",name:"Main Street"}},w229:{id:"w229",nodes:["n2083","n2103","n2102","n2084","n2085","n2086","n2087","n2242","n471","n324","n2101","n332","n1868"],tags:{name:"Conrail Railroad",railway:"rail"}},w23:{id:"w23",nodes:["n123","n124","n125","n126","n123"],tags:{building:"yes"}},w230:{id:"w230",nodes:["n2232","n2236","n2231","n2230","n2226","n2241","n2237","n2227","n1182","n2233","n2228","n2229","n1183","n2234","n19","n1891","n20","n2223","n2224","n2238","n2235","n2240","n2225","n2239"],tags:{name:"Saint Joseph River",waterway:"river"}},w231:{id:"w231",nodes:["n456","n1036","n1037","n1038"],tags:{barrier:"wall"}},w232:{id:"w232",nodes:["n1034","n1039","n1040"],tags:{barrier:"wall"}},w233:{id:"w233",nodes:["n1041","n1042","n1043","n1044","n1045","n1046","n1041"],tags:{access:"private",leisure:"swimming_pool"}},w234:{id:"w234",nodes:["n1047","n1048"],tags:{barrier:"hedge"}},w235:{id:"w235",nodes:["n1049","n1050","n1051","n1052","n1049"],tags:{building:"yes"}},w236:{id:"w236",nodes:["n1053","n1054","n1055","n1056","n1057","n1058","n1059","n1060","n1053"],tags:{building:"yes"}},w237:{id:"w237",nodes:["n1061","n1062","n1063","n1064","n1065","n1061"],tags:{building:"yes"}},w238:{id:"w238",nodes:["n1066","n1067","n1068","n1069","n1070","n1071","n1066"],tags:{building:"yes"}},w239:{id:"w239",nodes:["n1072","n1073","n1074","n1075","n1072"],tags:{building:"yes"}},w24:{id:"w24",nodes:["n127","n128","n129","n130","n127"],tags:{building:"yes"}},w240:{id:"w240",nodes:["n1076","n1077","n1078","n1079","n1080","n1081","n1076"],tags:{building:"yes"}},w241:{id:"w241",nodes:["n1082","n1083","n1084","n1085","n1082"],tags:{building:"yes"}},w242:{id:"w242",nodes:["n1086","n1087","n1088","n1089","n1086"],tags:{building:"yes"}},w243:{id:"w243",nodes:["n1090","n1091","n1092","n1093","n1094","n1095","n1096","n1097","n1090"],tags:{building:"yes"}},w244:{id:"w244",nodes:["n1098","n1099","n1100","n1101"],tags:{barrier:"fence"}},w245:{id:"w245",nodes:["n1102","n835","n30","n2590","n35","n29","n2591","n34","n28","n2592","n2312","n32","n2593","n31","n33","n2594","n2595","n1102"],tags:{highway:"service"}},w246:{id:"w246",nodes:["n1103","n1139","n1104"],tags:{barrier:"fence"}},w247:{id:"w247",nodes:["n1105","n1106","n1107","n1108","n1109","n1110","n1111","n1112","n1113","n1114","n1105"],tags:{building:"yes"}},w248:{id:"w248",nodes:["n1115","n1116","n1117","n1118","n1119","n1120","n1115"],tags:{building:"yes"}},w249:{id:"w249",nodes:["n1121","n1122","n1123","n1124","n1121"],tags:{building:"yes"}},w25:{id:"w25",nodes:["n131","n132","n133","n134","n135","n136","n137","n138","n139","n140","n141","n142","n131"],tags:{building:"yes"}},w250:{id:"w250",nodes:["n1125","n1126","n1127","n1128","n1129","n1130","n1131","n1132","n1133","n1134","n1135","n1136","n1125"],tags:{building:"yes"}},w251:{id:"w251",nodes:["n1137","n1138","n1139"],tags:{barrier:"fence"}},w252:{id:"w252",nodes:["n876","n1140","n1141"],tags:{footway:"sidewalk",highway:"footway"}},w253:{id:"w253",nodes:["n1141","n1142","n1143","n1144","n1145","n1146"],tags:{footway:"sidewalk",highway:"footway"}},w254:{id:"w254",nodes:["n1146","n4743","n1147","n1148"],tags:{footway:"sidewalk",highway:"footway"}},w255:{id:"w255",nodes:["n1148","n1149","n1150","n1151"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w256:{id:"w256",nodes:["n1151","n1153","n1154","n1155"],tags:{footway:"sidewalk",highway:"footway"}},w257:{id:"w257",nodes:["n1155","n1156"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w258:{id:"w258",nodes:["n1157","n1158"],tags:{barrier:"retaining_wall"}},w259:{id:"w259",nodes:["n1156","n1161","n1159","n1160","n719"],tags:{footway:"sidewalk",highway:"footway"}},w26:{id:"w26",nodes:["n143","n608","n144"],tags:{highway:"service"}},w260:{id:"w260",nodes:["n1162","n1163","n1164","n1165","n1166","n1167","n1168","n1169","n1170","n2528"],tags:{highway:"footway"}},w261:{id:"w261",nodes:["n1171","n1172","n1173"],tags:{barrier:"wall"}},w262:{id:"w262",nodes:["n1175","n1176","n1177","n1178","n1179","n1180","n1181","n1175"],tags:{natural:"wood"}},w263:{id:"w263",nodes:["n1947","n1184","n1948","n1185","n1949","n1957","n1950","n480","n1951","n479","n478","n477","n1952","n1851","n1956","n2248","n619","n618","n2249","n2250","n2251","n617","n2252","n616","n2253","n829","n2254","n827","n828","n2255","n830","n2256","n826","n2257","n831","n2258","n832","n835","n834","n2312","n2267","n2259","n833","n2268","n2260","n836","n2261","n837","n2262","n838","n2263","n2264","n839","n2265","n840","n2266"],tags:{highway:"path",name:"Riverwalk Trail",surface:"asphalt",width:"3"}},w264:{id:"w264",nodes:["n1186","n1187","n1188","n1189","n1186"],tags:{building:"yes"}},w265:{id:"w265",nodes:["n1190","n1191","n1192","n1193","n1190"],tags:{building:"yes"}},w266:{id:"w266",nodes:["n1194","n1195","n1196","n1197","n1198","n1199","n1200","n1201","n1194"],tags:{building:"yes"}},w267:{id:"w267",nodes:["n1205","n1206","n1207","n1208","n1209","n1210","n1205"],tags:{building:"house"}},w268:{id:"w268",nodes:["n1211","n1212","n1213","n1214","n1215","n1216","n1217","n1218","n1219","n1220","n1211"],tags:{building:"house"}},w269:{id:"w269",nodes:["n1221","n1225","n1222","n1223","n1224","n1221"],tags:{building:"house"}},w27:{id:"w27",nodes:["n145","n147","n146"],tags:{highway:"footway"}},w270:{id:"w270",nodes:["n1225","n1226","n1227","n1229","n1228"],tags:{barrier:"fence"}},w271:{id:"w271",nodes:["n1229","n1230"],tags:{barrier:"fence"}},w272:{id:"w272",nodes:["n1231","n1232","n1233","n1234","n1235","n1236","n1237","n1238","n1231"],tags:{building:"house"}},w273:{id:"w273",nodes:["n1239","n1240","n1241","n1242","n1243","n1244","n1245","n1246","n1239"],tags:{building:"house"}},w274:{id:"w274",nodes:["n1247","n1248","n1249","n1250","n1247"],tags:{building:"house"}},w275:{id:"w275",nodes:["n1251","n1252","n1253","n1254","n1255","n1256","n1251"],tags:{building:"house"}},w276:{id:"w276",nodes:["n1257","n1258","n1259","n1260","n1257"],tags:{building:"shed"}},w277:{id:"w277",nodes:["n1261","n1262","n1263","n1264","n1265","n1266","n1267","n1268","n1261"],tags:{building:"house"}},w278:{id:"w278",nodes:["n1269","n1270","n1271","n1272","n1273","n1274","n1284","n1269"],tags:{building:"house"}},w279:{id:"w279",nodes:["n1275","n1276","n1277","n1278","n1279","n1280","n1275"],tags:{building:"house"}},w28:{id:"w28",nodes:["n147","n148"],tags:{highway:"footway"}},w280:{id:"w280",nodes:["n1281","n1282","n1283","n1284"],tags:{barrier:"fence"}},w281:{id:"w281",nodes:["n1285","n1286","n1287","n1288","n1285"],tags:{building:"house"}},w282:{id:"w282",nodes:["n1289","n1290","n1291","n1292","n1293","n1294","n1295","n1296","n1289"],tags:{building:"house"}},w283:{id:"w283",nodes:["n1297","n1298","n1299","n1300","n1301","n1302","n1297"],tags:{access:"private",leisure:"swimming_pool"}},w284:{id:"w284",nodes:["n1303","n1304","n1305","n1306","n1307","n1308","n1309","n1310","n1311","n1312","n1303"],tags:{building:"house"}},w285:{id:"w285",nodes:["n1313","n1314","n1315","n1316","n1313"],tags:{building:"house"}},w286:{id:"w286",nodes:["n1317","n1318","n1319","n1320","n1321","n1322","n1323","n1324","n1325","n1326","n1327","n1328","n1329","n1330","n1317"],tags:{building:"house"}},w287:{id:"w287",nodes:["n1331","n1332","n1333","n1334","n1465","n1335","n1336","n1331"],tags:{building:"yes"}},w288:{id:"w288",nodes:["n1349","n1350","n1351","n1352","n1353","n1354","n1355","n1337","n1338","n1341","n1342","n1343","n1344","n1345","n1346","n1347","n1348","n1339","n1340","n1349"],tags:{access:"private",leisure:"swimming_pool"}},w289:{id:"w289",nodes:["n1356","n1331"],tags:{barrier:"fence"}},w29:{id:"w29",nodes:["n149","n874","n150","n151","n897","n898","n875","n152"],tags:{highway:"service",oneway:"yes"}},w290:{id:"w290",nodes:["n1357","n1358","n1359","n1360","n1357"],tags:{building:"shed"}},w291:{id:"w291",nodes:["n1358","n1361","n1362"],tags:{barrier:"fence"}},w292:{id:"w292",nodes:["n1363","n1364","n1365","n1366","n1367","n1368","n1363"],tags:{building:"house"}},w293:{id:"w293",nodes:["n1369","n1370","n1371","n1372","n1373","n1374","n1369"],tags:{leisure:"swimming_pool"}},w294:{id:"w294",nodes:["n1367","n1375","n1376","n1377"],tags:{barrier:"fence"}},w295:{id:"w295",nodes:["n1378","n1379","n1380","n1381","n1378"],tags:{building:"house"}},w296:{id:"w296",nodes:["n1382","n1383","n1384","n1385","n1386","n1387","n1382"],tags:{building:"house"}},w297:{id:"w297",nodes:["n1388","n1389","n1390","n1391","n1392","n1393","n1388"],tags:{building:"house"}},w298:{id:"w298",nodes:["n1394","n1395","n1396","n1397","n1394"],tags:{building:"house"}},w299:{id:"w299",nodes:["n1398","n1399","n1400","n1401","n1398"],tags:{access:"private3",leisure:"swimming_pool"}},w3:{id:"w3",nodes:["n1","n2"],tags:{highway:"track",name:"Water Street"}},w30:{id:"w30",nodes:["n153","n154","n155","n156","n153"],tags:{amenity:"parking"}},w300:{id:"w300",nodes:["n1402","n1403","n1404","n1405","n1406","n1407","n1408","n1409","n1410","n1411","n1412","n1413","n1402"],tags:{building:"house"}},w301:{id:"w301",nodes:["n1414","n1415","n1416","n1417","n1414"],tags:{building:"garage"}},w302:{id:"w302",nodes:["n1406","n1418","n1419","n1403"],tags:{barrier:"fence"}},w303:{id:"w303",nodes:["n1423","n1424","n1425","n1426","n1427","n1428","n1429","n1430","n1431","n1432","n1423"],tags:{building:"house"}},w304:{id:"w304",nodes:["n1433","n1434","n1435","n1446","n1436","n1437","n1438","n1439","n1444","n1440","n1441","n1445","n1442","n1443","n1433"],tags:{access:"private",leisure:"swimming_pool"}},w305:{id:"w305",nodes:["n1447","n1448","n1452","n1453","n1454","n1451","n1449","n1450","n1447"],tags:{building:"house"}},w306:{id:"w306",nodes:["n1455","n1456","n1457","n1458","n1455"],tags:{building:"shed"}},w307:{id:"w307",nodes:["n1459","n1460","n1461","n1462","n1459"],tags:{building:"shed"}},w308:{id:"w308",nodes:["n1463","n1464"],tags:{barrier:"fence"}},w309:{id:"w309",nodes:["n1465","n1466","n1467","n1468"],tags:{barrier:"fence"}},w31:{id:"w31",nodes:["n157","n605","n158"],tags:{highway:"service"}},w310:{id:"w310",nodes:["n1469","n1481","n1463"],tags:{barrier:"hedge"}},w311:{id:"w311",nodes:["n1470","n1471","n1472","n1473","n1474","n1475","n1480","n1476","n1477","n1478","n1479","n1470"],tags:{building:"house"}},w312:{id:"w312",nodes:["n1480","n1481"],tags:{barrier:"wall"}},w313:{id:"w313",nodes:["n1482","n1483","n1484","n1485","n1486","n1487","n1488","n1489","n1490","n1491","n1482"],tags:{access:"private",leisure:"swimming_pool"}},w314:{id:"w314",nodes:["n1492","n1493","n1494","n1495","n1496","n1497","n1498","n1499","n1500","n1501","n1502","n1503","n1504","n1505","n1492"],tags:{building:"house"}},w315:{id:"w315",nodes:["n1506","n1507","n1508","n1509","n1510","n1511","n1512","n1513","n1514","n1515","n1506"],tags:{building:"house"}},w316:{id:"w316",nodes:["n1516","n1517","n1518","n1519","n1520","n1521","n1522","n1523","n1516"],tags:{building:"house"}},w317:{id:"w317",nodes:["n1524","n1525","n1526","n1527","n1528","n1529","n1530","n1531","n1524"],tags:{building:"house"}},w318:{id:"w318",nodes:["n1532","n1533"],tags:{barrier:"fence"}},w319:{id:"w319",nodes:["n1534","n1532","n1535"],tags:{barrier:"fence"}},w32:{id:"w32",nodes:["n159","n160","n161","n162","n159"],tags:{amenity:"parking"}},w320:{id:"w320",nodes:["n1536","n1537","n1538","n1539","n1536"],tags:{building:"shed"}},w321:{id:"w321",nodes:["n1540","n1541","n1542","n1543","n1540"],tags:{building:"shed"}},w322:{id:"w322",nodes:["n1544","n1545","n1546","n1547","n1544"],tags:{building:"shed"}},w323:{id:"w323",nodes:["n1548","n1549","n1550","n1551","n1548"],tags:{building:"house"}},w324:{id:"w324",nodes:["n1552","n1553","n1554","n1555","n1556","n1557","n1558","n1559","n1552"],tags:{building:"house"}},w325:{id:"w325",nodes:["n1560","n1561","n1562","n1563","n1564","n1565","n1566","n1567","n1560"],tags:{building:"house"}},w326:{id:"w326",nodes:["n1561","n1568","n1569","n1570"],tags:{barrier:"wall"}},w327:{id:"w327",nodes:["n1571","n1572"],tags:{barrier:"fence"}},w328:{id:"w328",nodes:["n1573","n1574","n1575","n1576","n1573"],tags:{building:"house"}},w329:{id:"w329",nodes:["n1577","n1578","n1579","n1580","n1581","n1582","n1583","n1584","n1585","n1586","n1577"],tags:{building:"house"}},w33:{id:"w33",nodes:["n157","n163"],tags:{highway:"service"}},w330:{id:"w330",nodes:["n1587","n1588","n1589","n1590","n1591","n1592","n1593","n1594","n1587"],tags:{building:"house"}},w331:{id:"w331",nodes:["n1595","n1596","n1597","n1598","n1599","n1600","n1601","n1595"],tags:{access:"private",leisure:"swimming_pool"}},w332:{id:"w332",nodes:["n1602","n1603","n1604","n1605","n1606","n1607","n1608","n1609","n1611","n1610","n1612","n1613","n1602"],tags:{building:"house"}},w333:{id:"w333",nodes:["n2018","n1626","n1627","n2017","n2018"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w334:{id:"w334",nodes:["n2","n3","n2764"],tags:{highway:"service",name:"Water Street"}},w335:{id:"w335",nodes:["n3","n1628","n1614"],tags:{highway:"service"}},w336:{id:"w336",nodes:["n3198","n4545","n2747"],tags:{highway:"residential",name:"Morris Avenue"}},w337:{id:"w337",nodes:["n1629","n3504"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w338:{id:"w338",nodes:["n1813","n1635","n1814","n1634","n1815","n1632","n1816","n1817"],tags:{highway:"service",service:"parking_aisle"}},w339:{id:"w339",nodes:["n1827","n4684","n4690","n1842","n4686","n4685","n1826","n1828","n1846","n1645","n1637","n4703","n1641"],tags:{highway:"residential",name:"Millard Street"}},w34:{id:"w34",nodes:["n164","n165","n166","n171","n866","n172","n167","n168","n169","n910","n170","n164"],tags:{amenity:"parking"}},w340:{id:"w340",nodes:["n1824","n1825"],tags:{highway:"service",service:"parking_aisle"}},w341:{id:"w341",nodes:["n1701","n1702","n1703","n1704","n1705","n1706","n1701"],tags:{building:"yes"}},w342:{id:"w342",nodes:["n1855","n1860","n1856","n1775","n1804","n1776","n1855"],tags:{amenity:"parking",fee:"no"}},w343:{id:"w343",nodes:["n1757","n1758","n1759","n1760","n1757"],tags:{building:"yes"}},w344:{id:"w344",nodes:["n1659","n1660","n1661","n1662","n1663","n1664","n1665","n1666","n1659"],tags:{building:"school"}},w345:{id:"w345",nodes:["n1751","n1752","n1753","n1754","n1755","n1756","n1751"],tags:{building:"yes"}},w346:{id:"w346",nodes:["n1641","n1676","n1673","n1639","n1810","n1642","n1849","n4759","n1845"],tags:{highway:"residential",name:"Douglas Avenue"}},w347:{id:"w347",nodes:["n1642","n1643","n1031","n1630","n845","n1631","n816","n1831","n902","n905","n152","n149","n1832","n1850","n878","n1833","n1852","n42","n1834","n61","n60","n1851","n1835"],tags:{highway:"primary",name:"Michigan Avenue"}},w348:{id:"w348",nodes:["n1650","n1651","n1652","n1653","n1654","n1655","n1656","n1657","n1658","n1650"],tags:{leisure:"playground"}},w349:{id:"w349",nodes:["n1861","n1818","n1819","n1820","n1821","n1825","n1823","n1639"],tags:{highway:"service"}},w35:{id:"w35",nodes:["n168","n167","n172"],tags:{barrier:"fence",fence_type:"chain_link"}},w350:{id:"w350",nodes:["n1783","n1819","n1784","n1857","n1861","n1858","n1783"],tags:{amenity:"parking"}},w351:{id:"w351",nodes:["n1717","n1718","n1719","n1720","n1717"],tags:{building:"yes"}},w352:{id:"w352",nodes:["n1743","n1744","n1745","n1746","n1747","n1748","n1749","n1750","n1743"],tags:{building:"yes"}},w353:{id:"w353",nodes:["n1637","n1636","n1029","n4715","n1630"],tags:{highway:"residential",name:"Lincoln Avenue"}},w354:{id:"w354",nodes:["n1713","n1714","n1715","n1716","n1713"],tags:{building:"yes"}},w355:{id:"w355",nodes:["n1689","n1690","n1691","n1692","n1693","n1694","n1695","n1696","n1689"],tags:{building:"yes"}},w356:{id:"w356",nodes:["n1631","n4717","n1840","n4745","n1841"],tags:{highway:"residential",name:"Hook Avenue"}},w357:{id:"w357",nodes:["n1737","n1738","n1739","n1740","n1741","n1742","n1737"],tags:{building:"yes"}},w358:{id:"w358",nodes:["n1707","n1708","n1709","n1710","n1711","n1712","n1707"],tags:{building:"yes"}},w359:{id:"w359",nodes:["n1829","n4695","n4697","n1843","n4698","n4701","n1638","n4702","n4705","n1636","n4706","n4707","n1633"],tags:{highway:"residential",name:"South Street"}},w36:{id:"w36",nodes:["n910","n171","n866","n172"],tags:{barrier:"fence",fence_type:"chain_link"}},w360:{id:"w360",nodes:["n1767","n1768","n1769","n1770","n1771","n1772","n1773","n1774","n1767"],tags:{building:"yes"}},w361:{id:"w361",nodes:["n1859","n1860","n1804","n1640","n1805","n1817","n1806","n1644","n1811","n1807","n1808","n3419","n1812","n1790","n3418","n3744","n1809","n1813","n1810"],tags:{highway:"service"}},w362:{id:"w362",nodes:["n1639","n1683","n4710","n1633"],tags:{highway:"residential",name:"South Street",oneway:"yes"}},w363:{id:"w363",nodes:["n1646","n1647","n1648","n1649","n1646"],tags:{leisure:"pitch",pitch:"basketball"}},w364:{id:"w364",nodes:["n3820","n3821","n3822","n3823","n3824","n3825","n3826","n3827","n3828","n3829","n3830","n3838","n3839","n3820"],tags:{amenity:"school",name:"Three Rivers Middle School"}},w365:{id:"w365",nodes:["n1721","n1722","n1723","n1724","n1725","n1726","n1727","n1728","n1729","n1730","n1731","n1732","n1733","n1734","n1735","n1736","n1721"],tags:{building:"yes"}},w366:{id:"w366",nodes:["n1791","n1792","n1793","n1794","n1795","n1796","n1798","n1799","n1800","n1801","n1802","n1803","n1791"],tags:{amenity:"parking"}},w367:{id:"w367",nodes:["n1633","n4708","n4711","n1643","n4712","n1838","n4752","n1839"],tags:{highway:"residential",name:"Grant Avenue"}},w368:{id:"w368",nodes:["n1853","n1687","n1688","n1854","n1853"],tags:{amenity:"library",building:"yes",name:"Three Rivers Public Library"}},w369:{id:"w369",nodes:["n1777","n1778","n1779","n1780","n1781","n1782","n1777"],tags:{amenity:"parking"}},w37:{id:"w37",nodes:["n173","n174","n175","n176","n177","n178","n179","n180","n173"],tags:{building:"yes"}},w370:{id:"w370",nodes:["n1645","n1638","n858","n4718","n1631"],tags:{highway:"residential",name:"Hook Avenue"}},w371:{id:"w371",nodes:["n3836","n3835","n4624","n3831","n4632","n3834","n3832","n3833","n3830","n3838","n3839","n3837","n3836"],tags:{amenity:"school",name:"Three Rivers High School"}},w372:{id:"w372",nodes:["n1697","n1698","n1699","n1700","n1697"],tags:{building:"yes"}},w373:{id:"w373",nodes:["n2891","n1785","n1786","n3394","n1787","n1788","n1789","n1830","n1836","n1837","n1848","n3409","n2891"],tags:{amenity:"parking"}},w374:{id:"w374",nodes:["n1761","n1762","n1763","n1764","n1765","n1766","n1761"],tags:{building:"yes"}},w375:{id:"w375",nodes:["n1822","n1823"],tags:{highway:"service",service:"parking_aisle"}},w376:{id:"w376",nodes:["n1677","n1678","n1679","n1680","n1681","n1682","n1677"],tags:{amenity:"parking"}},w377:{id:"w377",nodes:["n1676","n1675","n1674","n1673"],tags:{highway:"service",oneway:"yes"}},w378:{id:"w378",nodes:["n1667","n1668","n1669","n1670","n1671","n1672","n1667"],tags:{amenity:"school",name:"Andrews Elementary School"}},w379:{id:"w379",nodes:["n1630","n4714","n1847","n4750","n1844"],tags:{highway:"residential",name:"Lincoln Avenue"}},w38:{id:"w38",nodes:["n181","n182","n183","n185","n184","n181"],tags:{building:"yes"}},w380:{id:"w380",nodes:["n1683","n3745","n1686","n1633"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w381:{id:"w381",nodes:["n2022","n2037"],tags:{highway:"footway"}},w382:{id:"w382",nodes:["n1826","n1863"],tags:{highway:"residential"}},w383:{id:"w383",nodes:["n2011","n2012","n739","n2013","n2014","n2029","n2011"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w384:{id:"w384",nodes:["n2064","n2065","n2066","n2067","n2068","n2069","n2070","n2071","n2072","n2073","n2074","n2075","n2076","n2077","n2078","n2079","n2064"],tags:{building:"yes"}},w385:{id:"w385",nodes:["n1923","n1924","n1925","n1926","n1927","n1928","n1930","n1929","n1923"],tags:{natural:"water"}},w386:{id:"w386",nodes:["n1827","n14","n1886","n15","n1887","n16","n1888","n18","n17","n1889","n12","n13","n1890","n485","n1864","n11","n10","n2058","n2036","n1865","n2020","n9","n8","n1866","n295","n1867"],tags:{highway:"service"}},w387:{id:"w387",nodes:["n1846","n1843","n865","n157","n4721","n1831"],tags:{highway:"residential",name:"Andrews Street"}},w388:{id:"w388",nodes:["n2019","n2020","n2021","n2022","n2023","n2024","n2025","n2026","n2027","n2028","n2029"],tags:{highway:"footway"}},w389:{id:"w389",nodes:["n2217","n2222","n2221","n2219","n1877","n1879","n1882","n1883","n484","n1885","n483","n1880","n1881","n1878","n1884","n2223"],tags:{name:"Rocky River",waterway:"river"}},w39:{id:"w39",nodes:["n185","n186","n187"],tags:{barrier:"fence"}},w390:{id:"w390",nodes:["n2050","n2051","n2052","n2053","n2050"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w391:{id:"w391",nodes:["n2089","n2090","n2091","n2092","n2093","n2094","n2311","n2095","n2096","n2097","n2098","n1174","n2099","n751","n43","n2062","n4725","n873","n1832"],tags:{highway:"residential",name:"Constantine Street"}},w392:{id:"w392",nodes:["n1869","n212","n436","n2281","n2081"],tags:{highway:"primary",name:"Michigan Avenue"}},w393:{id:"w393",nodes:["n1829","n611","n144","n4694","n602","n1832"],tags:{highway:"tertiary",name:"Constantine Street"}},w394:{id:"w394",nodes:["n1997","n1998","n2000","n1999"],tags:{highway:"service",service:"parking_aisle"}},w395:{id:"w395",nodes:["n1835","n1869"],tags:{bridge:"yes",highway:"primary",name:"Michigan Avenue"}},w396:{id:"w396",nodes:["n2000","n2001"],tags:{highway:"service",service:"parking_aisle"}},w397:{id:"w397",nodes:["n2082","n4688","n1842","n308","n498","n509","n246","n241","n1867","n4645","n293","n1834"],tags:{highway:"residential",name:"Spring Street"}},w398:{id:"w398",nodes:["n2015","n2016","n2017","n2018","n2015"],tags:{building:"yes"}},w399:{id:"w399",nodes:["n2062","n45","n2063","n877","n41","n1852"],tags:{highway:"service"}},w4:{id:"w4",nodes:["n7","n38","n378","n379","n7"],tags:{building:"yes"}},w40:{id:"w40",nodes:["n188","n189","n190","n191","n192","n193","n188"],tags:{building:"house"}},w400:{id:"w400",nodes:["n1968","n1969","n1970","n1971","n2007","n1972","n1973","n1978","n1974","n1977","n1976","n1975","n1968"],tags:{amenity:"parking"}},w401:{id:"w401",nodes:["n1963","n1964"],tags:{bridge:"yes",highway:"footway"}},w402:{id:"w402",nodes:["n1892","n1893","n1894","n1895","n1896","n1897","n1898","n1899","n1900","n1901","n1902","n1903","n1892"],tags:{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street",barrier:"fence",name:"Scidmore Park Petting Zoo",tourism:"zoo",zoo:"petting_zoo"}},w403:{id:"w403",nodes:["n1957","n1958","n1959","n481","n1960","n482","n1949"],tags:{highway:"path"}},w404:{id:"w404",nodes:["n2281","n27","n330","n1987","n1988"],tags:{highway:"service"}},w405:{id:"w405",nodes:["n2249","n2269","n2270","n2271","n2272","n454","n455","n2273"],tags:{highway:"path",name:"Riverwalk Trail"}},w406:{id:"w406",nodes:["n1947","n1624","n1625","n2030","n2033","n4658","n4659","n2031","n2032","n2021"],tags:{highway:"footway"}},w407:{id:"w407",nodes:["n2034","n2036","n2009"],tags:{highway:"footway"}},w408:{id:"w408",nodes:["n1964","n1965","n2002","n1966","n21","n1967","n1969"],tags:{highway:"footway"}},w409:{id:"w409",nodes:["n1904","n1905","n1906","n1907","n1908","n1909","n748","n1910","n747","n1911","n749","n1912","n750","n1913","n1922","n1914","n1921","n1915","n746","n1916","n745","n1917","n744","n1918","n743","n742","n1919","n741","n1920","n740","n1904"],tags:{natural:"water"}},w41:{id:"w41",nodes:["n194","n195","n196","n197","n198","n199","n200","n201","n202","n203","n204","n205","n194"],tags:{building:"house"}},w410:{id:"w410",nodes:["n1868","n2088"],tags:{bridge:"yes",name:"Conrail Railroad",railway:"rail"}},w411:{id:"w411",nodes:["n2010","n2019","n2009","n2008","n2058","n2035","n1961","n1962","n1947","n1963"],tags:{highway:"footway"}},w412:{id:"w412",nodes:["n2290","n2043","n2044","n2045","n1872","n2041","n1873","n2042","n1874","n2046","n2047","n2048","n2049","n2290"],tags:{"addr:city":"Three Rivers","addr:housenumber":"112","addr:postcode":"49093","addr:state":"MI","addr:street":"Spring Street",leisure:"park",name:"Scidmore Park"}},w413:{id:"w413",nodes:["n1831","n876","n4720","n821","n2089"],tags:{highway:"residential",name:"Andrews Street"}},w414:{id:"w414",nodes:["n2002","n2003","n2004","n2005","n2006","n2007"],tags:{highway:"footway"}},w415:{id:"w415",nodes:["n1979","n1980","n1981","n1982","n1979"],tags:{amenity:"parking"}},w416:{id:"w416",nodes:["n2054","n2055","n2056","n2057","n2054"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w417:{id:"w417",nodes:["n2291","n2292","n2293","n2294","n2295","n2296","n2297","n2298","n2299","n1098","n2300","n2301","n2302","n2303","n2304","n2059","n2060","n2305","n2307","n2306","n2310","n2308","n2309","n2291"],tags:{leisure:"park",name:"Memory Isle Park"}},w418:{id:"w418",nodes:["n2033","n2034","n2035"],tags:{highway:"footway"}},w419:{id:"w419",nodes:["n1983","n1984","n1985","n1986","n1983"],tags:{amenity:"parking"}},w42:{id:"w42",nodes:["n206","n207","n208","n209","n210","n211","n206"],tags:{building:"house"}},w420:{id:"w420",nodes:["n1840","n4746","n4748","n1847","n4749","n4755","n1838","n4754","n4756","n1849"],tags:{highway:"residential",name:"French Street"}},w421:{id:"w421",nodes:["n2337","n2268"],tags:{highway:"path"}},w422:{id:"w422",nodes:["n2338","n2339","n2320","n2317","n2319","n2318","n2340","n2341","n2342","n2343","n2344","n2345","n2346","n2347","n2348","n2338"],tags:{natural:"water"}},w423:{id:"w423",nodes:["n2180","n2349","n2350","n2351","n2352","n2404","n2353","n2354","n2355","n2356","n2357","n2358","n2359","n2360","n2361","n2362","n2363","n2364","n2365","n2366","n2370","n2371","n2372","n2373","n2374","n2375","n2377","n2378","n2380","n2381","n2382","n2383","n2386","n2389","n2390","n2391","n2392","n2393","n2396","n2397","n2401","n2402","n2321","n2322","n2323","n2403","n2180"],tags:{natural:"wetland"}},w424:{id:"w424",nodes:["n2324","n2316","n1841","n2315","n2314","n1844","n1839","n4758","n1845"],tags:{highway:"residential",name:"Pealer Street"}},w425:{id:"w425",nodes:["n2267","n2337","n2336","n2335","n2334","n2333","n2332","n2331","n2330","n37","n2329","n2328","n2327","n36","n2326","n2325","n2266"],tags:{highway:"path",name:"Riverwalk Trail"}},w426:{id:"w426",nodes:["n2478","n681","n680","n679","n2459","n2467","n2487","n2478"],tags:{building:"yes"}},w427:{id:"w427",nodes:["n2671","n2672","n2673","n2674","n2671"],tags:{building:"yes"}},w428:{id:"w428",nodes:["n2483","n2482","n2486","n2489","n2492","n2502","n2495","n2480","n2483"],tags:{building:"yes"}},w429:{id:"w429",nodes:["n2707","n2708","n2716","n2712","n2714","n2713","n2715","n2711","n2710","n2723","n2709","n2707"],tags:{amenity:"parking"}},w43:{id:"w43",nodes:["n1955","n1956"],tags:{footway:"sidewalk",highway:"footway",name:"Riverwalk Trail"}},w430:{id:"w430",nodes:["n2471","n2474","n2484","n2479","n2471"],tags:{building:"yes"}},w431:{id:"w431",nodes:["n2218","n2434","n2436","n2433","n2435","n2210"],tags:{name:"Rocky River",waterway:"river"}},w432:{id:"w432",nodes:["n2782","n2532","n2783","n2784","n2782"],tags:{amenity:"parking"}},w433:{id:"w433",nodes:["n2513","n649","n2520","n2514","n2507","n2513"],tags:{building:"yes"}},w434:{id:"w434",nodes:["n2470","n2468","n2461","n2465","n2470"],tags:{building:"yes"}},w435:{id:"w435",nodes:["n2598","n2599","n648","n649","n2520","n2598"],tags:{building:"yes"}},w436:{id:"w436",nodes:["n2639","n2640","n2641","n2642","n2643","n2644","n2645","n2646","n2647","n2648","n2639"],tags:{building:"yes"}},w437:{id:"w437",nodes:["n2503","n2512","n2508","n2499","n2503"],tags:{building:"yes"}},w438:{id:"w438",nodes:["n2440","n2800","n2774","n1"],tags:{highway:"residential",name:"Water Street"}},w439:{id:"w439",nodes:["n2675","n2676","n2677","n2678","n2675"],tags:{building:"yes"}},w44:{id:"w44",nodes:["n213","n214","n215","n216","n213"],tags:{building:"yes"}},w440:{id:"w440",nodes:["n2512","n2503","n2507","n2514","n2512"],tags:{building:"yes"}},w441:{id:"w441",nodes:["n2554","n2717","n674","n2720","n2798"],tags:{highway:"service",oneway:"yes"}},w442:{id:"w442",nodes:["n2583","n2596","n2584","n2585","n2595","n2586","n2587","n2588","n2589","n2583"],tags:{amenity:"parking"}},w443:{id:"w443",nodes:["n2629","n2627","n2628","n2616","n2630","n2629"],tags:{building:"yes"}},w444:{id:"w444",nodes:["n2717","n2724","n670","n2718","n669","n668","n2722","n2727"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w445:{id:"w445",nodes:["n2572","n2573"],tags:{bridge:"yes",highway:"path",name:"Riverwalk Trail"}},w446:{id:"w446",nodes:["n2603","n2604","n2601","n2605","n2606","n2607","n2603"],tags:{building:"yes"}},w447:{id:"w447",nodes:["n2780","n2777","n628","n624","n2779"],tags:{highway:"residential",name:"Foster Street",oneway:"yes"}},w448:{id:"w448",nodes:["n2733","n2734","n2735","n2736","n2737","n2738","n663","n664","n2739","n2733"],tags:{building:"yes"}},w449:{id:"w449",nodes:["n2564","n2565","n2566","n2567","n2568","n2794","n2795","n2564"],tags:{amenity:"parking"}},w45:{id:"w45",nodes:["n217","n218","n219","n220","n217"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w450:{id:"w450",nodes:["n2799","n2728","n2729","n2730","n2731","n2732","n2799"],tags:{building:"yes"}},w451:{id:"w451",nodes:["n2441","n1170","n2442","n2575","n2443","n2445","n2444","n2448","n2441"],tags:{amenity:"parking"}},w452:{id:"w452",nodes:["n2273","n457","n2569","n458","n2570"],tags:{highway:"path",name:"Riverwalk Trail"}},w453:{id:"w453",nodes:["n2447","n2242","n2448","n2527","n2530"],tags:{highway:"service"}},w454:{id:"w454",nodes:["n2560","n333","n2561"],tags:{highway:"service",service:"parking_aisle"}},w455:{id:"w455",nodes:["n2679","n2680","n2681","n2682","n2683","n2684","n2685","n2686","n2687","n2688","n2689","n2690","n2679"],tags:{building:"yes"}},w456:{id:"w456",nodes:["n2425","n2429","n2424"],tags:{bridge:"yes",highway:"residential",name:"Moore Street"}},w457:{id:"w457",nodes:["n2487","n2467","n2472","n2480","n2495","n2487"],tags:{building:"yes"}},w458:{id:"w458",nodes:["n2659","n2660","n2661","n2662","n678","n677","n2663","n2664","n2665","n2666","n675","n676","n2659"],tags:{building:"yes"}},w459:{id:"w459",nodes:["n2600","n2598","n2599","n2601","n2605","n2602","n2600"],tags:{building:"yes"}},w46:{id:"w46",nodes:["n221","n222","n223","n224","n221"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w460:{id:"w460",nodes:["n2468","n2464","n2455","n2457","n2461","n2468"],tags:{building:"yes"}},w461:{id:"w461",nodes:["n2478","n2473","n683","n682","n2463","n681","n2478"],tags:{building:"yes"}},w462:{id:"w462",nodes:["n2547","n473","n2548","n2549"],tags:{highway:"service",service:"parking_aisle"}},w463:{id:"w463",nodes:["n2573","n2574"],tags:{highway:"path",name:"Riverwalk Trail"}},w464:{id:"w464",nodes:["n2445","n2597","n2527","n2528","n2529","n2530","n2531","n2597"],tags:{highway:"service",service:"parking_aisle"}},w465:{id:"w465",nodes:["n2571","n459","n2572"],tags:{highway:"path",name:"Riverwalk Trail"}},w466:{id:"w466",nodes:["n2445","n2574","n2552","n442","n2551","n4727","n323","n2446"],tags:{highway:"service"}},w467:{id:"w467",nodes:["n2484","n2474","n2477","n2485","n2488","n2484"],tags:{building:"yes"}},w468:{id:"w468",nodes:["n2695","n2696","n2697","n2698","n2699","n2700","n2701","n2702","n2695"],tags:{building:"yes"}},w469:{id:"w469",nodes:["n2469","n2476","n2481","n2475","n920","n2466","n2469"],tags:{building:"yes"}},w47:{id:"w47",nodes:["n1988","n1997","n1989","n25","n24","n1990","n26","n1991","n21","n1992","n2006","n1993","n22","n1994","n23","n1995","n1999","n1996","n2001","n1988"],tags:{highway:"service"}},w470:{id:"w470",nodes:["n2473","n2470","n2465","n2458","n2462","n683","n2473"],tags:{building:"yes"}},w471:{id:"w471",nodes:["n2490","n2496","n994","n997","n998","n996","n995","n2485","n2477","n2490"],tags:{building:"yes"}},w472:{id:"w472",nodes:["n2424","n2426","n2427","n2428"],tags:{highway:"residential",name:"Moore Street"}},w473:{id:"w473",nodes:["n2432","n1026","n4741","n2554","n2425"],tags:{highway:"residential",name:"Moore Street"}},w474:{id:"w474",nodes:["n2577","n2576"],tags:{bridge:"yes",highway:"footway"}},w475:{id:"w475",nodes:["n2497","n2505","n2500","n2493","n2497"],tags:{building:"yes"}},w476:{id:"w476",nodes:["n2493","n2500","n2501","n2496","n2490","n2493"],tags:{building:"yes"}},w477:{id:"w477",nodes:["n2431","n360","n4726","n418","n397","n396","n2547","n646","n2447","n644","n2418","n424","n640","n2419","n2420","n2423"],tags:{highway:"residential",name:"Railroad Drive"}},w478:{id:"w478",nodes:["n2515","n2511","n2498","n2504","n2509","n2515"],tags:{building:"yes"}},w479:{id:"w479",nodes:["n2525","n651","n650","n2526","n2524","n653","n652","n656","n2523","n654","n2518","n2517","n2521","n2522","n2525"],tags:{building:"yes"}},w48:{id:"w48",nodes:["n225","n237","n226","n227","n228","n229","n230","n231","n232","n233","n234","n235","n236","n225"],tags:{building:"yes"}},w480:{id:"w480",nodes:["n2703","n2704","n2710","n2711","n2705","n2706","n2703"],tags:{amenity:"parking"}},w481:{id:"w481",nodes:["n2796","n2657","n2658","n2797","n2796"],tags:{building:"yes"}},w482:{id:"w482",nodes:["n2550","n2551","n442","n2552","n2553","n2550"],tags:{amenity:"parking"}},w483:{id:"w483",nodes:["n2790","n2542"],tags:{highway:"service",service:"parking_aisle"}},w484:{id:"w484",nodes:["n2311","n1102"],tags:{highway:"service"}},w485:{id:"w485",nodes:["n2515","n2509","n2516","n2519","n2515"],tags:{building:"yes"}},w486:{id:"w486",nodes:["n2506","n2502","n2492","n2491","n2494","n2506"],tags:{building:"yes"}},w487:{id:"w487",nodes:["n2667","n2668","n2669","n2670","n2667"],tags:{building:"yes"}},w488:{id:"w488",nodes:["n2616","n2608","n2617","n2618","n2619","n2620","n2621","n2622","n2623","n2624","n2625","n2626","n2627","n2628","n2616"],tags:{building:"yes"}},w489:{id:"w489",nodes:["n2081","n2430"],tags:{bridge:"yes",highway:"primary",name:"Michigan Avenue"}},w49:{id:"w49",nodes:["n237","n238"],tags:{highway:"footway"}},w490:{id:"w490",nodes:["n2410","n636","n730","n635","n2409","n2694","n2751","n2765","n2753","n2768","n2754","n2769","n2745","n2766","n4503","n2763","n4501","n2752","n2781"],tags:{highway:"residential",name:"Portage Avenue"}},w491:{id:"w491",nodes:["n2578","n2579","n2580","n2581","n2578"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w492:{id:"w492",nodes:["n2556","n2557","n2558","n2559","n2556"],tags:{amenity:"parking"}},w493:{id:"w493",nodes:["n2460","n2456","n687","n2453","n2454","n2460"],tags:{building:"yes"}},w494:{id:"w494",nodes:["n2471","n2479","n2476","n2469","n2471"],tags:{building:"yes"}},w495:{id:"w495",nodes:["n2724","n2725","n673","n672","n671","n2726","n2727"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w496:{id:"w496",nodes:["n2649","n2650","n2651","n2652","n2653","n2654","n2655","n2656","n2649"],tags:{building:"yes"}},w497:{id:"w497",nodes:["n2430","n2446","n343","n2101","n2560","n2431","n363","n2748"],tags:{highway:"primary",name:"Michigan Avenue"}},w498:{id:"w498",nodes:["n2691","n2692","n634","n633","n2693","n2694"],tags:{highway:"service"}},w499:{id:"w499",nodes:["n2423","n2415","n661","n2416","n2417","n2719","n2721","n2772","n2756","n2773","n2759","n2767"],tags:{highway:"residential",name:"West Street"}},w5:{id:"w5",nodes:["n380","n381","n382","n383","n429","n430","n380"],tags:{building:"yes"}},w50:{id:"w50",nodes:["n239","n499","n508","n245","n238","n242","n240"],tags:{footway:"sidewalk",highway:"footway"}},w500:{id:"w500",nodes:["n2428","n1152","n2421","n2324"],tags:{bridge:"yes",highway:"residential",name:"Moore Street"}},w501:{id:"w501",nodes:["n2608","n2609","n2610","n2611","n2612","n2613","n2614","n2615","n2617","n2608"],tags:{building:"yes"}},w502:{id:"w502",nodes:["n2570","n2571"],tags:{bridge:"yes",highway:"path",name:"Riverwalk Trail"}},w503:{id:"w503",nodes:["n2540","n2542","n2787"],tags:{highway:"service"}},w504:{id:"w504",nodes:["n2269","n2582","n2250"],tags:{highway:"path"}},w505:{id:"w505",nodes:["n2631","n2632","n2633","n2634","n2635","n2636","n2637","n2638","n2631"],tags:{building:"yes"}},w506:{id:"w506",nodes:["n2543","n2544","n2545","n395","n2546","n2543"],tags:{amenity:"parking"}},w507:{id:"w507",nodes:["n2449","n2450","n2451","n2452","n1162","n2449"],tags:{leisure:"pitch",sport:"tennis"}},w508:{id:"w508",nodes:["n2554","n1160","n2559","n2558","n659","n2555","n658","n657","n2419"],tags:{highway:"service"}},w509:{id:"w509",nodes:["n2499","n2508","n2510","n2505","n2497","n2499"],tags:{building:"yes"}},w51:{id:"w51",nodes:["n241","n242","n243","n244"],tags:{highway:"service",surface:"unpaved"}},w510:{id:"w510",nodes:["n2575","n2577"],tags:{highway:"footway"}},w511:{id:"w511",nodes:["n2533","n2534","n2535","n2536","n2537","n2538","n2539","n2785","n2786","n2533"],tags:{amenity:"parking"}},w512:{id:"w512",nodes:["n2801","n2740","n2741","n2742","n2743","n2744","n2801"],tags:{building:"yes"}},w513:{id:"w513",nodes:["n2720","n2721"],tags:{highway:"service",service:"parking_aisle"}},w514:{id:"w514",nodes:["n2788","n2790","n2789","n989","n2540","n2541"],tags:{highway:"service",service:"parking_aisle"}},w515:{id:"w515",nodes:["n2848","n2849","n2850","n2851","n2803","n2804","n2812"],tags:{highway:"residential",name:"Middle Street"}},w516:{id:"w516",nodes:["n2852","n2805"],tags:{access:"private",highway:"service",name:"Battle Street"}},w517:{id:"w517",nodes:["n2863","n2815","n2814","n2812","n2864","n2855","n2865","n2867","n2868"],tags:{highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w518:{id:"w518",nodes:["n2859","n2808"],tags:{highway:"residential",name:"2nd Avenue"}},w519:{id:"w519",nodes:["n2823","n2824","n2825","n2826","n2827","n2828","n2823"],tags:{building:"yes"}},w52:{id:"w52",nodes:["n247","n248","n249","n250","n247"],tags:{amenity:"parking"}},w520:{id:"w520",nodes:["n2806","n2807","n2803"],tags:{highway:"residential",name:"2nd Avenue"}},w521:{id:"w521",nodes:["n2829","n2830","n2831","n2832","n2833","n2834","n2835","n2836","n2837","n2838","n2829"],tags:{building:"yes"}},w522:{id:"w522",nodes:["n2815","n2813","n2811","n4597","n2846","n4596","n2857","n4601","n2853","n4602","n2861","n4","n2879","n4560","n3550","n5","n1685"],tags:{highway:"residential",name:"Washington Street"}},w523:{id:"w523",nodes:["n2878","n2811","n2810","n2860","n2880","n2881","n2882"],tags:{highway:"residential",name:"5th Avenue"}},w524:{id:"w524",nodes:["n2816","n2817","n2818","n2819","n2820","n2821","n2822","n2816"],tags:{building:"yes"}},w525:{id:"w525",nodes:["n2869","n2856","n2806","n2808","n2814","n2809","n2810","n2847","n2858","n2854","n2870","n2871","n6","n2872","n2839","n2862"],tags:{highway:"residential",name:"Wood Street"}},w526:{id:"w526",nodes:["n2877","n2809","n2813","n2844","n2843"],tags:{highway:"residential",name:"4th Avenue"}},w527:{id:"w527",nodes:["n4785","n4784","n2936","n4788","n4787","n4786","n4785"],tags:{amenity:"parking"}},w528:{id:"w528",nodes:["n2864","n2892","n2893","n2877","n2860","n3840"],tags:{highway:"residential",name:"Garden Street"}},w529:{id:"w529",nodes:["n2868","n2890"],tags:{bridge:"yes",highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w53:{id:"w53",nodes:["n251","n252","n253","n254","n255","n256","n257","n258","n259","n260","n261","n262","n251"],tags:{building:"yes"}},w530:{id:"w530",nodes:["n2914","n2915","n2916","n2917","n2918","n2919","n2920","n2921","n2922","n2923","n2924","n2925","n2926","n2927","n2928","n2929","n2930","n2931","n2932","n2933","n2914"],tags:{building:"yes"}},w531:{id:"w531",nodes:["n2958","n2896"],tags:{bridge:"yes",highway:"secondary",name:"Main Street"}},w532:{id:"w532",nodes:["n2896","n394","n364","n2748"],tags:{highway:"secondary",name:"Main Street"}},w533:{id:"w533",nodes:["n2800","n2943","n2940","n2941","n2942","n2943"],tags:{highway:"service",service:"parking_aisle"}},w534:{id:"w534",nodes:["n3836","n3837","n3839","n3838","n3834","n4632","n3831","n4624","n3835","n3836"],tags:{barrier:"fence"}},w535:{id:"w535",nodes:["n2894","n2944","n2774","n2765"],tags:{highway:"residential",name:"5th Avenue"}},w536:{id:"w536",nodes:["n2890","n2780","n627","n2889","n2887","n623","n2888","n366","n2748"],tags:{highway:"secondary",name:"Michigan Avenue",name_1:"State Highway 60",ref:"M 60"}},w537:{id:"w537",nodes:["n2895","n738","n2887","n737","n2913"],tags:{highway:"residential",name:"Water Street"}},w538:{id:"w538",nodes:["n2855","n3756","n2884","n2885","n2886","n2945","n2946","n2947","n2948","n2949","n2950","n2951","n2952","n2953","n2955","n2848","n2956","n2856"],tags:{highway:"residential",name:"River Drive"}},w539:{id:"w539",nodes:["n2882","n2894"],tags:{bridge:"yes",highway:"residential",name:"5th Avenue"}},w54:{id:"w54",nodes:["n263","n264","n265","n266","n267","n268","n269","n270","n271","n272","n273","n274","n275","n276","n263"],tags:{building:"yes"}},w540:{id:"w540",nodes:["n2987","n2964","n2981","n2983","n2966","n2982","n2962","n2960","n2967","n2965","n2984","n2977","n2968","n2976","n2986","n2988","n2963","n2970","n2969","n2979","n2974","n2980","n2959","n2973","n2985","n2961","n2975","n2971","n2972","n2978","n2898","n2907","n2912","n2909","n2911","n2901","n2903","n2904","n2906","n2902","n2900","n2910","n2908","n2899","n2897","n2905","n2186","n2233"],tags:{name:"Portage River",waterway:"river"}},w541:{id:"w541",nodes:["n2852","n2851","n3003"],tags:{highway:"residential",name:"1st Avenue"}},w542:{id:"w542",nodes:["n2991","n3004","n2994"],tags:{highway:"residential",name:"River Street"}},w543:{id:"w543",nodes:["n2993","n2989"],tags:{bridge:"yes",highway:"residential",name:"6th Street"}},w544:{id:"w544",nodes:["n2995","n2996","n2997","n2998","n2999","n3000","n3001","n3002","n2990","n2991","n2993"],tags:{highway:"residential",name:"6th Street"}},w545:{id:"w545",nodes:["n2989","n2992","n2848"],tags:{highway:"residential",name:"6th Street"}},w546:{id:"w546",nodes:["n2313","n3169","n3170","n3171","n3172","n3173","n3174","n3175","n3176","n3177","n3178","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2146","n2156","n2129","n2112","n2109","n2313"],tags:{natural:"wetland"}},w547:{id:"w547",nodes:["n2088","n3013","n3015","n3014","n3017","n3018"],tags:{name:"Conrail Railroad",railway:"rail"}},w548:{id:"w548",nodes:["n3083","n3084","n3085","n3086","n3083"],tags:{building:"yes"}},w549:{id:"w549",nodes:["n3020","n2288","n2283","n2284","n2131","n2286","n2287","n2285","n2132","n2140","n2289","n3020"],tags:{leisure:"park",name:"Conservation Park"}},w55:{id:"w55",nodes:["n277","n278","n279","n280","n281","n282","n283","n284","n277"],tags:{building:"yes"}},w550:{id:"w550",nodes:["n3056","n3042","n3041","n3040","n3039","n3038","n3037","n3036","n3044","n3035","n3034","n3043","n3016","n3056","n3019","n3015","n3012"],tags:{highway:"service"}},w551:{id:"w551",nodes:["n3044","n3045","n3046","n3047","n3048","n3049","n3050","n3051","n3052","n3053","n3054","n3055","n3016"],tags:{highway:"footway"}},w552:{id:"w552",nodes:["n3117","n3118","n3119","n3120","n3121","n3122","n3117"],tags:{building:"yes"}},w553:{id:"w553",nodes:["n3123","n3124","n3129","n3125","n3126","n3123"],tags:{building:"yes"}},w554:{id:"w554",nodes:["n3069","n3070","n3071","n3072","n3073","n3074","n3075","n3076","n3077","n3078","n3079","n3080","n3081","n3082","n3069"],tags:{building:"yes"}},w555:{id:"w555",nodes:["n3087","n3088","n3089","n3090","n3087"],tags:{building:"yes"}},w556:{id:"w556",nodes:["n3113","n3114","n3115","n3116","n3113"],tags:{building:"yes"}},w557:{id:"w557",nodes:["n3103","n3104","n3105","n3106","n3103"],tags:{building:"yes"}},w558:{id:"w558",nodes:["n3127","n3128","n3129","n3124","n3127"],tags:{building:"yes"}},w559:{id:"w559",nodes:["n3137","n3141","n3142","n3138","n3139","n3140","n3137"],tags:{building:"yes"}},w56:{id:"w56",nodes:["n285","n286","n287","n288","n285"],tags:{amenity:"parking"}},w560:{id:"w560",nodes:["n3091","n3092","n3093","n3094","n3091"],tags:{building:"yes"}},w561:{id:"w561",nodes:["n3155","n3157","n3158","n3159","n3156","n3155"],tags:{building:"yes"}},w562:{id:"w562",nodes:["n3057","n3058","n3059","n3060","n3057"],tags:{building:"yes"}},w563:{id:"w563",nodes:["n3107","n3108","n3109","n3110","n3111","n3112","n3107"],tags:{building:"yes"}},w564:{id:"w564",nodes:["n3134","n3135","n3136","n3131","n3134"],tags:{building:"yes"}},w565:{id:"w565",nodes:["n3143","n3144","n3145","n3146","n3143"],tags:{building:"yes"}},w566:{id:"w566",nodes:["n3095","n3096","n3097","n3098","n3095"],tags:{building:"yes"}},w567:{id:"w567",nodes:["n3130","n3131","n3136","n3132","n3133","n3130"],tags:{building:"yes"}},w568:{id:"w568",nodes:["n3025","n3026","n3027","n3028","n3029","n3030","n3031","n3033","n3032","n3025"],tags:{amenity:"parking"}},w569:{id:"w569",nodes:["n3061","n3062","n3063","n3064","n3061"],tags:{building:"yes"}},w57:{id:"w57",nodes:["n289","n290","n291","n292","n289"],tags:{amenity:"parking"}},w570:{id:"w570",nodes:["n3155","n3156","n3152","n3153","n3155"],tags:{building:"yes"}},w571:{id:"w571",nodes:["n3099","n3100","n3101","n3102","n3099"],tags:{building:"yes"}},w572:{id:"w572",nodes:["n3147","n3148","n3149","n3150","n3147"],tags:{building:"yes"}},w573:{id:"w573",nodes:["n3039","n2284"],tags:{highway:"service"}},w574:{id:"w574",nodes:["n3151","n3152","n3153","n3154","n3151"],tags:{building:"yes"}},w575:{id:"w575",nodes:["n3021","n3022","n3023","n3024","n3021"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w576:{id:"w576",nodes:["n3065","n3066","n3067","n3068","n3065"],tags:{building:"yes"}},w577:{id:"w577",nodes:["n2944","n3192","n3757","n3813","n3814","n3815","n3816","n3817","n3818","n3819"],tags:{highway:"service",name:"Willow Drive",service:"driveway",surface:"unpaved"}},w578:{id:"w578",nodes:["n2163","n2165","n2166","n2167","n2168","n2172","n2173","n2174","n2175","n2176","n2178","n2181","n2163"],tags:{building:"yes"}},w579:{id:"w579",nodes:["n2754","n3195","n3204","n3205","n4537","n4540","n3206","n4530","n4536","n3207","n4524","n3199","n4521","n3197","n1032"],tags:{highway:"residential",name:"Elm Street"}},w58:{id:"w58",nodes:["n240","n293","n294"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w580:{id:"w580",nodes:["n2184","n2185","n2187","n2190","n2191","n2192","n2184"],tags:{building:"yes"}},w581:{id:"w581",nodes:["n2765","n3208","n3211","n2755","n3280","n2756","n3346"],tags:{highway:"residential",name:"Kelsey Street"}},w582:{id:"w582",nodes:["n2753","n3194","n3193","n3201","n3196","n4551","n3202","n4550","n3203","n3200","n3198","n1033"],tags:{highway:"residential",name:"Walnut Street"}},w583:{id:"w583",nodes:["n3272","n4469","n4588","n2879","n4564","n2872"],tags:{highway:"residential",name:"10th Avenue"}},w584:{id:"w584",nodes:["n3243","n3242","n3241","n3240","n3243"],tags:{building:"industrial"}},w585:{id:"w585",nodes:["n3273","n3274","n4631","n4593","n3275","n4592","n2846","n4611","n2847"],tags:{highway:"residential",name:"6th Avenue"}},w586:{id:"w586",nodes:["n3276","n4591","n2853","n4605","n2854"],tags:{highway:"residential",name:"8th Avenue"}},w587:{id:"w587",nodes:["n3269","n3268","n3267","n3266","n3265","n3264","n3263","n3262","n3269"],tags:{building:"industrial"}},w588:{id:"w588",nodes:["n3277","n4599","n2857","n4598","n4608","n2858"],tags:{highway:"residential",name:"7th Avenue"}},w589:{id:"w589",nodes:["n3239","n3238","n3271","n3270","n3237","n3236","n3235","n3234","n3239"],tags:{building:"yes"}},w59:{id:"w59",nodes:["n294","n295","n296","n297","n298","n299","n300","n301","n302","n303","n491","n304","n305","n306","n307"],tags:{footway:"sidewalk",highway:"footway"}},w590:{id:"w590",nodes:["n3278","n4458","n4589","n4604","n2861"],tags:{highway:"residential",name:"9th Avenue"}},w591:{id:"w591",nodes:["n3253","n3252","n3251","n3250","n3249","n3248","n3253"],tags:{building:"industrial"}},w592:{id:"w592",nodes:["n3229","n3228","n3227","n3226","n3225","n3224","n3223","n3222","n3221","n3220","n3219","n3218","n3217","n3216","n3215","n3214","n3213","n3212","n3229"],tags:{natural:"water",water:"pond"}},w593:{id:"w593",nodes:["n3261","n3260","n3259","n3258","n3257","n3256","n3255","n3254","n3261"],tags:{building:"industrial"}},w594:{id:"w594",nodes:["n3233","n3232","n3231","n3230","n3233"],tags:{building:"yes"}},w595:{id:"w595",nodes:["n3247","n3246","n3245","n3244","n3247"],tags:{building:"industrial"}},w596:{id:"w596",nodes:["n2769","n3195","n3193","n3209","n2758","n2759","n3279"],tags:{highway:"residential",name:"Armitage Street"}},w597:{id:"w597",nodes:["n2193","n2194","n2195","n2197","n2193"],tags:{building:"yes"}},w598:{id:"w598",nodes:["n3404","n3403","n3402","n3401","n3400","n3399","n3398","n3397","n3373","n3372","n3396","n3395","n3404"],tags:{building:"school"}},w6:{id:"w6",nodes:["n879","n880","n881","n882","n879"],tags:{building:"shed"}},w60:{id:"w60",nodes:["n239","n308","n307"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w600:{id:"w600",nodes:["n3387","n3386","n3316","n3315","n3314","n3313","n3387"],tags:{building:"yes"}},w601:{id:"w601",nodes:["n3304","n3303","n3302","n3301","n3385","n3384","n3300","n3299","n3304"],tags:{building:"yes"}},w602:{id:"w602",nodes:["n3334","n3333","n3332","n3331","n3330","n3329","n3328","n3327","n3326","n3325","n3324","n3323","n3322","n3321","n3320","n3319","n3318","n3317","n3334"],tags:{building:"yes"}},w603:{id:"w603",nodes:["n3353","n3352","n3347","n3280","n2798"],tags:{highway:"service",service:"alley",surface:"unpaved"}},w604:{id:"w604",nodes:["n3753","n3211","n3383"],tags:{highway:"service",service:"alley"}},w605:{id:"w605",nodes:["n3290","n3289","n3288","n3287","n3286","n3285","n3284","n3283","n3282","n3281","n3290"],tags:{building:"yes"}},w606:{id:"w606",nodes:["n2198","n2199","n2201","n2202","n2203","n2206","n2198"],tags:{building:"yes"}},w607:{id:"w607",nodes:["n2198","n2207"],tags:{barrier:"wall"}},w608:{id:"w608",nodes:["n2751","n3208","n3210","n3209","n3415","n3410","n3414","n3413","n3412","n3416"],tags:{highway:"residential",name:"East Street"}},w609:{id:"w609",nodes:["n2772","n3346","n3746","n3748","n3747","n3345","n3378","n3279","n3411"],tags:{highway:"residential",name:"Maple Street"}},w61:{id:"w61",nodes:["n309","n310","n311","n312","n313","n240"],tags:{footway:"sidewalk",highway:"footway"}},w610:{id:"w610",nodes:["n3379","n3380","n3382","n3381","n3379"],tags:{leisure:"park",name:"LaFayette Park"}},w611:{id:"w611",nodes:["n2768","n3194","n3210","n3753","n2760","n3353","n2773","n3378"],tags:{highway:"residential",name:"Bennett Street"}},w612:{id:"w612",nodes:["n2751","n3383","n2749","n2798","n2772"],tags:{highway:"residential",name:"Market Street"}},w613:{id:"w613",nodes:["n3298","n3297","n3296","n3295","n3294","n3293","n3292","n3291","n3298"],tags:{building:"yes"}},w614:{id:"w614",nodes:["n3375","n3406","n3405","n3374","n3375"],tags:{leisure:"playground"}},w615:{id:"w615",nodes:["n3393","n3344","n3343","n3342","n3341","n3340","n3339","n3338","n3337","n3392","n3391","n3390","n3389","n3336","n3335","n3388","n3393"],tags:{building:"yes"}},w616:{id:"w616",nodes:["n3376","n3407","n3408","n3377","n3376"],tags:{amenity:"school",name:"Three Rivers Elementary School"}},w617:{id:"w617",nodes:["n3312","n3311","n3310","n3309","n3308","n3307","n3306","n3305","n3312"],tags:{building:"yes"}},w619:{id:"w619",nodes:["n2863","n3424","n3425","n3426","n3427","n3428","n3429","n3430","n3431","n3432","n3433","n2844"],tags:{highway:"secondary",name:"Michigan Avenue",ref:"M 60"}},w62:{id:"w62",nodes:["n876","n906","n904","n875","n874","n873","n872","n871","n870","n869","n41","n868","n146","n314","n315","n1956"],tags:{footway:"sidewalk",highway:"footway"}},w620:{id:"w620",nodes:["n2844","n3420","n3421","n3422","n3439","n2859","n3437","n3493","n3496","n3500","n3497"],tags:{highway:"residential"}},w621:{id:"w621",nodes:["n3468","n3469","n3470","n3471","n3468"],tags:{building:"yes"}},w622:{id:"w622",nodes:["n3417","n3436","n3438","n3491","n3488","n3492","n3495","n3494","n3498","n3487","n3499","n3490","n3489","n4800","n3417"],tags:{landuse:"cemetery",name:"Riverside Cemetery"}},w623:{id:"w623",nodes:["n3440","n3441","n3442","n3443","n3444","n3445","n3440"],tags:{building:"yes"}},w624:{id:"w624",nodes:["n3446","n3447","n3448","n3449","n3450","n3451","n3452","n3453","n3454","n3455","n3456","n3457","n3458","n3459","n3460","n3461","n3462","n3463","n3464","n3465","n3466","n3467","n3446"],tags:{building:"yes"}},w625:{id:"w625",nodes:["n2844","n3434","n3435","n2878","n3275","n4621","n3276","n3278","n4463","n3272","n3472","n3474","n3475","n3476","n3477","n3478","n1202","n3479","n3480","n3481","n1203","n3482","n3483","n3484","n3485","n4574","n3486","n3473"],tags:{highway:"secondary",name:"Jefferson Street",name_1:"State Highway 60",ref:"M 60"}},w626:{id:"w626",nodes:["n3439","n3423","n2863"],tags:{highway:"unclassified",name:"Michigan Avenue",name_1:"State Highway 60"}},w627:{id:"w627",nodes:["n3500","n3005"],tags:{highway:"service"}},w628:{id:"w628",nodes:["n3491","n3488","n3492","n3010","n3009","n3005","n3008","n3007","n3006","n3502","n3491"],tags:{leisure:"park",name:"Marina Park"}},w629:{id:"w629",nodes:["n2208","n2209","n2212","n2214","n2208"],tags:{building:"yes"}},w63:{id:"w63",nodes:["n1955","n316"],tags:{footway:"sidewalk",highway:"footway"}},w630:{id:"w630",nodes:["n2757","n3414","n3202","n4542","n3206","n4538","n3750","n3503","n1629","n4500","n2763","n4502","n2764","n3508"],tags:{highway:"residential",name:"Hoffman Street"}},w631:{id:"w631",nodes:["n2215","n2750","n2770","n2771","n2215"],tags:{building:"yes"}},w632:{id:"w632",nodes:["n2766","n3504","n3507","n3751","n3205","n3196","n3410","n2746"],tags:{highway:"residential",name:"Cushman Street"}},w633:{id:"w633",nodes:["n2745","n3749","n3507","n4535","n3503"],tags:{highway:"residential",name:"Pine Street"}},w634:{id:"w634",nodes:["n3510","n3511","n3512","n3509","n3510"],tags:{leisure:"park",name:"Bowman Park"}},w636:{id:"w636",nodes:["n2745","n3752","n3204","n3201","n3415","n2761","n2767","n3411"],tags:{highway:"residential",name:"Wheeler Street"}},w637:{id:"w637",nodes:["n3550","n4586","n4476","n3472"],tags:{highway:"residential",name:"11th Avenue"}},w638:{id:"w638",nodes:["n3508","n3518"],tags:{bridge:"yes",highway:"residential",name:"Hoffman Street"}},w639:{id:"w639",nodes:["n3518","n1204","n2862","n3519","n3520","n3521","n3522","n3523","n2161","n3524","n3549","n3552","n4239","n3551","n4577","n4582","n4578","n4583","n4579","n4574"],tags:{highway:"residential",name:"Hoffman Street"}},w64:{id:"w64",nodes:["n316","n317"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w640:{id:"w640",nodes:["n3634","n3640","n3676","n3633","n3678","n3648","n3638","n3683","n3600","n3579","n3679","n3677","n2987","n3592","n3588","n3608","n3559","n3617","n3620","n3660","n3553","n3533","n3530","n3531","n3525","n3527","n3526","n3532","n3529","n3528","n3667","n3627","n3623","n3625","n3601","n3687","n3671","n3644","n3626","n3673","n3582","n3693","n3605","n3619","n3651","n3650","n3615","n3663","n3631","n3596","n3604","n3655","n3586","n3595","n3701","n3603","n3686","n3611","n3568","n3674","n3613","n3580","n3562","n3564","n3689","n3585","n3670","n3659","n3684","n3680","n3646","n3558","n3556","n3692","n3563","n3575","n3571","n3675","n3557","n3700","n3656","n3622","n3657","n3565","n3669","n3658","n3618","n3624","n3688","n3610","n3570","n3645","n3649","n3583","n3694","n3561","n3554","n3614","n3698","n3581","n3635","n3641","n3569","n3647","n3628","n3598","n3696","n3665","n3639","n3607","n3695","n3642","n3672","n3577","n3643","n3691","n3602","n3576","n3591","n3560","n3606","n3685","n3597","n3629","n3661","n3654","n3616","n3697","n3578","n3609","n3653","n3699","n3566","n3637","n3567","n3666","n3555","n3599","n3590","n3572","n3593","n3690","n3681","n3612","n3682","n3668","n3587","n3621","n3636","n3662","n3589","n3573","n3652","n3664","n3632","n3574","n3594","n3584","n3630","n3634"],tags:{landuse:"reservoir",name:"Hoffman Pond",natural:"water"}},w641:{id:"w641",nodes:["n2988","n3534","n3535","n3536","n3537","n3538","n3539","n3540","n3541","n3542","n3543","n3544","n3545","n3546","n3547","n3548","n2970"],tags:{waterway:"river"}},w642:{id:"w642",nodes:["n3702","n3703","n3704","n3705","n3706","n3707","n3708","n3709","n3710","n3711","n3712","n3713","n3714","n3715","n3716","n3717","n3718","n3719","n3720","n3721","n3722","n3723","n3724","n3725","n3726","n3727","n3728","n3729","n3730","n3731","n3732","n3733","n3734","n3735","n3736","n3737","n3738","n3739","n3740","n3741","n3742","n3743","n3702"],tags:{admin_level:"8",boundary:"administrative"}},w643:{id:"w643",nodes:["n2839","n2873"],tags:{highway:"service",service:"driveway"}},w644:{id:"w644",nodes:["n2873","n2840"],tags:{bridge:"yes",highway:"service",layer:"1",service:"driveway"}},w645:{id:"w645",nodes:["n2840","n2841","n2842","n2845","n2866"],tags:{highway:"service",service:"driveway",surface:"unpaved"}},w646:{id:"w646",nodes:["n2752","n3759","n1420","n1421","n1422","n3758","n4507","n4506","n4505","n4520","n3199","n4522","n4504","n4546","n3200","n4547","n3412"],tags:{highway:"residential",name:"Flower Street"}},w647:{id:"w647",nodes:["n2874","n2875","n2876","n2954","n2874"],tags:{building:"industrial"}},w648:{id:"w648",nodes:["n3778","n3779","n3780","n3781","n3782","n3783","n3778"],tags:{building:"yes"}},w649:{id:"w649",nodes:["n3197","n4543","n4544","n3198"],tags:{highway:"residential",name:"Morris Avenue",surface:"unpaved"}},w65:{id:"w65",nodes:["n317","n318","n319","n320","n321"],tags:{footway:"sidewalk",highway:"footway"}},w650:{id:"w650",nodes:["n3207","n4526","n4528","n4548","n3203","n4549","n3413","n2762"],tags:{highway:"residential",name:"Adams Street"}},w651:{id:"w651",nodes:["n3788","n3785","n3786","n3787","n3788"],tags:{power:"station"}},w652:{id:"w652",nodes:["n2957","n3163","n3241"],tags:{barrier:"wall"}},w653:{id:"w653",nodes:["n3549","n3802","n3803","n3800","n3801"],tags:{highway:"service",surface:"unpaved"}},w654:{id:"w654",nodes:["n3164","n3165","n3166","n3167","n3168","n3505","n3164"],tags:{building:"yes"}},w655:{id:"w655",nodes:["n3506","n3517","n3760","n3761","n3762","n3763","n3506"],tags:{building:"yes"}},w656:{id:"w656",nodes:["n3764","n3765","n3766","n3767","n3768","n3769","n3770","n3771","n3764"],tags:{building:"yes"}},w657:{id:"w657",nodes:["n3772","n3773","n3774","n3775","n3772"],tags:{building:"yes"}},w658:{id:"w658",nodes:["n3776","n3777","n3784","n3789","n3776"],tags:{building:"yes"}},w659:{id:"w659",nodes:["n3930","n3931","n3932","n3933","n3934","n3935","n3936","n3937","n3938","n3930"],tags:{leisure:"pitch",sport:"baseball"}},w66:{id:"w66",nodes:["n321","n322"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w660:{id:"w660",nodes:["n3982","n3842","n3864","n3865","n2938","n3866","n2939","n3867","n3868","n3858","n2937","n3869","n2935","n2934","n3870","n3348","n3862"],tags:{highway:"service"}},w661:{id:"w661",nodes:["n3968","n3969"],tags:{highway:"footway"}},w662:{id:"w662",nodes:["n3875","n3876","n3877","n3878","n3879","n3880","n3881","n3882","n3875"],tags:{amenity:"parking"}},w663:{id:"w663",nodes:["n3964","n3965"],tags:{highway:"footway"}},w664:{id:"w664",nodes:["n3966","n3967"],tags:{highway:"footway"}},w665:{id:"w665",nodes:["n3857","n3890","n3884","n3894","n3889","n3899","n3885","n3886","n3896","n3887"],tags:{highway:"service",service:"parking_aisle"}},w666:{id:"w666",nodes:["n3895","n3896"],tags:{highway:"service",service:"parking_aisle"}},w667:{id:"w667",nodes:["n3274","n3977","n3984","n3983","n3981","n3844","n3978","n3982","n3861","n3862","n3873","n3874","n4468","n3863"],tags:{access:"private",highway:"service",name:"Collins Drive"}},w668:{id:"w668",nodes:["n3900","n3901","n3902","n3903","n3904","n3905","n3808","n3809","n3906","n3907","n3908","n3967","n3909","n3910","n3911","n3955","n3964","n3912","n3913","n3914","n3915","n3916","n3917","n3918","n3919","n3920","n3921","n3922","n3923","n3924","n3925","n3926","n3927","n3969","n3970","n3928","n3807","n3929","n3900"],tags:{building:"school"}},w669:{id:"w669",nodes:["n3272","n39","n40","n3974","n3863","n3857","n3892","n3883","n3891","n3889"],tags:{highway:"service"}},w67:{id:"w67",nodes:["n322","n886","n323","n475"],tags:{footway:"crossing",highway:"footway"}},w670:{id:"w670",nodes:["n3473","n3859","n3860","n3980","n4908","n4865"],tags:{highway:"secondary",name:"Hoffman Street",ref:"M 60"}},w671:{id:"w671",nodes:["n3970","n3806","n3971"],tags:{highway:"footway"}},w672:{id:"w672",nodes:["n3892","n3893","n3894"],tags:{highway:"service",service:"parking_aisle"}},w673:{id:"w673",nodes:["n3945","n3946","n3992","n3990","n3945"],tags:{leisure:"pitch",sport:"tennis"}},w674:{id:"w674",nodes:["n3890","n3893","n3891"],tags:{highway:"service",service:"parking_aisle"}},w675:{id:"w675",nodes:["n3947","n3948","n3994","n3993","n3947"],tags:{leisure:"pitch",sport:"tennis"}},w676:{id:"w676",nodes:["n3858","n3954","n3972","n3810","n3811","n3812","n3841","n3973","n3898","n3963","n3897","n3896"],tags:{highway:"service"}},w677:{id:"w677",nodes:["n3977","n3996","n3997","n4004","n3998","n3999","n4005","n4007","n4006","n3995","n4000","n3843","n4001","n4002","n4003","n3949","n3351","n3950","n3354","n3350","n3951","n3349","n3952","n3953","n3954","n3956","n3966","n3955"],tags:{highway:"footway"}},w678:{id:"w678",nodes:["n3887","n3888","n3895","n3899"],tags:{highway:"service",service:"parking_aisle"}},w679:{id:"w679",nodes:["n3946","n3947","n3993","n3992","n3946"],tags:{leisure:"pitch",sport:"tennis"}},w68:{id:"w68",nodes:["n294","n1952","n326"],tags:{footway:"sidewalk",highway:"footway"}},w680:{id:"w680",nodes:["n3939","n3940","n3941","n3985","n3986","n3987","n3988","n3989","n3942","n3943","n3939"],tags:{leisure:"pitch",sport:"baseball"}},w681:{id:"w681",nodes:["n3990","n3991","n3944","n3945","n3990"],tags:{leisure:"pitch",sport:"tennis"}},w682:{id:"w682",nodes:["n3871","n3872","n3873","n3874","n3871"],tags:{amenity:"parking"}},w683:{id:"w683",nodes:["n3956","n3965","n3957","n3958","n3959"],tags:{footway:"sidewalk",highway:"footway"}},w684:{id:"w684",nodes:["n3790","n3791","n3792","n3793","n3790"],tags:{building:"shed"}},w685:{id:"w685",nodes:["n3794","n3795","n3796","n3797","n3794"],tags:{building:"yes"}},w686:{id:"w686",nodes:["n3798","n3799","n3804","n3805","n3798"],tags:{building:"yes"}},w687:{id:"w687",nodes:["n3806","n3807"],tags:{highway:"footway"}},w688:{id:"w688",nodes:["n3845","n3846","n3847","n3848","n3845"],tags:{leisure:"pitch",sport:"american_football"}},w689:{id:"w689",nodes:["n3849","n4021","n3850","n3851","n3852","n3853","n3854","n3855","n3856","n3975","n3976","n3979","n4008","n4009","n4010","n4011","n4012","n4013","n4014","n4015","n4016","n4017","n4018","n4019","n4020","n4021"],tags:{leisure:"track",sport:"running"}},w69:{id:"w69",nodes:["n326","n327"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w690:{id:"w690",nodes:["n4022","n4023","n4024","n4025","n4026","n4027","n4022"],tags:{building:"yes"}},w691:{id:"w691",nodes:["n4028","n4029","n4030","n4031","n4028"],tags:{building:"yes"}},w692:{id:"w692",nodes:["n4032","n4033","n4034","n4035","n4032"],tags:{building:"yes"}},w693:{id:"w693",nodes:["n4036","n4037","n4038","n4039","n4036"],tags:{building:"yes"}},w694:{id:"w694",nodes:["n4040","n4041","n4042","n4043","n4040"],tags:{building:"yes"}},w695:{id:"w695",nodes:["n4044","n4045","n4050","n4053","n4046","n4047","n4048","n4049","n4044"],tags:{building:"yes"}},w696:{id:"w696",nodes:["n4050","n4051","n4052","n4053","n4050"],tags:{building:"roof"}},w697:{id:"w697",nodes:["n4054","n4068","n4055","n4056","n4057","n4054"],tags:{building:"yes"}},w698:{id:"w698",nodes:["n4058","n4059","n4060","n4061","n4062","n4063","n4058"],tags:{building:"yes"}},w699:{id:"w699",nodes:["n4064","n4066","n4065"],tags:{barrier:"fence"}},w7:{id:"w7",nodes:["n43","n44","n45"],tags:{highway:"service"}},w70:{id:"w70",nodes:["n327","n328","n27","n329"],tags:{footway:"sidewalk",highway:"footway"}},w700:{id:"w700",nodes:["n4066","n4067","n4068"],tags:{barrier:"fence"}},w701:{id:"w701",nodes:["n4069","n4070","n4071","n4072","n4069"],tags:{building:"shed"}},w702:{id:"w702",nodes:["n4073","n4074","n4075","n4076","n4077","n4078","n4079","n4080","n4081","n4082","n4083","n4084","n4073"],tags:{building:"yes"}},w703:{id:"w703",nodes:["n4085","n4093","n4086","n4087","n4088","n4089","n4090","n4091","n4092","n4085"],tags:{building:"yes"}},w704:{id:"w704",nodes:["n4093","n4094","n4095","n4096"],tags:{barrier:"fence"}},w705:{id:"w705",nodes:["n4097","n4098","n4099","n4100","n4097"],tags:{building:"yes"}},w706:{id:"w706",nodes:["n4098","n4102","n4087"],tags:{barrier:"fence"}},w707:{id:"w707",nodes:["n4101","n4102","n4096","n4170","n4103"],tags:{barrier:"fence"}},w708:{id:"w708",nodes:["n4104","n4105","n4106","n4107","n4104"],tags:{access:"private",leisure:"swimming_pool"}},w709:{id:"w709",nodes:["n4108","n4109","n4110","n4111","n4108"],tags:{building:"yes"}},w71:{id:"w71",nodes:["n329","n331"],tags:{bridge:"yes",footway:"sidewalk",highway:"footway",layer:"1"}},w710:{id:"w710",nodes:["n4112","n4113","n4114","n4115","n4116","n4117","n4118","n4119","n4112"],tags:{building:"yes"}},w711:{id:"w711",nodes:["n4120","n4121","n4122","n4123","n4120"],tags:{building:"yes"}},w712:{id:"w712",nodes:["n4124","n4125","n4126","n4127","n4128","n4129","n4124"],tags:{building:"yes"}},w713:{id:"w713",nodes:["n4130","n4131","n4132","n4133","n4130"],tags:{building:"shed"}},w714:{id:"w714",nodes:["n4134","n4135","n4136","n4137","n4138","n4139","n4140","n4141","n4142","n4143","n4134"],tags:{building:"yes"}},w715:{id:"w715",nodes:["n4144","n4145","n4146","n4147","n4148","n4149","n4144"],tags:{building:"yes"}},w716:{id:"w716",nodes:["n4150","n4151","n4152","n4153","n4150"],tags:{building:"yes"}},w717:{id:"w717",nodes:["n4154","n4155","n4156","n4157","n4154"],tags:{building:"yes"}},w718:{id:"w718",nodes:["n4158","n4159","n4160","n4161","n4162","n4163","n4164","n4165","n4158"],tags:{building:"yes"}},w719:{id:"w719",nodes:["n4166","n4167","n4168","n4169","n4166"],tags:{building:"yes"}},w72:{id:"w72",nodes:["n331","n344","n332","n333","n334"],tags:{footway:"sidewalk",highway:"footway"}},w720:{id:"w720",nodes:["n4170","n4171"],tags:{barrier:"fence"}},w721:{id:"w721",nodes:["n4138","n4103"],tags:{barrier:"fence"}},w722:{id:"w722",nodes:["n4103","n4172"],tags:{barrier:"fence"}},w723:{id:"w723",nodes:["n4173","n4174"],tags:{barrier:"fence"}},w724:{id:"w724",nodes:["n4175","n4176","n4177","n4178","n4175"],tags:{building:"yes"}},w725:{id:"w725",nodes:["n4179","n4180","n4181","n4182","n4183","n4184","n4179"],tags:{building:"yes"}},w726:{id:"w726",nodes:["n4185","n4186","n4187","n4188","n4185"],tags:{building:"yes"}},w727:{id:"w727",nodes:["n4189","n4190","n4191","n4192","n4193","n4194","n4195","n4196","n4197","n4198","n4199","n4200","n4201","n4202","n4189"],tags:{building:"yes"}},w728:{id:"w728",nodes:["n4203","n4204","n4205","n4206","n4207","n4208","n4209","n4210","n4203"],tags:{building:"yes"}},w729:{id:"w729",nodes:["n4211","n4212","n4213","n4214","n4211"],tags:{building:"shed"}},w73:{id:"w73",nodes:["n335","n336","n337","n338","n339","n340","n341","n342","n335"],tags:{building:"yes"}},w730:{id:"w730",nodes:["n4215","n4216","n4217","n4218","n4215"],tags:{building:"yes"}},w731:{id:"w731",nodes:["n4219","n4220","n4221","n4222","n4223","n4224","n4225","n4226","n4227","n4228","n4229","n4230","n4219"],tags:{building:"yes"}},w732:{id:"w732",nodes:["n4231","n4232","n4233","n4234","n4235","n4236","n4237","n4238","n4231"],tags:{building:"yes"}},w733:{id:"w733",nodes:["n4239","n4240","n4241","n4242","n4243","n4244","n4245","n4246","n4247","n4248","n4241"],tags:{highway:"service"}},w734:{id:"w734",nodes:["n4240","n4249","n4248"],tags:{highway:"service",service:"parking_aisle"}},w735:{id:"w735",nodes:["n4250","n4251","n4252","n4253","n4254","n4255","n4256","n4257","n4258","n4250"],tags:{amenity:"parking"}},w736:{id:"w736",nodes:["n4259","n4260","n4261","n4262","n4259"],tags:{building:"yes"}},w737:{id:"w737",nodes:["n4263","n4264","n4265","n4266","n4267","n4268","n4269","n4270","n4271","n4272","n4273","n4274","n4275","n4276","n4263"],tags:{building:"yes"}},w738:{id:"w738",nodes:["n4277","n4278","n4279","n4280","n4281","n4282","n4277"],tags:{building:"yes"}},w739:{id:"w739",nodes:["n4283","n4284","n4285","n4286","n4287","n4288","n4289","n4290","n4291","n4292","n4293","n4294","n4283"],tags:{building:"yes"}},w74:{id:"w74",nodes:["n343","n344","n345"],tags:{highway:"service"}},w740:{id:"w740",nodes:["n4295","n4296","n4297","n4298","n4295"],tags:{building:"yes"}},w741:{id:"w741",nodes:["n4299","n4300","n4301","n4302","n4303","n4304","n4305","n4306","n4307","n4308","n4309","n4310","n4299"],tags:{building:"yes"}},w742:{id:"w742",nodes:["n4311","n4312","n4313","n4314","n4311"],tags:{building:"shed"}},w743:{id:"w743",nodes:["n4315","n4316","n4317","n4318","n4319","n4320","n4315"],tags:{building:"yes"}},w744:{id:"w744",nodes:["n4321","n4322","n4323","n4324","n4325","n4326","n4327","n4328","n4329","n4330","n4331","n4332","n4333","n4334","n4321"],tags:{building:"yes"}},w745:{id:"w745",nodes:["n4335","n4336","n4337","n4338","n4335"],tags:{building:"shed"}},w746:{id:"w746",nodes:["n4339","n4340","n4341","n4342","n4343","n4344","n4339"],tags:{building:"yes"}},w747:{id:"w747",nodes:["n4345","n4346","n4347","n4348","n4345"],tags:{building:"yes"}},w748:{id:"w748",nodes:["n4349","n4350","n4351","n4352","n4349"],tags:{building:"yes"}},w749:{id:"w749",nodes:["n4353","n4354","n4355","n4356","n4357","n4358","n4353"],tags:{building:"yes"}},w75:{id:"w75",nodes:["n346","n347","n348","n349","n350","n351","n346"],tags:{amenity:"parking"}},w750:{id:"w750",nodes:["n4612","n4359","n4360"],tags:{barrier:"fence"}},w751:{id:"w751",nodes:["n4361","n4362","n4363","n4364","n4361"],tags:{building:"yes"}},w752:{id:"w752",nodes:["n4365","n4366","n4367","n4368","n4365"],tags:{building:"yes"}},w753:{id:"w753",nodes:["n4369","n4370","n4371","n4372","n4375","n4369"],tags:{building:"yes"}},w754:{id:"w754",nodes:["n4373","n4374","n4375"],tags:{barrier:"fence"}},w755:{id:"w755",nodes:["n4376","n4377","n4378","n4379","n4376"],tags:{building:"shed"}},w756:{id:"w756",nodes:["n4380","n4381","n4382","n4383","n4384","n4385","n4386","n4387","n4388","n4389","n4390","n4391","n4380"],tags:{building:"yes"}},w757:{id:"w757",nodes:["n4392","n4393","n4394","n4395","n4392"],tags:{building:"yes"}},w758:{id:"w758",nodes:["n4396","n4397","n4398","n4399","n4396"],tags:{building:"shed"}},w759:{id:"w759",nodes:["n4400","n4401","n4402","n4403","n4404","n4405","n4406","n4407","n4408","n4409","n4410","n4411","n4412","n4413","n4414","n4415","n4400"],tags:{building:"yes"}},w76:{id:"w76",nodes:["n2561","n359","n2563","n2793","n357","n356","n2792","n355","n354","n2791","n2562","n353","n352","n358","n2561"],tags:{highway:"service",oneway:"yes",service:"parking_aisle"}},w760:{id:"w760",nodes:["n4416","n4417"],tags:{barrier:"fence"}},w761:{id:"w761",nodes:["n4418","n4416","n4419"],tags:{barrier:"fence"}},w762:{id:"w762",nodes:["n4420","n4421"],tags:{barrier:"fence"}},w763:{id:"w763",nodes:["n4422","n4423","n4424","n4425","n4426","n4427","n4428","n4429","n4430","n4431","n4432","n4433","n4422"],tags:{building:"yes"}},w764:{id:"w764",nodes:["n4434","n4435","n4436","n4437","n4438","n4439","n4440","n4441","n4442","n4445","n4444","n4443","n4434"],tags:{building:"yes"}},w765:{id:"w765",nodes:["n4446","n4447","n4448","n4449","n4446"],tags:{building:"yes"}},w766:{id:"w766",nodes:["n4450","n4451","n4452","n4453","n4450"],tags:{building:"yes"}},w767:{id:"w767",nodes:["n4454","n4455","n4456","n4457","n4454"],tags:{building:"yes"}},w768:{id:"w768",nodes:["n4461","n4458","n4460"],tags:{footway:"crossing",highway:"footway"}},w769:{id:"w769",nodes:["n4460","n4462","n4459"],tags:{footway:"sidewalk",highway:"footway"}},w77:{id:"w77",nodes:["n325","n360","n361"],tags:{footway:"crossing",highway:"footway"}},w770:{id:"w770",nodes:["n4462","n4463","n4464"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w771:{id:"w771",nodes:["n4464","n4465","n4466","n4467"],tags:{footway:"sidewalk",highway:"footway"}},w772:{id:"w772",nodes:["n3959","n3968","n3971","n3960","n3961","n3962","n3963"],tags:{footway:"sidewalk",highway:"footway"}},w773:{id:"w773",nodes:["n4467","n4468","n3959"],tags:{footway:"crossing",highway:"footway"}},w774:{id:"w774",nodes:["n4459","n4469","n4470"],tags:{footway:"crossing",highway:"footway"}},w775:{id:"w775",nodes:["n4470","n4471","n4472","n4473","n4474","n4475"],tags:{footway:"sidewalk",highway:"footway"}},w776:{id:"w776",nodes:["n4475","n4476","n4477"],tags:{footway:"crossing",highway:"footway"}},w777:{id:"w777",nodes:["n4477","n4478","n4479","n4480","n4481","n4482","n4483","n4484","n4485","n4486","n4487"],tags:{footway:"sidewalk",highway:"footway"}},w778:{id:"w778",nodes:["n4488","n4489","n4490","n4491","n4488"],tags:{building:"yes"}},w779:{id:"w779",nodes:["n4492","n4493","n4494","n4495","n4492"],tags:{building:"yes"}},w78:{id:"w78",nodes:["n361","n362","n369"],tags:{footway:"sidewalk",highway:"footway"}},w780:{id:"w780",nodes:["n4496","n4497","n4498","n4499","n4496"],tags:{access:"private",leisure:"swimming_pool"}},w781:{id:"w781",nodes:["n4508","n4509"],tags:{footway:"sidewalk",highway:"footway"}},w782:{id:"w782",nodes:["n4510","n4511"],tags:{footway:"sidewalk",highway:"footway"}},w783:{id:"w783",nodes:["n4512","n4513"],tags:{footway:"sidewalk",highway:"footway"}},w784:{id:"w784",nodes:["n4513","n4514"],tags:{footway:"sidewalk",highway:"footway"}},w785:{id:"w785",nodes:["n4515","n4516"],tags:{footway:"sidewalk",highway:"footway"}},w786:{id:"w786",nodes:["n4517","n4515"],tags:{footway:"sidewalk",highway:"footway"}},w787:{id:"w787",nodes:["n4518","n4519"],tags:{footway:"sidewalk",highway:"footway"}},w788:{id:"w788",nodes:["n4519","n4520","n4513"],tags:{footway:"crossing",highway:"footway"}},w789:{id:"w789",nodes:["n4515","n4521","n4513"],tags:{footway:"crossing",highway:"footway"}},w79:{id:"w79",nodes:["n362","n363","n334"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w790:{id:"w790",nodes:["n4515","n4522","n4523"],tags:{footway:"crossing",highway:"footway"}},w791:{id:"w791",nodes:["n4523","n4524","n4519"],tags:{footway:"crossing",highway:"footway"}},w792:{id:"w792",nodes:["n4523","n4525"],tags:{footway:"sidewalk",highway:"footway"}},w793:{id:"w793",nodes:["n4525","n4526","n4527"],tags:{footway:"crossing",highway:"footway"}},w794:{id:"w794",nodes:["n4527","n4529"],tags:{footway:"sidewalk",highway:"footway"}},w795:{id:"w795",nodes:["n4529","n4530","n4518"],tags:{footway:"crossing",highway:"footway"}},w796:{id:"w796",nodes:["n4518","n4531"],tags:{footway:"sidewalk",highway:"footway"}},w797:{id:"w797",nodes:["n4531","n4532"],tags:{footway:"sidewalk",highway:"footway"}},w798:{id:"w798",nodes:["n4533","n4534"],tags:{footway:"sidewalk",highway:"footway"}},w799:{id:"w799",nodes:["n4518","n4538","n4539"],tags:{footway:"crossing",highway:"footway"}},w8:{id:"w8",nodes:["n46","n47","n145","n48","n49","n46"],tags:{amenity:"parking"}},w80:{id:"w80",nodes:["n334","n364","n365"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w800:{id:"w800",nodes:["n4539","n4540","n4541"],tags:{footway:"crossing",highway:"footway"}},w801:{id:"w801",nodes:["n4541","n4542","n4529"],tags:{footway:"crossing",highway:"footway"}},w802:{id:"w802",nodes:["n4552","n4553"],tags:{footway:"sidewalk",highway:"footway"}},w803:{id:"w803",nodes:["n4554","n4555","n4556","n4557","n4558","n4559","n4554"],tags:{building:"yes"}},w804:{id:"w804",nodes:["n4562","n4563"],tags:{barrier:"retaining_wall"}},w805:{id:"w805",nodes:["n4568","n4569","n4570","n4571","n4568"],tags:{building:"yes"}},w806:{id:"w806",nodes:["n3473","n4575","n4576","n4581","n4580","n3551"],tags:{highway:"residential",oneway:"yes"}},w807:{id:"w807",nodes:["n4613","n4614","n4615","n4616","n4617","n4618","n4619","n4620","n4613"],tags:{leisure:"pitch",sport:"baseball"}},w808:{id:"w808",nodes:["n4621","n4622","n4623","n4624","n4625","n4626","n4627","n4628","n4629","n4630"],tags:{highway:"service"}},w809:{id:"w809",nodes:["n4631","n4632","n4633","n4637","n4634","n4638","n4635","n4636"],tags:{highway:"service"}},w81:{id:"w81",nodes:["n365","n366","n367"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w810:{id:"w810",nodes:["n4639","n4640","n4641"],tags:{barrier:"fence"}},w811:{id:"w811",nodes:["n4649","n4650","n4651","n4652","n4649"],tags:{building:"yes"}},w812:{id:"w812",nodes:["n4654","n4655"],tags:{barrier:"fence"}},w813:{id:"w813",nodes:["n4656","n4657"],tags:{barrier:"fence"}},w814:{id:"w814",nodes:["n4669","n4670","n4671","n4672","n4669"],tags:{amenity:"shelter",building:"yes",shelter_type:"picnic_shelter"}},w815:{id:"w815",nodes:["n4678","n4679","n4680","n1889"],tags:{highway:"service"}},w816:{id:"w816",nodes:["n239","n4686","n4687"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w817:{id:"w817",nodes:["n4687","n4688","n4689"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w818:{id:"w818",nodes:["n4689","n4690","n307"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w819:{id:"w819",nodes:["n2266","n4743"],tags:{highway:"path"}},w82:{id:"w82",nodes:["n724","n368","n369"],tags:{crossing:"zebra",footway:"crossing",highway:"footway"}},w820:{id:"w820",nodes:["n4785","n4786","n4787","n4788","n1684","n4760","n4769","n4761","n4762","n4763","n4764","n4765","n4766","n4767","n4768","n4785"],tags:{natural:"wood"}},w821:{id:"w821",nodes:["n4769","n4770","n4771","n4772","n4773","n4774","n4775","n4776","n4777","n4778","n4779","n4780","n4781","n4782","n4783","n4784","n4785","n4768","n4767","n4766","n4765","n4764","n4763","n4762","n4761","n4769"],tags:{natural:"scrub"}},w822:{id:"w822",nodes:["n4772","n4789","n4790","n4791","n4792","n4793","n4794","n4795","n4796","n4797","n4798","n4799","n4783","n4782","n4781","n4780","n4779","n4778","n4777","n4776","n4775","n4774","n4773","n4772"],tags:{natural:"wood"}},w823:{id:"w823",nodes:["n4800","n4801","n4802","n4803","n4804","n4805","n4806","n4807","n4808","n4809","n4810","n4811","n4812","n4813","n4814","n4815","n4816","n3490","n3489","n4800"],tags:{natural:"wood"}},w824:{id:"w824",nodes:["n4817","n4818","n4819","n4820","n4821","n4822","n4817"],tags:{landuse:"recreation_ground"}},w825:{id:"w825",nodes:["n4563","n4823","n4824","n4829","n4825","n4826","n4827","n4828","n4562","n4563"],tags:{landuse:"recreation_ground"}},w826:{id:"w826",nodes:["n4830","n4831","n4832","n4833","n4834","n4835","n4836","n4830"],tags:{landuse:"industrial"}},w827:{id:"w827",nodes:["n4563","n4837","n4838","n4839","n4840","n4841","n4842","n4827","n4828","n4562","n4563"],tags:{landuse:"industrial"}},w828:{id:"w828",nodes:["n4843","n4844","n4845","n4846","n4843"],tags:{landuse:"farmland"}},w829:{id:"w829",nodes:["n3712","n4847","n4848","n4849","n4850","n4851","n4852","n4858","n4864","n4959","n4960","n4853","n4857","n4854","n4855","n4856","n3712"],tags:{aeroway:"aerodrome",name:"Three Rivers Municipal Airport"}},w83:{id:"w83",nodes:["n371","n372","n373","n374","n371"],tags:{building:"yes"}},w830:{id:"w830",nodes:["n4855","n4854","n4857","n4853","n4960"],tags:{barrier:"fence"}},w831:{id:"w831",nodes:["n4860","n4859","n4858","n4852","n4851"],tags:{barrier:"fence"}},w832:{id:"w832",nodes:["n4866","n4878","n4869","n4867"],tags:{aeroway:"runway",ref:"5/23"}},w833:{id:"w833",nodes:["n4868","n4890","n4894","n4881","n4869","n4905","n4870"],tags:{aeroway:"runway",ref:"9/27"}},w834:{id:"w834",nodes:["n4871","n4875","n4872","n4895","n4873","n4874","n4871"],tags:{aeroway:"apron"}},w835:{id:"w835",nodes:["n4875","n4876","n4877","n4878","n4879","n4880","n4882","n4881"],tags:{aeroway:"taxiway"}},w836:{id:"w836",nodes:["n4882","n4893","n4883","n4891","n4884","n4885","n4886","n4887","n4888","n4892","n4889","n4890"],tags:{aeroway:"taxiway"}},w837:{id:"w837",nodes:["n4893","n4894"],tags:{aeroway:"taxiway"}},w838:{id:"w838",nodes:["n4895","n4896","n4897","n4898","n4899","n4900","n4901","n4902","n4903","n4906","n4904","n4905"],tags:{aeroway:"taxiway"}},w839:{id:"w839",nodes:["n4907","n4908"],tags:{highway:"service"}},w84:{id:"w84",nodes:["n374","n375","n376","n377","n373","n374"],tags:{building:"yes"}},w840:{id:"w840",nodes:["n4909","n4907","n4910"],tags:{highway:"service"}},w841:{id:"w841",nodes:["n4911","n4912","n4913","n4914","n4911"],tags:{building:"yes"}},w842:{id:"w842",nodes:["n4915","n4916","n4917","n4918","n4915"],tags:{aeroway:"hangar",building:"yes"}},w843:{id:"w843",nodes:["n4919","n4920","n4921","n4922","n4919"],tags:{building:"yes"}},w844:{id:"w844",nodes:["n4923","n4924","n4925","n4926","n4923"],tags:{aeroway:"hangar",building:"yes"}},w845:{id:"w845",nodes:["n4927","n4928","n4929","n4930","n4927"],tags:{aeroway:"hangar",building:"yes"}},w846:{id:"w846",nodes:["n4931","n4932","n4933","n4934","n4931"],tags:{aeroway:"hangar",building:"yes"}},w847:{id:"w847",nodes:["n4935","n4936","n4937","n4938","n4935"],tags:{aeroway:"hangar",building:"yes"}},w848:{id:"w848",nodes:["n4939","n4940","n4941","n4942","n4939"],tags:{aeroway:"hangar",building:"yes"}},w849:{id:"w849",nodes:["n4943","n4944","n4945","n4946","n4943"],tags:{aeroway:"hangar",building:"yes"}},w85:{id:"w85",nodes:["n431","n432","n1038","n433","n434","n1040","n431"],tags:{building:"yes"}},w850:{id:"w850",nodes:["n4947","n4948","n4949","n4950","n4947"],tags:{aeroway:"hangar",building:"yes"}},w851:{id:"w851",nodes:["n4951","n4952","n4953","n4954","n4951"],tags:{aeroway:"hangar",building:"yes"}},w852:{id:"w852",nodes:["n4955","n4956","n4957","n4958","n4955"],tags:{aeroway:"hangar",building:"yes"}},w853:{id:"w853",nodes:["n4959","n4864","n4861","n4862","n4863"],tags:{barrier:"fence"}},w854:{id:"w854",nodes:["n4961","n4962","n4963","n4964","n4965","n4966","n4967","n4968","n4969","n4961"],tags:{landuse:"farmland"}},w855:{id:"w855",nodes:["n4970","n4971","n4972","n4973","n4974","n4975","n4976","n4977","n4978","n4980","n4970"],tags:{landuse:"farmland"}},w856:{id:"w856",nodes:["n4979","n4980","n4978","n4981","n4982","n4983","n4984","n4985","n4979"],tags:{natural:"scrub"}},w857:{id:"w857",nodes:["n4986","n4987","n4988","n5032","n4989","n4990","n4991","n4992","n4993","n4994","n4995","n4996","n4997","n4998","n4999","n5000","n5001","n5002","n5022","n5023","n5024","n5025","n5030","n5031","n5029","n5028","n5027","n5026","n4986"],tags:{landuse:"farmland"}},w858:{id:"w858",nodes:["n5001","n5003","n5004","n4999","n5000","n5001"],tags:{natural:"scrub"}},w859:{id:"w859",nodes:["n5005","n5006","n5007","n5008","n5009","n5010","n5021","n5020","n5019","n5011","n5012","n5013","n5018","n5014","n5015","n5017","n5016","n5005"],tags:{landuse:"farmland"}},w86:{id:"w86",nodes:["n384","n385","n386","n387","n384"],tags:{building:"yes"}},w860:{id:"w860",nodes:["n3020","n5033","n5034","n5035","n3179","n3180","n3191","n3181","n3190","n3182","n3183","n3184","n3185","n3186","n3187","n3188","n3189","n3160","n3161","n3162","n2126","n2153","n2288","n3020"],tags:{landuse:"industrial"}},w87:{id:"w87",nodes:["n387","n388","n389","n386","n387"],tags:{building:"yes"}},w88:{id:"w88",nodes:["n390","n391","n392","n393","n390"],tags:{building:"yes"}},w89:{id:"w89",nodes:["n394","n2895"],tags:{highway:"service"}},w9:{id:"w9",nodes:["n50","n51","n148","n52","n57","n891","n53","n50"],tags:{building:"yes"}},w90:{id:"w90",nodes:["n398","n399","n400","n401","n402","n403","n404","n405","n406","n407","n408","n409","n410","n411","n412","n413","n414","n415","n416","n417","n398"],tags:{building:"yes"}},w91:{id:"w91",nodes:["n418","n423","n419"],tags:{highway:"service"}},w92:{id:"w92",nodes:["n420","n421","n422","n423","n420"],tags:{amenity:"parking"}},w93:{id:"w93",nodes:["n2282","n1876"],tags:{name:"Rocky River",tunnel:"building_passage",waterway:"river"}},w94:{id:"w94",nodes:["n1876","n885","n1875","n2234"],tags:{name:"Rocky River",waterway:"river"}},w95:{id:"w95",nodes:["n425","n426","n427","n914","n428","n913","n425"],tags:{building:"yes"}},w96:{id:"w96",nodes:["n456","n620","n1034","n1035","n456"],tags:{building:"yes"}},w97:{id:"w97",nodes:["n435","n912","n451","n321"],tags:{highway:"footway"}},w98:{id:"w98",nodes:["n436","n319","n437","n438","n439","n440","n441","n476","n442"],tags:{highway:"service"}},w99:{id:"w99",nodes:["n443","n444","n445","n446","n447","n448","n449","n450","n443"],tags:{amenity:"parking"}},n2934:{id:"n2934",loc:[-85.617051,41.952263]},n2935:{id:"n2935",loc:[-85.61699,41.952276]},n2937:{id:"n2937",loc:[-85.616847,41.952262]},n2938:{id:"n2938",loc:[-85.616577,41.951956]},n2939:{id:"n2939",loc:[-85.61656,41.952044]},n3348:{id:"n3348",loc:[-85.61714,41.9522]},n3349:{id:"n3349",loc:[-85.616517,41.95212]},n3350:{id:"n3350",loc:[-85.616489,41.952033]},n3351:{id:"n3351",loc:[-85.616529,41.951907]},n3354:{id:"n3354",loc:[-85.616488,41.951994]}};
59229 // Tooltips and svg mask used to highlight certain features
59230 function uiCurtain() {
59232 var surface = select(null),
59233 tooltip = select(null),
59234 darkness = select(null);
59236 function curtain(selection$$1) {
59237 surface = selection$$1
59239 .attr('id', 'curtain')
59240 .style('z-index', 1000)
59241 .style('pointer-events', 'none')
59242 .style('position', 'absolute')
59246 darkness = surface.append('path')
59249 .attr('class', 'curtain-darkness');
59251 select(window).on('resize.curtain', resize);
59253 tooltip = selection$$1.append('div')
59254 .attr('class', 'tooltip')
59255 .style('z-index', 1002);
59259 .attr('class', 'tooltip-arrow');
59263 .attr('class', 'tooltip-inner');
59268 function resize() {
59270 .attr('width', window.innerWidth)
59271 .attr('height', window.innerHeight);
59272 curtain.cut(darkness.datum());
59278 * Reveal cuts the curtain to highlight the given box,
59279 * and shows a tooltip with instructions next to the box.
59281 * @param {String|ClientRect} [box] box used to cut the curtain
59282 * @param {String} [text] text for a tooltip
59283 * @param {Object} [options]
59284 * @param {string} [options.tooltipClass] optional class to add to the tooltip
59285 * @param {integer} [options.duration] transition time in milliseconds
59286 * @param {string} [options.buttonText] if set, create a button with this text label
59287 * @param {function} [options.buttonCallback] if set, the callback for the button
59288 * @param {String|ClientRect} [options.tooltipBox] box for tooltip position, if different from box for the curtain
59290 curtain.reveal = function(box, text, options) {
59291 if (typeof box === 'string') {
59292 box = select(box).node();
59294 if (box && box.getBoundingClientRect) {
59295 box = copyBox(box.getBoundingClientRect());
59298 options = options || {};
59301 if (options.tooltipBox) {
59302 tooltipBox = options.tooltipBox;
59303 if (typeof tooltipBox === 'string') {
59304 tooltipBox = select(tooltipBox).node();
59306 if (tooltipBox && tooltipBox.getBoundingClientRect) {
59307 tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
59313 if (tooltipBox && text) {
59314 // pseudo markdown bold text for the instruction section..
59315 var parts = text.split('**');
59316 var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
59318 html += '<span class="instruction">' + parts[1] + '</span>';
59321 html = html.replace(/\*(.*?)\*/g, '<em>$1</em>'); // emphasis
59322 html = html.replace(/\{br\}/g, '<br/><br/>'); // linebreak
59324 if (options.buttonText && options.buttonCallback) {
59325 html += '<div class="button-section">' +
59326 '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
59329 var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
59331 .classed(classes, true)
59332 .selectAll('.tooltip-inner')
59335 if (options.buttonText && options.buttonCallback) {
59336 var button = tooltip.selectAll('.button-section .button.action');
59338 .on('click', function() {
59339 event.preventDefault();
59340 options.buttonCallback();
59344 var tip = copyBox(tooltip.node().getBoundingClientRect()),
59345 w = window.innerWidth,
59346 h = window.innerHeight,
59347 tooltipWidth = 200,
59352 // hack: this will have bottom placement,
59353 // so need to reserve extra space for the tooltip illustration.
59354 if (options.tooltipClass === 'intro-mouse') {
59358 // trim box dimensions to just the portion that fits in the window..
59359 if (tooltipBox.top + tooltipBox.height > h) {
59360 tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
59362 if (tooltipBox.left + tooltipBox.width > w) {
59363 tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
59366 // determine tooltip placement..
59368 if (tooltipBox.top + tooltipBox.height < 100) {
59369 // tooltip below box..
59372 tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
59373 tooltipBox.top + tooltipBox.height
59376 } else if (tooltipBox.top > h - 140) {
59377 // tooltip above box..
59380 tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
59381 tooltipBox.top - tip.height
59385 // tooltip to the side of the tooltipBox..
59386 var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
59388 if (textDirection === 'rtl') {
59389 if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
59391 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
59395 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
59399 if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
59401 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
59405 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
59410 if (options.duration !== 0 || !tooltip.classed(side)) {
59411 tooltip.call(uiToggle(true));
59415 .style('top', pos[1] + 'px')
59416 .style('left', pos[0] + 'px')
59417 .attr('class', classes + ' ' + side);
59420 // shift tooltip-inner if it is very close to the top or bottom edge
59421 // (doesn't affect the placement of the tooltip-arrow)
59423 if (side === 'left' || side === 'right') {
59425 shiftY = 60 - pos[1];
59427 else if (pos[1] + tip.height > h - 100) {
59428 shiftY = h - pos[1] - tip.height - 100;
59431 tooltip.selectAll('.tooltip-inner')
59432 .style('top', shiftY + 'px');
59436 .classed('in', false)
59437 .call(uiToggle(false));
59440 curtain.cut(box, options.duration);
59446 curtain.cut = function(datum, duration) {
59447 darkness.datum(datum)
59451 if (duration === 0) {
59452 selection$$1 = darkness;
59454 selection$$1 = darkness
59456 .duration(duration || 600)
59461 .attr('d', function(d) {
59462 var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
59463 window.innerWidth + ',' + window.innerHeight + 'L' +
59464 window.innerWidth + ',0 Z';
59466 if (!d) return string;
59467 return string + 'M' +
59468 d.left + ',' + d.top + 'L' +
59469 d.left + ',' + (d.top + d.height) + 'L' +
59470 (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
59471 (d.left + d.width) + ',' + (d.top) + 'Z';
59477 curtain.remove = function() {
59480 select(window).on('resize.curtain', null);
59484 // ClientRects are immutable, so copy them to an object,
59485 // in case we need to trim the height/width.
59486 function copyBox(src) {
59490 bottom: src.bottom,
59501 function uiIntroWelcome(context, reveal) {
59502 var dispatch$$1 = dispatch('done'),
59503 listener = clickListener();
59506 title: 'intro.welcome.title'
59510 function welcome() {
59511 context.map().centerZoom([-85.63591, 41.94285], 19);
59512 reveal('.intro-nav-wrap .chapter-welcome',
59513 t('intro.welcome.welcome'),
59514 { buttonText: t('intro.ok'), buttonCallback: practice }
59518 function practice() {
59519 reveal('.intro-nav-wrap .chapter-welcome',
59520 t('intro.welcome.practice'),
59521 { buttonText: t('intro.ok'), buttonCallback: words }
59526 reveal('.intro-nav-wrap .chapter-welcome',
59527 t('intro.welcome.words'),
59528 { buttonText: t('intro.ok'), buttonCallback: mouse$$1 }
59533 function mouse$$1() {
59534 reveal('.intro-nav-wrap .chapter-welcome',
59535 t('intro.welcome.mouse'),
59536 { buttonText: t('intro.ok'), buttonCallback: leftClick }
59541 function leftClick() {
59545 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
59546 t('intro.welcome.leftclick', { num: times }),
59547 { tooltipClass: 'intro-mouse' }
59550 tooltip.selectAll('.tooltip-inner')
59551 .insert('svg', 'span')
59552 .attr('class', 'tooltip-illustration')
59554 .attr('xlink:href', '#iD-walkthrough-mouse');
59558 .attr('class', 'counter');
59560 tooltip.call(listener);
59562 listener.on('click', function(which) {
59563 if (which === 'left') {
59564 select('.curtain-tooltip.intro-mouse .counter')
59565 .text(String(++counter));
59567 if (counter === times) {
59568 window.setTimeout(function() { continueTo(rightClick); }, 1000);
59573 function continueTo(nextStep) {
59574 listener.on('click', null);
59575 tooltip.call(listener.off);
59576 tooltip.select('.counter').remove();
59582 function rightClick() {
59586 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
59587 t('intro.welcome.rightclick', { num: times }),
59588 { tooltipClass: 'intro-mouse' }
59591 tooltip.selectAll('.tooltip-inner')
59592 .insert('svg', 'span')
59593 .attr('class', 'tooltip-illustration')
59595 .attr('xlink:href', '#iD-walkthrough-mouse');
59599 .attr('class', 'counter');
59601 tooltip.call(listener);
59603 listener.on('click', function(which) {
59604 if (which === 'right') {
59605 select('.curtain-tooltip.intro-mouse .counter')
59606 .text(String(++counter));
59608 if (counter === times) {
59609 window.setTimeout(function() { continueTo(chapters); }, 1000);
59614 function continueTo(nextStep) {
59615 listener.on('click', null);
59616 tooltip.call(listener.off);
59617 tooltip.select('.counter').remove();
59623 function chapters() {
59624 dispatch$$1.call('done');
59625 reveal('.intro-nav-wrap .chapter-navigation',
59626 t('intro.welcome.chapters', { next: t('intro.navigation.title') })
59631 chapter.enter = function() {
59636 chapter.exit = function() {
59638 select('.curtain-tooltip.intro-mouse')
59639 .selectAll('.counter')
59644 chapter.restart = function() {
59650 return utilRebind(chapter, dispatch$$1, 'on');
59655 function clickListener() {
59656 var dispatch$$1 = dispatch('click'),
59658 tooltip = select(null),
59661 // `down` keeps track of which buttons/keys are down.
59662 // Setting a property in `down` happens immediately.
59663 // Unsetting a property in `down` is delayed because
59664 // on Windows a contextmenu event happens after keyup/mouseup
59666 function keydown() {
59667 if (event.keyCode === 93) { // context menu
59668 event.preventDefault();
59669 event.stopPropagation();
59670 down.menu = event.timeStamp;
59671 tooltip.classed('rightclick', true);
59677 if (event.keyCode === 93) { // context menu
59678 event.preventDefault();
59679 event.stopPropagation();
59680 var endTime = event.timeStamp,
59681 startTime = down.menu || endTime,
59682 delay = (endTime - startTime < minTime) ? minTime : 0;
59684 window.setTimeout(function() {
59685 tooltip.classed('rightclick', false);
59686 down.menu = undefined; // delayed, for Windows
59689 dispatch$$1.call('click', this, 'right');
59694 function mousedown() {
59695 var button = event.button;
59696 if (button === 0 && !event.ctrlKey) {
59697 tooltip.classed('leftclick', true);
59698 } else if (button === 2) {
59699 tooltip.classed('rightclick', true);
59701 down[button] = event.timeStamp;
59705 function mouseup() {
59706 var button = event.button,
59707 endTime = event.timeStamp,
59708 startTime = down[button] || endTime,
59709 delay = (endTime - startTime < minTime) ? minTime : 0;
59711 if (button === 0 && !event.ctrlKey) {
59712 window.setTimeout(function() {
59713 tooltip.classed('leftclick', false);
59714 down[button] = undefined; // delayed, for Windows
59717 dispatch$$1.call('click', this, 'left');
59719 } else if (button === 2) {
59720 window.setTimeout(function() {
59721 tooltip.classed('rightclick', false);
59722 down[button] = undefined; // delayed, for Windows
59725 dispatch$$1.call('click', this, 'right');
59728 window.setTimeout(function() {
59729 down[button] = undefined; // delayed, for Windows
59735 function contextmenu() {
59736 event.preventDefault();
59737 event.stopPropagation();
59738 if (!down[2] && !down.menu) {
59739 tooltip.classed('rightclick', true);
59740 window.setTimeout(function() {
59741 tooltip.classed('rightclick', false);
59743 dispatch$$1.call('click', this, 'right');
59748 var behavior = function(selection$$1) {
59749 tooltip = selection$$1;
59753 .on('keydown.intro', keydown)
59754 .on('keyup.intro', keyup)
59755 .on('mousedown.intro', mousedown)
59756 .on('mouseup.intro', mouseup)
59757 .on('contextmenu.intro', contextmenu);
59761 behavior.off = function() {
59763 .on('keydown.intro', null)
59764 .on('keyup.intro', null)
59765 .on('mousedown.intro', null)
59766 .on('mouseup.intro', null)
59767 .on('contextmenu.intro', null);
59770 .classed('leftclick', false)
59771 .classed('rightclick', false);
59774 return utilRebind(behavior, dispatch$$1, 'on');
59777 function uiIntroNavigation(context, reveal) {
59778 var dispatch$$1 = dispatch('done'),
59781 townHall = [-85.63591, 41.94285],
59782 springStreetId = 'w397',
59783 springStreetEndId = 'n1834',
59784 springStreet = [-85.63582, 41.94255],
59785 onewayField = context.presets().field('oneway'),
59786 maxspeedField = context.presets().field('maxspeed');
59790 title: 'intro.navigation.title'
59794 function timeout(f, t$$1) {
59795 timeouts.push(window.setTimeout(f, t$$1));
59799 function eventCancel() {
59800 event.stopPropagation();
59801 event.preventDefault();
59805 function isTownHallSelected() {
59806 var ids = context.selectedIDs();
59807 return ids.length === 1 && ids[0] === hallId;
59811 function dragMap() {
59812 context.enter(modeBrowse(context));
59813 context.history().reset('initial');
59815 var msec = transitionTime(townHall, context.map().center());
59816 if (msec) { reveal(null, null, { duration: 0 }); }
59817 context.map().zoom(19).centerEase(townHall, msec);
59819 timeout(function() {
59820 var centerStart = context.map().center();
59822 reveal('#surface', t('intro.navigation.drag'));
59823 context.map().on('drawn.intro', function() {
59824 reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
59827 context.map().on('move.intro', function() {
59828 var centerNow = context.map().center();
59829 if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
59830 context.map().on('move.intro', null);
59831 timeout(function() { continueTo(zoomMap); }, 3000);
59837 function continueTo(nextStep) {
59838 context.map().on('move.intro drawn.intro', null);
59844 function zoomMap() {
59845 var zoomStart = context.map().zoom();
59848 t('intro.navigation.zoom', {
59849 plus: icon('#iD-icon-plus', 'pre-text'),
59850 minus: icon('#iD-icon-minus', 'pre-text')
59854 context.map().on('drawn.intro', function() {
59856 t('intro.navigation.zoom', {
59857 plus: icon('#iD-icon-plus', 'pre-text'),
59858 minus: icon('#iD-icon-minus', 'pre-text')
59859 }), { duration: 0 }
59863 context.map().on('move.intro', function() {
59864 if (context.map().zoom() !== zoomStart) {
59865 context.map().on('move.intro', null);
59866 timeout(function() { continueTo(features); }, 3000);
59870 function continueTo(nextStep) {
59871 context.map().on('move.intro drawn.intro', null);
59877 function features() {
59878 var onClick = function() { continueTo(pointsLinesAreas); };
59880 reveal('#surface', t('intro.navigation.features'),
59881 { buttonText: t('intro.ok'), buttonCallback: onClick }
59884 context.map().on('drawn.intro', function() {
59885 reveal('#surface', t('intro.navigation.features'),
59886 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
59890 function continueTo(nextStep) {
59891 context.map().on('drawn.intro', null);
59896 function pointsLinesAreas() {
59897 var onClick = function() { continueTo(nodesWays); };
59899 reveal('#surface', t('intro.navigation.points_lines_areas'),
59900 { buttonText: t('intro.ok'), buttonCallback: onClick }
59903 context.map().on('drawn.intro', function() {
59904 reveal('#surface', t('intro.navigation.points_lines_areas'),
59905 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
59909 function continueTo(nextStep) {
59910 context.map().on('drawn.intro', null);
59915 function nodesWays() {
59916 var onClick = function() { continueTo(clickTownHall); };
59918 reveal('#surface', t('intro.navigation.nodes_ways'),
59919 { buttonText: t('intro.ok'), buttonCallback: onClick }
59922 context.map().on('drawn.intro', function() {
59923 reveal('#surface', t('intro.navigation.nodes_ways'),
59924 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
59928 function continueTo(nextStep) {
59929 context.map().on('drawn.intro', null);
59934 function clickTownHall() {
59935 context.enter(modeBrowse(context));
59936 context.history().reset('initial');
59938 reveal(null, null, { duration: 0 });
59939 context.map().zoomEase(19, 500);
59941 timeout(function() {
59942 var entity = context.hasEntity(hallId);
59943 if (!entity) return;
59944 context.map().centerEase(entity.loc, 500);
59946 timeout(function() {
59947 var entity = context.hasEntity(hallId);
59948 if (!entity) return;
59949 var box = pointBox(entity.loc, context);
59950 reveal(box, t('intro.navigation.click_townhall'));
59952 context.map().on('move.intro drawn.intro', function() {
59953 var entity = context.hasEntity(hallId);
59954 if (!entity) return;
59955 var box = pointBox(entity.loc, context);
59956 reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
59959 context.on('enter.intro', function() {
59960 if (isTownHallSelected()) continueTo(selectedTownHall);
59963 }, 550); // after centerEase
59965 }, 550); // after zoomEase
59967 context.history().on('change.intro', function() {
59968 if (!context.hasEntity(hallId)) {
59969 continueTo(clickTownHall);
59973 function continueTo(nextStep) {
59974 context.on('enter.intro', null);
59975 context.map().on('move.intro drawn.intro', null);
59976 context.history().on('change.intro', null);
59982 function selectedTownHall() {
59983 if (!isTownHallSelected()) return clickTownHall();
59985 var entity = context.hasEntity(hallId);
59986 if (!entity) return clickTownHall();
59988 var box = pointBox(entity.loc, context);
59989 var onClick = function() { continueTo(editorTownHall); };
59991 reveal(box, t('intro.navigation.selected_townhall'),
59992 { buttonText: t('intro.ok'), buttonCallback: onClick }
59995 context.map().on('move.intro drawn.intro', function() {
59996 var entity = context.hasEntity(hallId);
59997 if (!entity) return;
59998 var box = pointBox(entity.loc, context);
59999 reveal(box, t('intro.navigation.selected_townhall'),
60000 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60004 context.history().on('change.intro', function() {
60005 if (!context.hasEntity(hallId)) {
60006 continueTo(clickTownHall);
60010 function continueTo(nextStep) {
60011 context.map().on('move.intro drawn.intro', null);
60012 context.history().on('change.intro', null);
60018 function editorTownHall() {
60019 if (!isTownHallSelected()) return clickTownHall();
60021 // disallow scrolling
60022 select('.inspector-wrap').on('wheel.intro', eventCancel);
60024 var onClick = function() { continueTo(presetTownHall); };
60026 reveal('.entity-editor-pane',
60027 t('intro.navigation.editor_townhall'),
60028 { buttonText: t('intro.ok'), buttonCallback: onClick }
60031 context.on('exit.intro', function() {
60032 continueTo(clickTownHall);
60035 context.history().on('change.intro', function() {
60036 if (!context.hasEntity(hallId)) {
60037 continueTo(clickTownHall);
60041 function continueTo(nextStep) {
60042 context.on('exit.intro', null);
60043 context.history().on('change.intro', null);
60044 select('.inspector-wrap').on('wheel.intro', null);
60050 function presetTownHall() {
60051 if (!isTownHallSelected()) return clickTownHall();
60053 // reset pane, in case user happened to change it..
60054 select('.inspector-wrap .panewrap').style('right', '0%');
60055 // disallow scrolling
60056 select('.inspector-wrap').on('wheel.intro', eventCancel);
60058 // preset match, in case the user happened to change it.
60059 var entity = context.entity(context.selectedIDs()[0]);
60060 var preset = context.presets().match(entity, context.graph());
60062 var onClick = function() { continueTo(fieldsTownHall); };
60064 context.on('exit.intro', function() {
60065 continueTo(clickTownHall);
60068 context.history().on('change.intro', function() {
60069 if (!context.hasEntity(hallId)) {
60070 continueTo(clickTownHall);
60074 reveal('.inspector-body .preset-list-item.inspector-inner',
60075 t('intro.navigation.preset_townhall', { preset: preset.name() }),
60076 { buttonText: t('intro.ok'), buttonCallback: onClick }
60079 function continueTo(nextStep) {
60080 context.on('exit.intro', null);
60081 context.history().on('change.intro', null);
60082 select('.inspector-wrap').on('wheel.intro', null);
60088 function fieldsTownHall() {
60089 if (!isTownHallSelected()) return clickTownHall();
60091 // reset pane, in case user happened to change it..
60092 select('.inspector-wrap .panewrap').style('right', '0%');
60093 // disallow scrolling
60094 select('.inspector-wrap').on('wheel.intro', eventCancel);
60096 var onClick = function() { continueTo(closeTownHall); };
60098 reveal('.inspector-body .preset-editor',
60099 t('intro.navigation.fields_townhall'),
60100 { buttonText: t('intro.ok'), buttonCallback: onClick }
60103 context.on('exit.intro', function() {
60104 continueTo(clickTownHall);
60107 context.history().on('change.intro', function() {
60108 if (!context.hasEntity(hallId)) {
60109 continueTo(clickTownHall);
60113 function continueTo(nextStep) {
60114 context.on('exit.intro', null);
60115 context.history().on('change.intro', null);
60116 select('.inspector-wrap').on('wheel.intro', null);
60122 function closeTownHall() {
60123 if (!isTownHallSelected()) return clickTownHall();
60125 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60126 var href = select(selector$$1).attr('href') || '#iD-icon-close';
60128 reveal('.entity-editor-pane',
60129 t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
60132 context.on('exit.intro', function() {
60133 continueTo(searchStreet);
60136 context.history().on('change.intro', function() {
60137 // update the close icon in the tooltip if the user edits something.
60138 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60139 var href = select(selector$$1).attr('href') || '#iD-icon-close';
60141 reveal('.entity-editor-pane',
60142 t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
60147 function continueTo(nextStep) {
60148 context.on('exit.intro', null);
60149 context.history().on('change.intro', null);
60155 function searchStreet() {
60156 context.enter(modeBrowse(context));
60157 context.history().reset('initial'); // ensure spring street exists
60159 var msec = transitionTime(springStreet, context.map().center());
60160 if (msec) { reveal(null, null, { duration: 0 }); }
60161 context.map().zoom(19).centerEase(springStreet, msec); // ..and user can see it
60163 timeout(function() {
60164 reveal('.search-header input',
60165 t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
60168 select('.search-header input')
60169 .on('keyup.intro', checkSearchResult);
60174 function checkSearchResult() {
60175 var first = select('.feature-list-item:nth-child(0n+2)'), // skip "No Results" item
60176 firstName = first.select('.entity-name'),
60177 name = t('intro.graph.name.spring-street');
60179 if (!firstName.empty() && firstName.text() === name) {
60180 reveal(first.node(),
60181 t('intro.navigation.choose_street', { name: name }),
60185 context.on('exit.intro', function() {
60186 continueTo(selectedStreet);
60189 select('.search-header input')
60190 .on('keydown.intro', eventCancel, true)
60191 .on('keyup.intro', null);
60194 function continueTo(nextStep) {
60195 context.on('exit.intro', null);
60196 select('.search-header input')
60197 .on('keydown.intro', null)
60198 .on('keyup.intro', null);
60204 function selectedStreet() {
60205 if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
60206 return searchStreet();
60209 var onClick = function() { continueTo(editorStreet); };
60210 var entity = context.entity(springStreetEndId);
60211 var box = pointBox(entity.loc, context);
60215 t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
60216 { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
60219 timeout(function() {
60220 context.map().on('move.intro drawn.intro', function() {
60221 var entity = context.hasEntity(springStreetEndId);
60222 if (!entity) return;
60223 var box = pointBox(entity.loc, context);
60226 t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
60227 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60230 }, 600); // after reveal.
60232 context.on('enter.intro', function(mode) {
60233 if (!context.hasEntity(springStreetId)) {
60234 return continueTo(searchStreet);
60236 var ids = context.selectedIDs();
60237 if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
60238 // keep Spring Street selected..
60239 context.enter(modeSelect(context, [springStreetId]));
60243 context.history().on('change.intro', function() {
60244 if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
60245 timeout(function() {
60246 continueTo(searchStreet);
60247 }, 300); // after any transition (e.g. if user deleted intersection)
60251 function continueTo(nextStep) {
60252 context.map().on('move.intro drawn.intro', null);
60253 context.on('enter.intro', null);
60254 context.history().on('change.intro', null);
60260 function editorStreet() {
60261 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60262 var href = select(selector$$1).attr('href') || '#iD-icon-close';
60264 reveal('.entity-editor-pane',
60265 t('intro.navigation.editor_street', {
60266 button: icon(href, 'pre-text'),
60267 field1: onewayField.label(),
60268 field2: maxspeedField.label()
60272 context.on('exit.intro', function() {
60276 context.history().on('change.intro', function() {
60277 // update the close icon in the tooltip if the user edits something.
60278 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60279 var href = select(selector$$1).attr('href') || '#iD-icon-close';
60281 reveal('.entity-editor-pane',
60282 t('intro.navigation.editor_street', {
60283 button: icon(href, 'pre-text'),
60284 field1: onewayField.label().toLowerCase(),
60285 field2: maxspeedField.label().toLowerCase()
60286 }), { duration: 0 }
60290 function continueTo(nextStep) {
60291 context.on('exit.intro', null);
60292 context.history().on('change.intro', null);
60299 dispatch$$1.call('done');
60300 reveal('#id-container',
60301 t('intro.navigation.play', { next: t('intro.points.title') }), {
60302 tooltipBox: '.intro-nav-wrap .chapter-point',
60303 buttonText: t('intro.ok'),
60304 buttonCallback: function() { reveal('#id-container'); }
60310 chapter.enter = function() {
60315 chapter.exit = function() {
60316 timeouts.forEach(window.clearTimeout);
60317 context.on('enter.intro exit.intro', null);
60318 context.map().on('move.intro drawn.intro', null);
60319 context.history().on('change.intro', null);
60320 select('.inspector-wrap').on('wheel.intro', null);
60321 select('.search-header input').on('keydown.intro keyup.intro', null);
60325 chapter.restart = function() {
60331 return utilRebind(chapter, dispatch$$1, 'on');
60334 function uiIntroPoint(context, reveal) {
60335 var dispatch$$1 = dispatch('done'),
60337 intersection = [-85.63279, 41.94394],
60338 building = [-85.632422, 41.944045],
60339 cafePreset = context.presets().item('amenity/cafe'),
60344 title: 'intro.points.title'
60348 function timeout(f, t$$1) {
60349 timeouts.push(window.setTimeout(f, t$$1));
60353 function revealEditMenu(loc, text, options) {
60354 var rect = context.surfaceRect();
60355 var point$$1 = context.curtainProjection(loc);
60357 var width = 250 + (2 * pad);
60359 var startX = rect.left + point$$1[0];
60360 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
60363 top: point$$1[1] + rect.top - 60,
60367 reveal(box, text, options);
60371 function eventCancel() {
60372 event.stopPropagation();
60373 event.preventDefault();
60377 function addPoint() {
60378 context.enter(modeBrowse(context));
60379 context.history().reset('initial');
60381 var msec = transitionTime(intersection, context.map().center());
60382 if (msec) { reveal(null, null, { duration: 0 }); }
60383 context.map().zoom(19).centerEase(intersection, msec);
60385 timeout(function() {
60386 var tooltip = reveal('button.add-point',
60387 t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
60391 tooltip.selectAll('.tooltip-inner')
60392 .insert('svg', 'span')
60393 .attr('class', 'tooltip-illustration')
60395 .attr('xlink:href', '#iD-graphic-points');
60397 context.on('enter.intro', function(mode) {
60398 if (mode.id !== 'add-point') return;
60399 continueTo(placePoint);
60403 function continueTo(nextStep) {
60404 context.on('enter.intro', null);
60410 function placePoint() {
60411 if (context.mode().id !== 'add-point') {
60412 return chapter.restart();
60415 var pointBox$$1 = pad$1(building, 150, context);
60416 reveal(pointBox$$1, t('intro.points.place_point'));
60418 context.map().on('move.intro drawn.intro', function() {
60419 pointBox$$1 = pad$1(building, 150, context);
60420 reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
60423 context.on('enter.intro', function(mode) {
60424 if (mode.id !== 'select') return chapter.restart();
60425 pointId = context.mode().selectedIDs()[0];
60426 continueTo(searchPreset);
60429 function continueTo(nextStep) {
60430 context.map().on('move.intro drawn.intro', null);
60431 context.on('enter.intro', null);
60437 function searchPreset() {
60438 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
60442 // disallow scrolling
60443 select('.inspector-wrap').on('wheel.intro', eventCancel);
60445 select('.preset-search-input')
60446 .on('keydown.intro', null)
60447 .on('keyup.intro', checkPresetSearch);
60449 reveal('.preset-search-input',
60450 t('intro.points.search_cafe', { preset: cafePreset.name() })
60453 context.on('enter.intro', function(mode) {
60454 if (!pointId || !context.hasEntity(pointId)) {
60455 return continueTo(addPoint);
60458 var ids = context.selectedIDs();
60459 if (mode.id !== 'select' || !ids.length || ids[0] !== pointId) {
60460 // keep the user's point selected..
60461 context.enter(modeSelect(context, [pointId]));
60463 // disallow scrolling
60464 select('.inspector-wrap').on('wheel.intro', eventCancel);
60466 select('.preset-search-input')
60467 .on('keydown.intro', null)
60468 .on('keyup.intro', checkPresetSearch);
60470 reveal('.preset-search-input',
60471 t('intro.points.search_cafe', { preset: cafePreset.name() })
60474 context.history().on('change.intro', null);
60479 function checkPresetSearch() {
60480 var first = select('.preset-list-item:first-child');
60482 if (first.classed('preset-amenity-cafe')) {
60483 select('.preset-search-input')
60484 .on('keydown.intro', eventCancel, true)
60485 .on('keyup.intro', null);
60487 reveal(first.select('.preset-list-button').node(),
60488 t('intro.points.choose_cafe', { preset: cafePreset.name() }),
60492 context.history().on('change.intro', function() {
60493 continueTo(aboutFeatureEditor);
60498 function continueTo(nextStep) {
60499 context.on('enter.intro', null);
60500 context.history().on('change.intro', null);
60501 select('.inspector-wrap').on('wheel.intro', null);
60502 select('.preset-search-input').on('keydown.intro keyup.intro', null);
60508 function aboutFeatureEditor() {
60509 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
60513 timeout(function() {
60514 reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
60515 tooltipClass: 'intro-points-describe',
60516 buttonText: t('intro.ok'),
60517 buttonCallback: function() { continueTo(addName); }
60521 context.on('exit.intro', function() {
60522 // if user leaves select mode here, just continue with the tutorial.
60523 continueTo(reselectPoint);
60526 function continueTo(nextStep) {
60527 context.on('exit.intro', null);
60533 function addName() {
60534 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
60538 // reset pane, in case user happened to change it..
60539 select('.inspector-wrap .panewrap').style('right', '0%');
60541 timeout(function() {
60542 // It's possible for the user to add a name in a previous step..
60543 // If so, don't tell them to add the name in this step.
60544 // Give them an OK button instead.
60545 var entity = context.entity(pointId);
60546 if (entity.tags.name) {
60547 var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
60548 tooltipClass: 'intro-points-describe',
60549 buttonText: t('intro.ok'),
60550 buttonCallback: function() { continueTo(addCloseEditor); }
60552 tooltip.select('.instruction').style('display', 'none');
60555 reveal('.entity-editor-pane', t('intro.points.add_name'),
60556 { tooltipClass: 'intro-points-describe' }
60561 context.history().on('change.intro', function() {
60562 continueTo(addCloseEditor);
60565 context.on('exit.intro', function() {
60566 // if user leaves select mode here, just continue with the tutorial.
60567 continueTo(reselectPoint);
60570 function continueTo(nextStep) {
60571 context.on('exit.intro', null);
60572 context.history().on('change.intro', null);
60578 function addCloseEditor() {
60579 // reset pane, in case user happened to change it..
60580 select('.inspector-wrap .panewrap').style('right', '0%');
60582 var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60583 var href = select(selector$$1).attr('href') || '#iD-icon-close';
60585 context.on('exit.intro', function() {
60586 continueTo(reselectPoint);
60589 reveal('.entity-editor-pane',
60590 t('intro.points.add_close', { button: icon(href, 'pre-text') })
60593 function continueTo(nextStep) {
60594 context.on('exit.intro', null);
60600 function reselectPoint() {
60601 if (!pointId) return chapter.restart();
60602 var entity = context.hasEntity(pointId);
60603 if (!entity) return chapter.restart();
60605 // make sure it's still a cafe, in case user somehow changed it..
60606 var oldPreset = context.presets().match(entity, context.graph());
60607 context.replace(actionChangePreset(pointId, oldPreset, cafePreset));
60609 context.enter(modeBrowse(context));
60611 var msec = transitionTime(entity.loc, context.map().center());
60612 if (msec) { reveal(null, null, { duration: 0 }); }
60613 context.map().centerEase(entity.loc, msec);
60615 timeout(function() {
60616 var box = pointBox(entity.loc, context);
60617 reveal(box, t('intro.points.reselect'), { duration: 600 });
60619 timeout(function() {
60620 context.map().on('move.intro drawn.intro', function() {
60621 var entity = context.hasEntity(pointId);
60622 if (!entity) return chapter.restart();
60623 var box = pointBox(entity.loc, context);
60624 reveal(box, t('intro.points.reselect'), { duration: 0 });
60626 }, 600); // after reveal..
60628 context.on('enter.intro', function(mode) {
60629 if (mode.id !== 'select') return;
60630 continueTo(updatePoint);
60635 function continueTo(nextStep) {
60636 context.map().on('move.intro drawn.intro', null);
60637 context.on('enter.intro', null);
60643 function updatePoint() {
60644 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
60645 return continueTo(reselectPoint);
60648 // reset pane, in case user happened to untag the point..
60649 select('.inspector-wrap .panewrap').style('right', '0%');
60651 context.on('exit.intro', function() {
60652 continueTo(reselectPoint);
60655 context.history().on('change.intro', function() {
60656 continueTo(updateCloseEditor);
60659 timeout(function() {
60660 reveal('.entity-editor-pane', t('intro.points.update'),
60661 { tooltipClass: 'intro-points-describe' }
60665 function continueTo(nextStep) {
60666 context.on('exit.intro', null);
60667 context.history().on('change.intro', null);
60673 function updateCloseEditor() {
60674 if (context.mode().id !== 'select' || !pointId || !context.hasEntity(pointId)) {
60675 return continueTo(reselectPoint);
60678 // reset pane, in case user happened to change it..
60679 select('.inspector-wrap .panewrap').style('right', '0%');
60681 context.on('exit.intro', function() {
60682 continueTo(rightClickPoint);
60685 timeout(function() {
60686 reveal('.entity-editor-pane',
60687 t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
60691 function continueTo(nextStep) {
60692 context.on('exit.intro', null);
60698 function rightClickPoint() {
60699 if (!pointId) return chapter.restart();
60700 var entity = context.hasEntity(pointId);
60701 if (!entity) return chapter.restart();
60703 context.enter(modeBrowse(context));
60705 var box = pointBox(entity.loc, context);
60706 reveal(box, t('intro.points.rightclick'), { duration: 600 });
60708 timeout(function() {
60709 context.map().on('move.intro drawn.intro', function() {
60710 var entity = context.hasEntity(pointId);
60711 if (!entity) return chapter.restart();
60712 var box = pointBox(entity.loc, context);
60713 reveal(box, t('intro.points.rightclick'), { duration: 0 });
60715 }, 600); // after reveal
60717 context.on('enter.intro', function(mode) {
60718 if (mode.id !== 'select') return;
60719 var ids = context.selectedIDs();
60720 if (ids.length !== 1 || ids[0] !== pointId) return;
60722 timeout(function() {
60723 var node = selectMenuItem('delete').node();
60725 continueTo(enterDelete);
60726 }, 300); // after menu visible
60729 function continueTo(nextStep) {
60730 context.on('enter.intro', null);
60731 context.map().on('move.intro drawn.intro', null);
60737 function enterDelete() {
60738 if (!pointId) return chapter.restart();
60739 var entity = context.hasEntity(pointId);
60740 if (!entity) return chapter.restart();
60742 var node = selectMenuItem('delete').node();
60743 if (!node) { return continueTo(rightClickPoint); }
60745 revealEditMenu(entity.loc,
60746 t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
60749 timeout(function() {
60750 context.map().on('move.intro drawn.intro', function() {
60751 revealEditMenu(entity.loc,
60752 t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
60756 }, 300); // after menu visible
60758 context.on('exit.intro', function() {
60759 if (!pointId) return chapter.restart();
60760 var entity = context.hasEntity(pointId);
60761 if (entity) return continueTo(rightClickPoint); // point still exists
60764 context.history().on('change.intro', function(changed) {
60765 if (changed.deleted().length) {
60770 function continueTo(nextStep) {
60771 context.map().on('move.intro drawn.intro', null);
60772 context.history().on('change.intro', null);
60773 context.on('exit.intro', null);
60780 context.history().on('change.intro', function() {
60784 var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
60785 reveal('#bar button.undo-button',
60786 t('intro.points.undo', { button: icon(iconName, 'pre-text') })
60789 function continueTo(nextStep) {
60790 context.history().on('change.intro', null);
60797 dispatch$$1.call('done');
60798 reveal('#id-container',
60799 t('intro.points.play', { next: t('intro.areas.title') }), {
60800 tooltipBox: '.intro-nav-wrap .chapter-area',
60801 buttonText: t('intro.ok'),
60802 buttonCallback: function() { reveal('#id-container'); }
60808 chapter.enter = function() {
60813 chapter.exit = function() {
60814 timeouts.forEach(window.clearTimeout);
60815 context.on('enter.intro exit.intro', null);
60816 context.map().on('move.intro drawn.intro', null);
60817 context.history().on('change.intro', null);
60818 select('.inspector-wrap').on('wheel.intro', eventCancel);
60819 select('.preset-search-input').on('keydown.intro keyup.intro', null);
60823 chapter.restart = function() {
60829 return utilRebind(chapter, dispatch$$1, 'on');
60832 function uiIntroArea(context, reveal) {
60833 var dispatch$$1 = dispatch('done'),
60834 playground = [-85.63552, 41.94159],
60835 playgroundPreset = context.presets().item('leisure/playground'),
60836 descriptionField = context.presets().field('description'),
60842 title: 'intro.areas.title'
60846 function timeout(f, t$$1) {
60847 timeouts.push(window.setTimeout(f, t$$1));
60851 function eventCancel() {
60852 event.stopPropagation();
60853 event.preventDefault();
60857 function revealPlayground(center, text, options) {
60858 var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
60859 var box = pad$1(center, padding, context);
60860 reveal(box, text, options);
60864 function addArea() {
60865 context.enter(modeBrowse(context));
60866 context.history().reset('initial');
60869 var msec = transitionTime(playground, context.map().center());
60870 if (msec) { reveal(null, null, { duration: 0 }); }
60871 context.map().zoom(19).centerEase(playground, msec);
60873 timeout(function() {
60874 var tooltip = reveal('button.add-area',
60875 t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
60877 tooltip.selectAll('.tooltip-inner')
60878 .insert('svg', 'span')
60879 .attr('class', 'tooltip-illustration')
60881 .attr('xlink:href', '#iD-graphic-areas');
60883 context.on('enter.intro', function(mode) {
60884 if (mode.id !== 'add-area') return;
60885 continueTo(startPlayground);
60889 function continueTo(nextStep) {
60890 context.on('enter.intro', null);
60896 function startPlayground() {
60897 if (context.mode().id !== 'add-area') {
60898 return chapter.restart();
60902 context.map().zoomEase(19.5, 500);
60904 timeout(function() {
60905 revealPlayground(playground,
60906 t('intro.areas.start_playground'), { duration: 250 }
60909 timeout(function() {
60910 context.map().on('move.intro drawn.intro', function() {
60911 revealPlayground(playground,
60912 t('intro.areas.start_playground'), { duration: 0 }
60915 context.on('enter.intro', function(mode) {
60916 if (mode.id !== 'draw-area') return chapter.restart();
60917 continueTo(continuePlayground);
60919 }, 250); // after reveal
60921 }, 550); // after easing
60923 function continueTo(nextStep) {
60924 context.map().on('move.intro drawn.intro', null);
60925 context.on('enter.intro', null);
60931 function continuePlayground() {
60932 if (context.mode().id !== 'draw-area') {
60933 return chapter.restart();
60937 revealPlayground(playground,
60938 t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
60942 timeout(function() {
60943 context.map().on('move.intro drawn.intro', function() {
60944 revealPlayground(playground,
60945 t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
60949 }, 250); // after reveal
60951 context.on('enter.intro', function(mode) {
60952 if (mode.id === 'draw-area') {
60953 var entity = context.hasEntity(context.selectedIDs()[0]);
60954 if (entity && entity.nodes.length >= 6) {
60955 return continueTo(finishPlayground);
60959 } else if (mode.id === 'select') {
60960 areaId = context.selectedIDs()[0];
60961 return continueTo(searchPresets);
60963 return chapter.restart();
60967 function continueTo(nextStep) {
60968 context.map().on('move.intro drawn.intro', null);
60969 context.on('enter.intro', null);
60975 function finishPlayground() {
60976 if (context.mode().id !== 'draw-area') {
60977 return chapter.restart();
60981 revealPlayground(playground,
60982 t('intro.areas.finish_playground'), { duration: 250 }
60985 timeout(function() {
60986 context.map().on('move.intro drawn.intro', function() {
60987 revealPlayground(playground,
60988 t('intro.areas.finish_playground'), { duration: 0 }
60991 }, 250); // after reveal
60993 context.on('enter.intro', function(mode) {
60994 if (mode.id === 'draw-area') {
60996 } else if (mode.id === 'select') {
60997 areaId = context.selectedIDs()[0];
60998 return continueTo(searchPresets);
61000 return chapter.restart();
61004 function continueTo(nextStep) {
61005 context.map().on('move.intro drawn.intro', null);
61006 context.on('enter.intro', null);
61012 function searchPresets() {
61013 if (!areaId || !context.hasEntity(areaId)) {
61016 var ids = context.selectedIDs();
61017 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
61018 context.enter(modeSelect(context, [areaId]));
61021 // disallow scrolling
61022 select('.inspector-wrap').on('wheel.intro', eventCancel);
61024 timeout(function() {
61025 // reset pane, in case user somehow happened to change it..
61026 select('.inspector-wrap .panewrap').style('right', '-100%');
61028 select('.preset-search-input')
61029 .on('keydown.intro', null)
61030 .on('keyup.intro', checkPresetSearch);
61032 reveal('.preset-search-input',
61033 t('intro.areas.search_playground', { preset: playgroundPreset.name() })
61035 }, 400); // after preset list pane visible..
61037 context.on('enter.intro', function(mode) {
61038 if (!areaId || !context.hasEntity(areaId)) {
61039 return continueTo(addArea);
61042 var ids = context.selectedIDs();
61043 if (mode.id !== 'select' || !ids.length || ids[0] !== areaId) {
61044 // keep the user's area selected..
61045 context.enter(modeSelect(context, [areaId]));
61047 // reset pane, in case user somehow happened to change it..
61048 select('.inspector-wrap .panewrap').style('right', '-100%');
61049 // disallow scrolling
61050 select('.inspector-wrap').on('wheel.intro', eventCancel);
61052 select('.preset-search-input')
61053 .on('keydown.intro', null)
61054 .on('keyup.intro', checkPresetSearch);
61056 reveal('.preset-search-input',
61057 t('intro.areas.search_playground', { preset: playgroundPreset.name() })
61060 context.history().on('change.intro', null);
61064 function checkPresetSearch() {
61065 var first = select('.preset-list-item:first-child');
61067 if (first.classed('preset-leisure-playground')) {
61068 reveal(first.select('.preset-list-button').node(),
61069 t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
61073 select('.preset-search-input')
61074 .on('keydown.intro', eventCancel, true)
61075 .on('keyup.intro', null);
61077 context.history().on('change.intro', function() {
61078 continueTo(clickAddField);
61083 function continueTo(nextStep) {
61084 select('.inspector-wrap').on('wheel.intro', null);
61085 context.on('enter.intro', null);
61086 context.history().on('change.intro', null);
61087 select('.preset-search-input').on('keydown.intro keyup.intro', null);
61093 function clickAddField() {
61094 if (!areaId || !context.hasEntity(areaId)) {
61097 var ids = context.selectedIDs();
61098 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
61099 return searchPresets();
61102 if (!select('.form-field-description').empty()) {
61103 return continueTo(describePlayground);
61106 // disallow scrolling
61107 select('.inspector-wrap').on('wheel.intro', eventCancel);
61109 timeout(function() {
61110 // reset pane, in case user somehow happened to change it..
61111 select('.inspector-wrap .panewrap').style('right', '0%');
61113 // It's possible for the user to add a description in a previous step..
61114 // If they did this already, just continue to next step.
61115 var entity = context.entity(areaId);
61116 if (entity.tags.description) {
61117 return continueTo(play);
61120 // scroll "Add field" into view
61121 var box = select('.more-fields').node().getBoundingClientRect();
61122 if (box.top > 300) {
61123 var pane = select('.entity-editor-pane .inspector-body');
61124 var start = pane.node().scrollTop;
61125 var end = start + (box.top - 300);
61130 .tween('scroll.inspector', function() {
61132 var i = interpolateNumber(start, end);
61133 return function(t$$1) {
61134 node.scrollTop = i(t$$1);
61139 timeout(function() {
61140 reveal('.more-fields .combobox-input',
61141 t('intro.areas.add_field'),
61145 select('.more-fields .combobox-input')
61146 .on('click.intro', function() {
61147 continueTo(chooseDescriptionField);
61149 }, 300); // after "Add Field" visible
61151 }, 400); // after editor pane visible
61153 context.on('exit.intro', function() {
61154 return continueTo(searchPresets);
61157 function continueTo(nextStep) {
61158 select('.inspector-wrap').on('wheel.intro', null);
61159 select('.more-fields .combobox-input').on('click.intro', null);
61160 context.on('exit.intro', null);
61166 function chooseDescriptionField() {
61167 if (!areaId || !context.hasEntity(areaId)) {
61170 var ids = context.selectedIDs();
61171 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
61172 return searchPresets();
61175 if (!select('.form-field-description').empty()) {
61176 return continueTo(describePlayground);
61179 // Make sure combobox is ready..
61180 if (select('div.combobox').empty()) {
61181 return continueTo(clickAddField);
61183 // Watch for the combobox to go away..
61185 watcher = window.setInterval(function() {
61186 if (select('div.combobox').empty()) {
61187 window.clearInterval(watcher);
61188 timeout(function() {
61189 if (select('.form-field-description').empty()) {
61190 continueTo(retryChooseDescription);
61192 continueTo(describePlayground);
61194 }, 300); // after description field added.
61198 reveal('div.combobox',
61199 t('intro.areas.choose_field', { field: descriptionField.label() }),
61203 context.on('exit.intro', function() {
61204 return continueTo(searchPresets);
61207 function continueTo(nextStep) {
61208 if (watcher) window.clearInterval(watcher);
61209 context.on('exit.intro', null);
61215 function describePlayground() {
61216 if (!areaId || !context.hasEntity(areaId)) {
61219 var ids = context.selectedIDs();
61220 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
61221 return searchPresets();
61224 // reset pane, in case user happened to change it..
61225 select('.inspector-wrap .panewrap').style('right', '0%');
61227 if (select('.form-field-description').empty()) {
61228 return continueTo(retryChooseDescription);
61231 context.on('exit.intro', function() {
61235 reveal('.entity-editor-pane',
61236 t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
61240 function continueTo(nextStep) {
61241 context.on('exit.intro', null);
61247 function retryChooseDescription() {
61248 if (!areaId || !context.hasEntity(areaId)) {
61251 var ids = context.selectedIDs();
61252 if (context.mode().id !== 'select' || !ids.length || ids[0] !== areaId) {
61253 return searchPresets();
61256 // reset pane, in case user happened to change it..
61257 select('.inspector-wrap .panewrap').style('right', '0%');
61259 reveal('.entity-editor-pane',
61260 t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
61261 buttonText: t('intro.ok'),
61262 buttonCallback: function() { continueTo(clickAddField); }
61265 context.on('exit.intro', function() {
61266 return continueTo(searchPresets);
61269 function continueTo(nextStep) {
61270 context.on('exit.intro', null);
61277 dispatch$$1.call('done');
61278 reveal('#id-container',
61279 t('intro.areas.play', { next: t('intro.lines.title') }), {
61280 tooltipBox: '.intro-nav-wrap .chapter-line',
61281 buttonText: t('intro.ok'),
61282 buttonCallback: function() { reveal('#id-container'); }
61288 chapter.enter = function() {
61293 chapter.exit = function() {
61294 timeouts.forEach(window.clearTimeout);
61295 context.on('enter.intro exit.intro', null);
61296 context.map().on('move.intro drawn.intro', null);
61297 context.history().on('change.intro', null);
61298 select('.inspector-wrap').on('wheel.intro', null);
61299 select('.preset-search-input').on('keydown.intro keyup.intro', null);
61300 select('.more-fields .combobox-input').on('click.intro', null);
61304 chapter.restart = function() {
61310 return utilRebind(chapter, dispatch$$1, 'on');
61313 function uiIntroLine(context, reveal) {
61314 var dispatch$$1 = dispatch('done'),
61316 tulipRoadId = null,
61317 flowerRoadId = 'w646',
61318 tulipRoadStart = [-85.6297754121684, 41.95805253325314],
61319 tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204],
61320 tulipRoadIntersection = [-85.62974496187628, 41.95742515554585],
61321 roadCategory = context.presets().item('category-road'),
61322 residentialPreset = context.presets().item('highway/residential'),
61323 woodRoadId = 'w525',
61324 woodRoadEndId = 'n2862',
61325 woodRoadAddNode = [-85.62390110349587, 41.95397111462291],
61326 woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487],
61327 woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872],
61328 washingtonStreetId = 'w522',
61329 twelfthAvenueId = 'w1',
61330 eleventhAvenueEndId = 'n3550',
61331 twelfthAvenueEndId = 'n5',
61332 washingtonSegmentId = null,
61333 eleventhAvenueEnd = context.entity(eleventhAvenueEndId).loc,
61334 twelfthAvenueEnd = context.entity(twelfthAvenueEndId).loc,
61335 deleteLinesLoc = [-85.6219395542764, 41.95228033922477],
61336 twelfthAvenue = [-85.62219310052491, 41.952505413152956];
61340 title: 'intro.lines.title'
61344 function timeout(f, t$$1) {
61345 timeouts.push(window.setTimeout(f, t$$1));
61349 function eventCancel() {
61350 event.stopPropagation();
61351 event.preventDefault();
61355 function revealEditMenu(loc, text, options) {
61356 var rect = context.surfaceRect();
61357 var point$$1 = context.curtainProjection(loc);
61359 var width = 250 + (2 * pad);
61361 var startX = rect.left + point$$1[0];
61362 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
61365 top: point$$1[1] + rect.top - 60,
61369 reveal(box, text, options);
61373 function addLine() {
61374 context.enter(modeBrowse(context));
61375 context.history().reset('initial');
61377 var msec = transitionTime(tulipRoadStart, context.map().center());
61378 if (msec) { reveal(null, null, { duration: 0 }); }
61379 context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
61381 timeout(function() {
61382 var tooltip = reveal('button.add-line',
61383 t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
61385 tooltip.selectAll('.tooltip-inner')
61386 .insert('svg', 'span')
61387 .attr('class', 'tooltip-illustration')
61389 .attr('xlink:href', '#iD-graphic-lines');
61391 context.on('enter.intro', function(mode) {
61392 if (mode.id !== 'add-line') return;
61393 continueTo(startLine);
61397 function continueTo(nextStep) {
61398 context.on('enter.intro', null);
61404 function startLine() {
61405 if (context.mode().id !== 'add-line') {
61406 return chapter.restart();
61409 tulipRoadId = null;
61411 var padding = 70 * Math.pow(2, context.map().zoom() - 18);
61412 var box = pad$1(tulipRoadStart, padding, context);
61413 box.height = box.height + 100;
61414 reveal(box, t('intro.lines.start_line'));
61416 context.map().on('move.intro drawn.intro', function() {
61417 padding = 70 * Math.pow(2, context.map().zoom() - 18);
61418 box = pad$1(tulipRoadStart, padding, context);
61419 box.height = box.height + 100;
61420 reveal(box, t('intro.lines.start_line'), { duration: 0 });
61423 context.on('enter.intro', function(mode) {
61424 if (mode.id !== 'draw-line') return chapter.restart();
61425 continueTo(drawLine);
61428 function continueTo(nextStep) {
61429 context.map().on('move.intro drawn.intro', null);
61430 context.on('enter.intro', null);
61436 function drawLine() {
61437 if (context.mode().id !== 'draw-line') {
61438 return chapter.restart();
61441 tulipRoadId = context.mode().selectedIDs()[0];
61442 context.map().centerEase(tulipRoadMidpoint, 500);
61444 timeout(function() {
61445 var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
61446 var box = pad$1(tulipRoadMidpoint, padding, context);
61447 box.height = box.height * 2;
61449 t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
61452 context.map().on('move.intro drawn.intro', function() {
61453 padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
61454 box = pad$1(tulipRoadMidpoint, padding, context);
61455 box.height = box.height * 2;
61457 t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
61461 }, 550); // after easing..
61463 context.history().on('change.intro', function() {
61464 var entity = tulipRoadId && context.hasEntity(tulipRoadId);
61465 if (!entity) return chapter.restart();
61467 if (isLineConnected()) {
61468 continueTo(continueLine);
61472 context.on('enter.intro', function(mode) {
61473 if (mode.id === 'draw-line')
61475 else if (mode.id === 'select') {
61476 continueTo(retryIntersect);
61480 return chapter.restart();
61483 function continueTo(nextStep) {
61484 context.map().on('move.intro drawn.intro', null);
61485 context.history().on('change.intro', null);
61486 context.on('enter.intro', null);
61492 function isLineConnected() {
61493 var entity = tulipRoadId && context.hasEntity(tulipRoadId);
61494 if (!entity) return false;
61496 var drawNodes = context.graph().childNodes(entity);
61497 return some(drawNodes, function(node) {
61498 return some(context.graph().parentWays(node), function(parent) {
61499 return parent.id === flowerRoadId;
61505 function retryIntersect() {
61506 select(window).on('mousedown.intro', eventCancel, true);
61508 var box = pad$1(tulipRoadIntersection, 80, context);
61510 t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
61513 timeout(chapter.restart, 3000);
61517 function continueLine() {
61518 if (context.mode().id !== 'draw-line') return chapter.restart();
61519 var entity = tulipRoadId && context.hasEntity(tulipRoadId);
61520 if (!entity) return chapter.restart();
61522 context.map().centerEase(tulipRoadIntersection, 500);
61524 reveal('#surface', t('intro.lines.continue_line'));
61526 context.on('enter.intro', function(mode) {
61527 if (mode.id === 'draw-line')
61529 else if (mode.id === 'select')
61530 return continueTo(chooseCategoryRoad);
61532 return chapter.restart();
61535 function continueTo(nextStep) {
61536 context.on('enter.intro', null);
61542 function chooseCategoryRoad() {
61543 if (context.mode().id !== 'select') {
61544 return chapter.restart();
61547 context.on('exit.intro', function() {
61548 return chapter.restart();
61551 var button = select('.preset-category-road .preset-list-button');
61552 if (button.empty()) return chapter.restart();
61554 // disallow scrolling
61555 select('.inspector-wrap').on('wheel.intro', eventCancel);
61557 timeout(function() {
61558 // reset pane, in case user somehow happened to change it..
61559 select('.inspector-wrap .panewrap').style('right', '-100%');
61561 reveal(button.node(),
61562 t('intro.lines.choose_category_road', { category: roadCategory.name() })
61565 button.on('click.intro', function() {
61566 continueTo(choosePresetResidential);
61569 }, 400); // after editor pane visible
61571 function continueTo(nextStep) {
61572 select('.inspector-wrap').on('wheel.intro', null);
61573 select('.preset-list-button').on('click.intro', null);
61574 context.on('exit.intro', null);
61580 function choosePresetResidential() {
61581 if (context.mode().id !== 'select') {
61582 return chapter.restart();
61585 context.on('exit.intro', function() {
61586 return chapter.restart();
61589 var subgrid = select('.preset-category-road .subgrid');
61590 if (subgrid.empty()) return chapter.restart();
61592 subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
61593 .on('click.intro', function() {
61594 continueTo(retryPresetResidential);
61597 subgrid.selectAll('.preset-highway-residential .preset-list-button')
61598 .on('click.intro', function() {
61599 continueTo(nameRoad);
61602 timeout(function() {
61603 reveal(subgrid.node(),
61604 t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
61605 { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
61609 function continueTo(nextStep) {
61610 select('.preset-list-button').on('click.intro', null);
61611 context.on('exit.intro', null);
61617 // selected wrong road type
61618 function retryPresetResidential() {
61619 if (context.mode().id !== 'select') {
61620 return chapter.restart();
61623 context.on('exit.intro', function() {
61624 return chapter.restart();
61627 // disallow scrolling
61628 select('.inspector-wrap').on('wheel.intro', eventCancel);
61630 timeout(function() {
61631 var button = select('.entity-editor-pane .preset-list-button');
61633 reveal(button.node(),
61634 t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
61637 button.on('click.intro', function() {
61638 continueTo(chooseCategoryRoad);
61643 function continueTo(nextStep) {
61644 select('.inspector-wrap').on('wheel.intro', null);
61645 select('.preset-list-button').on('click.intro', null);
61646 context.on('exit.intro', null);
61652 function nameRoad() {
61653 context.on('exit.intro', function() {
61654 continueTo(didNameRoad);
61657 timeout(function() {
61658 reveal('.entity-editor-pane',
61659 t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
61660 { tooltipClass: 'intro-lines-name_road' }
61664 function continueTo(nextStep) {
61665 context.on('exit.intro', null);
61671 function didNameRoad() {
61672 context.history().checkpoint('doneAddLine');
61674 timeout(function() {
61675 reveal('#surface', t('intro.lines.did_name_road'), {
61676 buttonText: t('intro.ok'),
61677 buttonCallback: function() { continueTo(updateLine); }
61681 function continueTo(nextStep) {
61687 function updateLine() {
61688 context.history().reset('doneAddLine');
61689 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61690 return chapter.restart();
61693 var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
61694 if (msec) { reveal(null, null, { duration: 0 }); }
61695 context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
61697 timeout(function() {
61698 var padding = 250 * Math.pow(2, context.map().zoom() - 19);
61699 var box = pad$1(woodRoadDragMidpoint, padding, context);
61700 var advance = function() { continueTo(addNode); };
61702 reveal(box, t('intro.lines.update_line'),
61703 { buttonText: t('intro.ok'), buttonCallback: advance }
61706 context.map().on('move.intro drawn.intro', function() {
61707 var padding = 250 * Math.pow(2, context.map().zoom() - 19);
61708 var box = pad$1(woodRoadDragMidpoint, padding, context);
61709 reveal(box, t('intro.lines.update_line'),
61710 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
61715 function continueTo(nextStep) {
61716 context.map().on('move.intro drawn.intro', null);
61722 function addNode() {
61723 context.history().reset('doneAddLine');
61724 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61725 return chapter.restart();
61728 var padding = 40 * Math.pow(2, context.map().zoom() - 19);
61729 var box = pad$1(woodRoadAddNode, padding, context);
61730 reveal(box, t('intro.lines.add_node'));
61732 context.map().on('move.intro drawn.intro', function() {
61733 var padding = 40 * Math.pow(2, context.map().zoom() - 19);
61734 var box = pad$1(woodRoadAddNode, padding, context);
61735 reveal(box, t('intro.lines.add_node'), { duration: 0 });
61738 context.history().on('change.intro', function(changed) {
61739 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61740 return continueTo(updateLine);
61742 if (changed.created().length === 1) {
61743 timeout(function() { continueTo(startDragEndpoint); }, 500);
61747 context.on('enter.intro', function(mode) {
61748 if (mode.id !== 'select') {
61749 continueTo(updateLine);
61753 function continueTo(nextStep) {
61754 context.map().on('move.intro drawn.intro', null);
61755 context.history().on('change.intro', null);
61756 context.on('enter.intro', null);
61762 function startDragEndpoint() {
61763 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61764 return continueTo(updateLine);
61766 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61767 var box = pad$1(woodRoadDragEndpoint, padding, context);
61768 reveal(box, t('intro.lines.start_drag_endpoint'));
61770 context.map().on('move.intro drawn.intro', function() {
61771 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61772 return continueTo(updateLine);
61774 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61775 var box = pad$1(woodRoadDragEndpoint, padding, context);
61776 reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
61778 var entity = context.entity(woodRoadEndId);
61779 if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
61780 continueTo(finishDragEndpoint);
61784 function continueTo(nextStep) {
61785 context.map().on('move.intro drawn.intro', null);
61791 function finishDragEndpoint() {
61792 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61793 return continueTo(updateLine);
61796 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61797 var box = pad$1(woodRoadDragEndpoint, padding, context);
61798 reveal(box, t('intro.lines.finish_drag_endpoint'));
61800 context.map().on('move.intro drawn.intro', function() {
61801 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61802 return continueTo(updateLine);
61804 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61805 var box = pad$1(woodRoadDragEndpoint, padding, context);
61806 reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
61808 var entity = context.entity(woodRoadEndId);
61809 if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
61810 continueTo(startDragEndpoint);
61814 context.on('enter.intro', function() {
61815 continueTo(startDragMidpoint);
61818 function continueTo(nextStep) {
61819 context.map().on('move.intro drawn.intro', null);
61820 context.on('enter.intro', null);
61826 function startDragMidpoint() {
61827 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61828 return continueTo(updateLine);
61830 if (context.selectedIDs().indexOf(woodRoadId) === -1) {
61831 context.enter(modeSelect(context, [woodRoadId]));
61834 var padding = 80 * Math.pow(2, context.map().zoom() - 19);
61835 var box = pad$1(woodRoadDragMidpoint, padding, context);
61836 reveal(box, t('intro.lines.start_drag_midpoint'));
61838 context.map().on('move.intro drawn.intro', function() {
61839 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61840 return continueTo(updateLine);
61842 var padding = 80 * Math.pow(2, context.map().zoom() - 19);
61843 var box = pad$1(woodRoadDragMidpoint, padding, context);
61844 reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
61847 context.history().on('change.intro', function(changed) {
61848 if (changed.created().length === 1) {
61849 continueTo(continueDragMidpoint);
61853 context.on('enter.intro', function(mode) {
61854 if (mode.id !== 'select') {
61855 // keep Wood Road selected so midpoint triangles are drawn..
61856 context.enter(modeSelect(context, [woodRoadId]));
61860 function continueTo(nextStep) {
61861 context.map().on('move.intro drawn.intro', null);
61862 context.history().on('change.intro', null);
61863 context.on('enter.intro', null);
61869 function continueDragMidpoint() {
61870 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61871 return continueTo(updateLine);
61874 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61875 var box = pad$1(woodRoadDragEndpoint, padding, context);
61878 var advance = function() {
61879 context.history().checkpoint('doneUpdateLine');
61880 continueTo(deleteLines);
61883 reveal(box, t('intro.lines.continue_drag_midpoint'),
61884 { buttonText: t('intro.ok'), buttonCallback: advance }
61887 context.map().on('move.intro drawn.intro', function() {
61888 if (!context.hasEntity(woodRoadId) || !context.hasEntity(woodRoadEndId)) {
61889 return continueTo(updateLine);
61891 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61892 var box = pad$1(woodRoadDragEndpoint, padding, context);
61894 reveal(box, t('intro.lines.continue_drag_midpoint'),
61895 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
61899 function continueTo(nextStep) {
61900 context.map().on('move.intro drawn.intro', null);
61906 function deleteLines() {
61907 context.history().reset('doneUpdateLine');
61908 context.enter(modeBrowse(context));
61910 if (!context.hasEntity(washingtonStreetId) ||
61911 !context.hasEntity(twelfthAvenueId) ||
61912 !context.hasEntity(eleventhAvenueEndId)) {
61913 return chapter.restart();
61916 var msec = transitionTime(deleteLinesLoc, context.map().center());
61917 if (msec) { reveal(null, null, { duration: 0 }); }
61918 context.map().zoom(18).centerEase(deleteLinesLoc, msec);
61920 timeout(function() {
61921 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
61922 var box = pad$1(deleteLinesLoc, padding, context);
61925 var advance = function() { continueTo(rightClickIntersection); };
61927 reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
61928 { buttonText: t('intro.ok'), buttonCallback: advance }
61931 context.map().on('move.intro drawn.intro', function() {
61932 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
61933 var box = pad$1(deleteLinesLoc, padding, context);
61936 reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
61937 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
61941 context.history().on('change.intro', function() {
61942 timeout(function() {
61943 continueTo(deleteLines);
61944 }, 500); // after any transition (e.g. if user deleted intersection)
61949 function continueTo(nextStep) {
61950 context.map().on('move.intro drawn.intro', null);
61951 context.history().on('change.intro', null);
61957 function rightClickIntersection() {
61958 context.history().reset('doneUpdateLine');
61959 context.enter(modeBrowse(context));
61961 context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
61963 timeout(function() {
61964 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
61965 var box = pad$1(eleventhAvenueEnd, padding, context);
61966 reveal(box, t('intro.lines.rightclick_intersection',
61967 { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
61970 context.map().on('move.intro drawn.intro', function() {
61971 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
61972 var box = pad$1(eleventhAvenueEnd, padding, context);
61973 reveal(box, t('intro.lines.rightclick_intersection',
61974 { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
61979 context.on('enter.intro', function(mode) {
61980 if (mode.id !== 'select') return;
61981 var ids = context.selectedIDs();
61982 if (ids.length !== 1 || ids[0] !== eleventhAvenueEndId) return;
61984 timeout(function() {
61985 var node = selectMenuItem('split').node();
61987 continueTo(splitIntersection);
61988 }, 300); // after menu visible
61991 context.history().on('change.intro', function() {
61992 timeout(function() {
61993 continueTo(deleteLines);
61994 }, 300); // after any transition (e.g. if user deleted intersection)
61999 function continueTo(nextStep) {
62000 context.map().on('move.intro drawn.intro', null);
62001 context.on('enter.intro', null);
62002 context.history().on('change.intro', null);
62008 function splitIntersection() {
62009 if (!context.hasEntity(washingtonStreetId) ||
62010 !context.hasEntity(twelfthAvenueId) ||
62011 !context.hasEntity(eleventhAvenueEndId)) {
62012 return continueTo(deleteLines);
62015 var node = selectMenuItem('split').node();
62016 if (!node) { return continueTo(rightClickIntersection); }
62018 var wasChanged = false;
62019 var menuCoords = context.map().mouseCoordinates();
62020 washingtonSegmentId = null;
62022 revealEditMenu(menuCoords, t('intro.lines.split_intersection',
62023 { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
62026 context.map().on('move.intro drawn.intro', function() {
62027 var node = selectMenuItem('split').node();
62028 if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
62030 revealEditMenu(menuCoords, t('intro.lines.split_intersection',
62031 { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
62036 context.history().on('change.intro', function(changed) {
62038 timeout(function() {
62039 if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
62040 washingtonSegmentId = changed.created()[0].id;
62041 continueTo(didSplit);
62043 washingtonSegmentId = null;
62044 continueTo(retrySplit);
62046 }, 300); // after any transition (e.g. if user deleted intersection)
62049 function continueTo(nextStep) {
62050 context.map().on('move.intro drawn.intro', null);
62051 context.history().on('change.intro', null);
62057 function retrySplit() {
62058 context.enter(modeBrowse(context));
62059 context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
62060 var advance = function() { continueTo(rightClickIntersection); };
62062 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
62063 var box = pad$1(eleventhAvenueEnd, padding, context);
62064 reveal(box, t('intro.lines.retry_split'),
62065 { buttonText: t('intro.ok'), buttonCallback: advance }
62068 context.map().on('move.intro drawn.intro', function() {
62069 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
62070 var box = pad$1(eleventhAvenueEnd, padding, context);
62071 reveal(box, t('intro.lines.retry_split'),
62072 { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
62076 function continueTo(nextStep) {
62077 context.map().on('move.intro drawn.intro', null);
62083 function didSplit() {
62084 if (!washingtonSegmentId ||
62085 !context.hasEntity(washingtonSegmentId) ||
62086 !context.hasEntity(washingtonStreetId) ||
62087 !context.hasEntity(twelfthAvenueId) ||
62088 !context.hasEntity(eleventhAvenueEndId)) {
62089 return continueTo(rightClickIntersection);
62092 var ids = context.selectedIDs();
62093 var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
62094 var street = t('intro.graph.name.washington-street');
62096 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62097 var box = pad$1(twelfthAvenue, padding, context);
62098 box.width = box.width / 2;
62099 reveal(box, t(string, { street1: street, street2: street }),
62103 timeout(function() {
62104 context.map().zoom(18).centerEase(twelfthAvenue, 500);
62106 context.map().on('move.intro drawn.intro', function() {
62107 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62108 var box = pad$1(twelfthAvenue, padding, context);
62109 box.width = box.width / 2;
62110 reveal(box, t(string, { street1: street, street2: street }),
62114 }, 600); // after initial reveal and curtain cut
62116 context.on('enter.intro', function() {
62117 var ids = context.selectedIDs();
62118 if (ids.length === 1 && ids[0] === washingtonSegmentId) {
62119 continueTo(multiSelect);
62123 context.history().on('change.intro', function() {
62124 if (!washingtonSegmentId ||
62125 !context.hasEntity(washingtonSegmentId) ||
62126 !context.hasEntity(washingtonStreetId) ||
62127 !context.hasEntity(twelfthAvenueId) ||
62128 !context.hasEntity(eleventhAvenueEndId)) {
62129 return continueTo(rightClickIntersection);
62133 function continueTo(nextStep) {
62134 context.map().on('move.intro drawn.intro', null);
62135 context.on('enter.intro', null);
62136 context.history().on('change.intro', null);
62142 function multiSelect() {
62143 if (!washingtonSegmentId ||
62144 !context.hasEntity(washingtonSegmentId) ||
62145 !context.hasEntity(washingtonStreetId) ||
62146 !context.hasEntity(twelfthAvenueId) ||
62147 !context.hasEntity(eleventhAvenueEndId)) {
62148 return continueTo(rightClickIntersection);
62151 var ids = context.selectedIDs();
62152 var hasWashington = ids.indexOf(washingtonSegmentId) !== -1;
62153 var hasTwelfth = ids.indexOf(twelfthAvenueId) !== -1;
62155 if (hasWashington && hasTwelfth) {
62156 return continueTo(multiRightClick);
62157 } else if (!hasWashington && !hasTwelfth) {
62158 return continueTo(didSplit);
62161 context.map().zoom(18).centerEase(twelfthAvenue, 500);
62163 timeout(function() {
62164 var selected, other, padding, box;
62165 if (hasWashington) {
62166 selected = t('intro.graph.name.washington-street');
62167 other = t('intro.graph.name.12th-avenue');
62168 padding = 60 * Math.pow(2, context.map().zoom() - 18);
62169 box = pad$1(twelfthAvenueEnd, padding, context);
62172 selected = t('intro.graph.name.12th-avenue');
62173 other = t('intro.graph.name.washington-street');
62174 padding = 200 * Math.pow(2, context.map().zoom() - 18);
62175 box = pad$1(twelfthAvenue, padding, context);
62180 t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
62183 context.map().on('move.intro drawn.intro', function() {
62184 if (hasWashington) {
62185 selected = t('intro.graph.name.washington-street');
62186 other = t('intro.graph.name.12th-avenue');
62187 padding = 60 * Math.pow(2, context.map().zoom() - 18);
62188 box = pad$1(twelfthAvenueEnd, padding, context);
62191 selected = t('intro.graph.name.12th-avenue');
62192 other = t('intro.graph.name.washington-street');
62193 padding = 200 * Math.pow(2, context.map().zoom() - 18);
62194 box = pad$1(twelfthAvenue, padding, context);
62199 t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
62204 context.on('enter.intro', function() {
62205 continueTo(multiSelect);
62208 context.history().on('change.intro', function() {
62209 if (!washingtonSegmentId ||
62210 !context.hasEntity(washingtonSegmentId) ||
62211 !context.hasEntity(washingtonStreetId) ||
62212 !context.hasEntity(twelfthAvenueId) ||
62213 !context.hasEntity(eleventhAvenueEndId)) {
62214 return continueTo(rightClickIntersection);
62219 function continueTo(nextStep) {
62220 context.map().on('move.intro drawn.intro', null);
62221 context.on('enter.intro', null);
62222 context.history().on('change.intro', null);
62228 function multiRightClick() {
62229 if (!washingtonSegmentId ||
62230 !context.hasEntity(washingtonSegmentId) ||
62231 !context.hasEntity(washingtonStreetId) ||
62232 !context.hasEntity(twelfthAvenueId) ||
62233 !context.hasEntity(eleventhAvenueEndId)) {
62234 return continueTo(rightClickIntersection);
62237 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62238 var box = pad$1(twelfthAvenue, padding, context);
62239 reveal(box, t('intro.lines.multi_rightclick'));
62241 context.map().on('move.intro drawn.intro', function() {
62242 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62243 var box = pad$1(twelfthAvenue, padding, context);
62244 reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
62247 select(window).on('click.intro contextmenu.intro', function() {
62248 timeout(function() {
62249 var ids = context.selectedIDs();
62250 if (ids.length === 2 &&
62251 ids.indexOf(twelfthAvenueId) !== -1 &&
62252 ids.indexOf(washingtonSegmentId) !== -1) {
62253 var node = selectMenuItem('delete').node();
62255 continueTo(multiDelete);
62256 } else if (ids.length === 1 &&
62257 ids.indexOf(washingtonSegmentId) !== -1) {
62258 return continueTo(multiSelect);
62260 return continueTo(didSplit);
62262 }, 300); // after edit menu visible
62265 context.history().on('change.intro', function() {
62266 if (!washingtonSegmentId ||
62267 !context.hasEntity(washingtonSegmentId) ||
62268 !context.hasEntity(washingtonStreetId) ||
62269 !context.hasEntity(twelfthAvenueId) ||
62270 !context.hasEntity(eleventhAvenueEndId)) {
62271 return continueTo(rightClickIntersection);
62275 function continueTo(nextStep) {
62276 context.map().on('move.intro drawn.intro', null);
62277 select(window).on('click.intro contextmenu.intro', null, true);
62278 context.history().on('change.intro', null);
62284 function multiDelete() {
62285 if (!washingtonSegmentId ||
62286 !context.hasEntity(washingtonSegmentId) ||
62287 !context.hasEntity(washingtonStreetId) ||
62288 !context.hasEntity(twelfthAvenueId) ||
62289 !context.hasEntity(eleventhAvenueEndId)) {
62290 return continueTo(rightClickIntersection);
62293 var node = selectMenuItem('delete').node();
62294 if (!node) return continueTo(multiRightClick);
62296 var menuCoords = context.map().mouseCoordinates();
62297 revealEditMenu(menuCoords,
62298 t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
62301 context.map().on('move.intro drawn.intro', function() {
62302 revealEditMenu(menuCoords,
62303 t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
62308 context.on('exit.intro', function() {
62309 if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
62310 return continueTo(multiSelect); // left select mode but roads still exist
62314 context.history().on('change.intro', function() {
62315 if (context.hasEntity(washingtonSegmentId) || context.hasEntity(twelfthAvenueId)) {
62316 continueTo(retryDelete); // changed something but roads still exist
62322 function continueTo(nextStep) {
62323 context.map().on('move.intro drawn.intro', null);
62324 context.on('exit.intro', null);
62325 context.history().on('change.intro', null);
62331 function retryDelete() {
62332 context.enter(modeBrowse(context));
62334 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62335 var box = pad$1(twelfthAvenue, padding, context);
62336 reveal(box, t('intro.lines.retry_delete'), {
62337 buttonText: t('intro.ok'),
62338 buttonCallback: function() { continueTo(multiSelect); }
62341 function continueTo(nextStep) {
62348 dispatch$$1.call('done');
62349 reveal('#id-container',
62350 t('intro.lines.play', { next: t('intro.buildings.title') }), {
62351 tooltipBox: '.intro-nav-wrap .chapter-building',
62352 buttonText: t('intro.ok'),
62353 buttonCallback: function() { reveal('#id-container'); }
62359 chapter.enter = function() {
62364 chapter.exit = function() {
62365 timeouts.forEach(window.clearTimeout);
62366 select(window).on('mousedown.intro', null, true);
62367 context.on('enter.intro exit.intro', null);
62368 context.map().on('move.intro drawn.intro', null);
62369 context.history().on('change.intro', null);
62370 select('.inspector-wrap').on('wheel.intro', null);
62371 select('.preset-list-button').on('click.intro', null);
62375 chapter.restart = function() {
62381 return utilRebind(chapter, dispatch$$1, 'on');
62384 function uiIntroBuilding(context, reveal) {
62385 var dispatch$$1 = dispatch('done'),
62386 house = [-85.62815, 41.95638],
62387 tank = [-85.62732, 41.95347],
62388 buildingCatetory = context.presets().item('category-building'),
62389 housePreset = context.presets().item('building/house'),
62390 tankPreset = context.presets().item('man_made/storage_tank'),
62397 title: 'intro.buildings.title'
62401 function timeout(f, t$$1) {
62402 timeouts.push(window.setTimeout(f, t$$1));
62406 function eventCancel() {
62407 event.stopPropagation();
62408 event.preventDefault();
62412 function revealHouse(center, text, options) {
62413 var padding = 160 * Math.pow(2, context.map().zoom() - 20);
62414 var box = pad$1(center, padding, context);
62415 reveal(box, text, options);
62419 function revealTank(center, text, options) {
62420 var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
62421 var box = pad$1(center, padding, context);
62422 reveal(box, text, options);
62426 function revealEditMenu(loc, text, options) {
62427 var rect = context.surfaceRect();
62428 var point$$1 = context.curtainProjection(loc);
62430 var width = 250 + (2 * pad);
62432 var startX = rect.left + point$$1[0];
62433 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
62436 top: point$$1[1] + rect.top - 60,
62440 reveal(box, text, options);
62444 function addHouse() {
62445 context.enter(modeBrowse(context));
62446 context.history().reset('initial');
62449 var msec = transitionTime(house, context.map().center());
62450 if (msec) { reveal(null, null, { duration: 0 }); }
62451 context.map().zoom(19).centerEase(house, msec);
62453 timeout(function() {
62454 var tooltip = reveal('button.add-area',
62455 t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
62457 tooltip.selectAll('.tooltip-inner')
62458 .insert('svg', 'span')
62459 .attr('class', 'tooltip-illustration')
62461 .attr('xlink:href', '#iD-graphic-buildings');
62463 context.on('enter.intro', function(mode) {
62464 if (mode.id !== 'add-area') return;
62465 continueTo(startHouse);
62469 function continueTo(nextStep) {
62470 context.on('enter.intro', null);
62476 function startHouse() {
62477 if (context.mode().id !== 'add-area') {
62478 return continueTo(addHouse);
62482 context.map().zoomEase(20, 500);
62484 timeout(function() {
62485 revealHouse(house, t('intro.buildings.start_building'));
62487 context.map().on('move.intro drawn.intro', function() {
62488 revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
62491 context.on('enter.intro', function(mode) {
62492 if (mode.id !== 'draw-area') return chapter.restart();
62493 continueTo(continueHouse);
62496 }, 550); // after easing
62498 function continueTo(nextStep) {
62499 context.map().on('move.intro drawn.intro', null);
62500 context.on('enter.intro', null);
62506 function continueHouse() {
62507 if (context.mode().id !== 'draw-area') {
62508 return continueTo(addHouse);
62513 revealHouse(house, t('intro.buildings.continue_building'));
62515 context.map().on('move.intro drawn.intro', function() {
62516 revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
62519 context.on('enter.intro', function(mode) {
62520 if (mode.id === 'draw-area') {
62522 } else if (mode.id === 'select') {
62523 var graph = context.graph(),
62524 way = context.entity(context.selectedIDs()[0]),
62525 nodes = graph.childNodes(way),
62526 points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
62528 if (isMostlySquare(points)) {
62530 return continueTo(chooseCategoryBuilding);
62532 return continueTo(retryHouse);
62536 return chapter.restart();
62540 function continueTo(nextStep) {
62541 context.map().on('move.intro drawn.intro', null);
62542 context.on('enter.intro', null);
62548 function retryHouse() {
62549 var onClick = function() { continueTo(addHouse); };
62551 revealHouse(house, t('intro.buildings.retry_building'),
62552 { buttonText: t('intro.ok'), buttonCallback: onClick }
62555 context.map().on('move.intro drawn.intro', function() {
62556 revealHouse(house, t('intro.buildings.retry_building'),
62557 { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
62561 function continueTo(nextStep) {
62562 context.map().on('move.intro drawn.intro', null);
62568 function chooseCategoryBuilding() {
62569 if (!houseId || !context.hasEntity(houseId)) {
62572 var ids = context.selectedIDs();
62573 if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
62574 context.enter(modeSelect(context, [houseId]));
62577 // disallow scrolling
62578 select('.inspector-wrap').on('wheel.intro', eventCancel);
62580 timeout(function() {
62581 // reset pane, in case user somehow happened to change it..
62582 select('.inspector-wrap .panewrap').style('right', '-100%');
62584 var button = select('.preset-category-building .preset-list-button');
62586 reveal(button.node(),
62587 t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
62590 button.on('click.intro', function() {
62591 button.on('click.intro', null);
62592 continueTo(choosePresetHouse);
62595 }, 400); // after preset list pane visible..
62598 context.on('enter.intro', function(mode) {
62599 if (!houseId || !context.hasEntity(houseId)) {
62600 return continueTo(addHouse);
62602 var ids = context.selectedIDs();
62603 if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
62604 return continueTo(chooseCategoryBuilding);
62608 function continueTo(nextStep) {
62609 select('.inspector-wrap').on('wheel.intro', null);
62610 select('.preset-list-button').on('click.intro', null);
62611 context.on('enter.intro', null);
62617 function choosePresetHouse() {
62618 if (!houseId || !context.hasEntity(houseId)) {
62621 var ids = context.selectedIDs();
62622 if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
62623 context.enter(modeSelect(context, [houseId]));
62626 // disallow scrolling
62627 select('.inspector-wrap').on('wheel.intro', eventCancel);
62629 timeout(function() {
62630 // reset pane, in case user somehow happened to change it..
62631 select('.inspector-wrap .panewrap').style('right', '-100%');
62633 var button = select('.preset-building-house .preset-list-button');
62635 reveal(button.node(),
62636 t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
62640 button.on('click.intro', function() {
62641 button.on('click.intro', null);
62642 continueTo(closeEditorHouse);
62646 }, 400); // after preset list pane visible..
62648 context.on('enter.intro', function(mode) {
62649 if (!houseId || !context.hasEntity(houseId)) {
62650 return continueTo(addHouse);
62652 var ids = context.selectedIDs();
62653 if (mode.id !== 'select' || !ids.length || ids[0] !== houseId) {
62654 return continueTo(chooseCategoryBuilding);
62658 function continueTo(nextStep) {
62659 select('.inspector-wrap').on('wheel.intro', null);
62660 select('.preset-list-button').on('click.intro', null);
62661 context.on('enter.intro', null);
62667 function closeEditorHouse() {
62668 if (!houseId || !context.hasEntity(houseId)) {
62671 var ids = context.selectedIDs();
62672 if (context.mode().id !== 'select' || !ids.length || ids[0] !== houseId) {
62673 context.enter(modeSelect(context, [houseId]));
62676 context.history().checkpoint('hasHouse');
62678 context.on('exit.intro', function() {
62679 continueTo(rightClickHouse);
62682 timeout(function() {
62683 reveal('.entity-editor-pane',
62684 t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
62688 function continueTo(nextStep) {
62689 context.on('exit.intro', null);
62695 function rightClickHouse() {
62696 if (!houseId) return chapter.restart();
62698 context.enter(modeBrowse(context));
62699 context.history().reset('hasHouse');
62700 context.map().centerEase(house, 500);
62702 timeout(function() {
62703 if (context.map().zoom() < 20) {
62704 context.map().zoomEase(20, 500);
62708 context.on('enter.intro', function(mode) {
62709 if (mode.id !== 'select') return;
62710 var ids = context.selectedIDs();
62711 if (ids.length !== 1 || ids[0] !== houseId) return;
62713 timeout(function() {
62714 var node = selectMenuItem('orthogonalize').node();
62716 continueTo(clickSquare);
62717 }, 300); // after menu visible
62720 context.map().on('move.intro drawn.intro', function() {
62721 revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
62724 context.history().on('change.intro', function() {
62725 continueTo(rightClickHouse);
62728 function continueTo(nextStep) {
62729 context.on('enter.intro', null);
62730 context.map().on('move.intro drawn.intro', null);
62731 context.history().on('change.intro', null);
62737 function clickSquare() {
62738 if (!houseId) return chapter.restart();
62739 var entity = context.hasEntity(houseId);
62740 if (!entity) return continueTo(rightClickHouse);
62742 var node = selectMenuItem('orthogonalize').node();
62743 if (!node) { return continueTo(rightClickHouse); }
62745 var wasChanged = false;
62746 var menuCoords = context.map().mouseCoordinates();
62748 revealEditMenu(menuCoords,
62749 t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
62752 context.on('enter.intro', function(mode) {
62753 if (mode.id === 'browse') {
62754 continueTo(rightClickHouse);
62755 } else if (mode.id === 'move' || mode.id === 'rotate') {
62756 continueTo(retryClickSquare);
62760 context.map().on('move.intro drawn.intro', function() {
62761 var node = selectMenuItem('orthogonalize').node();
62762 if (!wasChanged && !node) { return continueTo(rightClickHouse); }
62764 revealEditMenu(menuCoords,
62765 t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
62770 context.history().on('change.intro', function() {
62772 context.history().on('change.intro', null);
62774 // Something changed. Wait for transition to complete and check undo annotation.
62775 timeout(function() {
62776 if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
62777 continueTo(doneSquare);
62779 continueTo(retryClickSquare);
62781 }, 500); // after transitioned actions
62784 function continueTo(nextStep) {
62785 context.on('enter.intro', null);
62786 context.map().on('move.intro drawn.intro', null);
62787 context.history().on('change.intro', null);
62793 function retryClickSquare() {
62794 context.enter(modeBrowse(context));
62796 revealHouse(house, t('intro.buildings.retry_square'), {
62797 buttonText: t('intro.ok'),
62798 buttonCallback: function() { continueTo(rightClickHouse); }
62801 function continueTo(nextStep) {
62807 function doneSquare() {
62808 context.history().checkpoint('doneSquare');
62810 revealHouse(house, t('intro.buildings.done_square'), {
62811 buttonText: t('intro.ok'),
62812 buttonCallback: function() { continueTo(addTank); }
62815 function continueTo(nextStep) {
62821 function addTank() {
62822 context.enter(modeBrowse(context));
62823 context.history().reset('doneSquare');
62826 var msec = transitionTime(tank, context.map().center());
62827 if (msec) { reveal(null, null, { duration: 0 }); }
62828 context.map().zoom(19.5).centerEase(tank, msec);
62830 timeout(function() {
62831 reveal('button.add-area',
62832 t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
62835 context.on('enter.intro', function(mode) {
62836 if (mode.id !== 'add-area') return;
62837 continueTo(startTank);
62841 function continueTo(nextStep) {
62842 context.on('enter.intro', null);
62848 function startTank() {
62849 if (context.mode().id !== 'add-area') {
62850 return continueTo(addTank);
62855 timeout(function() {
62856 revealTank(tank, t('intro.buildings.start_tank'));
62858 context.map().on('move.intro drawn.intro', function() {
62859 revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
62862 context.on('enter.intro', function(mode) {
62863 if (mode.id !== 'draw-area') return chapter.restart();
62864 continueTo(continueTank);
62867 }, 550); // after easing
62869 function continueTo(nextStep) {
62870 context.map().on('move.intro drawn.intro', null);
62871 context.on('enter.intro', null);
62877 function continueTank() {
62878 if (context.mode().id !== 'draw-area') {
62879 return continueTo(addTank);
62884 revealTank(tank, t('intro.buildings.continue_tank'));
62886 context.map().on('move.intro drawn.intro', function() {
62887 revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
62890 context.on('enter.intro', function(mode) {
62891 if (mode.id === 'draw-area') {
62893 } else if (mode.id === 'select') {
62894 tankId = context.selectedIDs()[0];
62895 return continueTo(searchPresetTank);
62897 return continueTo(addTank);
62901 function continueTo(nextStep) {
62902 context.map().on('move.intro drawn.intro', null);
62903 context.on('enter.intro', null);
62909 function searchPresetTank() {
62910 if (!tankId || !context.hasEntity(tankId)) {
62913 var ids = context.selectedIDs();
62914 if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
62915 context.enter(modeSelect(context, [tankId]));
62918 // disallow scrolling
62919 select('.inspector-wrap').on('wheel.intro', eventCancel);
62921 timeout(function() {
62922 // reset pane, in case user somehow happened to change it..
62923 select('.inspector-wrap .panewrap').style('right', '-100%');
62925 select('.preset-search-input')
62926 .on('keydown.intro', null)
62927 .on('keyup.intro', checkPresetSearch);
62929 reveal('.preset-search-input',
62930 t('intro.buildings.search_tank', { preset: tankPreset.name() })
62932 }, 400); // after preset list pane visible..
62934 context.on('enter.intro', function(mode) {
62935 if (!tankId || !context.hasEntity(tankId)) {
62936 return continueTo(addTank);
62939 var ids = context.selectedIDs();
62940 if (mode.id !== 'select' || !ids.length || ids[0] !== tankId) {
62941 // keep the user's area selected..
62942 context.enter(modeSelect(context, [tankId]));
62944 // reset pane, in case user somehow happened to change it..
62945 select('.inspector-wrap .panewrap').style('right', '-100%');
62946 // disallow scrolling
62947 select('.inspector-wrap').on('wheel.intro', eventCancel);
62949 select('.preset-search-input')
62950 .on('keydown.intro', null)
62951 .on('keyup.intro', checkPresetSearch);
62953 reveal('.preset-search-input',
62954 t('intro.buildings.search_tank', { preset: tankPreset.name() })
62957 context.history().on('change.intro', null);
62961 function checkPresetSearch() {
62962 var first = select('.preset-list-item:first-child');
62964 if (first.classed('preset-man_made-storage_tank')) {
62965 reveal(first.select('.preset-list-button').node(),
62966 t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
62970 select('.preset-search-input')
62971 .on('keydown.intro', eventCancel, true)
62972 .on('keyup.intro', null);
62974 context.history().on('change.intro', function() {
62975 continueTo(closeEditorTank);
62980 function continueTo(nextStep) {
62981 select('.inspector-wrap').on('wheel.intro', null);
62982 context.on('enter.intro', null);
62983 context.history().on('change.intro', null);
62984 select('.preset-search-input').on('keydown.intro keyup.intro', null);
62990 function closeEditorTank() {
62991 if (!tankId || !context.hasEntity(tankId)) {
62994 var ids = context.selectedIDs();
62995 if (context.mode().id !== 'select' || !ids.length || ids[0] !== tankId) {
62996 context.enter(modeSelect(context, [tankId]));
62999 context.history().checkpoint('hasTank');
63001 context.on('exit.intro', function() {
63002 continueTo(rightClickTank);
63005 timeout(function() {
63006 reveal('.entity-editor-pane',
63007 t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
63011 function continueTo(nextStep) {
63012 context.on('exit.intro', null);
63018 function rightClickTank() {
63019 if (!tankId) return continueTo(addTank);
63021 context.enter(modeBrowse(context));
63022 context.history().reset('hasTank');
63023 context.map().centerEase(tank, 500);
63025 timeout(function() {
63026 context.on('enter.intro', function(mode) {
63027 if (mode.id !== 'select') return;
63028 var ids = context.selectedIDs();
63029 if (ids.length !== 1 || ids[0] !== tankId) return;
63031 timeout(function() {
63032 var node = selectMenuItem('circularize').node();
63034 continueTo(clickCircle);
63035 }, 300); // after menu visible
63038 revealTank(tank, t('intro.buildings.rightclick_tank'));
63040 context.map().on('move.intro drawn.intro', function() {
63041 revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
63044 context.history().on('change.intro', function() {
63045 continueTo(rightClickTank);
63050 function continueTo(nextStep) {
63051 context.on('enter.intro', null);
63052 context.map().on('move.intro drawn.intro', null);
63053 context.history().on('change.intro', null);
63059 function clickCircle() {
63060 if (!tankId) return chapter.restart();
63061 var entity = context.hasEntity(tankId);
63062 if (!entity) return continueTo(rightClickTank);
63064 var node = selectMenuItem('circularize').node();
63065 if (!node) { return continueTo(rightClickTank); }
63067 var wasChanged = false;
63068 var menuCoords = context.map().mouseCoordinates();
63070 revealEditMenu(menuCoords,
63071 t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
63074 context.on('enter.intro', function(mode) {
63075 if (mode.id === 'browse') {
63076 continueTo(rightClickTank);
63077 } else if (mode.id === 'move' || mode.id === 'rotate') {
63078 continueTo(retryClickCircle);
63082 context.map().on('move.intro drawn.intro', function() {
63083 var node = selectMenuItem('circularize').node();
63084 if (!wasChanged && !node) { return continueTo(rightClickTank); }
63086 revealEditMenu(menuCoords,
63087 t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
63092 context.history().on('change.intro', function() {
63094 context.history().on('change.intro', null);
63096 // Something changed. Wait for transition to complete and check undo annotation.
63097 timeout(function() {
63098 if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
63101 continueTo(retryClickCircle);
63103 }, 500); // after transitioned actions
63106 function continueTo(nextStep) {
63107 context.on('enter.intro', null);
63108 context.map().on('move.intro drawn.intro', null);
63109 context.history().on('change.intro', null);
63115 function retryClickCircle() {
63116 context.enter(modeBrowse(context));
63118 revealTank(tank, t('intro.buildings.retry_circle'), {
63119 buttonText: t('intro.ok'),
63120 buttonCallback: function() { continueTo(rightClickTank); }
63123 function continueTo(nextStep) {
63130 dispatch$$1.call('done');
63131 reveal('#id-container',
63132 t('intro.buildings.play', { next: t('intro.startediting.title') }), {
63133 tooltipBox: '.intro-nav-wrap .chapter-startEditing',
63134 buttonText: t('intro.ok'),
63135 buttonCallback: function() { reveal('#id-container'); }
63141 chapter.enter = function() {
63146 chapter.exit = function() {
63147 timeouts.forEach(window.clearTimeout);
63148 context.on('enter.intro exit.intro', null);
63149 context.map().on('move.intro drawn.intro', null);
63150 context.history().on('change.intro', null);
63151 select('.inspector-wrap').on('wheel.intro', null);
63152 select('.preset-search-input').on('keydown.intro keyup.intro', null);
63153 select('.more-fields .combobox-input').on('click.intro', null);
63157 chapter.restart = function() {
63163 return utilRebind(chapter, dispatch$$1, 'on');
63166 function uiModal(selection$$1, blocking) {
63167 var keybinding = d3keybinding('modal');
63168 var previous = selection$$1.select('div.modal');
63169 var animate = previous.empty();
63171 previous.transition()
63173 .style('opacity', 0)
63176 var shaded = selection$$1
63178 .attr('class', 'shaded')
63179 .style('opacity', 0);
63181 shaded.close = function() {
63185 .style('opacity',0)
63191 .style('top','0px');
63199 .attr('class', 'modal fillL col6');
63202 shaded.on('click.remove-modal', function() {
63203 if (event.target === this) {
63208 modal.append('button')
63209 .attr('class', 'close')
63210 .on('click', shaded.close)
63211 .call(svgIcon('#iD-icon-close'));
63214 .on('⌫', shaded.close)
63215 .on('⎋', shaded.close);
63223 .attr('class', 'content');
63226 shaded.transition().style('opacity', 1);
63228 shaded.style('opacity', 1);
63235 function uiIntroStartEditing(context, reveal) {
63236 var dispatch$$1 = dispatch('done', 'startEditing');
63237 var modalSelection = select(null);
63241 title: 'intro.startediting.title'
63244 function showHelp() {
63245 reveal('.map-control.help-control',
63246 t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
63247 buttonText: t('intro.ok'),
63248 buttonCallback: function() { shortcuts(); }
63253 function shortcuts() {
63254 reveal('.map-control.help-control',
63255 t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
63256 buttonText: t('intro.ok'),
63257 buttonCallback: function() { showSave(); }
63262 function showSave() {
63263 d3_selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
63264 reveal('#bar button.save',
63265 t('intro.startediting.save'), {
63266 buttonText: t('intro.ok'),
63267 buttonCallback: function() { showStart(); }
63272 function showStart() {
63273 d3_selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
63275 modalSelection = uiModal(context.container());
63277 modalSelection.select('.modal')
63278 .attr('class', 'modal-splash modal col6');
63280 modalSelection.selectAll('.close').remove();
63282 var startbutton = modalSelection.select('.content')
63283 .attr('class', 'fillL')
63285 .attr('class', 'modal-section huge-modal-button')
63286 .on('click', function() {
63287 modalSelection.remove();
63292 .attr('class', 'illustration')
63294 .attr('xlink:href', '#iD-logo-walkthrough');
63298 .text(t('intro.startediting.start'));
63300 dispatch$$1.call('startEditing');
63304 chapter.enter = function() {
63309 chapter.exit = function() {
63310 modalSelection.remove();
63311 d3_selectAll('.shaded').remove(); // in case user opened keyboard shortcuts
63315 return utilRebind(chapter, dispatch$$1, 'on');
63319 welcome: uiIntroWelcome,
63320 navigation: uiIntroNavigation,
63321 point: uiIntroPoint,
63324 building: uiIntroBuilding,
63325 startEditing: uiIntroStartEditing
63328 var chapterFlow = [
63339 function uiIntro(context) {
63340 var INTRO_IMAGERY = 'EsriWorldImageryClarity';
63341 var introGraph = {};
63344 // create entities for intro graph and localize names
63345 for (var id in dataIntroGraph) {
63346 introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
63350 function intro(selection$$1) {
63351 context.enter(modeBrowse(context));
63353 // Save current map state
63354 var osm = context.connection();
63355 var history = context.history().toJSON();
63356 var hash = window.location.hash;
63357 var center = context.map().center();
63358 var zoom = context.map().zoom();
63359 var background = context.background().baseLayerSource();
63360 var overlays = context.background().overlayLayerSources();
63361 var opacity = d3_selectAll('#map .layer-background').style('opacity');
63362 var caches = osm && osm.caches();
63363 var baseEntities = context.history().graph().base().entities;
63364 var countryCode = services.geocoder.countryCode;
63367 context.inIntro(true);
63369 // Load semi-real data used in intro
63370 if (osm) { osm.toggle(false).reset(); }
63371 context.history().reset();
63372 context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
63373 context.history().checkpoint('initial');
63375 var imagery = context.background().findSource(INTRO_IMAGERY);
63377 context.background().baseLayerSource(imagery);
63379 context.background().bing();
63381 overlays.forEach(function (d) {
63382 context.background().toggleOverlayLayer(d);
63386 services.geocoder.countryCode = function(location, callback) {
63387 callback(null, t('intro.graph.countrycode'));
63390 d3_selectAll('#map .layer-background').style('opacity', 1);
63392 var curtain = uiCurtain();
63393 selection$$1.call(curtain);
63395 // store that the user started the walkthrough..
63396 context.storage('walkthrough_started', 'yes');
63398 // restore previous walkthrough progress..
63399 var storedProgress = context.storage('walkthrough_progress') || '';
63400 var progress = storedProgress.split(';').filter(Boolean);
63402 var chapters = chapterFlow.map(function(chapter, i) {
63403 var s = chapterUi[chapter](context, curtain.reveal)
63404 .on('done', function() {
63405 context.presets().init(); // clear away "recent" presets
63407 buttons.filter(function(d) {
63408 return d.title === s.title;
63409 }).classed('finished', true);
63411 if (i < chapterFlow.length - 1) {
63412 var next = chapterFlow[i + 1];
63413 select('button.chapter-' + next)
63414 .classed('next', true);
63417 // store walkthrough progress..
63418 progress.push(chapter);
63419 context.storage('walkthrough_progress', uniq(progress).join(';'));
63424 chapters[chapters.length - 1].on('startEditing', function() {
63425 // store walkthrough progress..
63426 progress.push('startEditing');
63427 context.storage('walkthrough_progress', uniq(progress).join(';'));
63429 // store if walkthrough is completed..
63430 var incomplete = difference(chapterFlow, progress);
63431 if (!incomplete.length) {
63432 context.storage('walkthrough_completed', 'yes');
63437 d3_selectAll('#map .layer-background').style('opacity', opacity);
63438 if (osm) { osm.toggle(true).reset().caches(caches); }
63439 context.history().reset().merge(values$1(baseEntities));
63440 context.background().baseLayerSource(background);
63441 overlays.forEach(function (d) { context.background().toggleOverlayLayer(d); });
63442 if (history) { context.history().fromJSON(history, false); }
63443 context.map().centerZoom(center, zoom);
63444 window.location.replace(hash);
63445 services.geocoder.countryCode = countryCode;
63446 context.inIntro(false);
63449 var navwrap = selection$$1
63451 .attr('class', 'intro-nav-wrap fillD');
63455 .attr('class', 'intro-nav-wrap-logo')
63457 .attr('xlink:href', '#iD-logo-walkthrough');
63459 var buttonwrap = navwrap
63461 .attr('class', 'joined')
63462 .selectAll('button.chapter');
63464 var buttons = buttonwrap
63468 .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
63469 .on('click', enterChapter);
63473 .text(function(d) { return t(d.title); });
63477 .attr('class', 'status')
63478 .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
63480 enterChapter(chapters[0]);
63483 function enterChapter(newChapter) {
63484 if (_currChapter) { _currChapter.exit(); }
63485 context.enter(modeBrowse(context));
63487 _currChapter = newChapter;
63488 _currChapter.enter();
63491 .classed('next', false)
63492 .classed('active', function(d) {
63493 return d.title === _currChapter.title;
63502 function uiConfirm(selection) {
63503 var modalSelection = uiModal(selection);
63505 modalSelection.select('.modal')
63506 .classed('modal-alert', true);
63508 var section = modalSelection.select('.content');
63510 section.append('div')
63511 .attr('class', 'modal-section header');
63513 section.append('div')
63514 .attr('class', 'modal-section message-text');
63516 var buttons = section.append('div')
63517 .attr('class', 'modal-section buttons cf');
63520 modalSelection.okButton = function() {
63523 .attr('class', 'button ok-button action col4')
63524 .on('click.confirm', function() {
63525 modalSelection.remove();
63527 .text(t('confirm.okay'))
63531 return modalSelection;
63535 return modalSelection;
63538 function uiSettingsCustomData(context) {
63539 var dispatch$$1 = dispatch('change');
63541 function render(selection$$1) {
63542 var dataLayer = context.layers().layer('data');
63543 var _origSettings = {
63544 fileList: (dataLayer && dataLayer.fileList()) || null,
63545 url: context.storage('settings-custom-data-url')
63547 var _currSettings = cloneDeep(_origSettings);
63549 // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
63550 var modal = uiConfirm(selection$$1).okButton();
63553 .classed('settings-modal settings-custom-data', true);
63555 modal.select('.modal-section.header')
63557 .text(t('settings.custom_data.header'));
63560 var textSection = modal.select('.modal-section.message-text');
63564 .attr('class', 'instructions-file')
63565 .text(t('settings.custom_data.file.instructions'));
63569 .attr('class', 'field-file')
63570 .attr('type', 'file')
63571 .property('files', _currSettings.fileList) // works for all except IE11
63572 .on('change', function() {
63573 var files = event.target.files;
63574 if (files && files.length) {
63575 _currSettings.url = '';
63576 textSection.select('.field-url').property('value', '');
63577 _currSettings.fileList = files;
63579 _currSettings.fileList = null;
63585 .text(t('settings.custom_data.or'));
63589 .attr('class', 'instructions-url')
63590 .text(t('settings.custom_data.url.instructions'));
63593 .append('textarea')
63594 .attr('class', 'field-url')
63595 .attr('placeholder', t('settings.custom_data.url.placeholder'))
63597 .property('value', _currSettings.url);
63600 // insert a cancel button, and adjust the button widths
63601 var buttonSection = modal.select('.modal-section.buttons');
63604 .insert('button', '.ok-button')
63605 .attr('class', 'button col3 cancel-button secondary-action')
63606 .text(t('confirm.cancel'));
63609 buttonSection.select('.cancel-button')
63610 .on('click.cancel', clickCancel);
63612 buttonSection.select('.ok-button')
63613 .classed('col3', true)
63614 .classed('col4', false)
63615 .attr('disabled', isSaveDisabled)
63616 .on('click.save', clickSave);
63619 function isSaveDisabled() {
63624 // restore the original url
63625 function clickCancel() {
63626 textSection.select('.field-url').property('value', _origSettings.url);
63627 context.storage('settings-custom-data-url', _origSettings.url);
63632 // accept the current url
63633 function clickSave() {
63634 _currSettings.url = textSection.select('.field-url').property('value').trim();
63636 // one or the other but not both
63637 if (_currSettings.url) { _currSettings.fileList = null; }
63638 if (_currSettings.fileList) { _currSettings.url = ''; }
63640 context.storage('settings-custom-data-url', _currSettings.url);
63643 dispatch$$1.call('change', this, _currSettings);
63647 return utilRebind(render, dispatch$$1, 'on');
63650 function uiTooltipHtml(text, key, heading) {
63654 s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
63657 s += '<div class="tooltip-text"><span>' + text + '</span></div>';
63660 s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
63661 '<span class="keyhint">' + key + '</span></div>';
63667 function uiMapData(context) {
63668 var key = t('map_data.key');
63669 var features = context.features().keys();
63670 var layers = context.layers();
63671 var fills = ['wireframe', 'partial', 'full'];
63673 var settingsCustomData = uiSettingsCustomData(context)
63674 .on('change', customChanged);
63676 var _fillSelected = context.storage('area-fill') || 'partial';
63677 var _shown = false;
63678 var _dataLayerContainer = select(null);
63679 var _fillList = select(null);
63680 var _featureList = select(null);
63683 function showsFeature(d) {
63684 return context.features().enabled(d);
63688 function autoHiddenFeature(d) {
63689 return context.features().autoHidden(d);
63693 function clickFeature(d) {
63694 context.features().toggle(d);
63699 function showsFill(d) {
63700 return _fillSelected === d;
63704 function setFill(d) {
63705 fills.forEach(function(opt) {
63706 context.surface().classed('fill-' + opt, Boolean(opt === d));
63710 context.storage('area-fill', d);
63711 if (d !== 'wireframe') {
63712 context.storage('area-fill-toggle', d);
63718 function showsLayer(which) {
63719 var layer = layers.layer(which);
63721 return layer.enabled();
63727 function setLayer(which, enabled) {
63728 var layer = layers.layer(which);
63730 layer.enabled(enabled);
63732 if (!enabled && (which === 'osm' || which === 'notes')) {
63733 context.enter(modeBrowse(context));
63741 function toggleLayer(which) {
63742 setLayer(which, !showsLayer(which));
63746 function drawPhotoItems(selection$$1) {
63747 var photoKeys = ['streetside', 'mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
63748 var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
63749 var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
63751 function layerSupported(d) {
63752 return d.layer && d.layer.supported();
63754 function layerEnabled(d) {
63755 return layerSupported(d) && d.layer.enabled();
63758 var ul = selection$$1
63759 .selectAll('.layer-list-photos')
63764 .attr('class', 'layer-list layer-list-photos')
63767 var li = ul.selectAll('.list-item-photos')
63773 var liEnter = li.enter()
63775 .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
63777 var labelEnter = liEnter
63779 .each(function(d) {
63782 .title(t(d.id.replace('-', '_') + '.tooltip'))
63789 .attr('type', 'checkbox')
63790 .on('change', function(d) { toggleLayer(d.id); });
63794 .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
63800 .classed('active', layerEnabled)
63801 .selectAll('input')
63802 .property('checked', layerEnabled);
63806 function drawOsmItems(selection$$1) {
63807 var osmKeys = ['osm', 'notes'];
63808 var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
63810 var ul = selection$$1
63811 .selectAll('.layer-list-osm')
63816 .attr('class', 'layer-list layer-list-osm')
63819 var li = ul.selectAll('.list-item')
63825 var liEnter = li.enter()
63827 .attr('class', function(d) { return 'list-item list-item-' + d.id; });
63829 var labelEnter = liEnter
63831 .each(function(d) {
63834 .title(t('map_data.layers.' + d.id + '.tooltip'))
63835 .placement('bottom')
63841 .attr('type', 'checkbox')
63842 .on('change', function(d) { toggleLayer(d.id); });
63846 .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
63852 .classed('active', function (d) { return d.layer.enabled(); })
63853 .selectAll('input')
63854 .property('checked', function (d) { return d.layer.enabled(); });
63858 // Beta feature - sample vector layers to support Detroit Mapping Challenge
63859 // https://github.com/osmus/detroit-mapping-challenge
63860 function drawVectorItems(selection$$1) {
63861 var dataLayer = layers.layer('data');
63864 name: 'Detroit Neighborhoods/Parks',
63865 src: 'neighborhoods-parks',
63866 tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
63867 template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmur6x34562qp9iv1u3ksf-54hev,jonahadkins.cjksmqxdx33jj2wp90xd9x2md-4e5y2/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
63869 name: 'Detroit Composite POIs',
63870 src: 'composite-poi',
63871 tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
63872 template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmm6a02sli31myxhsr7zf3-2sw8h/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
63874 name: 'Detroit All-The-Places POIs',
63875 src: 'alltheplaces-poi',
63876 tooltip: 'Public domain business location data created by web scrapers.',
63877 template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmswgk340g2vo06p1w9w0j-8fjjc/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
63881 // Only show this if the map is around Detroit..
63882 var detroit = geoExtent$$1([-83.5, 42.1], [-82.8, 42.5]);
63883 var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
63885 var container = selection$$1.selectAll('.vectortile-container')
63886 .data(showVectorItems ? [0] : []);
63891 var containerEnter = container.enter()
63893 .attr('class', 'vectortile-container');
63897 .attr('class', 'vectortile-header')
63898 .text('Detroit Vector Tiles (Beta)');
63902 .attr('class', 'layer-list layer-list-vectortile');
63906 .attr('class', 'vectortile-footer')
63908 .attr('target', '_blank')
63909 .attr('tabindex', -1)
63910 .call(svgIcon('#iD-icon-out-link', 'inline'))
63911 .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
63913 .text('About these layers');
63915 container = container
63916 .merge(containerEnter);
63919 var ul = container.selectAll('.layer-list-vectortile');
63921 var li = ul.selectAll('.list-item')
63927 var liEnter = li.enter()
63929 .attr('class', function(d) { return 'list-item list-item-' + d.src; });
63931 var labelEnter = liEnter
63933 .each(function(d) {
63935 tooltip().title(d.tooltip).placement('top')
63941 .attr('type', 'radio')
63942 .attr('name', 'vectortile')
63943 .on('change', selectVTLayer);
63947 .text(function(d) { return d.name; });
63952 .classed('active', isVTLayerSelected)
63953 .selectAll('input')
63954 .property('checked', isVTLayerSelected);
63957 function isVTLayerSelected(d) {
63958 return dataLayer && dataLayer.template() === d.template;
63961 function selectVTLayer(d) {
63962 context.storage('settings-custom-data-url', d.template);
63964 dataLayer.template(d.template, d.src);
63965 dataLayer.enabled(true);
63971 function drawCustomDataItems(selection$$1) {
63972 var dataLayer = layers.layer('data');
63973 var hasData = dataLayer && dataLayer.hasData();
63974 var showsData = hasData && dataLayer.enabled();
63976 var ul = selection$$1
63977 .selectAll('.layer-list-data')
63978 .data(dataLayer ? [0] : []);
63985 var ulEnter = ul.enter()
63987 .attr('class', 'layer-list layer-list-data');
63989 var liEnter = ulEnter
63991 .attr('class', 'list-item-data');
63996 .title(t('settings.custom_data.tooltip'))
63997 .placement((textDirection === 'rtl') ? 'right' : 'left')
63999 .on('click', editCustom)
64000 .call(svgIcon('#iD-icon-more'));
64005 .title(t('map_data.layers.custom.zoom'))
64006 .placement((textDirection === 'rtl') ? 'right' : 'left')
64008 .on('click', function() {
64009 event.preventDefault();
64010 event.stopPropagation();
64011 dataLayer.fitZoom();
64013 .call(svgIcon('#iD-icon-search'));
64015 var labelEnter = liEnter
64018 .title(t('map_data.layers.custom.tooltip'))
64024 .attr('type', 'checkbox')
64025 .on('change', function() { toggleLayer('data'); });
64029 .text(t('map_data.layers.custom.title'));
64035 ul.selectAll('.list-item-data')
64036 .classed('active', showsData)
64037 .selectAll('label')
64038 .classed('deemphasize', !hasData)
64039 .selectAll('input')
64040 .property('disabled', !hasData)
64041 .property('checked', showsData);
64045 function editCustom() {
64046 event.preventDefault();
64047 context.container()
64048 .call(settingsCustomData);
64052 function customChanged(d) {
64053 var dataLayer = layers.layer('data');
64056 dataLayer.url(d.url);
64057 } else if (d && d.fileList) {
64058 dataLayer.fileList(d.fileList);
64063 function drawListItems(selection$$1, data, type, name, change, active) {
64064 var items = selection$$1.selectAll('li')
64072 var enter = items.enter()
64074 .attr('class', 'layer')
64077 .title(function(d) {
64078 var tip = t(name + '.' + d + '.tooltip'),
64079 key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
64081 if (name === 'feature' && autoHiddenFeature(d)) {
64082 var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
64083 tip += '<div>' + msg + '</div>';
64085 return uiTooltipHtml(tip, key);
64095 .attr('type', type)
64096 .attr('name', name)
64097 .on('change', change);
64101 .text(function(d) { return t(name + '.' + d + '.description'); });
64108 .classed('active', active)
64109 .selectAll('input')
64110 .property('checked', active)
64111 .property('indeterminate', function(d) {
64112 return (name === 'feature' && autoHiddenFeature(d));
64117 function renderDataLayers(selection$$1) {
64118 var container = selection$$1.selectAll('data-layer-container')
64121 _dataLayerContainer = container.enter()
64123 .attr('class', 'data-layer-container')
64128 function renderFillList(selection$$1) {
64129 var container = selection$$1.selectAll('layer-fill-list')
64132 _fillList = container.enter()
64134 .attr('class', 'layer-list layer-fill-list')
64139 function renderFeatureList(selection$$1) {
64140 var container = selection$$1.selectAll('layer-feature-list')
64143 _featureList = container.enter()
64145 .attr('class', 'layer-list layer-feature-list')
64150 function update() {
64151 _dataLayerContainer
64152 .call(drawOsmItems)
64153 .call(drawPhotoItems)
64154 .call(drawCustomDataItems)
64155 .call(drawVectorItems); // Beta - Detroit mapping challenge
64158 .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
64161 .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
64165 function toggleWireframe() {
64167 event.preventDefault();
64168 event.stopPropagation();
64171 if (_fillSelected === 'wireframe') {
64172 _fillSelected = context.storage('area-fill-toggle') || 'partial';
64174 _fillSelected = 'wireframe';
64177 setFill(_fillSelected);
64178 context.map().pan([0,0]); // trigger a redraw
64182 function mapData(selection$$1) {
64184 function hidePane() {
64188 function togglePane() {
64189 if (event) event.preventDefault();
64190 paneTooltip.hide(button);
64191 setVisible(!button.classed('active'));
64194 function setVisible(show) {
64195 if (show !== _shown) {
64196 button.classed('active', show);
64200 uiBackground.hidePane();
64205 .style('display', 'block')
64206 .style('right', '-300px')
64209 .style('right', '0px');
64213 .style('display', 'block')
64214 .style('right', '0px')
64217 .style('right', '-300px')
64218 .on('end', function() {
64219 select(this).style('display', 'none');
64226 var pane = selection$$1
64228 .attr('class', 'fillL map-pane col4 hide');
64230 var paneTooltip = tooltip()
64231 .placement((textDirection === 'rtl') ? 'right' : 'left')
64233 .title(uiTooltipHtml(t('map_data.description'), key));
64235 var button = selection$$1
64237 .attr('tabindex', -1)
64238 .on('click', togglePane)
64239 .call(svgIcon('#iD-icon-data', 'light'))
64240 .call(paneTooltip);
64245 .attr('class', 'pane-heading');
64249 .text(t('map_data.title'));
64253 .on('click', function() { uiMapData.hidePane(); })
64254 .call(svgIcon('#iD-icon-close'));
64259 .attr('class', 'pane-content');
64264 .attr('class', 'map-data-data-layers')
64265 .call(uiDisclosure(context, 'data_layers', true)
64266 .title(t('map_data.data_layers'))
64267 .content(renderDataLayers)
64273 .attr('class', 'map-data-area-fills')
64274 .call(uiDisclosure(context, 'fill_area', false)
64275 .title(t('map_data.fill_area'))
64276 .content(renderFillList)
64282 .attr('class', 'map-data-feature-filters')
64283 .call(uiDisclosure(context, 'map_features', false)
64284 .title(t('map_data.map_features'))
64285 .content(renderFeatureList)
64291 .on('change.map_data-update', update);
64294 setFill(_fillSelected);
64296 var keybinding = d3keybinding('features')
64297 .on(key, togglePane)
64298 .on(t('area_fill.wireframe.key'), toggleWireframe)
64299 .on([t('background.key'), t('help.key')], hidePane);
64304 uiMapData.hidePane = hidePane;
64305 uiMapData.togglePane = togglePane;
64306 uiMapData.setVisible = setVisible;
64312 function uiShortcuts() {
64313 var detected = utilDetect();
64315 var modalSelection;
64316 var savedSelection;
64319 var keybinding = d3keybinding('shortcuts')
64320 .on(t('shortcuts.toggle.key'), function () {
64321 if (d3_selectAll('.modal-shortcuts').size()) { // already showing
64322 if (modalSelection) {
64323 modalSelection.close();
64324 modalSelection = null;
64327 modalSelection = uiModal(savedSelection);
64328 shortcutsModal(modalSelection);
64337 function shortcutsModal(modalSelection) {
64338 modalSelection.select('.modal')
64339 .classed('modal-shortcuts', true);
64341 var shortcutsModal = modalSelection.select('.content');
64345 .attr('class', 'modal-section')
64347 .text(t('shortcuts.title'));
64354 function render(selection$$1) {
64355 var wrapper = selection$$1
64356 .selectAll('.wrapper')
64359 var wrapperEnter = wrapper
64362 .attr('class', 'wrapper modal-section');
64364 var tabsBar = wrapperEnter
64366 .attr('class', 'tabs-bar');
64368 var shortcutsList = wrapperEnter
64370 .attr('class', 'shortcuts-list');
64372 wrapper = wrapper.merge(wrapperEnter);
64376 .data(dataShortcuts);
64378 var tabsEnter = tabs
64381 .attr('class', 'tab')
64382 .on('click', function (d, i) {
64384 render(selection$$1);
64389 .text(function (d) { return t(d.text); });
64395 wrapper.selectAll('.tab')
64396 .classed('active', function (d, i) {
64397 return i === activeTab;
64401 var shortcuts = shortcutsList
64402 .selectAll('.shortcut-tab')
64403 .data(dataShortcuts);
64405 var shortcutsEnter = shortcuts
64408 .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
64410 var columnsEnter = shortcutsEnter
64411 .selectAll('.shortcut-column')
64412 .data(function (d) { return d.columns; })
64415 .attr('class', 'shortcut-column');
64417 var rowsEnter = columnsEnter
64418 .selectAll('.shortcut-row')
64419 .data(function (d) { return d.rows; })
64422 .attr('class', 'shortcut-row');
64425 var sectionRows = rowsEnter
64426 .filter(function (d) { return !d.shortcuts; });
64433 .attr('class', 'shortcut-section')
64435 .text(function (d) { return t(d.text); });
64438 var shortcutRows = rowsEnter
64439 .filter(function (d) { return d.shortcuts; });
64441 var shortcutKeys = shortcutRows
64443 .attr('class', 'shortcut-keys');
64445 var modifierKeys = shortcutKeys
64446 .filter(function (d) { return d.modifiers; });
64449 .selectAll('kbd.modifier')
64450 .data(function (d) {
64451 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
64453 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
64456 return d.modifiers;
64460 .each(function () {
64461 var selection$$1 = select(this);
64465 .attr('class', 'modifier')
64466 .text(function (d) { return uiCmd.display(d); });
64475 .selectAll('kbd.shortcut')
64476 .data(function (d) {
64477 var arr = d.shortcuts;
64478 if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
64480 } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
64484 return arr.map(function(s) {
64487 separator: d.separator
64492 .each(function (d, i, nodes) {
64493 var selection$$1 = select(this);
64494 var click = d.shortcut.toLowerCase().match(/(.*).click/);
64496 if (click && click[1]) {
64498 .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
64502 .attr('class', 'shortcut')
64503 .text(function (d) {
64504 var key = d.shortcut;
64505 return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
64509 if (i < nodes.length - 1) {
64512 .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
64518 .filter(function(d) { return d.gesture; })
64519 .each(function () {
64520 var selection$$1 = select(this);
64528 .attr('class', 'gesture')
64529 .text(function (d) { return t(d.gesture); });
64535 .attr('class', 'shortcut-desc')
64536 .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
64539 shortcuts = shortcuts
64540 .merge(shortcutsEnter);
64543 wrapper.selectAll('.shortcut-tab')
64544 .style('display', function (d, i) {
64545 return i === activeTab ? 'flex' : 'none';
64550 return function(selection$$1, show) {
64551 savedSelection = selection$$1;
64553 modalSelection = uiModal(selection$$1);
64554 shortcutsModal(modalSelection);
64559 function uiHelp(context) {
64560 var key = t('help.key');
64583 'select_left_click',
64584 'select_right_click',
64586 'multiselect_shift_click',
64587 'multiselect_lasso',
64600 ['feature_editor', [
64607 'fields_all_fields',
64609 'fields_add_field',
64618 'add_point_finish',
64623 'delete_point_command'
64632 'modify_line_dragnode',
64633 'modify_line_addnode',
64636 'connect_line_display',
64637 'connect_line_drag',
64638 'connect_line_tag',
64639 'disconnect_line_h',
64640 'disconnect_line_command',
64642 'move_line_command',
64643 'move_line_connected',
64646 'delete_line_command'
64653 'add_area_command',
64657 'square_area_command',
64659 'modify_area_dragnode',
64660 'modify_area_addnode',
64663 'delete_area_command'
64669 'edit_relation_add',
64670 'edit_relation_delete',
64671 'maintain_relation_h',
64672 'maintain_relation',
64673 'relation_types_h',
64676 'multipolygon_create',
64677 'multipolygon_merge',
64678 'turn_restriction_h',
64679 'turn_restriction',
64680 'turn_restriction_field',
64681 'turn_restriction_editing',
64727 'help.help.open_data_h': 3,
64728 'help.help.before_start_h': 3,
64729 'help.help.open_source_h': 3,
64730 'help.overview.navigation_h': 3,
64731 'help.overview.features_h': 3,
64732 'help.editing.select_h': 3,
64733 'help.editing.multiselect_h': 3,
64734 'help.editing.undo_redo_h': 3,
64735 'help.editing.save_h': 3,
64736 'help.editing.upload_h': 3,
64737 'help.editing.backups_h': 3,
64738 'help.editing.keyboard_h': 3,
64739 'help.feature_editor.type_h': 3,
64740 'help.feature_editor.fields_h': 3,
64741 'help.feature_editor.tags_h': 3,
64742 'help.points.add_point_h': 3,
64743 'help.points.move_point_h': 3,
64744 'help.points.delete_point_h': 3,
64745 'help.lines.add_line_h': 3,
64746 'help.lines.modify_line_h': 3,
64747 'help.lines.connect_line_h': 3,
64748 'help.lines.disconnect_line_h': 3,
64749 'help.lines.move_line_h': 3,
64750 'help.lines.delete_line_h': 3,
64751 'help.areas.point_or_area_h': 3,
64752 'help.areas.add_area_h': 3,
64753 'help.areas.square_area_h': 3,
64754 'help.areas.modify_area_h': 3,
64755 'help.areas.delete_area_h': 3,
64756 'help.relations.edit_relation_h': 3,
64757 'help.relations.maintain_relation_h': 3,
64758 'help.relations.relation_types_h': 2,
64759 'help.relations.multipolygon_h': 3,
64760 'help.relations.turn_restriction_h': 3,
64761 'help.relations.route_h': 3,
64762 'help.relations.boundary_h': 3,
64763 'help.notes.add_note_h': 3,
64764 'help.notes.update_note_h': 3,
64765 'help.notes.save_note_h': 3,
64766 'help.imagery.sources_h': 3,
64767 'help.imagery.offsets_h': 3,
64768 'help.streetlevel.using_h': 3,
64769 'help.gps.using_h': 3,
64772 var replacements = {
64773 point: icon('#iD-icon-point', 'pre-text'),
64774 line: icon('#iD-icon-line', 'pre-text'),
64775 area: icon('#iD-icon-area', 'pre-text'),
64776 note: icon('#iD-icon-note', 'pre-text add-note'),
64777 plus: icon('#iD-icon-plus', 'pre-text'),
64778 minus: icon('#iD-icon-minus', 'pre-text'),
64779 orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
64780 disconnect: icon('#iD-operation-disconnect', 'pre-text'),
64781 layers: icon('#iD-icon-layers', 'pre-text'),
64782 data: icon('#iD-icon-data', 'pre-text'),
64783 inspect: icon('#iD-icon-inspect', 'pre-text'),
64784 move: icon('#iD-operation-move', 'pre-text'),
64785 merge: icon('#iD-operation-merge', 'pre-text'),
64786 delete: icon('#iD-operation-delete', 'pre-text'),
64787 close: icon('#iD-icon-close', 'pre-text'),
64788 undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
64789 redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
64790 save: icon('#iD-icon-save', 'pre-text'),
64791 leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
64792 rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
64793 shift: uiCmd.display('⇧'),
64794 alt: uiCmd.display('⌥'),
64795 return: uiCmd.display('↵'),
64796 version: context.version
64799 // For each section, squash all the texts into a single markdown document
64800 var docs = docKeys.map(function(key) {
64801 var helpkey = 'help.' + key[0];
64802 var text = key[1].reduce(function(all, part) {
64803 var subkey = helpkey + '.' + part;
64804 var depth = headings[subkey]; // is this subkey a heading?
64805 var hhh = depth ? Array(depth + 1).join('#') + ' ' : ''; // if so, prepend with some ##'s
64806 return all + hhh + t(subkey, replacements) + '\n\n';
64810 title: t(helpkey + '.title'),
64811 html: marked(text.trim())
64816 function help(selection$$1) {
64818 function hidePane() {
64823 function togglePane() {
64824 if (event) event.preventDefault();
64825 tooltipBehavior.hide(button);
64826 setVisible(!button.classed('active'));
64830 function setVisible(show) {
64831 if (show !== shown) {
64832 button.classed('active', show);
64836 uiBackground.hidePane();
64837 uiMapData.hidePane();
64839 pane.style('display', 'block')
64840 .style('right', '-500px')
64843 .style('right', '0px');
64846 pane.style('right', '0px')
64849 .style('right', '-500px')
64850 .on('end', function() {
64851 select(this).style('display', 'none');
64858 function clickHelp(d, i) {
64859 var rtl = (textDirection === 'rtl');
64860 pane.property('scrollTop', 0);
64861 doctitle.html(d.title);
64864 body.selectAll('a')
64865 .attr('target', '_blank');
64866 menuItems.classed('selected', function(m) {
64867 return m.title === d.title;
64872 nav.call(drawNext).call(drawPrevious);
64874 nav.call(drawPrevious).call(drawNext);
64878 function drawNext(selection$$1) {
64879 if (i < docs.length - 1) {
64880 var nextLink = selection$$1
64882 .attr('class', 'next')
64883 .on('click', function() {
64884 clickHelp(docs[i + 1], i + 1);
64889 .text(docs[i + 1].title)
64890 .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
64895 function drawPrevious(selection$$1) {
64897 var prevLink = selection$$1
64899 .attr('class', 'previous')
64900 .on('click', function() {
64901 clickHelp(docs[i - 1], i - 1);
64905 .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
64907 .text(docs[i - 1].title);
64913 function clickWalkthrough() {
64914 if (context.inIntro()) return;
64915 context.container().call(uiIntro(context));
64920 function clickShortcuts() {
64921 context.container().call(uiShortcuts(context), true);
64925 var pane = selection$$1.append('div')
64926 .attr('class', 'help-wrap map-pane fillL col6 hide');
64928 var tooltipBehavior = tooltip()
64929 .placement((textDirection === 'rtl') ? 'right' : 'left')
64931 .title(uiTooltipHtml(t('help.title'), key));
64933 var button = selection$$1.append('button')
64934 .attr('tabindex', -1)
64935 .on('click', togglePane)
64936 .call(svgIcon('#iD-icon-help', 'light'))
64937 .call(tooltipBehavior);
64944 .attr('class', 'pane-heading');
64946 var doctitle = heading
64948 .text(t('help.title'));
64952 .on('click', function() { uiHelp.hidePane(); })
64953 .call(svgIcon('#iD-icon-close'));
64958 .attr('class', 'pane-content');
64962 .attr('class', 'toc');
64964 var menuItems = toc.selectAll('li')
64969 .html(function(d) { return d.title; })
64970 .on('click', clickHelp);
64972 var shortcuts = toc
64974 .attr('class', 'shortcuts')
64977 .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
64981 .on('click', clickShortcuts);
64985 .text(t('shortcuts.title'));
64987 var walkthrough = toc
64989 .attr('class', 'walkthrough')
64991 .on('click', clickWalkthrough);
64995 .attr('class', 'logo logo-walkthrough')
64997 .attr('xlink:href', '#iD-logo-walkthrough');
65001 .text(t('splash.walkthrough'));
65004 var helpContent = content
65006 .attr('class', 'left-content');
65008 var body = helpContent
65010 .attr('class', 'body');
65012 var nav = helpContent
65014 .attr('class', 'nav');
65016 clickHelp(docs[0], 0);
65018 var keybinding = d3keybinding('help')
65019 .on(key, togglePane)
65020 .on([t('background.key'), t('map_data.key')], hidePane);
65025 uiHelp.hidePane = hidePane;
65026 uiHelp.togglePane = togglePane;
65027 uiHelp.setVisible = setVisible;
65033 function localeDateString(s) {
65034 if (!s) return null;
65035 var detected = utilDetect();
65036 var options = { day: 'numeric', month: 'short', year: 'numeric' };
65037 var d = new Date(s);
65038 if (isNaN(d.getTime())) return null;
65039 return d.toLocaleDateString(detected.locale, options);
65042 function vintageRange(vintage) {
65044 if (vintage.start || vintage.end) {
65045 s = (vintage.start || '?');
65046 if (vintage.start !== vintage.end) {
65047 s += ' - ' + (vintage.end || '?');
65054 function rendererBackgroundSource(data) {
65055 var source = clone(data);
65056 var offset = [0, 0];
65057 var name = source.name;
65058 var description = source.description;
65059 var best = !!source.best;
65060 var template = source.template;
65062 source.tileSize = data.tileSize || 256;
65063 source.zoomExtent = data.zoomExtent || [0, 22];
65064 source.overzoom = data.overzoom !== false;
65066 source.offset = function(_) {
65067 if (!arguments.length) return offset;
65073 source.nudge = function(_, zoomlevel) {
65074 offset[0] += _[0] / Math.pow(2, zoomlevel);
65075 offset[1] += _[1] / Math.pow(2, zoomlevel);
65080 source.name = function() {
65081 var id_safe = source.id.replace('.', '<TX_DOT>');
65082 return t('imagery.' + id_safe + '.name', { default: name });
65086 source.description = function() {
65087 var id_safe = source.id.replace('.', '<TX_DOT>');
65088 return t('imagery.' + id_safe + '.description', { default: description });
65092 source.best = function() {
65097 source.area = function() {
65098 if (!data.polygon) return Number.MAX_VALUE; // worldwide
65099 var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
65100 return isNaN(area) ? 0 : area;
65104 source.imageryUsed = function() {
65105 return name || source.id;
65109 source.template = function(_) {
65110 if (!arguments.length) return template;
65111 if (source.id === 'custom') template = _;
65116 source.url = function(coord) {
65117 if (this.type === 'wms') {
65118 var tileToProjectedCoords = (function(x, y, z) {
65119 //polyfill for IE11, PhantomJS
65120 var sinh = Math.sinh || function(x) {
65121 var y = Math.exp(x);
65122 return (y - 1 / y) / 2;
65125 var zoomSize = Math.pow(2, z);
65126 var lon = x / zoomSize * Math.PI * 2 - Math.PI;
65127 var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
65129 switch (this.projection) {
65132 x: lon * 180 / Math.PI,
65133 y: lat * 180 / Math.PI
65135 default: // EPSG:3857 and synonyms
65136 var mercCoords = mercatorRaw(lon, lat);
65138 x: 20037508.34 / Math.PI * mercCoords[0],
65139 y: 20037508.34 / Math.PI * mercCoords[1]
65144 var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
65145 var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
65147 .replace('{width}', this.tileSize)
65148 .replace('{height}', this.tileSize)
65149 .replace('{proj}', this.projection)
65150 .replace('{bbox}', minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y);
65153 .replace('{x}', coord[0])
65154 .replace('{y}', coord[1])
65155 // TMS-flipped y coordinate
65156 .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
65157 .replace(/\{z(oom)?\}/, coord[2])
65158 .replace(/\{switch:([^}]+)\}/, function(s, r) {
65159 var subdomains = r.split(',');
65160 return subdomains[(coord[0] + coord[1]) % subdomains.length];
65162 .replace('{u}', function() {
65164 for (var zoom = coord[2]; zoom > 0; zoom--) {
65166 var mask = 1 << (zoom - 1);
65167 if ((coord[0] & mask) !== 0) b++;
65168 if ((coord[1] & mask) !== 0) b += 2;
65176 source.validZoom = function(z) {
65177 return source.zoomExtent[0] <= z &&
65178 (source.overzoom || source.zoomExtent[1] > z);
65182 source.isLocatorOverlay = function() {
65183 return source.id === 'mapbox_locator_overlay';
65187 /* hides a source from the list, but leaves it available for use */
65188 source.isHidden = function() {
65189 return source.id === 'DigitalGlobe-Premium-vintage' ||
65190 source.id === 'DigitalGlobe-Standard-vintage';
65194 source.copyrightNotices = function() {};
65197 source.getMetadata = function(center, tileCoord, callback) {
65199 start: localeDateString(source.startDate),
65200 end: localeDateString(source.endDate)
65202 vintage.range = vintageRange(vintage);
65204 var metadata = { vintage: vintage };
65205 callback(null, metadata);
65213 rendererBackgroundSource.Bing = function(data, dispatch) {
65214 // http://msdn.microsoft.com/en-us/library/ff701716.aspx
65215 // http://msdn.microsoft.com/en-us/library/ff701701.aspx
65217 data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
65219 var bing = rendererBackgroundSource(data);
65220 var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // Same as P2 and JOSM
65221 var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
65225 var providers = [];
65227 d3_json(url, function(err, json$$1) {
65228 providers = json$$1.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
65230 attribution: provider.attribution,
65231 areas: provider.coverageAreas.map(function(area) {
65233 zoom: [area.zoomMin, area.zoomMax],
65234 extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
65239 dispatch.call('change');
65243 bing.copyrightNotices = function(zoom, extent) {
65244 zoom = Math.min(zoom, 21);
65245 return providers.filter(function(provider) {
65246 return some(provider.areas, function(area) {
65247 return extent.intersects(area.extent) &&
65248 area.zoom[0] <= zoom &&
65249 area.zoom[1] >= zoom;
65251 }).map(function(provider) {
65252 return provider.attribution;
65257 bing.getMetadata = function(center, tileCoord, callback) {
65258 var tileId = tileCoord.slice(0, 3).join('/');
65259 var zoom = Math.min(tileCoord[2], 21);
65260 var centerPoint = center[1] + ',' + center[0]; // lat,lng
65261 var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
65262 '?zl=' + zoom + '&key=' + key;
65264 if (inflight[tileId]) return;
65266 if (!cache[tileId]) {
65267 cache[tileId] = {};
65269 if (cache[tileId] && cache[tileId].metadata) {
65270 return callback(null, cache[tileId].metadata);
65273 inflight[tileId] = true;
65274 d3_json(url, function(error, result) {
65275 delete inflight[tileId];
65280 } else if (!result && 'Unknown Error') {
65281 err = result.errorDetails;
65284 return callback(err);
65287 start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
65288 end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
65290 vintage.range = vintageRange(vintage);
65292 var metadata = { vintage: vintage };
65293 cache[tileId].metadata = metadata;
65294 return callback(null, metadata);
65300 bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
65308 rendererBackgroundSource.Esri = function(data) {
65309 // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
65310 if (data.template.match(/blankTile/) === null) {
65311 data.template = data.template + '?blankTile=false';
65314 var esri = rendererBackgroundSource(data);
65319 // use a tilemap service to set maximum zoom for esri tiles dynamically
65320 // https://developers.arcgis.com/documentation/tiled-elevation-service/
65321 esri.fetchTilemap = function(center) {
65322 // skip if we have already fetched a tilemap within 5km
65323 if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
65324 _prevCenter = center;
65326 // tiles are available globally to zoom level 19, afterward they may or may not be present
65329 // first generate a random url using the template
65330 var dummyUrl = esri.url([1,2,3]);
65332 // calculate url z/y/x from the lat/long of the center of the map
65333 var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
65334 var y = (Math.floor((1 - Math.log(Math.tan(center[1] * Math.PI / 180) + 1 / Math.cos(center[1] * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, z)));
65336 // fetch an 8x8 grid to leverage cache
65337 var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
65339 // make the request and introspect the response from the tilemap server
65340 d3_json(tilemapUrl, function (err, tilemap) {
65341 if (err || !tilemap) return;
65343 var hasTiles = true;
65344 for (var i = 0; i < tilemap.data.length; i++) {
65345 // 0 means an individual tile in the grid doesn't exist
65346 if (!tilemap.data[i]) {
65352 // if any tiles are missing at level 20 we restrict maxZoom to 19
65353 esri.zoomExtent[1] = (hasTiles ? 22 : 19);
65357 esri.getMetadata = function(center, tileCoord, callback) {
65358 var tileId = tileCoord.slice(0, 3).join('/');
65359 var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
65360 var centerPoint = center[0] + ',' + center[1]; // long, lat (as it should be)
65361 var unknown = t('info_panels.background.unknown');
65366 if (inflight[tileId]) return;
65369 case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
65382 metadataLayer = 99;
65386 // build up query using the layer appropriate to the current zoom
65387 if (esri.id === 'EsriWorldImagery') {
65388 url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
65389 } else if (esri.id === 'EsriWorldImageryClarity') {
65390 url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
65393 url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
65395 if (!cache[tileId]) {
65396 cache[tileId] = {};
65398 if (cache[tileId] && cache[tileId].metadata) {
65399 return callback(null, cache[tileId].metadata);
65402 // accurate metadata is only available >= 13
65403 if (metadataLayer === 99) {
65412 description: unknown,
65413 resolution: unknown,
65417 callback(null, metadata);
65420 inflight[tileId] = true;
65421 d3_json(url, function(error, result) {
65422 delete inflight[tileId];
65427 } else if (!result) {
65428 err = 'Unknown Error';
65429 } else if (result.features && result.features.length < 1) {
65430 err = 'No Results';
65431 } else if (result.error && result.error.message) {
65432 err = result.error.message;
65436 return callback(err);
65438 // pass through the discrete capture date from metadata
65439 var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
65441 start: captureDate,
65447 source: clean(result.features[0].attributes.NICE_NAME),
65448 description: clean(result.features[0].attributes.NICE_DESC),
65449 resolution: clean(result.features[0].attributes.SRC_RES),
65450 accuracy: clean(result.features[0].attributes.SRC_ACC)
65453 // append units - meters
65454 if (isFinite(metadata.resolution)) {
65455 metadata.resolution += ' m';
65457 if (isFinite(metadata.accuracy)) {
65458 metadata.accuracy += ' m';
65461 cache[tileId].metadata = metadata;
65462 return callback(null, metadata);
65468 function clean(val) {
65469 return String(val).trim() || unknown;
65477 rendererBackgroundSource.None = function() {
65478 var source = rendererBackgroundSource({ id: 'none', template: '' });
65481 source.name = function() {
65482 return t('background.none');
65486 source.imageryUsed = function() {
65491 source.area = function() {
65492 return -1; // sources in background pane are sorted by area
65500 rendererBackgroundSource.Custom = function(template) {
65501 var source = rendererBackgroundSource({ id: 'custom', template: template });
65504 source.name = function() {
65505 return t('background.custom');
65509 source.imageryUsed = function() {
65510 return 'Custom (' + source.template() + ')';
65514 source.area = function() {
65515 return -2; // sources in background pane are sorted by area
65522 function rendererTileLayer(context) {
65523 var transformProp = utilPrefixCSSProperty('Transform');
65524 var tiler = utilTiler();
65526 var _tileSize = 256;
65534 function tileSizeAtZoom(d, z) {
65535 var EPSILON = 0.002; // close seams
65536 return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
65540 function atZoom(t$$1, distance) {
65541 var power = Math.pow(2, distance);
65543 Math.floor(t$$1[0] * power),
65544 Math.floor(t$$1[1] * power),
65550 function lookUp(d) {
65551 for (var up = -1; up > -d[2]; up--) {
65552 var tile = atZoom(d, up);
65553 if (_cache[_source.url(tile)] !== false) {
65560 function uniqueBy(a, n) {
65563 for (var i = 0; i < a.length; i++) {
65564 if (seen[a[i][n]] === undefined) {
65566 seen[a[i][n]] = true;
65573 function addSource(d) {
65574 d.push(_source.url(d));
65579 // Update tiles based on current state of `projection`.
65580 function background(selection$$1) {
65581 _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
65586 _source.offset()[0] * Math.pow(2, _zoom),
65587 _source.offset()[1] * Math.pow(2, _zoom)
65590 pixelOffset = [0, 0];
65594 _projection.translate()[0] + pixelOffset[0],
65595 _projection.translate()[1] + pixelOffset[1]
65599 .scale(_projection.scale() * 2 * Math.PI)
65600 .translate(translate);
65603 _projection.scale() * Math.PI - translate[0],
65604 _projection.scale() * Math.PI - translate[1]
65607 render(selection$$1);
65611 // Derive the tiles onscreen, remove those offscreen and position them.
65612 // Important that this part not depend on `_projection` because it's
65613 // rentered when tiles load/error (see #644).
65614 function render(selection$$1) {
65615 if (!_source) return;
65617 var showDebug = context.getDebug('tile') && !_source.overlay;
65619 if (_source.validZoom(_zoom)) {
65620 tiler.skipNullIsland(!!_source.overlay);
65622 tiler().forEach(function(d) {
65624 if (d[3] === '') return;
65625 if (typeof d[3] !== 'string') return; // Workaround for #2295
65627 if (_cache[d[3]] === false && lookUp(d)) {
65628 requests.push(addSource(lookUp(d)));
65632 requests = uniqueBy(requests, 3).filter(function(r) {
65633 // don't re-request tiles which have failed in the past
65634 return _cache[r[3]] !== false;
65639 _cache[d[3]] = true;
65643 .classed('tile-loaded', true);
65644 render(selection$$1);
65647 function error(d) {
65648 _cache[d[3]] = false;
65653 render(selection$$1);
65656 function imageTransform(d) {
65657 var ts = _tileSize * Math.pow(2, _zoom - d[2]);
65658 var scale = tileSizeAtZoom(d, _zoom);
65659 return 'translate(' +
65660 ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
65661 ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
65662 'scale(' + scale + ',' + scale + ')';
65665 function tileCenter(d) {
65666 var ts = _tileSize * Math.pow(2, _zoom - d[2]);
65668 ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
65669 ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
65673 function debugTransform(d) {
65674 var coord = tileCenter(d);
65675 return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
65679 // Pick a representative tile near the center of the viewport
65680 // (This is useful for sampling the imagery vintage)
65681 var dims = tiler.size();
65682 var mapCenter = [dims[0] / 2, dims[1] / 2];
65683 var minDist = Math.max(dims[0], dims[1]);
65686 requests.forEach(function(d) {
65687 var c = tileCenter(d);
65688 var dist = geoVecLength(c, mapCenter);
65689 if (dist < minDist) {
65696 var image = selection$$1.selectAll('img')
65697 .data(requests, function(d) { return d[3]; });
65700 .style(transformProp, imageTransform)
65701 .classed('tile-removing', true)
65702 .classed('tile-center', false)
65704 var tile = select(this);
65705 window.setTimeout(function() {
65706 if (tile.classed('tile-removing')) {
65714 .attr('class', 'tile')
65715 .attr('src', function(d) { return d[3]; })
65716 .on('error', error)
65719 .style(transformProp, imageTransform)
65720 .classed('tile-debug', showDebug)
65721 .classed('tile-removing', false)
65722 .classed('tile-center', function(d) { return d === nearCenter; });
65726 var debug = selection$$1.selectAll('.tile-label-debug')
65727 .data(showDebug ? requests : [], function(d) { return d[3]; });
65733 var debugEnter = debug.enter()
65735 .attr('class', 'tile-label-debug');
65739 .attr('class', 'tile-label-debug-coord');
65743 .attr('class', 'tile-label-debug-vintage');
65745 debug = debug.merge(debugEnter);
65748 .style(transformProp, debugTransform);
65751 .selectAll('.tile-label-debug-coord')
65752 .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
65755 .selectAll('.tile-label-debug-vintage')
65756 .each(function(d) {
65757 var span = select(this);
65758 var center = context.projection.invert(tileCenter(d));
65759 _source.getMetadata(center, d, function(err, result) {
65760 span.text((result && result.vintage && result.vintage.range) ||
65761 t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
65770 background.projection = function(_) {
65771 if (!arguments.length) return _projection;
65777 background.dimensions = function(_) {
65778 if (!arguments.length) return tiler.size();
65784 background.source = function(_) {
65785 if (!arguments.length) return _source;
65787 _tileSize = _source.tileSize;
65789 tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
65797 function rendererBackground(context) {
65798 var dispatch$$1 = dispatch('change');
65799 var detected = utilDetect();
65800 var baseLayer = rendererTileLayer(context).projection(context.projection);
65801 var _overlayLayers = [];
65802 var _backgroundSources = [];
65803 var _brightness = 1;
65805 var _saturation = 1;
65806 var _sharpness = 1;
65809 function background(selection$$1) {
65810 // If we are displaying an Esri basemap at high zoom,
65811 // check its tilemap to see how high the zoom can go
65812 if (context.map().zoom() > 18) {
65813 var basemap = baseLayer.source();
65814 if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
65815 var center = context.map().center();
65816 basemap.fetchTilemap(center);
65820 var baseFilter = '';
65821 if (detected.cssfilters) {
65822 if (_brightness !== 1) {
65823 baseFilter += 'brightness(' + _brightness + ')';
65825 if (_contrast !== 1) {
65826 baseFilter += 'contrast(' + _contrast + ')';
65828 if (_saturation !== 1) {
65829 baseFilter += 'saturate(' + _saturation + ')';
65831 if (_sharpness < 1) { // gaussian blur
65832 var blur = interpolateNumber(0.5, 5)(1 - _sharpness);
65833 baseFilter += 'blur(' + blur + 'px)';
65837 var base = selection$$1.selectAll('.layer-background')
65840 base = base.enter()
65841 .insert('div', '.layer-data')
65842 .attr('class', 'layer layer-background')
65845 if (detected.cssfilters) {
65846 base.style('filter', baseFilter || null);
65848 base.style('opacity', _brightness);
65852 var imagery = base.selectAll('.layer-imagery')
65857 .attr('class', 'layer layer-imagery')
65862 var maskFilter = '';
65863 var mixBlendMode = '';
65864 if (detected.cssfilters && _sharpness > 1) { // apply unsharp mask
65865 mixBlendMode = 'overlay';
65866 maskFilter = 'saturate(0) blur(3px) invert(1)';
65868 var contrast = _sharpness - 1;
65869 maskFilter += ' contrast(' + contrast + ')';
65871 var brightness = interpolateNumber(1, 0.85)(_sharpness - 1);
65872 maskFilter += ' brightness(' + brightness + ')';
65875 var mask = base.selectAll('.layer-unsharp-mask')
65876 .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
65883 .attr('class', 'layer layer-mask layer-unsharp-mask')
65886 .style('filter', maskFilter || null)
65887 .style('mix-blend-mode', mixBlendMode || null);
65890 var overlays = selection$$1.selectAll('.layer-overlay')
65891 .data(_overlayLayers, function(d) { return d.source().name(); });
65897 .insert('div', '.layer-data')
65898 .attr('class', 'layer layer-overlay')
65900 .each(function(layer) { select(this).call(layer); });
65904 background.updateImagery = function() {
65905 if (context.inIntro()) return;
65907 var b = background.baseLayerSource();
65908 var o = _overlayLayers
65909 .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
65910 .map(function (d) { return d.source().id; })
65913 var meters = geoOffsetToMeters(b.offset());
65914 var epsilon = 0.01;
65915 var x = +meters[0].toFixed(2);
65916 var y = +meters[1].toFixed(2);
65917 var q = utilStringQs(window.location.hash.substring(1));
65920 if (id === 'custom') {
65921 id = 'custom:' + b.template();
65927 delete q.background;
65936 if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
65937 q.offset = x + ',' + y;
65942 if (!window.mocha) {
65943 window.location.replace('#' + utilQsString(q, true));
65946 var imageryUsed = [b.imageryUsed()];
65949 .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
65950 .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
65952 var data$$1 = context.layers().layer('data');
65953 if (data$$1 && data$$1.enabled() && data$$1.hasData()) {
65954 imageryUsed.push(data$$1.getSrc());
65957 var streetside = context.layers().layer('streetside');
65958 if (streetside && streetside.enabled()) {
65959 imageryUsed.push('Bing Streetside');
65962 var mapillary_images = context.layers().layer('mapillary-images');
65963 if (mapillary_images && mapillary_images.enabled()) {
65964 imageryUsed.push('Mapillary Images');
65967 var mapillary_signs = context.layers().layer('mapillary-signs');
65968 if (mapillary_signs && mapillary_signs.enabled()) {
65969 imageryUsed.push('Mapillary Signs');
65972 var openstreetcam_images = context.layers().layer('openstreetcam-images');
65973 if (openstreetcam_images && openstreetcam_images.enabled()) {
65974 imageryUsed.push('OpenStreetCam Images');
65977 context.history().imageryUsed(imageryUsed);
65981 background.sources = function(extent) {
65982 if (!data.imagery || !data.imagery.query) return []; // called before init()?
65985 var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
65986 matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
65988 return _backgroundSources.filter(function(source) {
65989 return matchIDs[source.id] || !source.polygon; // no polygon = worldwide
65994 background.dimensions = function(d) {
65996 baseLayer.dimensions(d);
65998 _overlayLayers.forEach(function(layer) {
65999 layer.dimensions(d);
66004 background.baseLayerSource = function(d) {
66005 if (!arguments.length) return baseLayer.source();
66007 // test source against OSM imagery blacklists..
66008 var osm = context.connection();
66009 if (!osm) return background;
66011 var blacklists = context.connection().imageryBlacklists();
66012 var template = d.template();
66017 for (var i = 0; i < blacklists.length; i++) {
66019 regex = new RegExp(blacklists[i]);
66020 fail = regex.test(template);
66028 // ensure at least one test was run.
66030 regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
66031 fail = regex.test(template);
66034 baseLayer.source(!fail ? d : background.findSource('none'));
66035 dispatch$$1.call('change');
66036 background.updateImagery();
66041 background.findSource = function(id) {
66042 return find$1(_backgroundSources, function(d) {
66043 return d.id && d.id === id;
66048 background.bing = function() {
66049 background.baseLayerSource(background.findSource('Bing'));
66053 background.showsLayer = function(d) {
66054 return d.id === baseLayer.source().id ||
66055 _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
66059 background.overlayLayerSources = function() {
66060 return _overlayLayers.map(function (l) { return l.source(); });
66064 background.toggleOverlayLayer = function(d) {
66066 for (var i = 0; i < _overlayLayers.length; i++) {
66067 layer = _overlayLayers[i];
66068 if (layer.source() === d) {
66069 _overlayLayers.splice(i, 1);
66070 dispatch$$1.call('change');
66071 background.updateImagery();
66076 layer = rendererTileLayer(context)
66078 .projection(context.projection)
66079 .dimensions(baseLayer.dimensions()
66082 _overlayLayers.push(layer);
66083 dispatch$$1.call('change');
66084 background.updateImagery();
66088 background.nudge = function(d, zoom) {
66089 baseLayer.source().nudge(d, zoom);
66090 dispatch$$1.call('change');
66091 background.updateImagery();
66096 background.offset = function(d) {
66097 if (!arguments.length) return baseLayer.source().offset();
66098 baseLayer.source().offset(d);
66099 dispatch$$1.call('change');
66100 background.updateImagery();
66105 background.brightness = function(d) {
66106 if (!arguments.length) return _brightness;
66108 if (context.mode()) dispatch$$1.call('change');
66113 background.contrast = function(d) {
66114 if (!arguments.length) return _contrast;
66116 if (context.mode()) dispatch$$1.call('change');
66121 background.saturation = function(d) {
66122 if (!arguments.length) return _saturation;
66124 if (context.mode()) dispatch$$1.call('change');
66129 background.sharpness = function(d) {
66130 if (!arguments.length) return _sharpness;
66132 if (context.mode()) dispatch$$1.call('change');
66137 background.init = function() {
66138 function parseMap(qmap) {
66139 if (!qmap) return false;
66140 var args = qmap.split('/').map(Number);
66141 if (args.length < 3 || args.some(isNaN)) return false;
66142 return geoExtent$$1([args[2], args[1]]);
66145 var q = utilStringQs(window.location.hash.substring(1));
66146 var requested = q.background || q.layer;
66147 var extent = parseMap(q.map);
66152 data.imagery = data.imagery || [];
66153 data.imagery.features = {};
66155 // build efficient index and querying for data.imagery
66156 var features = data.imagery.map(function(source) {
66157 if (!source.polygon) return null;
66160 properties: { id: source.id },
66161 geometry: { type: 'MultiPolygon', coordinates: [ source.polygon ] }
66164 data.imagery.features[source.id] = feature;
66166 }).filter(Boolean);
66168 data.imagery.query = whichPolygon_1({
66169 type: 'FeatureCollection',
66174 // Add all the available imagery sources
66175 _backgroundSources = data.imagery.map(function(source) {
66176 if (source.type === 'bing') {
66177 return rendererBackgroundSource.Bing(source, dispatch$$1);
66178 } else if (/^EsriWorldImagery/.test(source.id)) {
66179 return rendererBackgroundSource.Esri(source);
66181 return rendererBackgroundSource(source);
66185 first = _backgroundSources.length && _backgroundSources[0];
66188 _backgroundSources.unshift(rendererBackgroundSource.None());
66191 var template = context.storage('background-custom-template') || '';
66192 var custom = rendererBackgroundSource.Custom(template);
66193 _backgroundSources.unshift(custom);
66196 // Decide which background layer to display
66197 if (!requested && extent) {
66198 best = find$1(this.sources(extent), function(s) { return s.best(); });
66200 if (requested && requested.indexOf('custom:') === 0) {
66201 template = requested.replace(/^custom:/, '');
66202 background.baseLayerSource(custom.template(template));
66203 context.storage('background-custom-template', template);
66205 background.baseLayerSource(
66206 background.findSource(requested) ||
66208 background.findSource(context.storage('background-last-used')) ||
66209 background.findSource('Bing') ||
66211 background.findSource('none')
66215 var locator = find$1(_backgroundSources, function(d) {
66216 return d.overlay && d.default;
66220 background.toggleOverlayLayer(locator);
66223 var overlays = (q.overlays || '').split(',');
66224 overlays.forEach(function(overlay) {
66225 overlay = background.findSource(overlay);
66227 background.toggleOverlayLayer(overlay);
66232 var gpx = context.layers().layer('data');
66234 gpx.url(q.gpx, '.gpx');
66239 var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
66240 return !isNaN(n) && n;
66243 if (offset.length === 2) {
66244 background.offset(geoMetersToOffset(offset));
66250 return utilRebind(background, dispatch$$1, 'on');
66253 function rendererFeatures(context) {
66254 var traffic_roads = {
66256 'motorway_link': true,
66258 'trunk_link': true,
66260 'primary_link': true,
66262 'secondary_link': true,
66264 'tertiary_link': true,
66265 'residential': true,
66266 'unclassified': true,
66267 'living_street': true
66270 var service_roads = {
66282 'pedestrian': true,
66286 var past_futures = {
66288 'construction': true,
66290 'dismantled': true,
66293 'demolished': true,
66294 'obliterated': true
66297 var dispatch$$1 = dispatch('change', 'redraw'),
66306 function update() {
66307 if (!window.mocha) {
66308 var q = utilStringQs(window.location.hash.substring(1));
66309 var disabled = features.disabled();
66310 if (disabled.length) {
66311 q.disable_features = disabled.join(',');
66313 delete q.disable_features;
66315 window.location.replace('#' + utilQsString(q, true));
66316 context.storage('disabled-features', disabled.join(','));
66318 _hidden = features.hidden();
66319 dispatch$$1.call('change');
66320 dispatch$$1.call('redraw');
66324 function defineFeature(k, filter, max) {
66325 var isEnabled = true;
66330 enabled: isEnabled, // whether the user wants it enabled..
66332 currentMax: (max || Infinity),
66333 defaultMax: (max || Infinity),
66334 enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
66335 disable: function() { this.enabled = false; this.currentMax = 0; },
66336 hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
66337 autoHidden: function() { return this.hidden() && this.currentMax > 0; }
66342 defineFeature('points', function isPoint(entity, resolver, geometry) {
66343 return geometry === 'point';
66346 defineFeature('traffic_roads', function isTrafficRoad(entity) {
66347 return traffic_roads[entity.tags.highway];
66350 defineFeature('service_roads', function isServiceRoad(entity) {
66351 return service_roads[entity.tags.highway];
66354 defineFeature('paths', function isPath(entity) {
66355 return paths[entity.tags.highway];
66358 defineFeature('buildings', function isBuilding(entity) {
66360 !!entity.tags['building:part'] ||
66361 (!!entity.tags.building && entity.tags.building !== 'no') ||
66362 entity.tags.parking === 'multi-storey' ||
66363 entity.tags.parking === 'sheds' ||
66364 entity.tags.parking === 'carports' ||
66365 entity.tags.parking === 'garage_boxes'
66369 defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
66370 return geometry === 'area' &&
66371 !_features.buildings.filter(entity) &&
66372 !_features.water.filter(entity);
66375 defineFeature('boundaries', function isBoundary(entity) {
66377 !!entity.tags.boundary
66379 traffic_roads[entity.tags.highway] ||
66380 service_roads[entity.tags.highway] ||
66381 paths[entity.tags.highway]
66385 defineFeature('water', function isWater(entity) {
66387 !!entity.tags.waterway ||
66388 entity.tags.natural === 'water' ||
66389 entity.tags.natural === 'coastline' ||
66390 entity.tags.natural === 'bay' ||
66391 entity.tags.landuse === 'pond' ||
66392 entity.tags.landuse === 'basin' ||
66393 entity.tags.landuse === 'reservoir' ||
66394 entity.tags.landuse === 'salt_pond'
66398 defineFeature('rail', function isRail(entity) {
66400 !!entity.tags.railway ||
66401 entity.tags.landuse === 'railway'
66403 traffic_roads[entity.tags.highway] ||
66404 service_roads[entity.tags.highway] ||
66405 paths[entity.tags.highway]
66409 defineFeature('power', function isPower(entity) {
66410 return !!entity.tags.power;
66413 // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
66414 defineFeature('past_future', function isPastFuture(entity) {
66416 traffic_roads[entity.tags.highway] ||
66417 service_roads[entity.tags.highway] ||
66418 paths[entity.tags.highway]
66419 ) { return false; }
66421 var strings = Object.keys(entity.tags);
66423 for (var i = 0; i < strings.length; i++) {
66424 var s = strings[i];
66425 if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
66430 // Lines or areas that don't match another feature filter.
66431 // IMPORTANT: The 'others' feature must be the last one defined,
66432 // so that code in getMatches can skip this test if `hasMatch = true`
66433 defineFeature('others', function isOther(entity, resolver, geometry) {
66434 return (geometry === 'line' || geometry === 'area');
66438 function features() {}
66441 features.features = function() {
66446 features.keys = function() {
66451 features.enabled = function(k) {
66452 if (!arguments.length) {
66453 return _keys.filter(function(k) { return _features[k].enabled; });
66455 return _features[k] && _features[k].enabled;
66459 features.disabled = function(k) {
66460 if (!arguments.length) {
66461 return _keys.filter(function(k) { return !_features[k].enabled; });
66463 return _features[k] && !_features[k].enabled;
66467 features.hidden = function(k) {
66468 if (!arguments.length) {
66469 return _keys.filter(function(k) { return _features[k].hidden(); });
66471 return _features[k] && _features[k].hidden();
66475 features.autoHidden = function(k) {
66476 if (!arguments.length) {
66477 return _keys.filter(function(k) { return _features[k].autoHidden(); });
66479 return _features[k] && _features[k].autoHidden();
66483 features.enable = function(k) {
66484 if (_features[k] && !_features[k].enabled) {
66485 _features[k].enable();
66491 features.disable = function(k) {
66492 if (_features[k] && _features[k].enabled) {
66493 _features[k].disable();
66499 features.toggle = function(k) {
66500 if (_features[k]) {
66501 (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
66507 features.resetStats = function() {
66508 for (var i = 0; i < _keys.length; i++) {
66509 _features[_keys[i]].count = 0;
66511 dispatch$$1.call('change');
66515 features.gatherStats = function(d, resolver, dimensions) {
66516 var needsRedraw = false,
66517 type = groupBy(d, function(ent) { return ent.type; }),
66518 entities = [].concat(type.relation || [], type.way || [], type.node || []),
66519 currHidden, geometry, matches, i, j;
66521 for (i = 0; i < _keys.length; i++) {
66522 _features[_keys[i]].count = 0;
66525 // adjust the threshold for point/building culling based on viewport size..
66526 // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
66527 _cullFactor = dimensions[0] * dimensions[1] / 1000000;
66529 for (i = 0; i < entities.length; i++) {
66530 geometry = entities[i].geometry(resolver);
66531 if (!(geometry === 'vertex' || geometry === 'relation')) {
66532 matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
66533 for (j = 0; j < matches.length; j++) {
66534 _features[matches[j]].count++;
66539 currHidden = features.hidden();
66540 if (currHidden !== _hidden) {
66541 _hidden = currHidden;
66542 needsRedraw = true;
66543 dispatch$$1.call('change');
66546 return needsRedraw;
66550 features.stats = function() {
66551 for (var i = 0; i < _keys.length; i++) {
66552 _stats[_keys[i]] = _features[_keys[i]].count;
66559 features.clear = function(d) {
66560 for (var i = 0; i < d.length; i++) {
66561 features.clearEntity(d[i]);
66566 features.clearEntity = function(entity) {
66567 delete _cache[osmEntity$$1.key(entity)];
66571 features.reset = function() {
66576 features.getMatches = function(entity, resolver, geometry) {
66577 if (geometry === 'vertex' || geometry === 'relation') return {};
66579 var ent = osmEntity$$1.key(entity);
66580 if (!_cache[ent]) {
66584 if (!_cache[ent].matches) {
66588 for (var i = 0; i < _keys.length; i++) {
66589 if (_keys[i] === 'others') {
66590 if (hasMatch) continue;
66592 // Multipolygon members:
66594 // 1. is a way that hasn't matched other 'interesting' feature rules,
66595 // 2. and it belongs to a single parent multipolygon relation
66596 // ...then match whatever feature rules the parent multipolygon has matched.
66597 // see #2548, #2887
66600 // For this to work, getMatches must be called on relations before ways.
66602 if (entity.type === 'way') {
66603 var parents = features.getParents(entity, resolver, geometry);
66604 if (parents.length === 1 && parents[0].isMultipolygon()) {
66605 var pkey = osmEntity$$1.key(parents[0]);
66606 if (_cache[pkey] && _cache[pkey].matches) {
66607 matches = clone(_cache[pkey].matches);
66614 if (_features[_keys[i]].filter(entity, resolver, geometry)) {
66615 matches[_keys[i]] = hasMatch = true;
66618 _cache[ent].matches = matches;
66621 return _cache[ent].matches;
66625 features.getParents = function(entity, resolver, geometry) {
66626 if (geometry === 'point') return [];
66628 var ent = osmEntity$$1.key(entity);
66629 if (!_cache[ent]) {
66633 if (!_cache[ent].parents) {
66635 if (geometry === 'vertex') {
66636 parents = resolver.parentWays(entity);
66637 } else { // 'line', 'area', 'relation'
66638 parents = resolver.parentRelations(entity);
66640 _cache[ent].parents = parents;
66642 return _cache[ent].parents;
66646 features.isHiddenFeature = function(entity, resolver, geometry) {
66647 if (!_hidden.length) return false;
66648 if (!entity.version) return false;
66650 var matches = features.getMatches(entity, resolver, geometry);
66652 for (var i = 0; i < _hidden.length; i++) {
66653 if (matches[_hidden[i]]) return true;
66659 features.isHiddenChild = function(entity, resolver, geometry) {
66660 if (!_hidden.length) return false;
66661 if (!entity.version || geometry === 'point') return false;
66663 var parents = features.getParents(entity, resolver, geometry);
66664 if (!parents.length) return false;
66666 for (var i = 0; i < parents.length; i++) {
66667 if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
66675 features.hasHiddenConnections = function(entity, resolver) {
66676 if (!_hidden.length) return false;
66677 var childNodes, connections;
66679 if (entity.type === 'midpoint') {
66680 childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
66683 childNodes = entity.nodes ? resolver.childNodes(entity) : [];
66684 connections = features.getParents(entity, resolver, entity.geometry(resolver));
66687 // gather ways connected to child nodes..
66688 connections = reduce(childNodes, function(result, e) {
66689 return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
66692 return connections.length ? some(connections, function(e) {
66693 return features.isHidden(e, resolver, e.geometry(resolver));
66698 features.isHidden = function(entity, resolver, geometry) {
66699 if (!_hidden.length) return false;
66700 if (!entity.version) return false;
66702 var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
66703 return fn(entity, resolver, geometry);
66707 features.filter = function(d, resolver) {
66708 if (!_hidden.length) return d;
66711 for (var i = 0; i < d.length; i++) {
66713 if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
66714 result.push(entity);
66721 features.init = function() {
66722 var storage = context.storage('disabled-features');
66724 var storageDisabled = storage.replace(/;/g, ',').split(',');
66725 storageDisabled.forEach(features.disable);
66728 var q = utilStringQs(window.location.hash.substring(1));
66729 if (q.disable_features) {
66730 var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
66731 hashDisabled.forEach(features.disable);
66735 return utilRebind(features, dispatch$$1, 'on');
66738 function utilBindOnce(target, type, listener, capture) {
66739 var typeOnce = type + '.once';
66741 target.on(typeOnce, null);
66742 listener.apply(this, arguments);
66744 target.on(typeOnce, one, capture);
66749 var TAU$1 = 2 * Math.PI;
66750 var TILESIZE = 256;
66751 var kMin = geoZoomToScale(2, TILESIZE);
66752 var kMax = geoZoomToScale(24, TILESIZE);
66755 function rendererMap(context) {
66756 var dispatch$$1 = dispatch('move', 'drawn');
66757 var projection = context.projection;
66758 var curtainProjection = context.curtainProjection;
66759 var drawLayers = svgLayers(projection, context);
66760 var drawPoints = svgPoints$$1(projection, context);
66761 var drawVertices = svgVertices$$1(projection, context);
66762 var drawLines = svgLines$$1(projection, context);
66763 var drawAreas = svgAreas$$1(projection, context);
66764 var drawMidpoints = svgMidpoints$$1(projection, context);
66765 var drawLabels = svgLabels(projection, context);
66767 var _selection = select(null);
66768 var supersurface = select(null);
66769 var wrapper = select(null);
66770 var surface = select(null);
66772 var dimensions = [1, 1];
66773 var _dblClickEnabled = true;
66774 var _redrawEnabled = true;
66775 var _transformStart = projection.transform();
66776 var _transformLast;
66777 var _transformed = false;
66782 var zoom$$1 = d3_zoom()
66783 .scaleExtent([kMin, kMax])
66784 .interpolate(interpolate)
66785 .filter(zoomEventFilter)
66786 .on('zoom', zoomPan);
66788 var scheduleRedraw = throttle(redraw, 750);
66789 // var isRedrawScheduled = false;
66790 // var pendingRedrawCall;
66791 // function scheduleRedraw() {
66792 // // Only schedule the redraw if one has not already been set.
66793 // if (isRedrawScheduled) return;
66794 // isRedrawScheduled = true;
66795 // var that = this;
66796 // var args = arguments;
66797 // pendingRedrawCall = window.requestIdleCallback(function () {
66798 // // Reset the boolean so future redraws can be set.
66799 // isRedrawScheduled = false;
66800 // redraw.apply(that, args);
66801 // }, { timeout: 1400 });
66804 function cancelPendingRedraw() {
66805 scheduleRedraw.cancel();
66806 // isRedrawScheduled = false;
66807 // window.cancelIdleCallback(pendingRedrawCall);
66811 function map(selection$$1) {
66812 _selection = selection$$1;
66815 .on('change.map', immediateRedraw);
66817 var osm = context.connection();
66819 osm.on('change.map', immediateRedraw);
66823 .on('change.map', immediateRedraw)
66824 .on('undone.map redone.map', function(stack) {
66825 var mode = context.mode().id;
66826 if (mode !== 'browse' && mode !== 'select') return;
66828 var followSelected = false;
66829 if (Array.isArray(stack.selectedIDs)) {
66830 followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
66832 modeSelect(context, stack.selectedIDs).follow(followSelected)
66835 if (!followSelected && stack.transform) {
66836 map.transformEase(stack.transform);
66840 context.background()
66841 .on('change.map', immediateRedraw);
66844 .on('redraw.map', immediateRedraw);
66847 .on('change.map', function() {
66848 context.background().updateImagery();
66853 .on('dblclick.map', dblClick)
66855 .call(zoom$$1.transform, projection.transform());
66857 supersurface = selection$$1.append('div')
66858 .attr('id', 'supersurface')
66859 .call(utilSetTransform, 0, 0);
66861 // Need a wrapper div because Opera can't cope with an absolutely positioned
66862 // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
66863 wrapper = supersurface
66865 .attr('class', 'layer layer-data');
66867 map.surface = surface = wrapper
66869 .selectAll('.surface')
66870 .attr('id', 'surface');
66873 .call(drawLabels.observe)
66874 .on('mousedown.zoom', function() {
66875 if (event.button === 2) {
66876 event.stopPropagation();
66879 .on('mouseup.zoom', function() {
66880 if (resetTransform()) immediateRedraw();
66882 .on('mousemove.map', function() {
66885 .on('mouseover.vertices', function() {
66886 if (map.editable() && !_transformed) {
66887 var hover = event.target.__data__;
66888 surface.selectAll('.data-layer-osm')
66889 .call(drawVertices.drawHover, context.graph(), hover, map.extent());
66890 dispatch$$1.call('drawn', this, { full: false });
66893 .on('mouseout.vertices', function() {
66894 if (map.editable() && !_transformed) {
66895 var hover = event.relatedTarget && event.relatedTarget.__data__;
66896 surface.selectAll('.data-layer-osm')
66897 .call(drawVertices.drawHover, context.graph(), hover, map.extent());
66898 dispatch$$1.call('drawn', this, { full: false });
66903 .call(context.background());
66905 context.on('enter.map', function() {
66906 if (map.editable() && !_transformed) {
66907 // redraw immediately any objects affected by a change in selectedIDs.
66908 var graph = context.graph();
66909 var selectedAndParents = {};
66910 context.selectedIDs().forEach(function(id) {
66911 var entity = graph.hasEntity(id);
66913 selectedAndParents[entity.id] = entity;
66914 if (entity.type === 'node') {
66915 graph.parentWays(entity).forEach(function(parent) {
66916 selectedAndParents[parent.id] = parent;
66921 var data = values$1(selectedAndParents);
66922 var filter = function(d) { return d.id in selectedAndParents; };
66924 data = context.features().filter(data, graph);
66926 surface.selectAll('.data-layer-osm')
66927 .call(drawVertices.drawSelected, graph, map.extent())
66928 .call(drawLines, graph, data, filter)
66929 .call(drawAreas, graph, data, filter)
66930 .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
66932 dispatch$$1.call('drawn', this, { full: false });
66934 // redraw everything else later
66939 map.dimensions(utilGetDimensions(selection$$1));
66943 function zoomEventFilter() {
66944 // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
66945 // Intercept `mousedown` and check if there is an orphaned zoom gesture.
66946 // This can happen if a previous `mousedown` occurred without a `mouseup`.
66947 // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
66948 // so that d3-zoom won't stop propagation of new `mousedown` events.
66949 if (event.type === 'mousedown') {
66950 var hasOrphan = false;
66951 var listeners = window.__on;
66952 for (var i = 0; i < listeners.length; i++) {
66953 var listener = listeners[i];
66954 if (listener.name === 'zoom' && listener.type === 'mouseup') {
66960 var event$$1 = window.CustomEvent;
66962 event$$1 = new event$$1('mouseup');
66964 event$$1 = window.document.createEvent('Event');
66965 event$$1.initEvent('mouseup', false, false);
66967 // Event needs to be dispatched with an event.view property.
66968 event$$1.view = window;
66969 window.dispatchEvent(event$$1);
66973 return event.button !== 2; // ignore right clicks
66977 function pxCenter() {
66978 return [dimensions[0] / 2, dimensions[1] / 2];
66982 function drawVector(difference, extent) {
66983 var mode = context.mode();
66984 var graph = context.graph();
66985 var features = context.features();
66986 var all = context.intersects(map.extent());
66987 var fullRedraw = false;
66992 var complete = difference.complete(map.extent());
66993 data = compact(values$1(complete));
66994 filter = function(d) { return d.id in complete; };
66995 features.clear(data);
66998 // force a full redraw if gatherStats detects that a feature
66999 // should be auto-hidden (e.g. points or buildings)..
67000 if (features.gatherStats(all, graph, dimensions)) {
67001 extent = undefined;
67005 data = context.intersects(map.extent().intersection(extent));
67006 var set$$1 = set$2(map$3(data, 'id'));
67007 filter = function(d) { return set$$1.has(d.id); };
67012 filter = utilFunctor(true);
67016 data = features.filter(data, graph);
67018 if (mode && mode.id === 'select') {
67019 // update selected vertices - the user might have just double-clicked a way,
67020 // creating a new vertex, triggering a partial redraw without a mode change
67021 surface.selectAll('.data-layer-osm')
67022 .call(drawVertices.drawSelected, graph, map.extent());
67025 surface.selectAll('.data-layer-osm')
67026 .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
67027 .call(drawLines, graph, data, filter)
67028 .call(drawAreas, graph, data, filter)
67029 .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
67030 .call(drawLabels, graph, data, filter, dimensions, fullRedraw)
67031 .call(drawPoints, graph, data, filter);
67033 dispatch$$1.call('drawn', this, {full: true});
67037 function editOff() {
67038 context.features().resetStats();
67039 surface.selectAll('.layer-osm *').remove();
67041 var mode = context.mode();
67042 if (mode && mode.id !== 'save' && mode.id !== 'select-note' && mode.id !== 'select-data') {
67043 context.enter(modeBrowse(context));
67046 dispatch$$1.call('drawn', this, {full: true});
67050 function dblClick() {
67051 if (!_dblClickEnabled) {
67052 event.preventDefault();
67053 event.stopImmediatePropagation();
67058 function zoomPan(manualEvent) {
67059 var event$$1 = (manualEvent || event);
67060 var source = event$$1.sourceEvent;
67061 var eventTransform = event$$1.transform;
67063 if (_transformStart.x === eventTransform.x &&
67064 _transformStart.y === eventTransform.y &&
67065 _transformStart.k === eventTransform.k) {
67066 return; // no change
67069 // Normalize mousewheel - #3029
67070 // If wheel delta is provided in LINE units, recalculate it in PIXEL units
67071 // We are essentially redoing the calculations that occur here:
67072 // https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
67073 // See this for more info:
67074 // https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
67075 if (source && source.type === 'wheel' && source.deltaMode === 1 /* LINE */) {
67076 // pick sensible scroll amount if user scrolling fast or slow..
67077 var lines = Math.abs(source.deltaY);
67078 var scroll = lines > 2 ? 40 : lines * 10;
67080 var t0 = _transformed ? _transformLast : _transformStart;
67081 var p0 = mouse$$1(source);
67082 var p1 = t0.invert(p0);
67083 var k2 = t0.k * Math.pow(2, -source.deltaY * scroll / 500);
67084 var x2 = p0[0] - p1[0] * k2;
67085 var y2 = p0[1] - p1[1] * k2;
67087 eventTransform = identity$7.translate(x2,y2).scale(k2);
67088 _selection.node().__zoom = eventTransform;
67091 if (geoScaleToZoom(eventTransform.k, TILESIZE) < minzoom) {
67092 surface.interrupt();
67093 uiFlash().text(t('cannot_zoom'))();
67094 setZoom(context.minEditableZoom(), true);
67096 dispatch$$1.call('move', this, map);
67100 projection.transform(eventTransform);
67102 var scale = eventTransform.k / _transformStart.k;
67103 var tX = (eventTransform.x / scale - _transformStart.x) * scale;
67104 var tY = (eventTransform.y / scale - _transformStart.y) * scale;
67106 if (context.inIntro()) {
67107 curtainProjection.transform({
67108 x: eventTransform.x - tX,
67109 y: eventTransform.y - tY,
67110 k: eventTransform.k
67114 if (source) mousemove = event$$1;
67115 _transformed = true;
67116 _transformLast = eventTransform;
67117 utilSetTransform(supersurface, tX, tY, scale);
67120 dispatch$$1.call('move', this, map);
67124 function resetTransform() {
67125 if (!_transformed) return false;
67127 // deprecation warning - Radial Menu to be removed in iD v3
67128 surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
67129 utilSetTransform(supersurface, 0, 0);
67130 _transformed = false;
67131 if (context.inIntro()) {
67132 curtainProjection.transform(projection.transform());
67138 function redraw(difference, extent) {
67139 if (surface.empty() || !_redrawEnabled) return;
67141 // If we are in the middle of a zoom/pan, we can't do differenced redraws.
67142 // It would result in artifacts where differenced entities are redrawn with
67143 // one transform and unchanged entities with another.
67144 if (resetTransform()) {
67145 difference = extent = undefined;
67148 var zoom$$1 = map.zoom();
67149 var z = String(~~zoom$$1);
67151 if (surface.attr('data-zoom') !== z) {
67152 surface.attr('data-zoom', z);
67155 // class surface as `lowzoom` around z17-z18.5 (based on latitude)
67156 var lat = map.center()[1];
67157 var lowzoom = linear$2()
67158 .domain([-60, 0, 60])
67159 .range([17, 18.5, 17])
67163 .classed('low-zoom', zoom$$1 <= lowzoom(lat));
67167 supersurface.call(context.background());
67174 if (map.editable()) {
67175 context.loadTiles(projection);
67176 drawVector(difference, extent);
67181 _transformStart = projection.transform();
67188 var immediateRedraw = function(difference, extent) {
67189 if (!difference && !extent) cancelPendingRedraw();
67190 redraw(difference, extent);
67194 map.mouse = function() {
67195 var event$$1 = mousemove || event;
67198 while ((s = event$$1.sourceEvent)) { event$$1 = s; }
67199 return mouse$$1(event$$1);
67206 map.mouseCoordinates = function() {
67207 var coord = map.mouse() || pxCenter();
67208 return projection.invert(coord);
67212 map.dblclickEnable = function(_) {
67213 if (!arguments.length) return _dblClickEnabled;
67214 _dblClickEnabled = _;
67219 map.redrawEnable = function(_) {
67220 if (!arguments.length) return _redrawEnabled;
67221 _redrawEnabled = _;
67226 map.isTransformed = function() {
67227 return _transformed;
67231 function setTransform(t2, duration, force) {
67232 var t$$1 = projection.transform();
67233 if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
67240 .duration(duration)
67241 .on('start', function() { map.startEase(); })
67242 .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
67244 projection.transform(t2);
67245 _transformStart = t2;
67246 _selection.call(zoom$$1.transform, _transformStart);
67251 function setZoom(z2, force, duration) {
67252 if (z2 === map.zoom() && !force) {
67256 var k = projection.scale();
67257 var k2 = Math.max(kMin, Math.min(kMax, geoZoomToScale(z2, TILESIZE)));
67258 var center = pxCenter();
67259 var l = pointLocation(center);
67261 projection.scale(k2);
67263 var t$$1 = projection.translate();
67264 l = locationPoint(l);
67266 t$$1[0] += center[0] - l[0];
67267 t$$1[1] += center[1] - l[1];
67270 projection.scale(k); // reset scale
67273 .duration(duration)
67274 .on('start', function() { map.startEase(); })
67275 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
67277 projection.translate(t$$1);
67278 _transformStart = projection.transform();
67279 _selection.call(zoom$$1.transform, _transformStart);
67285 function locationPoint(l) {
67286 var translate = projection.translate();
67287 var scale = projection.scale() * TAU$1;
67288 return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
67291 function pointLocation(p) {
67292 var translate = projection.translate();
67293 var scale = projection.scale() * TAU$1;
67294 return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
67299 function setCenter(loc2, duration) {
67300 var c = map.center();
67301 if (loc2[0] === c[0] && loc2[1] === c[1]) {
67305 var t$$1 = projection.translate();
67306 var k = projection.scale();
67307 var pxC = pxCenter();
67308 var ll = projection(loc2);
67310 t$$1[0] = t$$1[0] - ll[0] + pxC[0];
67311 t$$1[1] = t$$1[1] - ll[1] + pxC[1];
67316 .duration(duration)
67317 .on('start', function() { map.startEase(); })
67318 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
67320 projection.translate(t$$1);
67321 _transformStart = projection.transform();
67322 _selection.call(zoom$$1.transform, _transformStart);
67329 map.pan = function(delta, duration) {
67330 var t$$1 = projection.translate();
67331 var k = projection.scale();
67333 t$$1[0] += delta[0];
67334 t$$1[1] += delta[1];
67339 .duration(duration)
67340 .on('start', function() { map.startEase(); })
67341 .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
67343 projection.translate(t$$1);
67344 _transformStart = projection.transform();
67345 _selection.call(zoom$$1.transform, _transformStart);
67346 dispatch$$1.call('move', this, map);
67354 map.dimensions = function(_) {
67355 if (!arguments.length) return dimensions;
67356 var center = map.center();
67358 drawLayers.dimensions(dimensions);
67359 context.background().dimensions(dimensions);
67360 projection.clipExtent([[0, 0], dimensions]);
67361 mouse$$1 = utilFastMouse(supersurface.node());
67369 function zoomIn(delta) {
67370 setZoom(~~map.zoom() + delta, true, 250);
67373 function zoomOut(delta) {
67374 setZoom(~~map.zoom() - delta, true, 250);
67377 map.zoomIn = function() { zoomIn(1); };
67378 map.zoomInFurther = function() { zoomIn(4); };
67380 map.zoomOut = function() { zoomOut(1); };
67381 map.zoomOutFurther = function() { zoomOut(4); };
67384 map.center = function(loc2) {
67385 if (!arguments.length) {
67386 return projection.invert(pxCenter());
67389 if (setCenter(loc2)) {
67390 dispatch$$1.call('move', this, map);
67398 map.zoom = function(z2) {
67399 if (!arguments.length) {
67400 return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
67403 if (z2 < minzoom) {
67404 surface.interrupt();
67405 uiFlash().text(t('cannot_zoom'))();
67406 z2 = context.minEditableZoom();
67410 dispatch$$1.call('move', this, map);
67418 map.zoomTo = function(entity, zoomLimits) {
67419 var extent = entity.extent(context.graph());
67420 if (!isFinite(extent.area())) return;
67422 var z2 = map.trimmedExtentZoom(extent);
67423 zoomLimits = zoomLimits || [context.minEditableZoom(), 19];
67424 map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
67428 map.centerZoom = function(loc2, z2) {
67429 var centered = setCenter(loc2);
67430 var zoomed = setZoom(z2);
67432 if (centered || zoomed) {
67433 dispatch$$1.call('move', this, map);
67441 map.centerEase = function(loc2, duration) {
67442 duration = duration || 250;
67443 setCenter(loc2, duration);
67448 map.zoomEase = function(z2, duration) {
67449 duration = duration || 250;
67450 setZoom(z2, false, duration);
67455 map.transformEase = function(t2, duration) {
67456 duration = duration || 250;
67457 setTransform(t2, duration, false);
67462 map.startEase = function() {
67463 utilBindOnce(surface, 'mousedown.ease', function() {
67470 map.cancelEase = function() {
67471 _selection.interrupt();
67476 map.extent = function(_) {
67477 if (!arguments.length) {
67478 return new geoExtent$$1(
67479 projection.invert([0, dimensions[1]]),
67480 projection.invert([dimensions[0], 0])
67483 var extent = geoExtent$$1(_);
67484 map.centerZoom(extent.center(), map.extentZoom(extent));
67489 map.trimmedExtent = function(_) {
67490 if (!arguments.length) {
67494 return new geoExtent$$1(
67495 projection.invert([pad, dimensions[1] - footerY - pad]),
67496 projection.invert([dimensions[0] - pad, headerY + pad])
67499 var extent = geoExtent$$1(_);
67500 map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
67505 function calcZoom(extent, dim) {
67506 var tl = projection([extent[0][0], extent[1][1]]);
67507 var br = projection([extent[1][0], extent[0][1]]);
67509 // Calculate maximum zoom that fits extent
67510 var hFactor = (br[0] - tl[0]) / dim[0];
67511 var vFactor = (br[1] - tl[1]) / dim[1];
67512 var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
67513 var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
67514 var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
67520 map.extentZoom = function(_) {
67521 return calcZoom(geoExtent$$1(_), dimensions);
67525 map.trimmedExtentZoom = function(_) {
67528 var trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
67529 return calcZoom(geoExtent$$1(_), trimmed);
67533 map.editable = function() {
67534 var osmLayer = surface.selectAll('.data-layer-osm');
67535 if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
67537 return map.zoom() >= context.minEditableZoom();
67541 map.notesEditable = function() {
67542 var noteLayer = surface.selectAll('.data-layer-notes');
67543 if (!noteLayer.empty() && noteLayer.classed('disabled')) return false;
67545 return map.zoom() >= context.minEditableZoom();
67549 map.minzoom = function(_) {
67550 if (!arguments.length) return minzoom;
67556 map.layers = drawLayers;
67559 return utilRebind(map, dispatch$$1, 'on');
67562 function uiMapInMap(context) {
67564 function map_in_map(selection$$1) {
67565 var backgroundLayer = rendererTileLayer(context);
67566 var overlayLayers = {};
67567 var projection$$1 = geoRawMercator();
67568 var dataLayer = svgData$$1(projection$$1, context).showLabels(false);
67569 var debugLayer = svgDebug$$1(projection$$1, context);
67570 var zoom$$1 = d3_zoom()
67571 .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
67572 .on('start', zoomStarted)
67573 .on('zoom', zoomed)
67574 .on('end', zoomEnded);
67575 var isTransformed = false;
67576 var isHidden = true;
67577 var skipEvents = false;
67578 var gesture = null;
67579 var zDiff = 6; // by default, minimap renders at (main zoom - 6)
67580 var wrap = select(null);
67581 var tiles = select(null);
67582 var viewport = select(null);
67583 var tStart; // transform at start of gesture
67584 var tCurr; // transform at most recent event
67588 function zoomStarted() {
67589 if (skipEvents) return;
67590 tStart = tCurr = projection$$1.transform();
67595 function zoomed() {
67596 if (skipEvents) return;
67598 var x = event.transform.x;
67599 var y = event.transform.y;
67600 var k = event.transform.k;
67601 var isZooming = (k !== tStart.k);
67602 var isPanning = (x !== tStart.x || y !== tStart.y);
67604 if (!isZooming && !isPanning) {
67605 return; // no change
67608 // lock in either zooming or panning, don't allow both in minimap.
67610 gesture = isZooming ? 'zoom' : 'pan';
67613 var tMini = projection$$1.transform();
67616 if (gesture === 'zoom') {
67617 var dMini = utilGetDimensions(wrap);
67618 var cMini = geoVecScale(dMini, 0.5);
67619 scale = k / tMini.k;
67620 tX = (cMini[0] / scale - cMini[0]) * scale;
67621 tY = (cMini[1] / scale - cMini[1]) * scale;
67629 utilSetTransform(tiles, tX, tY, scale);
67630 utilSetTransform(viewport, 0, 0, scale);
67631 isTransformed = true;
67632 tCurr = identity$7.translate(x, y).scale(k);
67634 var zMain = geoScaleToZoom(context.projection.scale());
67635 var zMini = geoScaleToZoom(k);
67637 zDiff = zMain - zMini;
67643 function zoomEnded() {
67644 if (skipEvents) return;
67645 if (gesture !== 'pan') return;
67647 updateProjection();
67649 var dMini = utilGetDimensions(wrap);
67650 var cMini = geoVecScale(dMini, 0.5);
67651 context.map().center(projection$$1.invert(cMini)); // recenter main map..
67655 function updateProjection() {
67656 var loc = context.map().center();
67657 var dMini = utilGetDimensions(wrap);
67658 var cMini = geoVecScale(dMini, 0.5);
67659 var tMain = context.projection.transform();
67660 var zMain = geoScaleToZoom(tMain.k);
67661 var zMini = Math.max(zMain - zDiff, 0.5);
67662 var kMini = geoZoomToScale(zMini);
67665 .translate([tMain.x, tMain.y])
67668 var point$$1 = projection$$1(loc);
67669 var mouse$$1 = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
67670 var xMini = cMini[0] - point$$1[0] + tMain.x + mouse$$1[0];
67671 var yMini = cMini[1] - point$$1[1] + tMain.y + mouse$$1[1];
67674 .translate([xMini, yMini])
67675 .clipExtent([[0, 0], dMini]);
67677 tCurr = projection$$1.transform();
67679 if (isTransformed) {
67680 utilSetTransform(tiles, 0, 0);
67681 utilSetTransform(viewport, 0, 0);
67682 isTransformed = false;
67686 .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
67689 wrap.call(zoom$$1.transform, tCurr);
67690 skipEvents = false;
67694 function redraw() {
67695 clearTimeout(timeoutId);
67696 if (isHidden) return;
67698 updateProjection();
67700 var dMini = utilGetDimensions(wrap);
67701 var zMini = geoScaleToZoom(projection$$1.scale());
67703 // setup tile container
67705 .selectAll('.map-in-map-tiles')
67708 tiles = tiles.enter()
67710 .attr('class', 'map-in-map-tiles')
67713 // redraw background
67715 .source(context.background().baseLayerSource())
67716 .projection(projection$$1)
67717 .dimensions(dMini);
67719 var background = tiles
67720 .selectAll('.map-in-map-background')
67725 .attr('class', 'map-in-map-background')
67727 .call(backgroundLayer);
67731 var overlaySources = context.background().overlayLayerSources();
67732 var activeOverlayLayers = [];
67733 for (var i = 0; i < overlaySources.length; i++) {
67734 if (overlaySources[i].validZoom(zMini)) {
67735 if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
67736 activeOverlayLayers.push(overlayLayers[i]
67737 .source(overlaySources[i])
67738 .projection(projection$$1)
67739 .dimensions(dMini));
67743 var overlay = tiles
67744 .selectAll('.map-in-map-overlay')
67747 overlay = overlay.enter()
67749 .attr('class', 'map-in-map-overlay')
67753 var overlays = overlay
67755 .data(activeOverlayLayers, function(d) { return d.source().name(); });
67760 overlays = overlays.enter()
67763 .each(function(layer) { select(this).call(layer); });
67766 var dataLayers = tiles
67767 .selectAll('.map-in-map-data')
67773 dataLayers = dataLayers.enter()
67775 .attr('class', 'map-in-map-data')
67781 // redraw viewport bounding box
67782 if (gesture !== 'pan') {
67783 var getPath = d3_geoPath(projection$$1);
67784 var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
67786 viewport = wrap.selectAll('.map-in-map-viewport')
67789 viewport = viewport.enter()
67791 .attr('class', 'map-in-map-viewport')
67795 var path = viewport.selectAll('.map-in-map-bbox')
67800 .attr('class', 'map-in-map-bbox')
67802 .attr('d', getPath)
67803 .classed('thick', function(d) { return getPath.area(d) < 30; });
67808 function queueRedraw() {
67809 clearTimeout(timeoutId);
67810 timeoutId = setTimeout(function() { redraw(); }, 750);
67814 function toggle() {
67815 if (event) event.preventDefault();
67817 isHidden = !isHidden;
67819 select('.minimap-toggle-item')
67820 .classed('active', !isHidden)
67822 .property('checked', !isHidden);
67826 .style('display', 'block')
67827 .style('opacity', '1')
67830 .style('opacity', '0')
67831 .on('end', function() {
67832 selection$$1.selectAll('.map-in-map')
67833 .style('display', 'none');
67837 .style('display', 'block')
67838 .style('opacity', '0')
67841 .style('opacity', '1')
67842 .on('end', function() {
67849 uiMapInMap.toggle = toggle;
67851 wrap = selection$$1.selectAll('.map-in-map')
67854 wrap = wrap.enter()
67856 .attr('class', 'map-in-map')
67857 .style('display', (isHidden ? 'none' : 'block'))
67859 .on('dblclick.zoom', null)
67863 .on('drawn.map-in-map', function(drawn) {
67864 if (drawn.full === true) {
67871 var keybinding = d3keybinding('map-in-map')
67872 .on(t('background.minimap.key'), toggle);
67881 function uiSettingsCustomBackground(context) {
67882 var dispatch$$1 = dispatch('change');
67884 function render(selection) {
67885 var _origSettings = {
67886 template: context.storage('background-custom-template')
67888 var _currSettings = cloneDeep(_origSettings);
67889 var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
67890 var modal = uiConfirm(selection).okButton();
67893 .classed('settings-modal settings-custom-background', true);
67895 modal.select('.modal-section.header')
67897 .text(t('settings.custom_background.header'));
67900 var textSection = modal.select('.modal-section.message-text');
67904 .attr('class', 'instructions-template')
67905 .text(t('settings.custom_background.instructions', { example: example }));
67908 .append('textarea')
67909 .attr('class', 'field-template')
67910 .attr('placeholder', t('settings.custom_background.template.placeholder'))
67912 .property('value', _currSettings.template);
67915 // insert a cancel button, and adjust the button widths
67916 var buttonSection = modal.select('.modal-section.buttons');
67919 .insert('button', '.ok-button')
67920 .attr('class', 'button col3 cancel-button secondary-action')
67921 .text(t('confirm.cancel'));
67924 buttonSection.select('.cancel-button')
67925 .on('click.cancel', clickCancel);
67927 buttonSection.select('.ok-button')
67928 .classed('col3', true)
67929 .classed('col4', false)
67930 .attr('disabled', isSaveDisabled)
67931 .on('click.save', clickSave);
67934 function isSaveDisabled() {
67939 // restore the original template
67940 function clickCancel() {
67941 textSection.select('.field-template').property('value', _origSettings.template);
67942 context.storage('background-custom-template', _origSettings.template);
67947 // accept the current template
67948 function clickSave() {
67949 _currSettings.template = textSection.select('.field-template').property('value');
67950 context.storage('background-custom-template', _currSettings.template);
67953 dispatch$$1.call('change', this, _currSettings);
67957 return utilRebind(render, dispatch$$1, 'on');
67960 function uiBackground(context) {
67961 var key = t('background.key');
67963 var _customSource = context.background().findSource('custom');
67964 var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
67965 var _shown = false;
67967 var _backgroundList = select(null);
67968 var _overlayList = select(null);
67969 var _displayOptionsContainer = select(null);
67970 var _offsetContainer = select(null);
67972 var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
67973 var backgroundOffset = uiBackgroundOffset(context);
67975 var settingsCustomBackground = uiSettingsCustomBackground(context)
67976 .on('change', customChanged);
67979 function setTooltips(selection$$1) {
67980 selection$$1.each(function(d, i, nodes) {
67981 var item = select(this).select('label');
67982 var span = item.select('span');
67983 var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
67984 var description = d.description();
67985 var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
67987 if (d === _previousBackground) {
67988 item.call(tooltip()
67989 .placement(placement)
67991 .title(function() {
67992 var tip = '<div>' + t('background.switch') + '</div>';
67993 return uiTooltipHtml(tip, uiCmd('⌘' + key));
67996 } else if (description || isOverflowing) {
67997 item.call(tooltip()
67998 .placement(placement)
67999 .title(description || d.name())
68002 item.call(tooltip().destroy);
68008 function updateLayerSelections(selection$$1) {
68009 function active(d) {
68010 return context.background().showsLayer(d);
68013 selection$$1.selectAll('.layer')
68014 .classed('active', active)
68015 .classed('switch', function(d) { return d === _previousBackground; })
68017 .selectAll('input')
68018 .property('checked', active);
68022 function chooseBackground(d) {
68023 if (d.id === 'custom' && !d.template()) {
68024 return editCustom();
68027 event.preventDefault();
68028 _previousBackground = context.background().baseLayerSource();
68029 context.storage('background-last-used-toggle', _previousBackground.id);
68030 context.storage('background-last-used', d.id);
68031 context.background().baseLayerSource(d);
68032 _backgroundList.call(updateLayerSelections);
68033 document.activeElement.blur();
68037 function customChanged(d) {
68038 if (d && d.template) {
68039 _customSource.template(d.template);
68040 chooseBackground(_customSource);
68042 _customSource.template('');
68043 chooseBackground(context.background().findSource('none'));
68048 function editCustom() {
68049 event.preventDefault();
68050 context.container()
68051 .call(settingsCustomBackground);
68055 function chooseOverlay(d) {
68056 event.preventDefault();
68057 context.background().toggleOverlayLayer(d);
68058 _overlayList.call(updateLayerSelections);
68059 document.activeElement.blur();
68063 function drawListItems(layerList, type, change, filter) {
68064 var sources = context.background()
68065 .sources(context.map().extent())
68068 var layerLinks = layerList.selectAll('li.layer')
68069 .data(sources, function(d) { return d.name(); });
68074 var enter = layerLinks.enter()
68076 .attr('class', 'layer')
68077 .classed('layer-custom', function(d) { return d.id === 'custom'; })
68078 .classed('best', function(d) { return d.best(); });
68080 enter.filter(function(d) { return d.id === 'custom'; })
68082 .attr('class', 'layer-browse')
68084 .title(t('settings.custom_background.tooltip'))
68085 .placement((textDirection === 'rtl') ? 'right' : 'left')
68087 .on('click', editCustom)
68088 .call(svgIcon('#iD-icon-more'));
68090 enter.filter(function(d) { return d.best(); })
68092 .attr('class', 'best')
68094 .title(t('background.best_imagery'))
68095 .placement((textDirection === 'rtl') ? 'right' : 'left')
68105 .attr('type', type)
68106 .attr('name', 'layers')
68107 .on('change', change);
68111 .text(function(d) { return d.name(); });
68114 layerList.selectAll('li.layer')
68116 .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
68119 .call(updateLayerSelections);
68122 function sortSources(a, b) {
68123 return a.best() && !b.best() ? -1
68124 : b.best() && !a.best() ? 1
68125 : d3_descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
68130 function renderBackgroundList(selection$$1) {
68132 // the background list
68133 var container = selection$$1.selectAll('.layer-background-list')
68136 _backgroundList = container.enter()
68138 .attr('class', 'layer-list layer-background-list')
68139 .attr('dir', 'auto')
68143 // add minimap toggle below list
68144 var minimapEnter = selection$$1.selectAll('.minimap-toggle-list')
68148 .attr('class', 'layer-list minimap-toggle-list')
68150 .attr('class', 'layer minimap-toggle-item');
68152 var minimapLabelEnter = minimapEnter
68156 .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
68162 .attr('type', 'checkbox')
68163 .on('change', function() {
68164 event.preventDefault();
68165 uiMapInMap.toggle();
68170 .text(t('background.minimap.description'));
68173 // "Info / Report a Problem" link
68174 selection$$1.selectAll('.imagery-faq')
68178 .attr('class', 'imagery-faq')
68180 .attr('target', '_blank')
68181 .attr('tabindex', -1)
68182 .call(svgIcon('#iD-icon-out-link', 'inline'))
68183 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
68185 .text(t('background.imagery_source_faq'));
68189 function renderOverlayList(selection$$1) {
68190 var container = selection$$1.selectAll('.layer-overlay-list')
68193 _overlayList = container.enter()
68195 .attr('class', 'layer-list layer-overlay-list')
68196 .attr('dir', 'auto')
68201 function update() {
68203 .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
68206 .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
68208 _displayOptionsContainer
68209 .call(backgroundDisplayOptions);
68212 .call(backgroundOffset);
68216 function quickSwitch() {
68218 event.stopImmediatePropagation();
68219 event.preventDefault();
68221 if (_previousBackground) {
68222 chooseBackground(_previousBackground);
68227 function background(selection$$1) {
68229 function hidePane() {
68233 function togglePane() {
68234 if (event) event.preventDefault();
68235 paneTooltip.hide(button);
68236 setVisible(!button.classed('active'));
68239 function setVisible(show) {
68240 if (show !== _shown) {
68241 button.classed('active', show);
68245 uiMapData.hidePane();
68250 .style('display', 'block')
68251 .style('right', '-300px')
68254 .style('right', '0px');
68258 .style('display', 'block')
68259 .style('right', '0px')
68262 .style('right', '-300px')
68263 .on('end', function() {
68264 select(this).style('display', 'none');
68271 var pane = selection$$1
68273 .attr('class', 'fillL map-pane col4 hide');
68275 var paneTooltip = tooltip()
68276 .placement((textDirection === 'rtl') ? 'right' : 'left')
68278 .title(uiTooltipHtml(t('background.description'), key));
68280 var button = selection$$1
68282 .attr('tabindex', -1)
68283 .on('click', togglePane)
68284 .call(svgIcon('#iD-icon-layers', 'light'))
68285 .call(paneTooltip);
68290 .attr('class', 'pane-heading');
68294 .text(t('background.title'));
68298 .on('click', function() { uiBackground.hidePane(); })
68299 .call(svgIcon('#iD-icon-close'));
68304 .attr('class', 'pane-content');
68309 .attr('class', 'background-background-list-container')
68310 .call(uiDisclosure(context, 'background_list', true)
68311 .title(t('background.backgrounds'))
68312 .content(renderBackgroundList)
68318 .attr('class', 'background-overlay-list-container')
68319 .call(uiDisclosure(context, 'overlay_list', true)
68320 .title(t('background.overlays'))
68321 .content(renderOverlayList)
68325 _displayOptionsContainer = content
68327 .attr('class', 'background-display-options');
68330 _offsetContainer = content
68332 .attr('class', 'background-offset');
68337 .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
68339 context.background()
68340 .on('change.background-update', update);
68345 var keybinding = d3keybinding('background')
68346 .on(key, togglePane)
68347 .on(uiCmd('⌘' + key), quickSwitch)
68348 .on([t('map_data.key'), t('help.key')], hidePane);
68353 uiBackground.hidePane = hidePane;
68354 uiBackground.togglePane = togglePane;
68355 uiBackground.setVisible = setVisible;
68361 function uiContributors(context) {
68362 var osm = context.connection(),
68363 debouncedUpdate = debounce(function() { update(); }, 1000),
68366 wrap = select(null);
68369 function update() {
68373 entities = context.intersects(context.map().extent());
68375 entities.forEach(function(entity) {
68376 if (entity && entity.user) users[entity.user] = true;
68379 var u = Object.keys(users),
68380 subset = u.slice(0, u.length > limit ? limit - 1 : limit);
68383 .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
68385 var userList = select(document.createElement('span'));
68387 userList.selectAll()
68391 .attr('class', 'user-link')
68392 .attr('href', function(d) { return osm.userURL(d); })
68393 .attr('target', '_blank')
68394 .attr('tabindex', -1)
68397 if (u.length > limit) {
68398 var count = select(document.createElement('span'));
68401 .attr('target', '_blank')
68402 .attr('tabindex', -1)
68403 .attr('href', function() {
68404 return osm.changesetsURL(context.map().center(), context.map().zoom());
68406 .text(u.length - limit + 1);
68408 wrap.append('span')
68409 .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
68412 wrap.append('span')
68413 .html(t('contributors.list', { users: userList.html() }));
68420 .style('opacity', 0);
68422 } else if (hidden) {
68425 .style('opacity', 1);
68430 return function(selection$$1) {
68432 wrap = selection$$1;
68435 osm.on('loaded.contributors', debouncedUpdate);
68436 context.map().on('move.contributors', debouncedUpdate);
68440 function uiFeatureInfo(context) {
68441 function update(selection$$1) {
68442 var features = context.features(),
68443 stats = features.stats(),
68445 hiddenList = compact(map$3(features.hidden(), function(k) {
68448 return String(stats[k]) + ' ' + t('feature.' + k + '.description');
68452 selection$$1.html('');
68454 if (hiddenList.length) {
68455 var tooltipBehavior = tooltip()
68458 .title(function() {
68459 return uiTooltipHtml(hiddenList.join('<br/>'));
68462 var warning = selection$$1.append('a')
68464 .attr('tabindex', -1)
68465 .html(t('feature_info.hidden_warning', { count: count }))
68466 .call(tooltipBehavior)
68467 .on('click', function() {
68468 tooltipBehavior.hide(warning);
68469 // open map data panel?
68470 event.preventDefault();
68475 .classed('hide', !hiddenList.length);
68479 return function(selection$$1) {
68480 update(selection$$1);
68482 context.features().on('change.feature_info', function() {
68483 update(selection$$1);
68488 function uiFullScreen(context) {
68489 var element = context.container().node(),
68490 keybinding = d3keybinding('full-screen');
68494 function getFullScreenFn() {
68495 if (element.requestFullscreen) {
68496 return element.requestFullscreen;
68497 } else if (element.msRequestFullscreen) {
68498 return element.msRequestFullscreen;
68499 } else if (element.mozRequestFullScreen) {
68500 return element.mozRequestFullScreen;
68501 } else if (element.webkitRequestFullscreen) {
68502 return element.webkitRequestFullscreen;
68507 function getExitFullScreenFn() {
68508 if (document.exitFullscreen) {
68509 return document.exitFullscreen;
68510 } else if (document.msExitFullscreen) {
68511 return document.msExitFullscreen;
68512 } else if (document.mozCancelFullScreen) {
68513 return document.mozCancelFullScreen;
68514 } else if (document.webkitExitFullscreen) {
68515 return document.webkitExitFullscreen;
68520 function isFullScreen() {
68521 return document.fullscreenElement ||
68522 document.mozFullScreenElement ||
68523 document.webkitFullscreenElement ||
68524 document.msFullscreenElement;
68528 function isSupported() {
68529 return !!getFullScreenFn();
68533 function fullScreen() {
68534 event.preventDefault();
68535 if (!isFullScreen()) {
68536 // button.classed('active', true);
68537 getFullScreenFn().apply(element);
68539 // button.classed('active', false);
68540 getExitFullScreenFn().apply(document);
68545 return function() { // selection) {
68546 if (!isSupported())
68549 // button = selection.append('button')
68550 // .attr('title', t('full_screen'))
68551 // .attr('tabindex', -1)
68552 // .on('click', fullScreen)
68555 // button.append('span')
68556 // .attr('class', 'icon full-screen');
68558 var detected = utilDetect();
68559 var keys = detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11'];
68560 keybinding.on(keys, fullScreen);
68567 function uiLoading(context) {
68568 var _modalSelection = select(null);
68570 var _blocking = false;
68573 var loading = function(selection$$1) {
68574 _modalSelection = uiModal(selection$$1, _blocking);
68576 var loadertext = _modalSelection.select('.content')
68577 .classed('loading-modal', true)
68579 .attr('class', 'modal-section fillL');
68583 .attr('class', 'loader')
68584 .attr('src', context.imagePath('loader-white.gif'));
68590 _modalSelection.select('button.close')
68591 .attr('class', 'hide');
68597 loading.message = function(_) {
68598 if (!arguments.length) return _message;
68604 loading.blocking = function(_) {
68605 if (!arguments.length) return _blocking;
68611 loading.close = function() {
68612 _modalSelection.remove();
68619 function uiGeolocate(context) {
68620 var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
68621 locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
68626 if (context.inIntro()) return;
68627 context.enter(modeBrowse(context));
68628 context.container().call(locating);
68629 navigator.geolocation.getCurrentPosition(success, error, geoOptions);
68631 // This timeout ensures that we still call finish() even if
68632 // the user declines to share their location in Firefox
68633 timeoutId = setTimeout(finish, 10000 /* 10sec */ );
68637 function success(position) {
68638 var map = context.map(),
68639 extent = geoExtent$$1([position.coords.longitude, position.coords.latitude])
68640 .padByMeters(position.coords.accuracy);
68642 map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
68652 function finish() {
68653 locating.close(); // unblock ui
68654 if (timeoutId) { clearTimeout(timeoutId); }
68655 timeoutId = undefined;
68659 return function(selection) {
68660 if (!navigator.geolocation) return;
68664 .attr('tabindex', -1)
68665 .attr('title', t('geolocate.title'))
68666 .on('click', click)
68667 .call(svgIcon('#iD-icon-geolocate', 'light'))
68669 .placement((textDirection === 'rtl') ? 'right' : 'left'));
68673 function uiPanelBackground(context) {
68674 var background = context.background();
68675 var currSourceName = null;
68677 var metadataKeys = [
68678 'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
68681 var debouncedRedraw = debounce(redraw, 250);
68683 function redraw(selection$$1) {
68684 var source = background.baseLayerSource(),
68685 isDG = (source.id.match(/^DigitalGlobe/i) !== null);
68687 if (currSourceName !== source.name()) {
68688 currSourceName = source.name();
68692 selection$$1.html('');
68694 var list = selection$$1
68696 .attr('class', 'background-info');
68700 .text(currSourceName);
68702 metadataKeys.forEach(function(k) {
68703 // DigitalGlobe vintage is available in raster layers for now.
68704 if (isDG && k === 'vintage') return;
68708 .attr('class', 'background-info-list-' + k)
68709 .classed('hide', !metadata[k])
68710 .text(t('info_panels.background.' + k) + ':')
68712 .attr('class', 'background-info-span-' + k)
68713 .text(metadata[k]);
68716 debouncedGetMetadata(selection$$1);
68718 var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
68722 .text(t('info_panels.background.' + toggleTiles))
68724 .attr('class', 'button button-toggle-tiles')
68725 .on('click', function() {
68726 event.preventDefault();
68727 context.setDebug('tile', !context.getDebug('tile'));
68728 selection$$1.call(redraw);
68732 var key = source.id + '-vintage';
68733 var sourceVintage = context.background().findSource(key);
68734 var showsVintage = context.background().showsLayer(sourceVintage);
68735 var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
68738 .text(t('info_panels.background.' + toggleVintage))
68740 .attr('class', 'button button-toggle-vintage')
68741 .on('click', function() {
68742 event.preventDefault();
68743 context.background().toggleOverlayLayer(sourceVintage);
68744 selection$$1.call(redraw);
68748 // disable if necessary
68749 ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
68750 if (source.id !== layerId) {
68751 var key = layerId + '-vintage';
68752 var sourceVintage = context.background().findSource(key);
68753 if (context.background().showsLayer(sourceVintage)) {
68754 context.background().toggleOverlayLayer(sourceVintage);
68761 var debouncedGetMetadata = debounce(getMetadata, 250);
68763 function getMetadata(selection$$1) {
68764 var tile = select('.layer-background img.tile-center'); // tile near viewport center
68765 if (tile.empty()) return;
68767 var sourceName = currSourceName,
68769 zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
68770 center = context.map().center();
68773 metadata.zoom = String(zoom);
68774 selection$$1.selectAll('.background-info-list-zoom')
68775 .classed('hide', false)
68776 .selectAll('.background-info-span-zoom')
68777 .text(metadata.zoom);
68779 if (!d || !d.length >= 3) return;
68781 background.baseLayerSource().getMetadata(center, d, function(err, result) {
68782 if (err || currSourceName !== sourceName) return;
68785 var vintage = result.vintage;
68786 metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
68787 selection$$1.selectAll('.background-info-list-vintage')
68788 .classed('hide', false)
68789 .selectAll('.background-info-span-vintage')
68790 .text(metadata.vintage);
68792 // update other metdata
68793 without(metadataKeys, 'zoom', 'vintage')
68794 .forEach(function(k) {
68795 var val = result[k];
68797 selection$$1.selectAll('.background-info-list-' + k)
68798 .classed('hide', !val)
68799 .selectAll('.background-info-span-' + k)
68806 var panel = function(selection$$1) {
68807 selection$$1.call(redraw);
68810 .on('drawn.info-background', function() {
68811 selection$$1.call(debouncedRedraw);
68813 .on('move.info-background', function() {
68814 selection$$1.call(debouncedGetMetadata);
68819 panel.off = function() {
68821 .on('drawn.info-background', null)
68822 .on('move.info-background', null);
68825 panel.id = 'background';
68826 panel.title = t('info_panels.background.title');
68827 panel.key = t('info_panels.background.key');
68833 function uiPanelHistory(context) {
68836 function displayTimestamp(timestamp) {
68837 if (!timestamp) return t('info_panels.history.unknown');
68838 var detected = utilDetect();
68840 day: 'numeric', month: 'short', year: 'numeric',
68841 hour: 'numeric', minute: 'numeric', second: 'numeric'
68843 var d = new Date(timestamp);
68844 if (isNaN(d.getTime())) return t('info_panels.history.unknown');
68845 return d.toLocaleString(detected.locale, options);
68849 function displayUser(selection, userName) {
68853 .text(t('info_panels.history.unknown'));
68859 .attr('class', 'user-name')
68862 var links = selection
68864 .attr('class', 'links');
68869 .attr('class', 'user-osm-link')
68870 .attr('href', osm.userURL(userName))
68871 .attr('target', '_blank')
68872 .attr('tabindex', -1)
68878 .attr('class', 'user-hdyc-link')
68879 .attr('href', 'https://hdyc.neis-one.org/?' + userName)
68880 .attr('target', '_blank')
68881 .attr('tabindex', -1)
68886 function displayChangeset(selection, changeset) {
68890 .text(t('info_panels.history.unknown'));
68896 .attr('class', 'changeset-id')
68899 var links = selection
68901 .attr('class', 'links');
68906 .attr('class', 'changeset-osm-link')
68907 .attr('href', osm.changesetURL(changeset))
68908 .attr('target', '_blank')
68909 .attr('tabindex', -1)
68915 .attr('class', 'changeset-osmcha-link')
68916 .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
68917 .attr('target', '_blank')
68918 .attr('tabindex', -1)
68923 function redraw(selection) {
68924 var selectedNoteID = context.selectedNoteID();
68925 osm = context.connection();
68927 var selected, note, entity;
68928 if (selectedNoteID && osm) { // selected 1 note
68929 selected = [ t('note.note') + ' ' + selectedNoteID ];
68930 note = osm.getNote(selectedNoteID);
68931 } else { // selected 1..n entities
68932 selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
68933 if (selected.length) {
68934 entity = context.entity(selected[0]);
68938 var singular = selected.length === 1 ? selected[0] : null;
68940 selection.html('');
68944 .attr('class', 'history-heading')
68945 .text(singular || t('info_panels.history.selected', { n: selected.length }));
68947 if (!singular) return;
68950 selection.call(redrawEntity, entity);
68952 selection.call(redrawNote, note);
68957 function redrawNote(selection, note) {
68958 if (!note || note.isNew()) {
68961 .text(t('info_panels.history.note_no_history'));
68965 var list = selection
68970 .text(t('info_panels.history.note_comments') + ':')
68972 .text(note.comments.length);
68974 if (note.comments.length) {
68977 .text(t('info_panels.history.note_created_date') + ':')
68979 .text(displayTimestamp(note.comments[0].date));
68983 .text(t('info_panels.history.note_created_user') + ':')
68984 .call(displayUser, note.comments[0].user);
68990 .attr('class', 'view-history-on-osm')
68991 .attr('target', '_blank')
68992 .attr('tabindex', -1)
68993 .attr('href', osm.noteURL(note))
68994 .call(svgIcon('#iD-icon-out-link', 'inline'))
68996 .text(t('info_panels.history.note_link_text'));
69001 function redrawEntity(selection, entity) {
69002 if (!entity || entity.isNew()) {
69005 .text(t('info_panels.history.no_history'));
69009 var list = selection
69014 .text(t('info_panels.history.version') + ':')
69016 .text(entity.version);
69020 .text(t('info_panels.history.last_edit') + ':')
69022 .text(displayTimestamp(entity.timestamp));
69026 .text(t('info_panels.history.edited_by') + ':')
69027 .call(displayUser, entity.user);
69031 .text(t('info_panels.history.changeset') + ':')
69032 .call(displayChangeset, entity.changeset);
69037 .attr('class', 'view-history-on-osm')
69038 .attr('target', '_blank')
69039 .attr('tabindex', -1)
69040 .attr('href', osm.historyURL(entity))
69041 .call(svgIcon('#iD-icon-out-link', 'inline'))
69043 .text(t('info_panels.history.link_text'));
69048 var panel = function(selection) {
69049 selection.call(redraw);
69052 .on('drawn.info-history', function() {
69053 selection.call(redraw);
69057 .on('enter.info-history', function() {
69058 selection.call(redraw);
69062 panel.off = function() {
69063 context.map().on('drawn.info-history', null);
69064 context.on('enter.info-history', null);
69067 panel.id = 'history';
69068 panel.title = t('info_panels.history.title');
69069 panel.key = t('info_panels.history.key');
69075 var OSM_PRECISION = 7;
69076 var locale$2 = utilDetect().locale;
69079 * Returns a localized representation of the given length measurement.
69081 * @param {Number} m area in meters
69082 * @param {Boolean} isImperial true for U.S. customary units; false for metric
69084 function displayLength(m, isImperial) {
69085 var d = m * (isImperial ? 3.28084 : 1);
69098 unit = 'kilometers';
69104 return t('units.' + unit, {
69105 quantity: d.toLocaleString(locale$2, {
69106 maximumSignificantDigits: 4
69112 * Returns a localized representation of the given area measurement.
69114 * @param {Number} m2 area in square meters
69115 * @param {Boolean} isImperial true for U.S. customary units; false for metric
69117 function displayArea(m2, isImperial) {
69118 var d = m2 * (isImperial ? 10.7639111056 : 1);
69124 if (d >= 6969600) { // > 0.25mi² show mi²
69126 unit1 = 'square_miles';
69129 unit1 = 'square_feet';
69132 if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
69138 if (d >= 250000) { // > 0.25km² show km²
69140 unit1 = 'square_kilometers';
69143 unit1 = 'square_meters';
69146 if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
69148 unit2 = 'hectares';
69152 area = t('units.' + unit1, {
69153 quantity: d1.toLocaleString(locale$2, {
69154 maximumSignificantDigits: 4
69159 return t('units.area_pair', {
69161 area2: t('units.' + unit2, {
69162 quantity: d2.toLocaleString(locale$2, {
69163 maximumSignificantDigits: 2
69172 function wrap(x, min, max) {
69174 return ((x - min) % d + d) % d + min;
69177 function clamp(x, min, max) {
69178 return Math.max(min, Math.min(x, max));
69181 function displayCoordinate(deg, pos, neg) {
69182 var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
69183 var sec = (min - Math.floor(min)) * 60;
69184 var displayDegrees = t('units.arcdegrees', {
69185 quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
69187 var displayCoordinate;
69189 if (Math.floor(sec) > 0) {
69190 displayCoordinate = displayDegrees +
69191 t('units.arcminutes', {
69192 quantity: Math.floor(min).toLocaleString(locale$2)
69194 t('units.arcseconds', {
69195 quantity: Math.round(sec).toLocaleString(locale$2)
69197 } else if (Math.floor(min) > 0) {
69198 displayCoordinate = displayDegrees +
69199 t('units.arcminutes', {
69200 quantity: Math.round(min).toLocaleString(locale$2)
69203 displayCoordinate = t('units.arcdegrees', {
69204 quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
69209 return displayCoordinate;
69211 return t('units.coordinate', {
69212 coordinate: displayCoordinate,
69213 direction: t('units.' + (deg > 0 ? pos : neg))
69219 * Returns given coordinate pair in degree-minute-second format.
69221 * @param {Array<Number>} coord longitude and latitude
69223 function dmsCoordinatePair(coord) {
69224 return t('units.coordinate_pair', {
69225 latitude: displayCoordinate(clamp(coord[1], -90, 90), 'north', 'south'),
69226 longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
69231 * Returns the given coordinate pair in decimal format.
69232 * note: unlocalized to avoid comma ambiguity - see #4765
69234 * @param {Array<Number>} coord longitude and latitude
69236 function decimalCoordinatePair(coord) {
69237 return t('units.coordinate_pair', {
69238 latitude: clamp(coord[1], -90, 90).toFixed(OSM_PRECISION),
69239 longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
69243 function uiPanelLocation(context) {
69244 var currLocation = '';
69247 function redraw(selection) {
69248 selection.html('');
69250 var list = selection
69253 // Mouse coordinates
69254 var coord = context.map().mouseCoordinates();
69255 if (coord.some(isNaN)) {
69256 coord = context.map().center();
69261 .text(dmsCoordinatePair(coord))
69263 .text(decimalCoordinatePair(coord));
69268 .attr('class', 'location-info')
69269 .text(currLocation || ' ');
69271 debouncedGetLocation(selection, coord);
69275 var debouncedGetLocation = debounce(getLocation, 250);
69276 function getLocation(selection, coord) {
69277 if (!services.geocoder) {
69278 currLocation = t('info_panels.location.unknown_location');
69279 selection.selectAll('.location-info')
69280 .text(currLocation);
69282 services.geocoder.reverse(coord, function(err, result) {
69283 currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
69284 selection.selectAll('.location-info')
69285 .text(currLocation);
69291 var panel = function(selection) {
69292 selection.call(redraw);
69295 .on('mousemove.info-location', function() {
69296 selection.call(redraw);
69300 panel.off = function() {
69302 .on('mousemove.info-location', null);
69305 panel.id = 'location';
69306 panel.title = t('info_panels.location.title');
69307 panel.key = t('info_panels.location.key');
69313 function uiPanelMeasurement(context) {
69314 var locale = utilDetect().locale,
69315 isImperial = (locale.toLowerCase() === 'en-us');
69318 function radiansToMeters(r) {
69319 // using WGS84 authalic radius (6371007.1809 m)
69320 return r * 6371007.1809;
69323 function steradiansToSqmeters(r) {
69324 // http://gis.stackexchange.com/a/124857/40446
69325 return r / (4 * Math.PI) * 510065621724000;
69329 function toLineString(feature) {
69330 if (feature.type === 'LineString') return feature;
69332 var result = { type: 'LineString', coordinates: [] };
69333 if (feature.type === 'Polygon') {
69334 result.coordinates = feature.coordinates[0];
69335 } else if (feature.type === 'MultiPolygon') {
69336 result.coordinates = feature.coordinates[0][0];
69343 function nodeCount(feature) {
69344 if (feature.type === 'LineString') return feature.coordinates.length;
69345 if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
69349 function redraw(selection$$1) {
69350 var resolver = context.graph();
69351 var selectedNoteID = context.selectedNoteID();
69352 var osm = services.osm;
69354 var selected, center, entity, note, geometry;
69356 if (selectedNoteID && osm) { // selected 1 note
69357 selected = [ t('note.note') + ' ' + selectedNoteID ];
69358 note = osm.getNote(selectedNoteID);
69362 } else { // selected 1..n entities
69363 var extent = geoExtent$$1();
69364 selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
69365 if (selected.length) {
69366 for (var i = 0; i < selected.length; i++) {
69367 entity = context.entity(selected[i]);
69368 extent._extend(entity.extent(resolver));
69370 center = extent.center();
69371 geometry = entity.geometry(resolver);
69375 var singular = selected.length === 1 ? selected[0] : null;
69377 selection$$1.html('');
69381 .attr('class', 'measurement-heading')
69382 .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
69384 if (!selected.length) return;
69387 var list = selection$$1
69391 // multiple selected features, just display extent center..
69395 .text(t('info_panels.measurement.center') + ':');
69396 coordItem.append('span')
69397 .text(dmsCoordinatePair(center));
69398 coordItem.append('span')
69399 .text(decimalCoordinatePair(center));
69403 // single selected feature, display details..
69404 if (geometry === 'line' || geometry === 'area') {
69405 var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
69406 var feature = entity.asGeoJSON(resolver);
69407 var length = radiansToMeters(length$1(toLineString(feature)));
69408 var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
69409 var centroid = d3_geoCentroid(feature);
69413 .text(t('info_panels.measurement.geometry') + ':')
69416 closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
69419 if (entity.type !== 'relation') {
69422 .text(t('info_panels.measurement.node_count') + ':')
69424 .text(nodeCount(feature).toLocaleString(locale));
69428 var area = steradiansToSqmeters(entity.area(resolver));
69431 .text(t('info_panels.measurement.area') + ':')
69433 .text(displayArea(area, isImperial));
69439 .text(lengthLabel + ':')
69441 .text(displayLength(length, isImperial));
69445 .text(t('info_panels.measurement.centroid') + ':');
69446 coordItem.append('span')
69447 .text(dmsCoordinatePair(centroid));
69448 coordItem.append('span')
69449 .text(decimalCoordinatePair(centroid));
69451 var toggle = isImperial ? 'imperial' : 'metric';
69455 .text(t('info_panels.measurement.' + toggle))
69457 .attr('class', 'button button-toggle-units')
69458 .on('click', function() {
69459 event.preventDefault();
69460 isImperial = !isImperial;
69461 selection$$1.call(redraw);
69465 var centerLabel = t('info_panels.measurement.' +
69466 (note || entity.type === 'node' ? 'location' : 'center'));
69470 .text(t('info_panels.measurement.geometry') + ':')
69472 .text(t('geometry.' + geometry));
69476 .text(centerLabel + ':');
69477 coordItem.append('span')
69478 .text(dmsCoordinatePair(center));
69479 coordItem.append('span')
69480 .text(decimalCoordinatePair(center));
69485 var panel = function(selection$$1) {
69486 selection$$1.call(redraw);
69489 .on('drawn.info-measurement', function() {
69490 selection$$1.call(redraw);
69494 .on('enter.info-measurement', function() {
69495 selection$$1.call(redraw);
69499 panel.off = function() {
69500 context.map().on('drawn.info-measurement', null);
69501 context.on('enter.info-measurement', null);
69504 panel.id = 'measurement';
69505 panel.title = t('info_panels.measurement.title');
69506 panel.key = t('info_panels.measurement.key');
69512 var uiInfoPanels = {
69513 background: uiPanelBackground,
69514 history: uiPanelHistory,
69515 location: uiPanelLocation,
69516 measurement: uiPanelMeasurement,
69519 function uiInfo(context) {
69520 var ids = Object.keys(uiInfoPanels),
69521 wasActive = ['measurement'],
69526 ids.forEach(function(k) {
69528 panels[k] = uiInfoPanels[k](context);
69534 function info(selection$$1) {
69536 function redraw() {
69537 var activeids = ids.filter(function(k) { return active[k]; }).sort();
69539 var containers = infoPanels.selectAll('.panel-container')
69540 .data(activeids, function(k) { return k; });
69543 .style('opacity', 1)
69546 .style('opacity', 0)
69547 .on('end', function(d) {
69549 .call(panels[d].off)
69553 var enter = containers.enter()
69555 .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
69558 .style('opacity', 0)
69561 .style('opacity', 1);
69565 .attr('class', 'panel-title fillD2');
69569 .text(function(d) { return panels[d].title; });
69573 .attr('class', 'close')
69574 .on('click', function (d) { toggle(d); })
69575 .call(svgIcon('#iD-icon-close'));
69579 .attr('class', function(d) { return 'panel-content panel-content-' + d; });
69582 // redraw the panels
69583 infoPanels.selectAll('.panel-content')
69584 .each(function(d) {
69585 select(this).call(panels[d]);
69590 function toggle(which) {
69592 event.stopImmediatePropagation();
69593 event.preventDefault();
69596 var activeids = ids.filter(function(k) { return active[k]; });
69598 if (which) { // toggle one
69599 active[which] = !active[which];
69600 if (activeids.length === 1 && activeids[0] === which) { // none active anymore
69601 wasActive = [which];
69603 } else { // toggle all
69604 if (activeids.length) {
69605 wasActive = activeids;
69606 activeids.forEach(function(k) { active[k] = false; });
69608 wasActive.forEach(function(k) { active[k] = true; });
69616 var infoPanels = selection$$1.selectAll('.info-panels')
69619 infoPanels = infoPanels.enter()
69621 .attr('class', 'info-panels')
69622 .merge(infoPanels);
69626 var keybinding = d3keybinding('info')
69627 .on(uiCmd('⌘' + t('info_panels.key')), toggle);
69629 ids.forEach(function(k) {
69630 var key = t('info_panels.' + k + '.key', { default: null });
69633 .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
69643 function uiModes(context) {
69645 modeAddPoint$$1(context),
69646 modeAddLine$$1(context),
69647 modeAddArea$$1(context),
69648 modeAddNote$$1(context)
69652 function editable() {
69653 var mode = context.mode();
69654 return context.editable() && mode && mode.id !== 'save';
69657 function notesEnabled() {
69658 var noteLayer = context.layers().layer('notes');
69659 return noteLayer && noteLayer.enabled();
69662 function notesEditable() {
69663 var mode = context.mode();
69664 return context.map().notesEditable() && mode && mode.id !== 'save';
69668 return function(selection$$1) {
69670 .on('enter.editor', function(entered) {
69671 selection$$1.selectAll('button.add-button')
69672 .classed('active', function(mode) { return entered.button === mode.button; });
69673 context.container()
69674 .classed('mode-' + entered.id, true);
69678 .on('exit.editor', function(exited) {
69679 context.container()
69680 .classed('mode-' + exited.id, false);
69683 var keybinding = d3keybinding('mode-buttons');
69685 modes.forEach(function(mode) {
69686 keybinding.on(mode.key, function() {
69687 if (mode.id === 'add-note' && !(notesEnabled() && notesEditable())) return;
69688 if (mode.id !== 'add-note' && !editable()) return;
69690 if (mode.id === context.mode().id) {
69691 context.enter(modeBrowse(context));
69693 context.enter(mode);
69702 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
69705 .on('move.modes', debouncedUpdate)
69706 .on('drawn.modes', debouncedUpdate);
69709 .on('enter.modes', update);
69714 function update() {
69715 var showNotes = notesEnabled();
69716 var data = showNotes ? modes : modes.slice(0, 3);
69719 .classed('col3', !showNotes) // 25%
69720 .classed('col4', showNotes); // 33%
69722 var buttons = selection$$1.selectAll('button.add-button')
69723 .data(data, function(d) { return d.id; });
69730 var buttonsEnter = buttons.enter()
69732 .attr('tabindex', -1)
69733 .attr('class', function(d) { return d.id + ' add-button'; })
69734 .on('click.mode-buttons', function(mode) {
69735 // When drawing, ignore accidental clicks on mode buttons - #4042
69736 var currMode = context.mode().id;
69737 if (currMode.match(/^draw/) !== null) return;
69739 if (mode.id === currMode) {
69740 context.enter(modeBrowse(context));
69742 context.enter(mode);
69746 .placement('bottom')
69748 .title(function(mode) {
69749 return uiTooltipHtml(mode.description, mode.key);
69754 .each(function(d) {
69756 .call(svgIcon('#iD-icon-' + d.button, 'pre-text'));
69761 .attr('class', 'label')
69762 .text(function(mode) { return mode.title; });
69766 .merge(buttonsEnter)
69767 .classed('col3', showNotes) // 25%
69768 .classed('col4', !showNotes) // 33%
69769 .property('disabled', function(d) {
69770 return d.id === 'add-note' ? !notesEditable() : !editable();
69776 function uiNotice(context) {
69778 return function(selection$$1) {
69779 var div = selection$$1
69781 .attr('class', 'notice');
69785 .attr('class', 'zoom-to notice fillD')
69786 .on('click', function() {
69787 context.map().zoomEase(context.minEditableZoom());
69789 .on('wheel', function() { // let wheel events pass through #4482
69790 var e2 = new WheelEvent(event.type, event);
69791 context.surface().node().dispatchEvent(e2);
69795 .call(svgIcon('#iD-icon-plus', 'pre-text'))
69797 .attr('class', 'label')
69798 .text(t('zoom_in_edit'));
69801 function disableTooHigh() {
69802 var canEdit = context.map().zoom() >= context.minEditableZoom();
69803 div.style('display', canEdit ? 'none' : 'block');
69807 .on('move.notice', debounce(disableTooHigh, 500));
69813 function uiRestore(context) {
69815 return function(selection) {
69816 if (!context.history().lock() || !context.history().restorableChanges())
69819 var modalSelection = uiModal(selection, true);
69821 modalSelection.select('.modal')
69822 .attr('class', 'modal fillL col6');
69824 var introModal = modalSelection.select('.content');
69827 .attr('class','cf');
69831 .attr('class', 'modal-section')
69833 .text(t('restore.heading'));
69837 .attr('class','modal-section')
69839 .text(t('restore.description'));
69841 var buttonWrap = introModal
69843 .attr('class', 'modal-actions cf');
69845 var restore = buttonWrap
69847 .attr('class', 'restore col6')
69848 .on('click', function() {
69849 context.history().restore();
69850 modalSelection.remove();
69855 .attr('class', 'logo logo-restore')
69857 .attr('xlink:href', '#iD-logo-restore');
69861 .text(t('restore.restore'));
69863 var reset = buttonWrap
69865 .attr('class', 'reset col6')
69866 .on('click', function() {
69867 context.history().clearSaved();
69868 modalSelection.remove();
69873 .attr('class', 'logo logo-reset')
69875 .attr('xlink:href', '#iD-logo-reset');
69879 .text(t('restore.reset'));
69881 restore.node().focus();
69885 function uiSave(context) {
69886 var history = context.history();
69887 var key = uiCmd('⌘S');
69890 function saving() {
69891 var mode = context.mode();
69892 return mode && mode.id === 'save';
69897 event.preventDefault();
69898 if (!context.inIntro() && !saving() && history.hasChanges()) {
69899 context.enter(modeSave$$1(context));
69904 function getBackground(numChanges) {
69906 if (numChanges === 0) {
69908 } else if (numChanges <= 50) {
69909 step = numChanges / 50;
69910 return interpolateRgb('#fff', '#ff8')(step); // white -> yellow
69912 step = Math.min((numChanges - 50) / 50, 1.0);
69913 return interpolateRgb('#ff8', '#f88')(step); // yellow -> red
69918 return function(selection$$1) {
69919 var numChanges = 0;
69921 function updateCount() {
69922 var _ = history.difference().summary().length;
69923 if (_ === numChanges) return;
69927 .title(uiTooltipHtml(
69928 t(numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
69931 var background = getBackground(numChanges);
69934 .classed('disabled', numChanges === 0)
69935 .classed('has-count', numChanges > 0)
69936 .style('background', background);
69938 button.select('span.count')
69940 .style('background', background)
69941 .style('border-color', background);
69945 var tooltipBehavior = tooltip()
69946 .placement('bottom')
69948 .title(uiTooltipHtml(t('save.no_changes'), key));
69950 var button = selection$$1
69952 .attr('class', 'save col12 disabled')
69953 .attr('tabindex', -1)
69955 .call(tooltipBehavior);
69958 .call(svgIcon('#iD-icon-save', 'pre-text'))
69960 .attr('class', 'label')
69961 .text(t('save.title'));
69965 .attr('class', 'count')
69971 var keybinding = d3keybinding('uiSave')
69972 .on(key, save, true);
69978 .on('change.save', updateCount);
69981 .on('enter.save', function() {
69982 button.property('disabled', saving());
69983 if (saving()) button.call(tooltipBehavior.hide);
69988 function uiScale(context) {
69989 var projection = context.projection,
69990 isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
69995 function scaleDefs(loc1, loc2) {
69996 var lat = (loc2[1] + loc1[1]) / 2,
69997 conversion = (isImperial ? 3.28084 : 1),
69998 dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
69999 scale = { dist: 0, px: 0, text: '' },
70000 buckets, i, val, dLon;
70003 buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
70005 buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
70008 // determine a user-friendly endpoint for the scale
70009 for (i = 0; i < buckets.length; i++) {
70012 scale.dist = Math.floor(dist / val) * val;
70015 scale.dist = +dist.toFixed(2);
70019 dLon = geoMetersToLon(scale.dist / conversion, lat);
70020 scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
70022 scale.text = displayLength(scale.dist / conversion, isImperial);
70028 function update(selection) {
70029 // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
70030 var dims = context.map().dimensions(),
70031 loc1 = projection.invert([0, dims[1]]),
70032 loc2 = projection.invert([maxLength, dims[1]]),
70033 scale = scaleDefs(loc1, loc2);
70035 selection.select('#scale-path')
70036 .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
70038 selection.select('#scale-textgroup')
70039 .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
70041 selection.select('#scale-text')
70046 return function(selection) {
70047 function switchUnits() {
70048 isImperial = !isImperial;
70049 selection.call(update);
70052 var scalegroup = selection.append('svg')
70053 .attr('id', 'scale')
70054 .on('click', switchUnits)
70056 .attr('transform', 'translate(10,11)');
70060 .attr('id', 'scale-path');
70064 .attr('id', 'scale-textgroup')
70066 .attr('id', 'scale-text');
70068 selection.call(update);
70070 context.map().on('move.scale', function() {
70076 function uiSidebar$$1(context) {
70077 var inspector = uiInspector(context);
70078 var dataEditor = uiDataEditor$$1(context);
70079 var noteEditor = uiNoteEditor$$1(context);
70081 var _wasData = false;
70082 var _wasNote = false;
70085 function sidebar(selection$$1) {
70086 var featureListWrap = selection$$1
70088 .attr('class', 'feature-list-pane')
70089 .call(uiFeatureList(context));
70091 var inspectorWrap = selection$$1
70093 .attr('class', 'inspector-hidden inspector-wrap fr');
70096 function hover(datum) {
70097 if (datum && datum.__featurehash__) { // hovering on data
70100 .show(dataEditor.datum(datum));
70102 selection$$1.selectAll('.sidebar-component')
70103 .classed('inspector-hover', true);
70105 } else if (datum instanceof osmNote) {
70106 if (context.mode().id === 'drag-note') return;
70110 .show(noteEditor.note(datum));
70112 selection$$1.selectAll('.sidebar-component')
70113 .classed('inspector-hover', true);
70115 } else if (!_current && (datum instanceof osmEntity$$1)) {
70117 .classed('inspector-hidden', true);
70120 .classed('inspector-hidden', false)
70121 .classed('inspector-hover', true);
70123 if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
70126 .entityID(datum.id);
70132 } else if (!_current) {
70134 .classed('inspector-hidden', false);
70136 .classed('inspector-hidden', true);
70140 } else if (_wasData || _wasNote) {
70143 d3_selectAll('.note').classed('hover', false);
70149 sidebar.hover = throttle(hover, 200);
70152 sidebar.select = function(id, newFeature) {
70153 if (!_current && id) {
70155 .classed('inspector-hidden', true);
70158 .classed('inspector-hidden', false)
70159 .classed('inspector-hover', false);
70161 if (inspector.entityID() !== id || inspector.state() !== 'select') {
70165 .newFeature(newFeature);
70171 } else if (!_current) {
70173 .classed('inspector-hidden', false);
70175 .classed('inspector-hidden', true);
70182 sidebar.show = function(component, element) {
70184 .classed('inspector-hidden', true);
70186 .classed('inspector-hidden', true);
70188 if (_current) _current.remove();
70189 _current = selection$$1
70191 .attr('class', 'sidebar-component')
70192 .call(component, element);
70196 sidebar.hide = function() {
70198 .classed('inspector-hidden', false);
70200 .classed('inspector-hidden', true);
70202 if (_current) _current.remove();
70208 sidebar.hover = function() {};
70209 sidebar.hover.cancel = function() {};
70210 sidebar.select = function() {};
70211 sidebar.show = function() {};
70212 sidebar.hide = function() {};
70217 function uiSpinner(context) {
70218 var osm = context.connection();
70221 return function(selection) {
70222 var img = selection
70224 .attr('src', context.imagePath('loader-black.gif'))
70225 .style('opacity', 0);
70229 .on('loading.spinner', function() {
70231 .style('opacity', 1);
70233 .on('loaded.spinner', function() {
70235 .style('opacity', 0);
70241 function uiSplash(context) {
70243 return function(selection) {
70244 if (context.storage('sawSplash'))
70247 context.storage('sawSplash', true);
70249 var modalSelection = uiModal(selection);
70251 modalSelection.select('.modal')
70252 .attr('class', 'modal-splash modal col6');
70254 var introModal = modalSelection.select('.content')
70256 .attr('class', 'fillL');
70260 .attr('class','modal-section cf')
70261 .append('h3').text(t('splash.welcome'));
70265 .attr('class','modal-section')
70267 .html(t('splash.text', {
70268 version: context.version,
70269 website: '<a href="http://ideditor.com/">ideditor.com</a>',
70270 github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
70273 var buttonWrap = introModal
70275 .attr('class', 'modal-actions cf');
70277 var walkthrough = buttonWrap
70279 .attr('class', 'walkthrough col6')
70280 .on('click', function() {
70281 context.container().call(uiIntro(context));
70282 modalSelection.close();
70287 .attr('class', 'logo logo-walkthrough')
70289 .attr('xlink:href', '#iD-logo-walkthrough');
70293 .text(t('splash.walkthrough'));
70295 var startEditing = buttonWrap
70297 .attr('class', 'start-editing col6')
70298 .on('click', modalSelection.close);
70302 .attr('class', 'logo logo-features')
70304 .attr('xlink:href', '#iD-logo-features');
70308 .text(t('splash.start'));
70311 modalSelection.select('button.close')
70312 .attr('class','hide');
70317 function uiStatus(context) {
70318 var osm = context.connection();
70321 return function(selection$$1) {
70324 function update() {
70325 osm.status(function(err, apiStatus) {
70326 selection$$1.html('');
70329 if (apiStatus === 'connectionSwitched') {
70330 // if the connection was just switched, we can't rely on
70331 // the status (we're getting the status of the previous api)
70334 } else if (apiStatus === 'rateLimited') {
70336 .text(t('status.rateLimit'))
70338 .attr('class', 'api-status-login')
70339 .attr('target', '_blank')
70340 .call(svgIcon('#iD-icon-out-link', 'inline'))
70343 .on('click.login', function() {
70344 event.preventDefault();
70345 osm.authenticate();
70348 // eslint-disable-next-line no-warning-comments
70349 // TODO: nice messages for different error types
70350 selection$$1.text(t('status.error'));
70353 } else if (apiStatus === 'readonly') {
70354 selection$$1.text(t('status.readonly'));
70355 } else if (apiStatus === 'offline') {
70356 selection$$1.text(t('status.offline'));
70359 selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
70363 osm.on('change', function() { update(selection$$1); });
70365 window.setInterval(update, 90000);
70366 update(selection$$1);
70370 function uiUndoRedo(context) {
70374 action: function() { if (editable()) context.undo(); },
70375 annotation: function() { return context.history().undoAnnotation(); }
70379 action: function() { if (editable()) context.redo(); },
70380 annotation: function() { return context.history().redoAnnotation(); }
70384 function editable() {
70385 var mode = context.mode();
70386 return context.editable() && mode && mode.id !== 'save';
70390 return function(selection$$1) {
70391 var tooltipBehavior = tooltip()
70392 .placement('bottom')
70394 .title(function (d) {
70395 return uiTooltipHtml(d.annotation() ?
70396 t(d.id + '.tooltip', {action: d.annotation()}) :
70397 t(d.id + '.nothing'), d.cmd);
70400 var buttons = selection$$1.selectAll('button')
70404 .attr('class', function(d) { return 'col6 disabled ' + d.id + '-button'; })
70405 .on('click', function(d) { return d.action(); })
70406 .call(tooltipBehavior);
70408 buttons.each(function(d) {
70409 var iconName = d.id;
70410 if (textDirection === 'rtl') {
70411 if (iconName === 'undo') {
70413 } else if (iconName === 'redo') {
70418 .call(svgIcon('#iD-icon-' + iconName));
70421 var keybinding = d3keybinding('undo')
70422 .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
70423 .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
70429 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
70432 .on('move.undo_redo', debouncedUpdate)
70433 .on('drawn.undo_redo', debouncedUpdate);
70436 .on('change.undo_redo', update);
70439 .on('enter.undo_redo', update);
70442 function update() {
70444 .property('disabled', !editable())
70445 .classed('disabled', function(d) { return !d.annotation(); })
70447 var selection$$1 = select(this);
70448 if (selection$$1.property('tooltipVisible')) {
70449 selection$$1.call(tooltipBehavior.show);
70456 // these are module variables so they are preserved through a ui.restart()
70457 var sawVersion = null;
70458 var isNewVersion = false;
70459 var isNewUser = false;
70462 function uiVersion(context) {
70464 var currVersion = context.version;
70465 var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
70467 if (sawVersion === null && matchedVersion !== null) {
70468 isNewVersion = (context.storage('sawVersion') !== currVersion);
70469 isNewUser = !context.storage('sawSplash');
70470 context.storage('sawVersion', currVersion);
70471 sawVersion = currVersion;
70474 return function(selection) {
70477 .attr('target', '_blank')
70478 .attr('tabindex', -1)
70479 .attr('href', 'https://github.com/openstreetmap/iD')
70480 .text(currVersion);
70482 // only show new version indicator to users that have used iD before
70483 if (isNewVersion && !isNewUser) {
70486 .attr('class', 'badge')
70488 .attr('target', '_blank')
70489 .attr('tabindex', -1)
70490 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
70491 .call(svgIcon('#maki-gift-11'))
70493 .title(t('version.whats_new', { version: currVersion }))
70500 function uiZoom(context) {
70504 title: t('zoom.in'),
70505 action: context.zoomIn,
70510 title: t('zoom.out'),
70511 action: context.zoomOut,
70516 function zoomIn() {
70517 event.preventDefault();
70522 function zoomOut() {
70523 event.preventDefault();
70528 function zoomInFurther() {
70529 event.preventDefault();
70530 context.zoomInFurther();
70534 function zoomOutFurther() {
70535 event.preventDefault();
70536 context.zoomOutFurther();
70540 return function(selection$$1) {
70541 var button = selection$$1.selectAll('button')
70545 .attr('tabindex', -1)
70546 .attr('class', function(d) { return d.id; })
70547 .on('click.editor', function(d) { d.action(); })
70549 .placement((textDirection === 'rtl') ? 'right' : 'left')
70551 .title(function(d) {
70552 return uiTooltipHtml(d.title, d.key);
70556 button.each(function(d) {
70558 .call(svgIcon('#iD-icon-' + d.icon, 'light'));
70561 var keybinding = d3keybinding('zoom');
70563 ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
70564 keybinding.on([key], zoomIn);
70565 keybinding.on([uiCmd('⌘' + key)], zoomInFurther);
70568 ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
70569 keybinding.on([key], zoomOut);
70570 keybinding.on([uiCmd('⌘' + key)], zoomOutFurther);
70578 function uiInit(context) {
70579 var uiInitCounter = 0;
70580 var dispatch$$1 = dispatch('photoviewerResize');
70583 function render(container) {
70585 .attr('dir', textDirection);
70587 var map = context.map();
70589 var hash = behaviorHash(context);
70592 if (!hash.hadHash) {
70593 map.centerZoom([0, 0], 2);
70598 .attr('id', 'defs')
70599 .call(svgDefs(context));
70603 .attr('id', 'sidebar')
70604 .attr('class', 'col4')
70607 var content = container
70609 .attr('id', 'content')
70610 .attr('class', 'active');
70615 .attr('class', 'fillD');
70620 .attr('dir', 'ltr')
70624 .call(uiMapInMap(context))
70625 .call(uiInfo(context))
70626 .call(uiNotice(context));
70630 .attr('class', 'spacer col4');
70632 var limiter = bar.append('div')
70633 .attr('class', 'limiter');
70637 .attr('class', 'button-wrap joined col3')
70638 .call(uiModes(context), limiter);
70642 .attr('class', 'button-wrap joined col1')
70643 .call(uiUndoRedo(context));
70647 .attr('class', 'button-wrap col1')
70648 .call(uiSave(context));
70652 .attr('class', 'full-screen')
70653 .call(uiFullScreen(context));
70657 .attr('class', 'spinner')
70658 .call(uiSpinner(context));
70663 .attr('class', 'map-controls');
70667 .attr('class', 'map-control zoombuttons')
70668 .call(uiZoom(context));
70672 .attr('class', 'map-control geolocate-control')
70673 .call(uiGeolocate(context));
70677 .attr('class', 'map-control background-control')
70678 .call(uiBackground(context));
70682 .attr('class', 'map-control map-data-control')
70683 .call(uiMapData(context));
70687 .attr('class', 'map-control help-control')
70688 .call(uiHelp(context));
70691 var about = content
70693 .attr('id', 'about');
70697 .attr('id', 'attrib')
70698 .attr('dir', 'ltr')
70699 .call(uiAttribution(context));
70703 .attr('class', 'api-status')
70704 .call(uiStatus(context));
70709 .attr('id', 'footer')
70710 .attr('class', 'fillD');
70714 .attr('id', 'flash-wrap')
70715 .attr('class', 'footer-hide');
70717 var footerWrap = footer
70719 .attr('id', 'footer-wrap')
70720 .attr('class', 'footer-show');
70724 .attr('id', 'scale-block')
70725 .call(uiScale(context));
70727 var aboutList = footerWrap
70729 .attr('id', 'info-block')
70731 .attr('id', 'about-list');
70733 if (!context.embed()) {
70735 .call(uiAccount(context));
70740 .attr('class', 'version')
70741 .call(uiVersion(context));
70743 var issueLinks = aboutList
70748 .attr('target', '_blank')
70749 .attr('tabindex', -1)
70750 .attr('href', 'https://github.com/openstreetmap/iD/issues')
70751 .call(svgIcon('#iD-icon-bug', 'light'))
70752 .call(tooltip().title(t('report_a_bug')).placement('top'));
70756 .attr('target', '_blank')
70757 .attr('tabindex', -1)
70758 .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
70759 .call(svgIcon('#iD-icon-translate', 'light'))
70760 .call(tooltip().title(t('help_translate')).placement('top'));
70764 .attr('class', 'feature-warning')
70765 .attr('tabindex', -1)
70766 .call(uiFeatureInfo(context));
70770 .attr('class', 'user-list')
70771 .attr('tabindex', -1)
70772 .call(uiContributors(context));
70775 var photoviewer = content
70777 .attr('id', 'photoviewer')
70778 .classed('al', true) // 'al'=left, 'ar'=right
70779 .classed('hide', true);
70783 .attr('class', 'thumb-hide')
70784 .on('click', function () {
70785 if (services.streetside) { services.streetside.hideViewer(); }
70786 if (services.mapillary) { services.mapillary.hideViewer(); }
70787 if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
70790 .call(svgIcon('#iD-icon-close'));
70794 .attr('class', 'resize-handle-xy')
70797 buildResizeListener(photoviewer, 'photoviewerResize', dispatch$$1, { resizeOnX: true, resizeOnY: true })
70802 .attr('class', 'resize-handle-x')
70805 buildResizeListener(photoviewer, 'photoviewerResize', dispatch$$1, { resizeOnX: true })
70810 .attr('class', 'resize-handle-y')
70813 buildResizeListener(photoviewer, 'photoviewerResize', dispatch$$1, { resizeOnY: true })
70816 var mapDimensions = map.dimensions();
70819 window.onbeforeunload = function() {
70820 return context.save();
70823 window.onunload = function() {
70824 context.history().unlock();
70828 .on('resize.editor', onResize);
70833 var pa = 80; // pan amount
70834 var keybinding = d3keybinding('main')
70835 .on('⌫', function() { event.preventDefault(); })
70836 .on('←', pan([pa, 0]))
70837 .on('↑', pan([0, pa]))
70838 .on('→', pan([-pa, 0]))
70839 .on('↓', pan([0, -pa]))
70840 .on(['⇧←', uiCmd('⌘←')], pan([mapDimensions[0], 0]))
70841 .on(['⇧↑', uiCmd('⌘↑')], pan([0, mapDimensions[1]]))
70842 .on(['⇧→', uiCmd('⌘→')], pan([-mapDimensions[0], 0]))
70843 .on(['⇧↓', uiCmd('⌘↓')], pan([0, -mapDimensions[1]]));
70848 context.enter(modeBrowse(context));
70850 if (!uiInitCounter++) {
70851 if (!hash.startWalkthrough) {
70852 context.container()
70853 .call(uiSplash(context))
70854 .call(uiRestore(context));
70857 context.container()
70858 .call(uiShortcuts(context));
70861 var osm = context.connection();
70862 var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
70866 .on('authLoading.ui', function() {
70867 context.container()
70870 .on('authDone.ui', function() {
70877 if (hash.startWalkthrough) {
70878 hash.startWalkthrough = false;
70879 context.container().call(uiIntro(context));
70883 function onResize() {
70884 mapDimensions = utilGetDimensions(content, true);
70885 map.dimensions(mapDimensions);
70887 // shrink photo viewer if it is too big
70888 // (-90 preserves space at top and bottom of map used by menus)
70889 var photoDimensions = utilGetDimensions(photoviewer, true);
70890 if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
70891 var setPhotoDimensions = [
70892 Math.min(photoDimensions[0], mapDimensions[0]),
70893 Math.min(photoDimensions[1], mapDimensions[1] - 90),
70897 .style('width', setPhotoDimensions[0] + 'px')
70898 .style('height', setPhotoDimensions[1] + 'px');
70900 dispatch$$1.call('photoviewerResize', photoviewer, setPhotoDimensions);
70906 return function() {
70907 event.preventDefault();
70908 context.pan(d, 100);
70912 function buildResizeListener(target, eventName, dispatch$$1, options) {
70913 var resizeOnX = !!options.resizeOnX;
70914 var resizeOnY = !!options.resizeOnY;
70915 var minHeight = options.minHeight || 240;
70916 var minWidth = options.minWidth || 320;
70922 function startResize() {
70923 var mapSize = context.map().dimensions();
70926 var maxWidth = mapSize[0];
70927 var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
70928 target.style('width', newWidth + 'px');
70932 var maxHeight = mapSize[1] - 90; // preserve space at top/bottom of map
70933 var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
70934 target.style('height', newHeight + 'px');
70937 dispatch$$1.call(eventName, target, utilGetDimensions(target, true));
70940 function clamp(num, min, max) {
70941 return Math.max(min, Math.min(num, max));
70944 function stopResize() {
70946 .on('.' + eventName, null);
70949 return function initResize() {
70950 startX = event.clientX;
70951 startY = event.clientY;
70952 startWidth = target.node().getBoundingClientRect().width;
70953 startHeight = target.node().getBoundingClientRect().height;
70956 .on('mousemove.' + eventName, startResize, false)
70957 .on('mouseup.' + eventName, stopResize, false);
70963 var renderCallback;
70965 function ui(node, callback) {
70966 renderCallback = callback;
70967 var container = select(node);
70968 context.container(container);
70969 context.loadLocale(function(err) {
70980 ui.restart = function(arg) {
70981 context.locale(arg);
70982 context.loadLocale(function(err) {
70984 context.container().selectAll('*').remove();
70985 render(context.container());
70986 if (renderCallback) renderCallback();
70992 ui.sidebar = uiSidebar$$1(context);
70994 return utilRebind(ui, dispatch$$1, 'on');
70997 function d3combobox() {
70998 var dispatch$$1 = dispatch('accept');
70999 var _container = select(document.body);
71001 var _suggestions = [];
71003 var _caseSensitive = false;
71005 var _fetcher = function(val, cb) {
71006 cb(_data.filter(function(d) {
71010 .indexOf(val.toLowerCase()) !== -1;
71014 var combobox = function(input, attachTo) {
71016 var wrapper = _container
71017 .selectAll('div.combobox')
71018 .filter(function(d) { return d === input.node(); });
71019 var shown = !wrapper.empty();
71020 var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
71023 .classed('combobox-input', true)
71024 .on('focus.typeahead', focus)
71025 .on('blur.typeahead', blur)
71026 .on('keydown.typeahead', keydown)
71027 .on('keyup.typeahead', keyup)
71028 .on('input.typeahead', change)
71030 var parent = this.parentNode;
71031 var sibling = this.nextSibling;
71033 var caret = select(parent).selectAll('.combobox-caret')
71034 .filter(function(d) { return d === input.node(); })
71035 .data([input.node()]);
71037 caret = caret.enter()
71038 .insert('div', function() { return sibling; })
71039 .attr('class', 'combobox-caret')
71043 .on('mousedown', function () {
71044 // prevent the form element from blurring. it blurs
71046 event.stopPropagation();
71047 event.preventDefault();
71049 input.node().focus();
71058 fetch(value(), render);
71062 window.setTimeout(hide, 150);
71067 wrapper = _container
71068 .insert('div', ':first-child')
71069 .datum(input.node())
71070 .attr('class', 'combobox')
71071 .style('position', 'absolute')
71072 .style('display', 'block')
71073 .style('left', '0px')
71074 .on('mousedown', function () {
71075 // prevent moving focus out of the text field
71076 event.preventDefault();
71080 .on('scroll.combobox', render, true);
71092 .on('scroll.combobox', null);
71098 function keydown() {
71099 switch (event.keyCode) {
71100 // backspace, delete
71103 input.on('input.typeahead', function() {
71106 var start = input.property('selectionStart');
71107 input.node().setSelectionRange(start, start);
71108 input.on('input.typeahead', change);
71113 wrapper.selectAll('a.selected').each(function (d) {
71114 dispatch$$1.call('accept', this, d);
71120 event.preventDefault();
71124 if (tagName === 'textarea' && !shown) return;
71126 event.preventDefault();
71130 if (tagName === 'textarea' && !shown) return;
71132 event.preventDefault();
71135 event.stopPropagation();
71139 switch (event.keyCode) {
71146 wrapper.selectAll('a.selected').each(function (d) {
71147 dispatch$$1.call('accept', this, d);
71154 function change() {
71155 fetch(value(), function() {
71156 if (input.property('selectionEnd') === input.property('value').length) {
71163 function nav(dir) {
71164 if (!_suggestions.length) return;
71165 idx = Math.max(Math.min(idx + dir, _suggestions.length - 1), 0);
71166 input.property('value', _suggestions[idx].value);
71172 var value = input.property('value');
71173 var start = input.property('selectionStart');
71174 var end = input.property('selectionEnd');
71176 if (start && end) {
71177 value = value.substring(0, start);
71183 function fetch(v, cb) {
71184 _fetcher.call(input, v, function(_) {
71190 function autocomplete() {
71191 var v = _caseSensitive ? value() : value().toLowerCase();
71195 // Don't autocomplete if user is typing a number - #4935
71196 if (!isNaN(parseFloat(v)) && isFinite(v)) return;
71199 var suggestion, compare;
71201 for (var i = 0; i < _suggestions.length; i++) {
71202 suggestion = _suggestions[i].value;
71203 compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
71205 // if search string matches suggestion exactly, pick it..
71206 if (compare === v) {
71210 // otherwise lock in the first result that starts with the search string..
71211 } else if (best === -1 && compare.indexOf(v) === 0) {
71218 suggestion = _suggestions[best].value;
71219 input.property('value', suggestion);
71220 input.node().setSelectionRange(v.length, suggestion.length);
71224 function render() {
71225 if (_suggestions.length >= _minItems && document.activeElement === input.node()) {
71232 var options = wrapper
71233 .selectAll('a.combobox-option')
71234 .data(_suggestions, function(d) { return d.value; });
71241 .attr('class', 'combobox-option')
71242 .text(function(d) { return d.value; })
71244 .attr('title', function(d) { return d.title; })
71245 .classed('selected', function(d, i) { return i === idx; })
71246 .on('mouseover', select$$1)
71247 .on('click', accept)
71251 var node = attachTo ? attachTo.node() : input.node();
71252 var rect = node.getBoundingClientRect();
71255 .style('left', (rect.left + 5) + 'px')
71256 .style('width', (rect.width - 10) + 'px')
71257 .style('top', rect.height + rect.top + 'px');
71260 function select$$1(d, i) {
71265 function ensureVisible() {
71266 var node = wrapper.selectAll('a.selected').node();
71267 if (node) node.scrollIntoView();
71270 function accept(d) {
71271 if (!shown) return;
71272 input.property('value', d.value);
71273 utilTriggerEvent(input, 'change');
71274 dispatch$$1.call('accept', this, d);
71279 combobox.fetcher = function(_) {
71280 if (!arguments.length) return _fetcher;
71285 combobox.data = function(_) {
71286 if (!arguments.length) return _data;
71291 combobox.minItems = function(_) {
71292 if (!arguments.length) return _minItems;
71297 combobox.caseSensitive = function(_) {
71298 if (!arguments.length) return _caseSensitive;
71299 _caseSensitive = _;
71303 combobox.container = function(_) {
71304 if (!arguments.length) return _container;
71309 return utilRebind(combobox, dispatch$$1, 'on');
71313 d3combobox.off = function(input) {
71315 .on('focus.typeahead', null)
71316 .on('blur.typeahead', null)
71317 .on('keydown.typeahead', null)
71318 .on('keyup.typeahead', null)
71319 .on('input.typeahead', null)
71321 select(this.parentNode).selectAll('.combobox-caret')
71322 .filter(function(d) { return d === input.node(); })
71323 .on('mousedown', null);
71327 .on('scroll.combobox', null);
71330 // This currently only works with the 'restrictions' field
71331 // It borrows some code from uiHelp
71333 function uiFieldHelp(context, fieldName) {
71334 var fieldHelp = {};
71335 var _inspector = select(null);
71336 var _wrap = select(null);
71337 var _body = select(null);
71339 var fieldHelpKeys = {
71367 'indirect_example',
71373 var fieldHelpHeadings = {};
71375 var replacements = {
71376 distField: t('restriction.controls.distance'),
71377 viaField: t('restriction.controls.via'),
71378 fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
71379 allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
71380 restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
71381 onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
71382 allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
71383 restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
71384 onlyTurn: icon('#iD-turn-only', 'pre-text turn')
71388 // For each section, squash all the texts into a single markdown document
71389 var docs = fieldHelpKeys[fieldName].map(function(key) {
71390 var helpkey = 'help.field.' + fieldName + '.' + key[0];
71391 var text = key[1].reduce(function(all, part) {
71392 var subkey = helpkey + '.' + part;
71393 var depth = fieldHelpHeadings[subkey]; // is this subkey a heading?
71394 var hhh = depth ? Array(depth + 1).join('#') + ' ' : ''; // if so, prepend with some ##'s
71395 return all + hhh + t(subkey, replacements) + '\n\n';
71400 title: t(helpkey + '.title'),
71401 html: marked(text.trim())
71410 .classed('hide', false)
71411 .style('opacity', '0')
71414 .style('opacity', '1');
71420 .classed('hide', true)
71423 .style('opacity', '0')
71424 .on('end', function () {
71425 _body.classed('hide', true);
71430 function clickHelp(index) {
71431 var d = docs[index];
71432 var tkeys = fieldHelpKeys[fieldName][index][1];
71434 _body.selectAll('.field-help-nav-item')
71435 .classed('active', function(d, i) { return i === index; });
71437 var content = _body.selectAll('.field-help-content')
71440 // class the paragraphs so we can find and style them
71441 content.selectAll('p')
71442 .attr('class', function(d, i) { return tkeys[i]; });
71444 // insert special content for certain help sections
71445 if (d.key === 'help.field.restrictions.inspecting') {
71447 .insert('img', 'p.from_shadow')
71448 .attr('class', 'field-help-image cf')
71449 .attr('src', context.imagePath('tr_inspect.gif'));
71451 } else if (d.key === 'help.field.restrictions.modifying') {
71453 .insert('img', 'p.allow_turn')
71454 .attr('class', 'field-help-image cf')
71455 .attr('src', context.imagePath('tr_modify.gif'));
71460 fieldHelp.button = function(selection$$1) {
71461 if (_body.empty()) return;
71463 var button = selection$$1.selectAll('.field-help-button')
71469 .attr('class', 'field-help-button')
71470 .attr('tabindex', -1)
71471 .call(svgIcon('#iD-icon-help'))
71473 .on('click', function () {
71474 event.stopPropagation();
71475 event.preventDefault();
71476 if (_body.classed('hide')) {
71485 function updatePosition() {
71486 var wrap = _wrap.node();
71487 var inspector = _inspector.node();
71488 var wRect = wrap.getBoundingClientRect();
71489 var iRect = inspector.getBoundingClientRect();
71492 .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
71496 fieldHelp.body = function(selection$$1) {
71497 // This control expects the field to have a preset-input-wrap div
71498 _wrap = selection$$1.selectAll('.preset-input-wrap');
71499 if (_wrap.empty()) return;
71501 // absolute position relative to the inspector, so it "floats" above the fields
71502 _inspector = select('#sidebar .entity-editor-pane .inspector-body');
71503 if (_inspector.empty()) return;
71505 _body = _inspector.selectAll('.field-help-body')
71508 var enter = _body.enter()
71510 .attr('class', 'field-help-body hide'); // initially hidden
71512 var titleEnter = enter
71514 .attr('class', 'field-help-title cf');
71518 .attr('class', 'fl')
71519 .text(t('help.field.' + fieldName + '.title'));
71523 .attr('class', 'fr close')
71524 .on('click', function() {
71525 event.stopPropagation();
71526 event.preventDefault();
71529 .call(svgIcon('#iD-icon-close'));
71531 var navEnter = enter
71533 .attr('class', 'field-help-nav cf');
71535 var titles = docs.map(function(d) { return d.title; });
71536 navEnter.selectAll('.field-help-nav-item')
71540 .attr('class', 'field-help-nav-item')
71541 .text(function(d) { return d; })
71542 .on('click', function(d, i) {
71543 event.stopPropagation();
71544 event.preventDefault();
71550 .attr('class', 'field-help-content');
71562 function uiFieldCheck(field, context) {
71563 var dispatch$$1 = dispatch('change');
71564 var options = field.strings && field.strings.options;
71568 var input = select(null);
71569 var text = select(null);
71570 var label = select(null);
71571 var reverser = select(null);
71579 for (var k in options) {
71580 values.push(k === 'undefined' ? undefined : k);
71581 texts.push(field.t('options.' + k, { 'default': options[k] }));
71584 values = [undefined, 'yes'];
71585 texts = [t('inspector.unknown'), t('inspector.check.yes')];
71586 if (field.type !== 'defaultCheck') {
71588 texts.push(t('inspector.check.no'));
71593 // Checks tags to see whether an undefined value is "Assumed to be Yes"
71594 function checkImpliedYes() {
71595 _impliedYes = (field.id === 'oneway_yes');
71597 // hack: pretend `oneway` field is a `oneway_yes` field
71598 // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
71599 if (field.id === 'oneway') {
71600 var entity = context.entity(_entityID);
71601 for (var key in entity.tags) {
71602 if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
71603 _impliedYes = true;
71604 texts[0] = t('presets.fields.oneway_yes.options.undefined');
71612 function reverserHidden() {
71613 if (!select('div.inspector-hover').empty()) return true;
71614 return !(_value === 'yes' || (_impliedYes && !_value));
71618 function reverserSetText(selection$$1) {
71619 var entity = context.hasEntity(_entityID);
71620 if (reverserHidden() || !entity) return selection$$1;
71622 var first = entity.first();
71623 var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
71624 var pseudoDirection = first < last;
71625 var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
71627 selection$$1.selectAll('.reverser-span')
71628 .text(t('inspector.check.reverser'))
71629 .call(svgIcon(icon, 'inline'));
71631 return selection$$1;
71635 var check = function(selection$$1) {
71637 selection$$1.classed('checkselect', 'true');
71639 label = selection$$1.selectAll('.preset-input-wrap')
71642 var enter = label.enter()
71644 .attr('class', 'preset-input-wrap');
71648 .property('indeterminate', field.type !== 'defaultCheck')
71649 .attr('type', 'checkbox')
71650 .attr('id', 'preset-input-' + field.safeid);
71655 .attr('class', 'value');
71657 if (field.type === 'onewayCheck') {
71660 .attr('id', 'preset-input-' + field.safeid + '-reverser')
71661 .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
71664 .attr('class', 'reverser-span');
71667 label = label.merge(enter);
71668 input = label.selectAll('input');
71669 text = label.selectAll('span.value');
71672 .on('click', function() {
71673 event.stopPropagation();
71675 t$$1[field.key] = values[(values.indexOf(_value) + 1) % values.length];
71677 // Don't cycle through `alternating` or `reversible` states - #4970
71678 // (They are supported as translated strings, but should not toggle with clicks)
71679 if (t$$1[field.key] === 'reversible' || t$$1[field.key] === 'alternating') {
71680 t$$1[field.key] = values[0];
71683 dispatch$$1.call('change', this, t$$1);
71686 if (field.type === 'onewayCheck') {
71687 reverser = label.selectAll('.reverser');
71690 .call(reverserSetText)
71691 .on('click', function() {
71692 event.preventDefault();
71693 event.stopPropagation();
71695 actionReverse(_entityID),
71696 t('operations.reverse.annotation')
71699 .call(reverserSetText);
71705 check.entity = function(_) {
71706 if (!arguments.length) return context.hasEntity(_entityID);
71712 check.tags = function(tags) {
71714 function isChecked(val) {
71715 return val !== 'no' && val !== '' && val !== undefined && val !== null;
71718 function textFor(val) {
71719 if (val === '') val = undefined;
71720 var index = values.indexOf(val);
71721 return (index !== -1 ? texts[index] : ('"' + val + '"'));
71725 _value = tags[field.key] && tags[field.key].toLowerCase();
71727 if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
71732 .property('indeterminate', field.type !== 'defaultCheck' && !_value)
71733 .property('checked', isChecked(_value));
71736 .text(textFor(_value));
71739 .classed('set', !!_value);
71741 if (field.type === 'onewayCheck') {
71743 .classed('hide', reverserHidden())
71744 .call(reverserSetText);
71749 check.focus = function() {
71750 input.node().focus();
71753 return utilRebind(check, dispatch$$1, 'on');
71756 /** Used for built-in method references. */
71757 var arrayProto$1 = Array.prototype;
71759 /** Built-in value references. */
71760 var splice$1 = arrayProto$1.splice;
71763 * The base implementation of `_.pullAt` without support for individual
71764 * indexes or capturing the removed elements.
71767 * @param {Array} array The array to modify.
71768 * @param {number[]} indexes The indexes of elements to remove.
71769 * @returns {Array} Returns `array`.
71771 function basePullAt(array, indexes) {
71772 var length = array ? indexes.length : 0,
71773 lastIndex = length - 1;
71776 var index = indexes[length];
71777 if (length == lastIndex || index !== previous) {
71778 var previous = index;
71779 if (isIndex(index)) {
71780 splice$1.call(array, index, 1);
71782 baseUnset(array, index);
71790 * Removes all elements from `array` that `predicate` returns truthy for
71791 * and returns an array of the removed elements. The predicate is invoked
71792 * with three arguments: (value, index, array).
71794 * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
71795 * to pull elements from an array by value.
71801 * @param {Array} array The array to modify.
71802 * @param {Function} [predicate=_.identity] The function invoked per iteration.
71803 * @returns {Array} Returns the new array of removed elements.
71806 * var array = [1, 2, 3, 4];
71807 * var evens = _.remove(array, function(n) {
71808 * return n % 2 == 0;
71811 * console.log(array);
71814 * console.log(evens);
71817 function remove$8(array, predicate) {
71819 if (!(array && array.length)) {
71824 length = array.length;
71826 predicate = baseIteratee(predicate, 3);
71827 while (++index < length) {
71828 var value = array[index];
71829 if (predicate(value, index, array)) {
71830 result.push(value);
71831 indexes.push(index);
71834 basePullAt(array, indexes);
71838 function uiFieldCombo(field, context) {
71839 var dispatch$$1 = dispatch('change'),
71840 nominatim = services.geocoder,
71841 taginfo = services.taginfo,
71842 isMulti = (field.type === 'multiCombo'),
71843 isNetwork = (field.type === 'networkCombo'),
71844 isSemi = (field.type === 'semiCombo'),
71845 optstrings = field.strings && field.strings.options,
71846 optarray = field.options,
71847 snake_case = (field.snake_case || (field.snake_case === undefined)),
71848 caseSensitive = field.caseSensitive,
71849 combobox = d3combobox()
71850 .container(context.container())
71851 .caseSensitive(caseSensitive)
71852 .minItems(isMulti || isSemi ? 1 : 2),
71860 // ensure multiCombo field.key ends with a ':'
71861 if (isMulti && field.key.match(/:$/) === null) {
71866 function snake(s) {
71867 return s.replace(/\s+/g, '_');
71870 function unsnake(s) {
71871 return s.replace(/_+/g, ' ');
71874 function clean(s) {
71875 return s.split(';')
71876 .map(function(s) { return s.trim(); })
71881 // returns the tag value for a display value
71882 // (for multiCombo, dval should be the key suffix, not the entire key)
71883 function tagValue(dval) {
71884 dval = clean(dval || '');
71887 var match = find$1(comboData, function(o) {
71888 return o.key && clean(o.value) === dval;
71895 if (field.type === 'typeCombo' && !dval) {
71899 return (snake_case ? snake(dval) : dval) || undefined;
71903 // returns the display value for a tag value
71904 // (for multiCombo, tval should be the key suffix, not the entire key)
71905 function displayValue(tval) {
71909 var match = find$1(comboData, function(o) { return o.key === tval && o.value; });
71911 return match.value;
71915 if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
71919 return snake_case ? unsnake(tval) : tval;
71923 function objectDifference(a, b) {
71924 return reject(a, function(d1) {
71925 return some(b, function(d2) { return d1.value === d2.value; });
71930 function initCombo(selection$$1, attachTo) {
71932 selection$$1.attr('readonly', 'readonly');
71933 selection$$1.call(combobox, attachTo);
71934 setStaticValues(setPlaceholder);
71936 } else if (optarray) {
71937 selection$$1.call(combobox, attachTo);
71938 setStaticValues(setPlaceholder);
71940 } else if (taginfo) {
71941 selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
71942 setTaginfoValues('', setPlaceholder);
71947 function setStaticValues(callback) {
71948 if (!(optstrings || optarray)) return;
71951 comboData = Object.keys(optstrings).map(function(k) {
71952 var v = field.t('options.' + k, { 'default': optstrings[k] });
71960 } else if (optarray) {
71961 comboData = optarray.map(function(k) {
71962 var v = snake_case ? unsnake(k) : k;
71971 combobox.data(objectDifference(comboData, multiData));
71972 if (callback) callback(comboData);
71976 function setTaginfoValues(q, callback) {
71977 var fn = isMulti ? 'multikeys' : 'values';
71978 var query = (isMulti ? field.key : '') + q;
71979 var hasCountryPrefix = isNetwork && country && country.indexOf(q.toLowerCase()) === 0;
71980 if (hasCountryPrefix) {
71981 query = country + ':';
71985 debounce: (q !== ''),
71991 params.geometry = context.geometry(entity.id);
71994 taginfo[fn](params, function(err, data) {
71996 if (hasCountryPrefix) {
71997 data = filter(data, function(d) {
71998 return d.value.toLowerCase().indexOf(country + ':') === 0;
72002 comboData = map$3(data, function(d) {
72004 if (isMulti) k = k.replace(field.key, '');
72005 var v = snake_case ? unsnake(k) : k;
72009 title: isMulti ? v : d.title
72013 comboData = objectDifference(comboData, multiData);
72014 if (callback) callback(comboData);
72019 function setPlaceholder(d) {
72022 if (isMulti || isSemi) {
72023 ph = field.placeholder() || t('inspector.add');
72025 var vals = map$3(d, 'value').filter(function(s) { return s.length < 20; }),
72026 placeholders = vals.length > 1 ? vals : map$3(d, 'key');
72027 ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
72030 if (ph.match(/(…|\.\.\.)$/) === null) {
72034 container.selectAll('input')
72035 .attr('placeholder', ph);
72039 function change() {
72040 var val = tagValue(utilGetSetValue(input)),
72043 if (isMulti || isSemi) {
72045 container.classed('active', false);
72046 utilGetSetValue(input, '');
72048 field.keys.push(field.key + val);
72049 t$$1[field.key + val] = 'yes';
72050 } else if (isSemi) {
72051 var arr = multiData.map(function(d) { return d.key; });
72053 t$$1[field.key] = compact(uniq(arr)).join(';');
72055 window.setTimeout(function() { input.node().focus(); }, 10);
72058 t$$1[field.key] = val;
72061 dispatch$$1.call('change', this, t$$1);
72065 function removeMultikey(d) {
72066 event.stopPropagation();
72069 t$$1[d.key] = undefined;
72070 } else if (isSemi) {
72071 remove$8(multiData, function(md) { return md.key === d.key; });
72072 var arr = multiData.map(function(md) { return md.key; });
72073 arr = compact(uniq(arr));
72074 t$$1[field.key] = arr.length ? arr.join(';') : undefined;
72076 dispatch$$1.call('change', this, t$$1);
72080 function combo(selection$$1) {
72081 if (isMulti || isSemi) {
72082 container = selection$$1.selectAll('ul').data([0]);
72084 container = container.enter()
72086 .attr('class', 'form-field-multicombo')
72087 .on('click', function() {
72088 window.setTimeout(function() { input.node().focus(); }, 10);
72093 container = selection$$1;
72096 input = container.selectAll('input')
72099 input = input.enter()
72101 .attr('type', 'text')
72102 .attr('id', 'preset-input-' + field.safeid)
72104 .call(initCombo, selection$$1)
72107 if (isNetwork && nominatim && entity) {
72108 var center = entity.extent(context.graph()).center();
72109 nominatim.countryCode(center, function (err, code) {
72115 .on('change', change)
72116 .on('blur', change);
72118 if (isMulti || isSemi) {
72120 .on('accept', function() {
72121 input.node().blur();
72122 input.node().focus();
72126 .on('focus', function() { container.classed('active', true); });
72131 combo.tags = function(tags) {
72132 if (isMulti || isSemi) {
72136 // Build multiData array containing keys already set..
72137 Object.keys(tags).forEach(function(key) {
72138 if (key.indexOf(field.key) !== 0 || tags[key].toLowerCase() !== 'yes') return;
72140 var suffix = key.substring(field.key.length);
72143 value: displayValue(suffix)
72147 // Set keys for form-field modified (needed for undo and reset buttons)..
72148 field.keys = map$3(multiData, 'key');
72150 } else if (isSemi) {
72151 var arr = compact(uniq((tags[field.key] || '').split(';')));
72152 multiData = arr.map(function(key) {
72155 value: displayValue(key)
72160 // Exclude existing multikeys from combo options..
72161 var available = objectDifference(comboData, multiData);
72162 combobox.data(available);
72164 // Hide 'Add' button if this field uses fixed set of
72165 // translateable optstrings and they're all currently used..
72166 container.selectAll('.combobox-input, .combobox-caret')
72167 .classed('hide', optstrings && !available.length);
72171 var chips = container.selectAll('.chips')
72177 var enter = chips.enter()
72178 .insert('li', 'input')
72179 .attr('class', 'chips');
72181 enter.append('span');
72184 chips = chips.merge(enter);
72186 chips.select('span')
72187 .text(function(d) { return d.value; });
72190 .on('click', removeMultikey)
72191 .attr('class', 'remove')
72195 utilGetSetValue(input, displayValue(tags[field.key]));
72200 combo.focus = function() {
72201 input.node().focus();
72205 combo.entity = function(_) {
72206 if (!arguments.length) return entity;
72212 return utilRebind(combo, dispatch$$1, 'on');
72215 function uiFieldText(field, context) {
72216 var dispatch$$1 = dispatch('change');
72217 var nominatim = services.geocoder;
72222 function i(selection$$1) {
72223 var fieldId = 'preset-input-' + field.safeid;
72225 input = selection$$1.selectAll('input')
72228 input = input.enter()
72230 .attr('type', field.type)
72231 .attr('id', fieldId)
72232 .attr('placeholder', field.placeholder() || t('inspector.unknown'))
72237 .on('input', change(true))
72238 .on('blur', change())
72239 .on('change', change());
72241 if (field.type === 'tel' && nominatim && entity) {
72242 var center = entity.extent(context.graph()).center();
72243 nominatim.countryCode(center, function (err, countryCode) {
72244 if (err || !dataPhoneFormats[countryCode]) return;
72245 selection$$1.selectAll('#' + fieldId)
72246 .attr('placeholder', dataPhoneFormats[countryCode]);
72249 } else if (field.type === 'number') {
72250 var rtl = (textDirection === 'rtl');
72252 input.attr('type', 'text');
72254 var spinControl = selection$$1.selectAll('.spin-control')
72257 var enter = spinControl.enter()
72259 .attr('class', 'spin-control');
72263 .datum(rtl ? 1 : -1)
72264 .attr('class', rtl ? 'increment' : 'decrement')
72265 .attr('tabindex', -1);
72269 .datum(rtl ? -1 : 1)
72270 .attr('class', rtl ? 'decrement' : 'increment')
72271 .attr('tabindex', -1);
72273 spinControl = spinControl
72276 spinControl.selectAll('button')
72277 .on('click', function(d) {
72278 event.preventDefault();
72279 input.node().value = parsed(input.node().value) + d;
72286 // parse as a number
72287 function parsed(val) {
72288 return parseFloat(val || 0, 10) || 0;
72291 // clamp number to min/max
72292 function clamped(num) {
72293 if (field.minValue !== undefined) {
72294 num = Math.max(num, field.minValue);
72296 if (field.maxValue !== undefined) {
72297 num = Math.min(num, field.maxValue);
72303 function change(onInput) {
72304 return function() {
72306 var val = utilGetSetValue(input).trim() || undefined;
72309 if (field.type === 'number' && val !== undefined) {
72310 val = clamped(parsed(val)) + '';
72312 utilGetSetValue(input, val || '');
72314 t$$1[field.key] = val;
72315 dispatch$$1.call('change', this, t$$1, onInput);
72320 i.entity = function(_) {
72321 if (!arguments.length) return entity;
72327 i.tags = function(tags) {
72328 utilGetSetValue(input, tags[field.key] || '');
72332 i.focus = function() {
72333 var node = input.node();
72334 if (node) node.focus();
72337 return utilRebind(i, dispatch$$1, 'on');
72340 function uiFieldAccess(field, context) {
72341 var dispatch$$1 = dispatch('change'),
72344 function access(selection$$1) {
72345 var wrap = selection$$1.selectAll('.preset-input-wrap')
72348 wrap = wrap.enter()
72350 .attr('class', 'cf preset-input-wrap')
72354 var list = wrap.selectAll('ul')
72357 list = list.enter()
72362 items = list.selectAll('li')
72366 var enter = items.enter()
72368 .attr('class', function(d) { return 'cf preset-access-' + d; });
72372 .attr('class', 'col6 label preset-label-access')
72373 .attr('for', function(d) { return 'preset-input-access-' + d; })
72374 .text(function(d) { return field.t('types.' + d); });
72378 .attr('class', 'col6 preset-input-access-wrap')
72380 .attr('type', 'text')
72381 .attr('class', 'preset-input-access')
72382 .attr('id', function(d) { return 'preset-input-access-' + d; })
72384 .each(function(d) {
72387 .container(context.container())
72388 .data(access.options(d))
72394 items = items.merge(enter);
72396 wrap.selectAll('.preset-input-access')
72397 .on('change', change)
72398 .on('blur', change);
72402 function change(d) {
72404 tag[d] = utilGetSetValue(select(this)) || undefined;
72405 dispatch$$1.call('change', this, tag);
72409 access.options = function(type) {
72410 var options = ['no', 'permissive', 'private', 'permit', 'destination'];
72412 if (type !== 'access') {
72413 options.unshift('yes');
72414 options.push('designated');
72416 if (type === 'bicycle') {
72417 options.push('dismount');
72421 return options.map(function(option) {
72423 title: field.t('options.' + option + '.description'),
72430 var placeholders = {
72432 foot: 'designated',
72433 motor_vehicle: 'no'
72437 motor_vehicle: 'no',
72443 motor_vehicle: 'no'
72446 motor_vehicle: 'no',
72447 bicycle: 'designated'
72450 motor_vehicle: 'no',
72451 horse: 'designated'
72455 motor_vehicle: 'no',
72461 motor_vehicle: 'yes',
72466 motor_vehicle: 'yes'
72470 motor_vehicle: 'yes',
72476 motor_vehicle: 'yes',
72482 motor_vehicle: 'yes',
72488 motor_vehicle: 'yes',
72494 motor_vehicle: 'yes',
72500 motor_vehicle: 'yes',
72506 motor_vehicle: 'yes',
72511 motor_vehicle: 'yes'
72515 motor_vehicle: 'yes',
72521 motor_vehicle: 'yes',
72527 motor_vehicle: 'yes',
72534 access.tags = function(tags) {
72535 utilGetSetValue(items.selectAll('.preset-input-access'),
72536 function(d) { return tags[d] || ''; })
72537 .attr('placeholder', function() {
72538 return tags.access ? tags.access : field.placeholder();
72541 items.selectAll('#preset-input-access-access')
72542 .attr('placeholder', 'yes');
72544 forEach(placeholders[tags.highway], function(v, k) {
72545 items.selectAll('#preset-input-access-' + k)
72546 .attr('placeholder', function() { return (tags.access || v); });
72551 access.focus = function() {
72552 items.selectAll('.preset-input-access')
72557 return utilRebind(access, dispatch$$1, 'on');
72560 function uiFieldAddress(field, context) {
72561 var dispatch$$1 = dispatch('init', 'change'),
72562 nominatim = services.geocoder,
72563 wrap = select(null),
72564 isInitialized = false,
72567 function getNearStreets() {
72568 var extent = entity.extent(context.graph()),
72569 l = extent.center(),
72570 box = geoExtent$$1(l).padByMeters(200);
72572 var streets = context.intersects(box)
72573 .filter(isAddressable)
72575 var loc = context.projection([
72576 (extent[0][0] + extent[1][0]) / 2,
72577 (extent[0][1] + extent[1][1]) / 2]),
72578 choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
72580 title: d.tags.name,
72581 value: d.tags.name,
72582 dist: choice.distance
72585 .sort(function(a, b) {
72586 return a.dist - b.dist;
72589 return uniqBy(streets, 'value');
72591 function isAddressable(d) {
72592 return d.tags.highway && d.tags.name && d.type === 'way';
72597 function getNearCities() {
72598 var extent = entity.extent(context.graph()),
72599 l = extent.center(),
72600 box = geoExtent$$1(l).padByMeters(200);
72602 var cities = context.intersects(box)
72603 .filter(isAddressable)
72606 title: d.tags['addr:city'] || d.tags.name,
72607 value: d.tags['addr:city'] || d.tags.name,
72608 dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
72611 .sort(function(a, b) {
72612 return a.dist - b.dist;
72615 return uniqBy(cities, 'value');
72618 function isAddressable(d) {
72620 if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
72622 if (d.tags.border_type === 'city')
72624 if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
72628 if (d.tags['addr:city'])
72635 function getNearValues(key) {
72636 var extent = entity.extent(context.graph()),
72637 l = extent.center(),
72638 box = geoExtent$$1(l).padByMeters(200);
72640 var results = context.intersects(box)
72641 .filter(function hasTag(d) {
72642 return d.tags[key];
72646 title: d.tags[key],
72647 value: d.tags[key],
72648 dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
72651 .sort(function(a, b) {
72652 return a.dist - b.dist;
72655 return uniqBy(results, 'value');
72659 function initCallback(err, countryCode) {
72662 var addressFormat = find$1(dataAddressFormats, function (a) {
72663 return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
72664 }) || dataAddressFormats[0];
72666 var widths = addressFormat.widths || {
72667 housenumber: 1/3, street: 2/3,
72668 city: 2/3, state: 1/4, postcode: 1/3
72672 // Normalize widths.
72673 var total = reduce(r, function(sum, field) {
72674 return sum + (widths[field] || 0.5);
72677 return r.map(function (field) {
72680 width: (widths[field] || 0.5) / total
72685 wrap.selectAll('div.addr-row')
72686 .data(addressFormat.format)
72689 .attr('class', 'addr-row')
72690 .selectAll('input')
72694 .property('type', 'text')
72695 .attr('placeholder', function (d) {
72696 var localkey = d.id + '!' + countryCode.toLowerCase(),
72697 tkey = field.strings.placeholders[localkey] ? localkey : d.id;
72698 return field.t('placeholders.' + tkey);
72700 .attr('class', function (d) { return 'addr-' + d.id; })
72702 .style('width', function (d) { return d.width * 100 + '%'; });
72706 // setup dropdowns for common address tags
72707 var dropdowns = addressFormat.dropdowns || [
72708 'city', 'county', 'country', 'district', 'hamlet',
72709 'neighbourhood', 'place', 'postcode', 'province',
72710 'quarter', 'state', 'street', 'subdistrict', 'suburb'
72713 // If fields exist for any of these tags, create dropdowns to pick nearby values..
72714 dropdowns.forEach(function(tag) {
72715 var nearValues = (tag === 'street') ? getNearStreets
72716 : (tag === 'city') ? getNearCities
72719 wrap.selectAll('input.addr-' + tag)
72721 .container(context.container())
72723 .fetcher(function(value, callback) {
72724 callback(nearValues('addr:' + tag));
72729 wrap.selectAll('input')
72730 .on('blur', change())
72731 .on('change', change());
72733 wrap.selectAll('input:not(.combobox-input)')
72734 .on('input', change(true));
72736 dispatch$$1.call('init');
72737 isInitialized = true;
72741 function address(selection$$1) {
72742 isInitialized = false;
72744 wrap = selection$$1.selectAll('.preset-input-wrap')
72747 wrap = wrap.enter()
72749 .attr('class', 'preset-input-wrap')
72752 if (nominatim && entity) {
72753 var center = entity.extent(context.graph()).center();
72754 nominatim.countryCode(center, initCallback);
72759 function change(onInput) {
72760 return function() {
72763 wrap.selectAll('input')
72764 .each(function (field) {
72765 tags['addr:' + field.id] = this.value || undefined;
72768 dispatch$$1.call('change', this, tags, onInput);
72773 function updateTags(tags) {
72774 utilGetSetValue(wrap.selectAll('input'), function (field) {
72775 return tags['addr:' + field.id] || '';
72780 address.entity = function(_) {
72781 if (!arguments.length) return entity;
72787 address.tags = function(tags) {
72788 if (isInitialized) {
72791 dispatch$$1.on('init', function () {
72792 dispatch$$1.on('init', null);
72799 address.focus = function() {
72800 var node = wrap.selectAll('input').node();
72801 if (node) node.focus();
72805 return utilRebind(address, dispatch$$1, 'on');
72808 function uiFieldCycleway(field, context) {
72809 var dispatch$$1 = dispatch('change'),
72810 items = select(null);
72813 function cycleway(selection$$1) {
72815 function stripcolon(s) {
72816 return s.replace(':', '');
72820 var wrap = selection$$1.selectAll('.preset-input-wrap')
72823 wrap = wrap.enter()
72825 .attr('class', 'cf preset-input-wrap')
72829 var div = wrap.selectAll('ul')
72837 items = div.selectAll('li')
72840 var enter = items.enter()
72842 .attr('class', function(d) { return 'cf preset-cycleway-' + stripcolon(d); });
72846 .attr('class', 'col6 label preset-label-cycleway')
72847 .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
72848 .text(function(d) { return field.t('types.' + d); });
72852 .attr('class', 'col6 preset-input-cycleway-wrap')
72854 .attr('type', 'text')
72855 .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
72857 .each(function(d) {
72860 .container(context.container())
72861 .data(cycleway.options(d))
72867 wrap.selectAll('.preset-input-cycleway')
72868 .on('change', change)
72869 .on('blur', change);
72873 function change() {
72874 var left = utilGetSetValue(select('.preset-input-cyclewayleft')),
72875 right = utilGetSetValue(select('.preset-input-cyclewayright')),
72878 if (left === 'none' || left === '') { left = undefined; }
72879 if (right === 'none' || right === '') { right = undefined; }
72881 // Always set both left and right as changing one can affect the other
72883 cycleway: undefined,
72884 'cycleway:left': left,
72885 'cycleway:right': right
72888 // If the left and right tags match, use the cycleway tag to tag both
72889 // sides the same way
72890 if (left === right) {
72893 'cycleway:left': undefined,
72894 'cycleway:right': undefined
72898 dispatch$$1.call('change', this, tag);
72902 cycleway.options = function() {
72903 return keys$1(field.strings.options).map(function(option) {
72905 title: field.t('options.' + option + '.description'),
72912 cycleway.tags = function(tags) {
72913 utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
72914 // If cycleway is set, always return that
72915 if (tags.cycleway) {
72916 return tags.cycleway;
72918 return tags[d] || '';
72920 .attr('placeholder', field.placeholder());
72924 cycleway.focus = function() {
72925 items.selectAll('.preset-input-cycleway')
72930 return utilRebind(cycleway, dispatch$$1, 'on');
72933 function uiFieldLanes(field, context) {
72934 var dispatch$$1 = dispatch('change'),
72940 function lanes(selection$$1) {
72941 lanesData = context.entity(wayID).lanes();
72943 if (!select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
72944 selection$$1.call(lanes.off);
72948 var wrap = selection$$1.selectAll('.preset-input-wrap')
72951 wrap = wrap.enter()
72953 .attr('class', 'preset-input-wrap')
72956 var surface = wrap.selectAll('.surface')
72959 var d = utilGetDimensions(wrap);
72960 var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
72962 surface = surface.enter()
72964 .attr('width', d[0])
72965 .attr('height', 300)
72966 .attr('class', 'surface')
72970 var lanesSelection = surface.selectAll('.lanes')
72973 lanesSelection = lanesSelection.enter()
72975 .attr('class', 'lanes')
72976 .merge(lanesSelection);
72979 .attr('transform', function () {
72980 return 'translate(' + (freeSpace / 2) + ', 0)';
72984 var lane = lanesSelection.selectAll('.lane')
72985 .data(lanesData.lanes);
72990 var enter = lane.enter()
72992 .attr('class', 'lane');
72998 .attr('width', LANE_WIDTH)
72999 .attr('height', LANE_HEIGHT);
73003 .attr('class', 'forward')
73011 .attr('class', 'bothways')
73019 .attr('class', 'backward')
73030 .attr('transform', function(d) {
73031 return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
73034 lane.select('.forward')
73035 .style('visibility', function(d) {
73036 return d.direction === 'forward' ? 'visible' : 'hidden';
73039 lane.select('.bothways')
73040 .style('visibility', function(d) {
73041 return d.direction === 'bothways' ? 'visible' : 'hidden';
73044 lane.select('.backward')
73045 .style('visibility', function(d) {
73046 return d.direction === 'backward' ? 'visible' : 'hidden';
73051 lanes.entity = function(_) {
73052 if (!wayID || wayID !== _.id) {
73057 lanes.tags = function() {};
73058 lanes.focus = function() {};
73059 lanes.off = function() {};
73061 return utilRebind(lanes, dispatch$$1, 'on');
73064 function uiFieldLocalized(field, context) {
73065 var dispatch$$1 = dispatch('change', 'input'),
73066 wikipedia = services.wikipedia,
73067 input = select(null),
73068 localizedInputs = select(null),
73073 function localized(selection$$1) {
73074 input = selection$$1.selectAll('.localized-main')
73077 input = input.enter()
73079 .attr('type', 'text')
73080 .attr('id', 'preset-input-' + field.safeid)
73081 .attr('class', 'localized-main')
73082 .attr('placeholder', field.placeholder())
73086 if (field.id === 'name') {
73087 var preset = context.presets().match(entity, context.graph());
73090 .container(context.container())
73091 .fetcher(utilSuggestNames(preset, dataSuggestions))
73096 .on('input', change(true))
73097 .on('blur', change())
73098 .on('change', change());
73101 var translateButton = selection$$1.selectAll('.localized-add')
73104 translateButton = translateButton.enter()
73106 .attr('class', 'button-input-action localized-add minor')
73107 .attr('tabindex', -1)
73108 .call(svgIcon('#iD-icon-plus'))
73110 .title(t('translate.translate'))
73111 .placement('left'))
73112 .merge(translateButton);
73115 .on('click', addNew);
73118 localizedInputs = selection$$1.selectAll('.localized-wrap')
73121 localizedInputs = localizedInputs.enter().append('div')
73122 .attr('class', 'localized-wrap')
73123 .merge(localizedInputs);
73127 function addNew() {
73128 event.preventDefault();
73129 var data$$1 = localizedInputs.selectAll('div.entry').data();
73130 var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
73131 var langExists = find$1(data$$1, function(datum) { return datum.lang === defaultLang;});
73132 var isLangEn = defaultLang.indexOf('en') > -1;
73133 if (isLangEn || langExists) {
73136 data$$1.push({ lang: defaultLang, value: '' });
73137 localizedInputs.call(render, data$$1);
73141 function change(onInput) {
73142 return function() {
73144 t$$1[field.key] = utilGetSetValue(select(this)) || undefined;
73145 dispatch$$1.call('change', this, t$$1, onInput);
73150 function key(lang) {
73151 return field.key + ':' + lang;
73155 function changeLang(d) {
73156 var lang = utilGetSetValue(select(this)),
73158 language = find$1(wikipedia$2, function(d) {
73159 return d[0].toLowerCase() === lang.toLowerCase() ||
73160 d[1].toLowerCase() === lang.toLowerCase();
73163 if (language) lang = language[2];
73165 if (d.lang && d.lang !== lang) {
73166 t$$1[key(d.lang)] = undefined;
73169 var value = utilGetSetValue(select(this.parentNode)
73170 .selectAll('.localized-value'));
73172 if (lang && value) {
73173 t$$1[key(lang)] = value;
73174 } else if (lang && wikiTitles && wikiTitles[d.lang]) {
73175 t$$1[key(lang)] = wikiTitles[d.lang];
73179 dispatch$$1.call('change', this, t$$1);
73183 function changeValue(d) {
73184 if (!d.lang) return;
73186 t$$1[key(d.lang)] = utilGetSetValue(select(this)) || undefined;
73187 dispatch$$1.call('change', this, t$$1);
73191 function fetcher(value, cb) {
73192 var v = value.toLowerCase();
73194 cb(wikipedia$2.filter(function(d) {
73195 return d[0].toLowerCase().indexOf(v) >= 0 ||
73196 d[1].toLowerCase().indexOf(v) >= 0 ||
73197 d[2].toLowerCase().indexOf(v) >= 0;
73198 }).map(function(d) {
73199 return { value: d[1] };
73204 function render(selection$$1, data$$1) {
73205 var wraps = selection$$1.selectAll('div.entry').
73206 data(data$$1, function(d) { return d.lang; });
73211 .style('max-height','0px')
73212 .style('opacity', '0')
73213 .style('top','-10px')
73216 var innerWrap = wraps.enter()
73217 .insert('div', ':first-child');
73219 innerWrap.attr('class', 'entry')
73221 var wrap = select(this);
73222 var langcombo = d3combobox()
73223 .container(context.container())
73229 .attr('class','form-label')
73230 .text(t('translate.localized_translation_label'))
73231 .attr('for','localized-lang');
73235 .attr('class', 'minor remove')
73236 .on('click', function(d){
73237 event.preventDefault();
73239 t$$1[key(d.lang)] = undefined;
73240 dispatch$$1.call('change', this, t$$1);
73241 select(this.parentNode.parentNode)
73243 .style('max-height','240px')
73245 .style('opacity', '0')
73246 .style('max-height','0px')
73249 .call(svgIcon('#iD-operation-delete'));
73253 .attr('class', 'localized-lang')
73254 .attr('type', 'text')
73255 .attr('placeholder',t('translate.localized_translation_language'))
73256 .on('blur', changeLang)
73257 .on('change', changeLang)
73262 .on('blur', changeValue)
73263 .on('change', changeValue)
73264 .attr('type', 'text')
73265 .attr('placeholder', t('translate.localized_translation_name'))
73266 .attr('class', 'localized-value');
73270 .style('margin-top', '0px')
73271 .style('max-height', '0px')
73272 .style('opacity', '0')
73275 .style('margin-top', '10px')
73276 .style('max-height', '240px')
73277 .style('opacity', '1')
73278 .on('end', function() {
73280 .style('max-height', '')
73281 .style('overflow', 'visible');
73285 var entry = selection$$1.selectAll('.entry');
73287 utilGetSetValue(entry.select('.localized-lang'), function(d) {
73288 var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
73289 return lang ? lang[1] : d.lang;
73292 utilGetSetValue(entry.select('.localized-value'),
73293 function(d) { return d.value; });
73297 localized.tags = function(tags) {
73298 // Fetch translations from wikipedia
73299 if (tags.wikipedia && !wikiTitles) {
73301 var wm = tags.wikipedia.match(/([^:]+):(.+)/);
73302 if (wm && wm[0] && wm[1]) {
73303 wikipedia.translations(wm[1], wm[2], function(d) {
73309 utilGetSetValue(input, tags[field.key] || '');
73311 var postfixed = [], k, m;
73313 m = k.match(/^(.*):([a-zA-Z_-]+)$/);
73314 if (m && m[1] === field.key && m[2]) {
73315 postfixed.push({ lang: m[2], value: tags[k] });
73319 localizedInputs.call(render, postfixed.reverse());
73323 localized.focus = function() {
73324 input.node().focus();
73328 localized.entity = function(_) {
73329 if (!arguments.length) return entity;
73334 return utilRebind(localized, dispatch$$1, 'on');
73337 function uiFieldMaxspeed(field, context) {
73338 var dispatch$$1 = dispatch('change'),
73341 unitInput = select(null),
73342 input = select(null),
73345 var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120],
73346 imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
73349 function maxspeed(selection$$1) {
73350 combobox = d3combobox()
73351 .container(context.container());
73353 var unitCombobox = d3combobox()
73354 .container(context.container())
73355 .data(['km/h', 'mph'].map(comboValues));
73357 input = selection$$1.selectAll('#preset-input-' + field.safeid)
73360 input = input.enter()
73362 .attr('type', 'text')
73363 .attr('id', 'preset-input-' + field.safeid)
73364 .attr('placeholder', field.placeholder())
73370 .on('change', change)
73371 .on('blur', change);
73373 var childNodes = context.graph().childNodes(context.entity(entity.id)),
73374 loc = childNodes[~~(childNodes.length/2)].loc;
73376 isImperial = some(dataImperial.features, function(f) {
73377 return some(f.geometry.coordinates, function(d) {
73378 return geoPointInPolygon(loc, d);
73382 unitInput = selection$$1.selectAll('input.maxspeed-unit')
73385 unitInput = unitInput.enter()
73387 .attr('type', 'text')
73388 .attr('class', 'maxspeed-unit')
73389 .call(unitCombobox)
73393 .on('blur', changeUnits)
73394 .on('change', changeUnits);
73397 function changeUnits() {
73398 isImperial = utilGetSetValue(unitInput) === 'mph';
73399 utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
73406 function setSuggestions() {
73407 combobox.data((isImperial ? imperialValues : metricValues).map(comboValues));
73408 utilGetSetValue(unitInput, isImperial ? 'mph' : 'km/h');
73412 function comboValues(d) {
73414 value: d.toString(),
73415 title: d.toString()
73420 function change() {
73422 value = utilGetSetValue(input);
73425 tag[field.key] = undefined;
73426 } else if (isNaN(value) || !isImperial) {
73427 tag[field.key] = value;
73429 tag[field.key] = value + ' mph';
73432 dispatch$$1.call('change', this, tag);
73436 maxspeed.tags = function(tags) {
73437 var value = tags[field.key];
73439 if (value && value.indexOf('mph') >= 0) {
73440 value = parseInt(value, 10);
73442 } else if (value) {
73443 isImperial = false;
73447 utilGetSetValue(input, value || '');
73451 maxspeed.focus = function() {
73452 input.node().focus();
73456 maxspeed.entity = function(_) {
73461 return utilRebind(maxspeed, dispatch$$1, 'on');
73465 * This function is like `baseIndexOf` except that it accepts a comparator.
73468 * @param {Array} array The array to inspect.
73469 * @param {*} value The value to search for.
73470 * @param {number} fromIndex The index to search from.
73471 * @param {Function} comparator The comparator invoked per element.
73472 * @returns {number} Returns the index of the matched value, else `-1`.
73474 function baseIndexOfWith(array, value, fromIndex, comparator) {
73475 var index = fromIndex - 1,
73476 length = array.length;
73478 while (++index < length) {
73479 if (comparator(array[index], value)) {
73486 /** Used for built-in method references. */
73487 var arrayProto$2 = Array.prototype;
73489 /** Built-in value references. */
73490 var splice$2 = arrayProto$2.splice;
73493 * The base implementation of `_.pullAllBy` without support for iteratee
73497 * @param {Array} array The array to modify.
73498 * @param {Array} values The values to remove.
73499 * @param {Function} [iteratee] The iteratee invoked per element.
73500 * @param {Function} [comparator] The comparator invoked per element.
73501 * @returns {Array} Returns `array`.
73503 function basePullAll(array, values, iteratee, comparator) {
73504 var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
73506 length = values.length,
73509 if (array === values) {
73510 values = copyArray(values);
73513 seen = arrayMap(array, baseUnary(iteratee));
73515 while (++index < length) {
73517 value = values[index],
73518 computed = iteratee ? iteratee(value) : value;
73520 while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
73521 if (seen !== array) {
73522 splice$2.call(seen, fromIndex, 1);
73524 splice$2.call(array, fromIndex, 1);
73531 * This method is like `_.pull` except that it accepts an array of values to remove.
73533 * **Note:** Unlike `_.difference`, this method mutates `array`.
73539 * @param {Array} array The array to modify.
73540 * @param {Array} values The values to remove.
73541 * @returns {Array} Returns `array`.
73544 * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
73546 * _.pullAll(array, ['a', 'c']);
73547 * console.log(array);
73550 function pullAll(array, values) {
73551 return (array && array.length && values && values.length)
73552 ? basePullAll(array, values)
73557 * Removes all given values from `array` using
73558 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
73559 * for equality comparisons.
73561 * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
73562 * to remove elements from an array by predicate.
73568 * @param {Array} array The array to modify.
73569 * @param {...*} [values] The values to remove.
73570 * @returns {Array} Returns `array`.
73573 * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
73575 * _.pull(array, 'a', 'c');
73576 * console.log(array);
73579 var pull = baseRest(pullAll);
73581 function uiFieldRadio(field, context) {
73582 var dispatch$$1 = dispatch('change'),
73583 placeholder = select(null),
73584 wrap = select(null),
73585 labels = select(null),
73586 radios = select(null),
73587 radioData = clone(field.options || field.keys),
73594 function selectedKey() {
73595 var node = wrap.selectAll('.toggle-list label.active input');
73596 return !node.empty() && node.datum();
73600 function radio(selection$$1) {
73601 selection$$1.classed('preset-radio', true);
73603 wrap = selection$$1.selectAll('.preset-input-wrap')
73606 var enter = wrap.enter()
73608 .attr('class', 'preset-input-wrap toggle-list');
73612 .attr('class', 'placeholder');
73618 placeholder = wrap.selectAll('.placeholder');
73620 labels = wrap.selectAll('label')
73623 enter = labels.enter()
73628 .attr('type', 'radio')
73629 .attr('name', field.id)
73630 .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
73631 .attr('checked', false);
73635 .text(function(d) { return field.t('options.' + d, { 'default': d }); });
73640 radios = labels.selectAll('input')
73641 .on('change', changeRadio);
73646 function structureExtras(selection$$1, tags) {
73647 var selected = selectedKey(),
73648 type = context.presets().field(selected),
73649 layer = context.presets().field('layer'),
73650 showLayer = (selected === 'bridge' || selected === 'tunnel');
73653 var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
73654 .data(selected ? [0] : []);
73659 extrasWrap = extrasWrap.enter()
73661 .attr('class', 'structure-extras-wrap')
73662 .merge(extrasWrap);
73664 var list = extrasWrap.selectAll('ul')
73667 list = list.enter()
73674 if (!typeField || typeField.id !== selected) {
73675 typeField = uiField(context, type, entity, { wrap: false })
73676 .on('change', changeType);
73678 typeField.tags(tags);
73683 var typeItem = list.selectAll('.structure-type-item')
73684 .data(typeField ? [typeField] : [], function(d) { return d.id; });
73691 var typeEnter = typeItem.enter()
73692 .insert('li', ':first-child')
73693 .attr('class', 'cf structure-type-item');
73697 .attr('class', 'col6 label structure-label-type')
73698 .attr('for', 'preset-input-' + selected)
73699 .text(t('inspector.radio.structure.type'));
73703 .attr('class', 'col6 structure-input-type-wrap');
73706 typeItem = typeItem
73710 typeItem.selectAll('.structure-input-type-wrap')
73711 .call(typeField.render);
73716 if (layer && showLayer) {
73718 layerField = uiField(context, layer, entity, { wrap: false })
73719 .on('change', changeLayer);
73721 layerField.tags(tags);
73722 field.keys = union(field.keys, ['layer']);
73725 pull(field.keys, 'layer');
73728 var layerItem = list.selectAll('.structure-layer-item')
73729 .data(layerField ? [layerField] : []);
73736 var layerEnter = layerItem.enter()
73738 .attr('class', 'cf structure-layer-item');
73742 .attr('class', 'col6 label structure-label-layer')
73743 .attr('for', 'preset-input-layer')
73744 .text(t('inspector.radio.structure.layer'));
73748 .attr('class', 'col6 structure-input-layer-wrap');
73751 layerItem = layerItem
73752 .merge(layerEnter);
73755 layerItem.selectAll('.structure-input-layer-wrap')
73756 .call(layerField.render);
73761 function changeType(t$$1, onInput) {
73762 var key = selectedKey();
73765 var val = t$$1[key];
73766 if (val !== 'no') {
73767 oldType[key] = val;
73770 if (field.type === 'structureRadio') {
73771 // remove layer if it should not be set
73772 if (val === 'no' ||
73773 (key !== 'bridge' && key !== 'tunnel') ||
73774 (key === 'tunnel' && val === 'building_passage')) {
73775 t$$1.layer = undefined;
73777 // add layer if it should be set
73778 if (t$$1.layer === undefined) {
73779 if (key === 'bridge' && val !== 'no') {
73782 if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
73788 dispatch$$1.call('change', this, t$$1, onInput);
73792 function changeLayer(t$$1, onInput) {
73793 if (t$$1.layer === '0') {
73794 t$$1.layer = undefined;
73796 dispatch$$1.call('change', this, t$$1, onInput);
73800 function changeRadio() {
73805 t$$1[field.key] = undefined;
73808 radios.each(function(d) {
73809 var active = select(this).property('checked');
73810 if (active) activeKey = d;
73813 if (active) t$$1[field.key] = d;
73815 var val = oldType[activeKey] || 'yes';
73816 t$$1[d] = active ? val : undefined;
73820 if (field.type === 'structureRadio') {
73821 if (activeKey === 'bridge') {
73823 } else if (activeKey === 'tunnel' && t$$1.tunnel !== 'building_passage') {
73826 t$$1.layer = undefined;
73830 dispatch$$1.call('change', this, t$$1);
73834 radio.tags = function(tags) {
73835 function checked(d) {
73837 return tags[field.key] === d;
73839 return !!(tags[d] && tags[d].toLowerCase() !== 'no');
73843 labels.classed('active', checked);
73844 radios.property('checked', checked);
73846 var selection$$1 = radios.filter(function() { return this.checked; });
73848 if (selection$$1.empty()) {
73849 placeholder.text(t('inspector.none'));
73851 placeholder.text(selection$$1.attr('value'));
73852 oldType[selection$$1.datum()] = tags[selection$$1.datum()];
73855 if (field.type === 'structureRadio') {
73856 // For waterways without a tunnel tag, set 'culvert' as
73857 // the oldType to default to if the user picks 'tunnel'
73858 if (!!tags.waterway && !oldType.tunnel) {
73859 oldType.tunnel = 'culvert';
73862 wrap.call(structureExtras, tags);
73867 radio.focus = function() {
73868 radios.node().focus();
73872 radio.entity = function(_) {
73873 if (!arguments.length) return entity;
73880 return utilRebind(radio, dispatch$$1, 'on');
73883 function uiFieldRestrictions(field, context) {
73884 var dispatch$$1 = dispatch('change');
73885 var breathe = behaviorBreathe(context);
73886 var storedViaWay = context.storage('turn-restriction-via-way');
73887 var storedDistance = context.storage('turn-restriction-distance');
73889 var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
73890 var _maxDistance = storedDistance ? (+storedDistance) : 30;
73891 var _initialized = false;
73892 var _parent = select(null); // the entire field
73893 var _container = select(null); // just the map
73901 function restrictions(selection$$1) {
73902 _parent = selection$$1;
73904 // try to reuse the intersection, but always rebuild it if the graph has changed
73905 if (_vertexID && (context.graph() !== _graph || !_intersection)) {
73906 _graph = context.graph();
73907 _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
73910 // It's possible for there to be no actual intersection here.
73911 // for example, a vertex of two `highway=path`
73912 // In this case, hide the field.
73915 _intersection.vertices.length && // has vertices
73916 _intersection.vertices // has the vertex that the user selected
73917 .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
73918 _intersection.ways.length > 2 && // has more than 2 ways
73919 _intersection.ways // has more than 1 TO way
73920 .filter(function(way) { return way.__to; }).length > 1
73923 // Also hide in the case where
73924 select(selection$$1.node().parentNode).classed('hide', !isOK);
73926 // if form field is hidden or has detached from dom, clean up.
73928 !select('.inspector-wrap.inspector-hidden').empty() ||
73929 !selection$$1.node().parentNode ||
73930 !selection$$1.node().parentNode.parentNode) {
73931 selection$$1.call(restrictions.off);
73936 var wrap = selection$$1.selectAll('.preset-input-wrap')
73939 wrap = wrap.enter()
73941 .attr('class', 'preset-input-wrap')
73944 var container = wrap.selectAll('.restriction-container')
73948 var containerEnter = container.enter()
73950 .attr('class', 'restriction-container');
73954 .attr('class', 'restriction-help');
73957 _container = containerEnter
73959 .call(renderViewer);
73961 var controls = wrap.selectAll('.restriction-controls')
73967 .attr('class', 'restriction-controls-container')
73969 .attr('class', 'restriction-controls')
73971 .call(renderControls);
73975 function renderControls(selection$$1) {
73976 var distControl = selection$$1.selectAll('.restriction-distance')
73982 var distControlEnter = distControl.enter()
73984 .attr('class', 'restriction-control restriction-distance');
73988 .attr('class', 'restriction-control-label restriction-distance-label')
73989 .text(t('restriction.controls.distance') + ':');
73993 .attr('class', 'restriction-distance-input')
73994 .attr('type', 'range')
73997 .attr('step', '5');
74001 .attr('class', 'restriction-distance-text');
74004 selection$$1.selectAll('.restriction-distance-input')
74005 .property('value', _maxDistance)
74006 .on('input', function() {
74007 var val = select(this).property('value');
74008 _maxDistance = +val;
74009 _intersection = null;
74010 _container.selectAll('.layer-osm .layer-turns *').remove();
74011 context.storage('turn-restriction-distance', _maxDistance);
74012 _parent.call(restrictions);
74015 selection$$1.selectAll('.restriction-distance-text')
74016 .text(displayMaxDistance(_maxDistance));
74019 var viaControl = selection$$1.selectAll('.restriction-via-way')
74025 var viaControlEnter = viaControl.enter()
74027 .attr('class', 'restriction-control restriction-via-way');
74031 .attr('class', 'restriction-control-label restriction-via-way-label')
74032 .text(t('restriction.controls.via') + ':');
74036 .attr('class', 'restriction-via-way-input')
74037 .attr('type', 'range')
74040 .attr('step', '1');
74044 .attr('class', 'restriction-via-way-text');
74047 selection$$1.selectAll('.restriction-via-way-input')
74048 .property('value', _maxViaWay)
74049 .on('input', function() {
74050 var val = select(this).property('value');
74052 _container.selectAll('.layer-osm .layer-turns *').remove();
74053 context.storage('turn-restriction-via-way', _maxViaWay);
74054 _parent.call(restrictions);
74057 selection$$1.selectAll('.restriction-via-way-text')
74058 .text(displayMaxVia(_maxViaWay));
74062 function renderViewer(selection$$1) {
74063 if (!_intersection) return;
74065 var vgraph = _intersection.graph;
74066 var filter = utilFunctor(true);
74067 var projection = geoRawMercator();
74069 var d = utilGetDimensions(selection$$1);
74070 var c = geoVecScale(d, 0.5);
74073 projection.scale(geoZoomToScale(z));
74075 // Calculate extent of all key vertices
74076 var extent = geoExtent$$1();
74077 for (var i = 0; i < _intersection.vertices.length; i++) {
74078 extent._extend(_intersection.vertices[i].extent());
74081 // If this is a large intersection, adjust zoom to fit extent
74082 if (_intersection.vertices.length > 1) {
74083 var padding = 180; // in z22 pixels
74084 var tl = projection([extent[0][0], extent[1][1]]);
74085 var br = projection([extent[1][0], extent[0][1]]);
74086 var hFactor = (br[0] - tl[0]) / (d[0] - padding);
74087 var vFactor = (br[1] - tl[1]) / (d[1] - padding);
74088 var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
74089 var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
74090 z = z - Math.max(hZoomDiff, vZoomDiff);
74091 projection.scale(geoZoomToScale(z));
74094 var padTop = 35; // reserve top space for hint text
74095 var extentCenter = projection(extent.center());
74096 extentCenter[1] = extentCenter[1] - padTop;
74099 .translate(geoVecSubtract(c, extentCenter))
74100 .clipExtent([[0, 0], d]);
74102 var drawLayers = svgLayers(projection, context).only('osm').dimensions(d);
74103 var drawVertices = svgVertices$$1(projection, context);
74104 var drawLines = svgLines$$1(projection, context);
74105 var drawTurns = svgTurns(projection, context);
74107 var firstTime = selection$$1.selectAll('.surface').empty();
74112 var surface = selection$$1.selectAll('.surface')
74113 .classed('tr', true);
74116 _initialized = true;
74122 .on('resize.restrictions', function() {
74123 utilSetDimensions(_container, null);
74129 // This can happen if we've lowered the detail while a FROM way
74130 // is selected, and that way is no longer part of the intersection.
74131 if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
74137 .call(utilSetDimensions, d)
74138 .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
74139 .call(drawLines, vgraph, _intersection.ways, filter)
74140 .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
74143 .on('click.restrictions', click)
74144 .on('mouseover.restrictions', mouseover);
74147 .selectAll('.selected')
74148 .classed('selected', false);
74151 .selectAll('.related')
74152 .classed('related', false);
74155 var way = vgraph.entity(_fromWayID);
74157 .selectAll('.' + _fromWayID)
74158 .classed('selected', true)
74159 .classed('related', true);
74170 var datum = event.target.__data__;
74171 var entity = datum && datum.properties && datum.properties.entity;
74176 if (datum instanceof osmWay && (datum.__from || datum.__via)) {
74177 _fromWayID = datum.id;
74181 } else if (datum instanceof osmTurn) {
74182 var actions, extraActions, turns, i;
74183 var restrictionType = osmInferRestriction(vgraph, datum, projection);
74185 if (datum.restrictionID && !datum.direct) {
74188 } else if (datum.restrictionID && !datum.only) { // NO -> ONLY
74190 var datumOnly = cloneDeep(datum);
74191 datumOnly.only = true;
74192 restrictionType = restrictionType.replace(/^no/, 'only');
74194 // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
74195 // We will remember them in _oldTurns, and restore them if the user clicks again.
74196 turns = _intersection.turns(_fromWayID, 2);
74199 for (i = 0; i < turns.length; i++) {
74200 var turn = turns[i];
74201 if (seen[turn.restrictionID]) continue; // avoid deleting the turn twice (#4968, #4928)
74203 if (turn.direct && turn.path[1] === datum.path[1]) {
74204 seen[turns[i].restrictionID] = true;
74205 turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
74206 _oldTurns.push(turn);
74207 extraActions.push(actionUnrestrictTurn(turn));
74211 actions = _intersection.actions.concat(extraActions, [
74212 actionRestrictTurn(datumOnly, restrictionType),
74213 t('operations.restriction.annotation.create')
74216 } else if (datum.restrictionID) { // ONLY -> Allowed
74217 // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
74218 // This relies on the assumption that the intersection was already split up when we
74219 // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
74220 turns = _oldTurns || [];
74222 for (i = 0; i < turns.length; i++) {
74223 if (turns[i].key !== datum.key) {
74224 extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
74229 actions = _intersection.actions.concat(extraActions, [
74230 actionUnrestrictTurn(datum),
74231 t('operations.restriction.annotation.delete')
74234 } else { // Allowed -> NO
74235 actions = _intersection.actions.concat([
74236 actionRestrictTurn(datum, restrictionType),
74237 t('operations.restriction.annotation.create')
74241 context.perform.apply(context, actions);
74243 // At this point the datum will be changed, but will have same key..
74244 // Refresh it and update the help..
74245 var s = surface.selectAll('.' + datum.key);
74246 datum = s.empty() ? null : s.datum();
74247 updateHints(datum);
74257 function mouseover() {
74258 var datum = event.target.__data__;
74259 updateHints(datum);
74263 function redraw() {
74264 if (context.hasEntity(_vertexID)) {
74265 _container.call(renderViewer);
74270 function highlightPathsFrom(wayID) {
74271 surface.selectAll('.related')
74272 .classed('related', false)
74273 .classed('allow', false)
74274 .classed('restrict', false)
74275 .classed('only', false);
74277 surface.selectAll('.' + wayID)
74278 .classed('related', true);
74281 var turns = _intersection.turns(wayID, _maxViaWay);
74282 for (var i = 0; i < turns.length; i++) {
74283 var turn = turns[i];
74284 var ids = [turn.to.way];
74285 var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
74287 if (turn.only || turns.length === 1) {
74288 if (turn.via.ways) {
74289 ids = ids.concat(turn.via.ways);
74291 } else if (turn.to.way === wayID) {
74295 surface.selectAll(utilEntitySelector(ids))
74296 .classed('related', true)
74297 .classed('allow', (klass === 'allow'))
74298 .classed('restrict', (klass === 'restrict'))
74299 .classed('only', (klass === 'only'));
74305 function updateHints(datum) {
74306 var help = _container.selectAll('.restriction-help').html('');
74308 var placeholders = {};
74309 ['from', 'via', 'to'].forEach(function(k) {
74310 placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
74313 var entity = datum && datum.properties && datum.properties.entity;
74319 way = vgraph.entity(_fromWayID);
74321 .selectAll('.' + _fromWayID)
74322 .classed('selected', true)
74323 .classed('related', true);
74327 if (datum instanceof osmWay && datum.__from) {
74330 highlightPathsFrom(_fromWayID ? null : way.id);
74331 surface.selectAll('.' + way.id)
74332 .classed('related', true);
74334 var clickSelect = (!_fromWayID || _fromWayID !== way.id);
74336 .append('div') // "Click to select FROM {fromName}." / "FROM {fromName}"
74337 .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
74338 from: placeholders.from,
74339 fromName: displayName(way.id, vgraph)
74343 // Hovering a turn arrow
74344 } else if (datum instanceof osmTurn) {
74345 var restrictionType = osmInferRestriction(vgraph, datum, projection);
74346 var turnType = restrictionType.replace(/^(only|no)\_/, '');
74347 var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
74348 var klass, turnText, nextText;
74351 klass = 'restrict';
74352 turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
74353 nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
74354 } else if (datum.only) {
74356 turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
74357 nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
74360 turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
74361 nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
74365 .append('div') // "NO Right Turn (indirect)"
74366 .attr('class', 'qualifier ' + klass)
74370 .append('div') // "FROM {fromName} TO {toName}"
74371 .html(t('restriction.help.from_name_to_name', {
74372 from: placeholders.from,
74373 fromName: displayName(datum.from.way, vgraph),
74374 to: placeholders.to,
74375 toName: displayName(datum.to.way, vgraph)
74378 if (datum.via.ways && datum.via.ways.length) {
74380 for (var i = 0; i < datum.via.ways.length; i++) {
74381 var prev = names[names.length - 1];
74382 var curr = displayName(datum.via.ways[i], vgraph);
74383 if (!prev || curr !== prev) // collapse identical names
74388 .append('div') // "VIA {viaNames}"
74389 .html(t('restriction.help.via_names', {
74390 via: placeholders.via,
74391 viaNames: names.join(', ')
74397 .append('div') // Click for "No Right Turn"
74398 .text(t('restriction.help.toggle', { turn: nextText.trim() }));
74401 highlightPathsFrom(null);
74402 var alongIDs = datum.path.slice();
74403 surface.selectAll(utilEntitySelector(alongIDs))
74404 .classed('related', true)
74405 .classed('allow', (klass === 'allow'))
74406 .classed('restrict', (klass === 'restrict'))
74407 .classed('only', (klass === 'only'));
74410 // Hovering empty surface
74412 highlightPathsFrom(null);
74415 .append('div') // "FROM {fromName}"
74416 .html(t('restriction.help.from_name', {
74417 from: placeholders.from,
74418 fromName: displayName(_fromWayID, vgraph)
74423 .append('div') // "Click to select a FROM segment."
74424 .html(t('restriction.help.select_from', {
74425 from: placeholders.from
74433 function displayMaxDistance(maxDist) {
74434 var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
74438 var distToFeet = { // imprecise conversion for prettier display
74439 20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
74441 opts = { distance: t('units.feet', { quantity: distToFeet }) };
74443 opts = { distance: t('units.meters', { quantity: maxDist }) };
74446 return t('restriction.controls.distance_up_to', opts);
74450 function displayMaxVia(maxVia) {
74451 return maxVia === 0 ? t('restriction.controls.via_node_only')
74452 : maxVia === 1 ? t('restriction.controls.via_up_to_one')
74453 : t('restriction.controls.via_up_to_two');
74457 function displayName(entityID, graph) {
74458 var entity = graph.entity(entityID);
74459 var name = utilDisplayName(entity) || '';
74460 var matched = context.presets().match(entity, graph);
74461 var type = (matched && matched.name()) || utilDisplayType(entity.id);
74462 return name || type;
74466 restrictions.entity = function(_) {
74467 _intersection = null;
74474 restrictions.tags = function() {};
74475 restrictions.focus = function() {};
74478 restrictions.off = function(selection$$1) {
74479 if (!_initialized) return;
74481 selection$$1.selectAll('.surface')
74483 .on('click.restrictions', null)
74484 .on('mouseover.restrictions', null);
74487 .on('resize.restrictions', null);
74491 return utilRebind(restrictions, dispatch$$1, 'on');
74494 function uiFieldTextarea(field) {
74495 var dispatch$$1 = dispatch('change'),
74496 input = select(null);
74499 function textarea(selection$$1) {
74500 input = selection$$1.selectAll('textarea')
74503 input = input.enter()
74504 .append('textarea')
74505 .attr('id', 'preset-input-' + field.safeid)
74506 .attr('placeholder', field.placeholder() || t('inspector.unknown'))
74507 .attr('maxlength', 255)
74509 .on('input', change(true))
74510 .on('blur', change())
74511 .on('change', change())
74516 function change(onInput) {
74517 return function() {
74519 t$$1[field.key] = utilGetSetValue(input) || undefined;
74520 dispatch$$1.call('change', this, t$$1, onInput);
74525 textarea.tags = function(tags) {
74526 utilGetSetValue(input, tags[field.key] || '');
74530 textarea.focus = function() {
74531 input.node().focus();
74535 return utilRebind(textarea, dispatch$$1, 'on');
74538 function uiFieldWikipedia(field, context) {
74539 var dispatch$$1 = dispatch('change'),
74540 wikipedia = services.wikipedia,
74541 wikidata = services.wikidata,
74542 link = select(null),
74543 lang = select(null),
74544 title = select(null),
74549 function wiki(selection$$1) {
74550 var langcombo = d3combobox()
74551 .container(context.container())
74552 .fetcher(function(value, cb) {
74553 var v = value.toLowerCase();
74555 cb(wikipedia$2.filter(function(d) {
74556 return d[0].toLowerCase().indexOf(v) >= 0 ||
74557 d[1].toLowerCase().indexOf(v) >= 0 ||
74558 d[2].toLowerCase().indexOf(v) >= 0;
74559 }).map(function(d) {
74560 return { value: d[1] };
74564 var titlecombo = d3combobox()
74565 .container(context.container())
74566 .fetcher(function(value, cb) {
74568 value = context.entity(entity.id).tags.name || '';
74571 var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
74572 searchfn(language()[2], value, function(query, data$$1) {
74573 cb(data$$1.map(function(d) {
74574 return { value: d };
74580 lang = selection$$1.selectAll('input.wiki-lang')
74583 lang = lang.enter()
74585 .attr('type', 'text')
74586 .attr('class', 'wiki-lang')
74587 .attr('placeholder', t('translate.localized_translation_language'))
74591 utilGetSetValue(lang, language()[1]);
74595 .on('blur', changeLang)
74596 .on('change', changeLang);
74599 title = selection$$1.selectAll('input.wiki-title')
74602 title = title.enter()
74604 .attr('type', 'text')
74605 .attr('class', 'wiki-title')
74606 .attr('id', 'preset-input-' + field.safeid)
74613 .on('change', change);
74616 link = selection$$1.selectAll('.wiki-link')
74619 link = link.enter()
74621 .attr('class', 'button-input-action wiki-link minor')
74622 .attr('tabindex', -1)
74623 .call(svgIcon('#iD-icon-out-link'))
74627 .on('click', function() {
74628 event.preventDefault();
74629 if (wikiURL) window.open(wikiURL, '_blank');
74634 function language() {
74635 var value = utilGetSetValue(lang).toLowerCase();
74636 var locale = utilDetect().locale.toLowerCase();
74637 var localeLanguage;
74638 return find$1(wikipedia$2, function(d) {
74639 if (d[2] === locale) localeLanguage = d;
74640 return d[0].toLowerCase() === value ||
74641 d[1].toLowerCase() === value ||
74643 }) || localeLanguage || ['English', 'English', 'en'];
74647 function changeLang() {
74648 utilGetSetValue(lang, language()[1]);
74658 function change(skipWikidata) {
74659 var value = utilGetSetValue(title),
74660 m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/),
74661 l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
74665 // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
74666 value = decodeURIComponent(m[2]).replace(/_/g, ' ');
74670 // Best-effort `anchordecode:` implementation
74671 anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
74673 anchor = decodeURIComponent(m[3]);
74675 value += '#' + anchor.replace(/_/g, ' ');
74677 value = value.slice(0, 1).toUpperCase() + value.slice(1);
74678 utilGetSetValue(lang, l[1]);
74679 utilGetSetValue(title, value);
74683 syncTags.wikipedia = language()[2] + ':' + value;
74685 syncTags.wikipedia = undefined;
74686 syncTags.wikidata = undefined;
74689 dispatch$$1.call('change', this, syncTags);
74692 if (skipWikidata || !value || !language()[2]) return;
74694 // attempt asynchronous update of wikidata tag..
74695 var initGraph = context.graph(),
74696 initEntityId = entity.id;
74698 wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
74699 // If graph has changed, we can't apply this update.
74700 if (context.graph() !== initGraph) return;
74702 if (!data$$1 || !Object.keys(data$$1).length) return;
74704 var qids = Object.keys(data$$1);
74705 var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
74706 var currTags = clone(context.entity(initEntityId).tags);
74708 currTags.wikidata = value;
74710 // Coalesce the update of wikidata tag into the previous tag change
74712 actionChangeTags(initEntityId, currTags),
74713 context.history().undoAnnotation()
74716 // do not dispatch.call('change') here, because entity_editor
74717 // changeTags() is not intended to be called asynchronously
74722 wiki.tags = function(tags) {
74723 var value = tags[field.key] || '',
74724 m = value.match(/([^:]+):([^#]+)(?:#(.+))?/),
74725 l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; }),
74726 anchor = m && m[3];
74728 // value in correct format
74730 utilGetSetValue(lang, l[1]);
74731 utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
74734 // Best-effort `anchorencode:` implementation
74735 anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
74737 anchor = anchor.replace(/ /g, '_');
74740 wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
74741 m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
74743 // unrecognized value format
74745 utilGetSetValue(title, value);
74746 if (value && value !== '') {
74747 utilGetSetValue(lang, '');
74748 wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
74756 wiki.entity = function(_) {
74757 if (!arguments.length) return entity;
74763 wiki.focus = function() {
74764 title.node().focus();
74768 return utilRebind(wiki, dispatch$$1, 'on');
74772 access: uiFieldAccess,
74773 address: uiFieldAddress,
74774 check: uiFieldCheck,
74775 combo: uiFieldCombo,
74776 cycleway: uiFieldCycleway,
74777 defaultCheck: uiFieldCheck,
74778 email: uiFieldText,
74779 lanes: uiFieldLanes,
74780 localized: uiFieldLocalized,
74781 maxspeed: uiFieldMaxspeed,
74782 multiCombo: uiFieldCombo,
74783 networkCombo: uiFieldCombo,
74784 number: uiFieldText,
74785 onewayCheck: uiFieldCheck,
74786 radio: uiFieldRadio,
74787 restrictions: uiFieldRestrictions,
74788 semiCombo: uiFieldCombo,
74789 structureRadio: uiFieldRadio,
74792 textarea: uiFieldTextarea,
74793 typeCombo: uiFieldCombo,
74795 wikipedia: uiFieldWikipedia
74798 function uiTagReference(tag) {
74799 var taginfo = services.taginfo;
74800 var tagReference = {};
74802 var _button = select(null);
74803 var _body = select(null);
74808 function findLocal(data) {
74809 var locale = utilDetect().locale.toLowerCase();
74812 if (locale !== 'pt-br') { // see #3776, prefer 'pt' over 'pt-br'
74813 localized = find$1(data, function(d) {
74814 return d.lang.toLowerCase() === locale;
74816 if (localized) return localized;
74819 // try the non-regional version of a language, like
74820 // 'en' if the language is 'en-US'
74821 if (locale.indexOf('-') !== -1) {
74822 var first = locale.split('-')[0];
74823 localized = find$1(data, function(d) {
74824 return d.lang.toLowerCase() === first;
74826 if (localized) return localized;
74829 // finally fall back to english
74830 return find$1(data, function(d) {
74831 return d.lang.toLowerCase() === 'en';
74836 function load(param) {
74837 if (!taginfo) return;
74840 .classed('tag-reference-loading', true);
74842 taginfo.docs(param, function show(err, data) {
74844 if (!err && data) {
74845 docs = findLocal(data);
74850 if (!docs || !docs.title) {
74851 if (param.hasOwnProperty('value')) {
74852 load(omit(param, 'value')); // retry with key only
74856 .attr('class', 'tag-reference-description')
74857 .text(t('inspector.no_documentation_key'));
74863 if (docs.image && docs.image.thumb_url_prefix) {
74866 .attr('class', 'tag-reference-wiki-image')
74867 .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
74868 .on('load', function() { done(); })
74869 .on('error', function() { select(this).remove(); done(); });
74876 .attr('class', 'tag-reference-description')
74877 .text(docs.description || t('inspector.documentation_redirect'));
74881 .attr('class', 'tag-reference-link')
74882 .attr('target', '_blank')
74883 .attr('tabindex', -1)
74884 .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
74885 .call(svgIcon('#iD-icon-out-link', 'inline'))
74887 .text(t('inspector.reference'));
74889 // Add link to info about "good changeset comments" - #2923
74890 if (param.key === 'comment') {
74893 .attr('class', 'tag-reference-comment-link')
74894 .attr('target', '_blank')
74895 .attr('tabindex', -1)
74896 .call(svgIcon('#iD-icon-out-link', 'inline'))
74897 .attr('href', t('commit.about_changeset_comments_link'))
74899 .text(t('commit.about_changeset_comments'));
74909 .classed('tag-reference-loading', false);
74912 .classed('expanded', true)
74915 .style('max-height', '200px')
74916 .style('opacity', '1');
74926 .style('max-height', '0px')
74927 .style('opacity', '0')
74928 .on('end', function () {
74929 _body.classed('expanded', false);
74936 tagReference.button = function(selection$$1) {
74937 _button = selection$$1.selectAll('.tag-reference-button')
74940 _button = _button.enter()
74942 .attr('class', 'tag-reference-button')
74943 .attr('title', t('icons.information'))
74944 .attr('tabindex', -1)
74945 .call(svgIcon('#iD-icon-inspect'))
74949 .on('click', function () {
74950 event.stopPropagation();
74951 event.preventDefault();
74954 } else if (_loaded) {
74963 tagReference.body = function(selection$$1) {
74964 var tagid = tag.rtype || (tag.key + '-' + tag.value);
74965 _body = selection$$1.selectAll('.tag-reference-body')
74966 .data([tagid], function(d) { return d; });
74971 _body = _body.enter()
74973 .attr('class', 'tag-reference-body cf')
74974 .style('max-height', '0')
74975 .style('opacity', '0')
74978 if (_showing === false) {
74984 tagReference.showing = function(_) {
74985 if (!arguments.length) return _showing;
74987 return tagReference;
74991 return tagReference;
74994 function uiField(context, presetField, entity, options) {
74995 options = assignIn({
75003 var dispatch$$1 = dispatch('change');
75004 var field = clone(presetField);
75005 var _show = options.show;
75010 // field implementation
75011 field.impl = uiFields[field.type](field, context)
75012 .on('change', function(t$$1, onInput) {
75013 dispatch$$1.call('change', field, t$$1, onInput);
75016 // if this field cares about the entity, pass it along
75017 if (entity && field.impl.entity) {
75018 field.entityID = entity.id;
75019 field.impl.entity(entity);
75022 field.keys = field.keys || [field.key];
75025 function isModified() {
75026 if (!entity) return false;
75027 var original = context.graph().base().entities[entity.id];
75028 return some(field.keys, function(key) {
75029 return original ? _tags[key] !== original.tags[key] : _tags[key];
75034 function isPresent() {
75035 return some(field.keys, function(key) {
75041 function revert(d) {
75042 event.stopPropagation();
75043 event.preventDefault();
75044 if (!entity) return false;
75046 var original = context.graph().base().entities[entity.id];
75048 d.keys.forEach(function(key) {
75049 t$$1[key] = original ? original.tags[key] : undefined;
75052 dispatch$$1.call('change', d, t$$1);
75056 function remove(d) {
75057 event.stopPropagation();
75058 event.preventDefault();
75061 d.keys.forEach(function(key) {
75062 t$$1[key] = undefined;
75065 dispatch$$1.call('change', d, t$$1);
75069 field.render = function(selection$$1) {
75070 var container = selection$$1.selectAll('.form-field')
75074 var enter = container.enter()
75076 .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
75077 .classed('nowrap', !options.wrap);
75079 if (options.wrap) {
75082 .attr('class', 'form-label')
75083 .attr('for', function(d) { return 'preset-input-' + d.safeid; })
75084 .text(function(d) { return d.label(); });
75088 .attr('class', 'form-label-button-wrap');
75090 if (options.remove) {
75093 .attr('class', 'remove-icon')
75094 .attr('title', t('icons.remove'))
75095 .attr('tabindex', -1)
75096 .call(svgIcon('#iD-operation-delete'));
75099 if (options.revert) {
75102 .attr('class', 'modified-icon')
75103 .attr('title', t('icons.undo'))
75104 .attr('tabindex', -1)
75105 .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
75111 container = container
75114 container.selectAll('.form-label-button-wrap .remove-icon')
75115 .on('click', remove);
75117 container.selectAll('.form-label-button-wrap .modified-icon')
75118 .on('click', revert);
75121 .classed('modified', isModified())
75122 .classed('present', isPresent())
75123 .each(function(d) {
75124 var reference, help;
75126 // instantiate field help
75127 if (options.wrap && field.type === 'restrictions') {
75128 help = uiFieldHelp(context, 'restrictions');
75131 // instantiate tag reference
75132 if (options.wrap && options.info) {
75133 var referenceKey = d.key;
75134 if (d.type === 'multiCombo') { // lookup key without the trailing ':'
75135 referenceKey = referenceKey.replace(/:$/, '');
75138 reference = uiTagReference(d.reference || { key: referenceKey }, context);
75139 if (_state === 'hover') {
75140 reference.showing(false);
75147 // add field help components
75151 .select('.form-label-button-wrap')
75152 .call(help.button);
75155 // add tag reference components
75158 .call(reference.body)
75159 .select('.form-label-button-wrap')
75160 .call(reference.button);
75163 d.impl.tags(_tags);
75168 field.state = function(_) {
75169 if (!arguments.length) return _state;
75175 field.tags = function(_) {
75176 if (!arguments.length) return _tags;
75182 field.show = function() {
75184 if (field.default && field.key && _tags[field.key] !== field.default) {
75186 t$$1[field.key] = field.default;
75187 dispatch$$1.call('change', this, t$$1);
75192 field.isShown = function() {
75193 return _show || some(field.keys, function(key) { return !!_tags[key]; });
75197 field.focus = function() {
75198 field.impl.focus();
75202 return utilRebind(field, dispatch$$1, 'on');
75205 function uiFormFields(context) {
75209 function formFields(selection$$1, klass) {
75210 render(selection$$1, klass);
75214 function render(selection$$1, klass) {
75215 var shown = _fieldsArr.filter(function(field) { return field.isShown(); });
75216 var notShown = _fieldsArr.filter(function(field) { return !field.isShown(); });
75218 var container = selection$$1.selectAll('.form-fields-container')
75221 container = container.enter()
75223 .attr('class', 'form-fields-container ' + (klass || ''))
75227 var fields = container.selectAll('.wrap-form-field')
75228 .data(shown, function(d) { return d.id + (d.entityID || ''); });
75234 var enter = fields.enter()
75236 .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
75244 .each(function(d) {
75250 notShown = notShown.map(function(field) {
75252 title: field.label(),
75253 value: field.label(),
75259 var more = selection$$1.selectAll('.more-fields')
75260 .data((notShown.length > 0) ? [0] : []);
75265 more = more.enter()
75267 .attr('class', 'more-fields')
75269 .text(t('inspector.add_fields'))
75273 var input = more.selectAll('.value')
75279 input = input.enter()
75281 .attr('class', 'value')
75282 .attr('type', 'text')
75287 .call(utilGetSetValue, '')
75288 .attr('placeholder', function() {
75289 var placeholder = [];
75290 for (var field in notShown) {
75291 placeholder.push(notShown[field].title);
75293 return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
75296 .container(context.container())
75299 .on('accept', function (d) {
75300 var field = d.field;
75302 render(selection$$1);
75303 if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
75311 formFields.fieldsArr = function(val) {
75312 if (!arguments.length) return _fieldsArr;
75321 function uiChangesetEditor(context) {
75322 var dispatch$$1 = dispatch('change');
75323 var formFields = uiFormFields(context);
75329 function changesetEditor(selection) {
75334 function render(selection) {
75335 var initial = false;
75339 var presets = context.presets();
75342 uiField(context, presets.field('comment'), null, { show: true, revert: false }),
75343 uiField(context, presets.field('source'), null, { show: false, revert: false }),
75344 uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
75347 _fieldsArr.forEach(function(field) {
75349 .on('change', function(t$$1, onInput) {
75350 dispatch$$1.call('change', field, t$$1, onInput);
75355 _fieldsArr.forEach(function(field) {
75362 .call(formFields.fieldsArr(_fieldsArr));
75366 var commentField = selection.select('#preset-input-comment');
75367 var commentNode = commentField.node();
75370 commentNode.focus();
75371 commentNode.select();
75374 // trigger a 'blur' event so that comment field can be cleaned
75375 // and checked for hashtags, even if retrieved from localstorage
75376 utilTriggerEvent(commentField, 'blur');
75378 var osm = context.connection();
75380 osm.userChangesets(function (err, changesets) {
75383 var comments = changesets.map(function(changeset) {
75385 title: changeset.tags.comment,
75386 value: changeset.tags.comment
75392 .container(context.container())
75393 .caseSensitive(true)
75394 .data(uniqBy(comments, 'title'))
75400 // Add warning if comment mentions Google
75401 var hasGoogle = _tags.comment.match(/google/i);
75402 var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
75403 .data(hasGoogle ? [0] : []);
75405 commentWarning.exit()
75408 .style('opacity', 0)
75411 var commentEnter = commentWarning.enter()
75412 .insert('div', '.tag-reference-body')
75413 .attr('class', 'field-warning comment-warning')
75414 .style('opacity', 0);
75418 .attr('target', '_blank')
75419 .attr('tabindex', -1)
75420 .call(svgIcon('#iD-icon-alert', 'inline'))
75421 .attr('href', t('commit.google_warning_link'))
75423 .text(t('commit.google_warning'));
75428 .style('opacity', 1);
75432 changesetEditor.tags = function(_) {
75433 if (!arguments.length) return _tags;
75435 // Don't reset _fieldsArr here.
75436 return changesetEditor;
75440 changesetEditor.changesetID = function(_) {
75441 if (!arguments.length) return _changesetID;
75442 if (_changesetID === _) return changesetEditor;
75445 return changesetEditor;
75449 return utilRebind(changesetEditor, dispatch$$1, 'on');
75453 * This method is like `_.union` except that it accepts `iteratee` which is
75454 * invoked for each element of each `arrays` to generate the criterion by
75455 * which uniqueness is computed. Result values are chosen from the first
75456 * array in which the value occurs. The iteratee is invoked with one argument:
75463 * @param {...Array} [arrays] The arrays to inspect.
75464 * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
75465 * @returns {Array} Returns the new array of combined values.
75468 * _.unionBy([2.1], [1.2, 2.3], Math.floor);
75471 * // The `_.property` iteratee shorthand.
75472 * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
75473 * // => [{ 'x': 1 }, { 'x': 2 }]
75475 var unionBy = baseRest(function(arrays) {
75476 var iteratee = last(arrays);
75477 if (isArrayLikeObject(iteratee)) {
75478 iteratee = undefined;
75480 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
75483 function uiCommitChanges(context) {
75484 var detected = utilDetect();
75488 function commitChanges(selection$$1) {
75489 var history = context.history();
75490 var summary = history.difference().summary();
75492 var container = selection$$1.selectAll('.modal-section.commit-section')
75495 var containerEnter = container.enter()
75497 .attr('class', 'commit-section modal-section fillL2');
75501 .text(t('commit.changes', { count: summary.length }));
75505 .attr('class', 'changeset-list');
75507 container = containerEnter
75511 var items = container.select('ul').selectAll('li')
75514 var itemsEnter = items.enter()
75516 .attr('class', 'change-item');
75519 .each(function(d) {
75521 .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
75526 .attr('class', 'change-type')
75527 .text(function(d) { return t('commit.' + d.changeType) + ' '; });
75531 .attr('class', 'entity-type')
75532 .text(function(d) {
75533 var matched = context.presets().match(d.entity, d.graph);
75534 return (matched && matched.name()) || utilDisplayType(d.entity.id);
75539 .attr('class', 'entity-name')
75540 .text(function(d) {
75541 var name = utilDisplayName(d.entity) || '',
75546 return string += ' ' + name;
75550 .style('opacity', 0)
75552 .style('opacity', 1);
75558 .on('mouseover', mouseover)
75559 .on('mouseout', mouseout)
75560 .on('click', click);
75563 // Download changeset link
75564 var changeset = new osmChangeset().update({ id: undefined });
75565 var changes = history.changes(actionDiscardTags(history.difference()));
75567 delete changeset.id; // Export without chnageset_id
75569 var data = JXON.stringify(changeset.osmChangeJXON(changes));
75570 var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
75571 var fileName = 'changes.osc';
75573 var linkEnter = container.selectAll('.download-changes')
75577 .attr('class', 'download-changes');
75579 if (detected.download) { // All except IE11 and Edge
75580 linkEnter // download the data as a file
75581 .attr('href', window.URL.createObjectURL(blob))
75582 .attr('download', fileName);
75584 } else { // IE11 and Edge
75585 linkEnter // open data uri in a new tab
75586 .attr('target', '_blank')
75587 .on('click.download', function() {
75588 navigator.msSaveBlob(blob, fileName);
75593 .call(svgIcon('#iD-icon-load', 'inline'))
75595 .text(t('commit.download_changes'));
75598 function mouseover(d) {
75600 context.surface().selectAll(
75601 utilEntityOrMemberSelector([d.entity.id], context.graph())
75602 ).classed('hover', true);
75607 function mouseout() {
75608 context.surface().selectAll('.hover')
75609 .classed('hover', false);
75613 function click(change) {
75614 if (change.changeType === 'deleted') {
75617 var entity = change.entity;
75618 _entityID = change.entity.id;
75619 context.map().zoomTo(entity);
75620 context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
75621 .classed('hover', true);
75627 commitChanges.entityID = function(_) {
75628 if (!arguments.length) return _entityID;
75630 return commitChanges;
75634 return commitChanges;
75637 function uiCommitWarnings(context) {
75639 function commitWarnings(selection) {
75641 var changes = context.history().changes();
75642 var warnings = context.history().validate(changes);
75644 var container = selection.selectAll('.warning-section')
75645 .data(warnings.length ? [0] : []);
75650 var containerEnter = container.enter()
75652 .attr('class', 'modal-section warning-section fillL2');
75656 .text(t('commit.warnings'));
75660 .attr('class', 'changeset-list');
75662 container = containerEnter
75666 var items = container.select('ul').selectAll('li')
75672 var itemsEnter = items.enter()
75674 .attr('class', 'warning-item');
75677 .call(svgIcon('#iD-icon-alert', 'pre-text'));
75681 .text(function(d) { return d.message; });
75683 itemsEnter.filter(function(d) { return d.tooltip; })
75685 .title(function(d) { return d.tooltip; })
75693 .on('mouseover', mouseover)
75694 .on('mouseout', mouseout)
75695 .on('click', warningClick);
75698 function mouseover(d) {
75700 context.surface().selectAll(
75701 utilEntityOrMemberSelector([d.entity.id], context.graph())
75702 ).classed('hover', true);
75707 function mouseout() {
75708 context.surface().selectAll('.hover')
75709 .classed('hover', false);
75713 function warningClick(d) {
75715 context.map().zoomTo(d.entity);
75716 context.enter(modeSelect(context, [d.entity.id]));
75723 return commitWarnings;
75726 function uiRawTagEditor(context) {
75727 var taginfo = services.taginfo;
75728 var dispatch$$1 = dispatch('change');
75729 var _readOnlyTags = [];
75730 var _showBlank = false;
75731 var _updatePreference = true;
75732 var _expanded = false;
75740 function rawTagEditor(selection$$1) {
75741 var count = Object.keys(_tags).filter(function(d) { return d; }).length;
75743 var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
75744 .title(t('inspector.all_tags') + ' (' + count + ')')
75745 .on('toggled', toggled)
75746 .updatePreference(_updatePreference)
75749 // Sometimes we want to force the raw_tag_editor to be opened/closed..
75750 // When undefined, uiDisclosure will use the user's stored preference.
75751 if (_expanded !== undefined) {
75752 disclosure.expanded(_expanded);
75755 selection$$1.call(disclosure);
75757 function toggled(expanded) {
75758 _expanded = expanded;
75760 selection$$1.node().parentNode.scrollTop += 200;
75766 function content(wrap) {
75767 var entries = map$3(_tags, function(v, k) {
75768 return { key: k, value: v };
75771 if (!entries.length || _showBlank) {
75772 _showBlank = false;
75773 entries.push({key: '', value: ''});
75777 var list = wrap.selectAll('.tag-list')
75780 list = list.enter()
75782 .attr('class', 'tag-list')
75785 var newTag = wrap.selectAll('.add-tag')
75790 .attr('class', 'add-tag')
75791 .on('click', addTag)
75792 .call(svgIcon('#iD-icon-plus', 'light'));
75795 var items = list.selectAll('.tag-row')
75796 .data(entries, function(d) { return d.key; });
75804 var enter = items.enter()
75806 .attr('class', 'tag-row cf')
75807 .classed('readonly', isReadOnly);
75811 .attr('class', 'key-wrap')
75813 .property('type', 'text')
75814 .attr('class', 'key')
75815 .attr('maxlength', 255)
75817 .on('blur', keyChange)
75818 .on('change', keyChange);
75822 .attr('class', 'input-wrap-position')
75824 .property('type', 'text')
75825 .attr('class', 'value')
75826 .attr('maxlength', 255)
75828 .on('blur', valueChange)
75829 .on('change', valueChange)
75830 .on('keydown.push-more', pushMore);
75834 .attr('tabindex', -1)
75835 .attr('class', 'remove minor')
75836 .call(svgIcon('#iD-operation-delete'));
75843 .sort(function(a, b) {
75844 return (a.key === _newRow && b.key !== _newRow) ? 1
75845 : (a.key !== _newRow && b.key === _newRow) ? -1
75846 : ascending(a.key, b.key);
75850 .each(function(tag) {
75851 var row = select(this);
75852 var key = row.select('input.key'); // propagate bound data to child
75853 var value = row.select('input.value'); // propagate bound data to child
75855 if (_entityID && taginfo) {
75856 bindTypeahead(key, value);
75859 var isRelation = (_entityID && context.entity(_entityID).type === 'relation');
75862 if (isRelation && tag.key === 'type') {
75863 reference = uiTagReference({ rtype: tag.value }, context);
75865 reference = uiTagReference({ key: tag.key, value: tag.value }, context);
75868 if (_state === 'hover') {
75869 reference.showing(false);
75873 .call(reference.button)
75874 .call(reference.body);
75877 items.selectAll('input.key')
75878 .attr('title', function(d) { return d.key; })
75879 .call(utilGetSetValue, function(d) { return d.key; })
75880 .property('disabled', isReadOnly);
75882 items.selectAll('input.value')
75883 .attr('title', function(d) { return d.value; })
75884 .call(utilGetSetValue, function(d) { return d.value; })
75885 .property('disabled', isReadOnly);
75887 items.selectAll('button.remove')
75888 .on('click', removeTag);
75892 function isReadOnly(d) {
75893 for (var i = 0; i < _readOnlyTags.length; i++) {
75894 if (d.key.match(_readOnlyTags[i]) !== null) {
75902 function pushMore() {
75903 if (event.keyCode === 9 && !event.shiftKey &&
75904 list.selectAll('li:last-child input.value').node() === this) {
75910 function bindTypeahead(key, value) {
75911 if (isReadOnly(key.datum())) return;
75913 var geometry = context.geometry(_entityID);
75915 key.call(d3combobox()
75916 .container(context.container())
75917 .fetcher(function(value, callback) {
75920 geometry: geometry,
75922 }, function(err, data) {
75923 if (!err) callback(sort(value, data));
75927 value.call(d3combobox()
75928 .container(context.container())
75929 .fetcher(function(value, callback) {
75932 key: utilGetSetValue(key),
75933 geometry: geometry,
75935 }, function(err, data) {
75936 if (!err) callback(sort(value, data));
75941 function sort(value, data) {
75942 var sameletter = [];
75944 for (var i = 0; i < data.length; i++) {
75945 if (data[i].value.substring(0, value.length) === value) {
75946 sameletter.push(data[i]);
75948 other.push(data[i]);
75951 return sameletter.concat(other);
75956 function unbind() {
75957 var row = select(this);
75959 row.selectAll('input.key')
75960 .call(d3combobox.off);
75962 row.selectAll('input.value')
75963 .call(d3combobox.off);
75967 function keyChange(d) {
75969 var kNew = this.value.trim();
75972 if (isReadOnly({ key: kNew })) {
75977 if (kNew && kNew !== kOld) {
75978 var match = kNew.match(/^(.*?)(?:_(\d+))?$/);
75979 var base = match[1];
75980 var suffix = +(match[2] || 1);
75981 while (_tags[kNew]) { // rename key if already in use
75982 kNew = base + '_' + suffix++;
75985 if (includes(kNew, '=')) {
75986 var splitStr = kNew.split('=').map(function(str) { return str.trim(); });
75987 var key = splitStr[0];
75988 var value = splitStr[1];
75994 tag[kOld] = undefined;
75995 tag[kNew] = d.value;
75997 d.key = kNew; // Maintain DOM identity through the subsequent update.
75999 if (_newRow === kOld) { // see if this row is still a new row
76000 _newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
76004 dispatch$$1.call('change', this, tag);
76008 function valueChange(d) {
76009 if (isReadOnly(d)) return;
76011 tag[d.key] = this.value;
76013 if (_newRow === d.key && d.key !== '' && d.value !== '') { // not a new row anymore
76014 _newRow = undefined;
76017 dispatch$$1.call('change', this, tag);
76021 function removeTag(d) {
76022 if (isReadOnly(d)) return;
76024 tag[d.key] = undefined;
76025 dispatch$$1.call('change', this, tag);
76026 select(this.parentNode).remove();
76030 function addTag() {
76031 // Wrapped in a setTimeout in case it's being called from a blur
76032 // handler. Without the setTimeout, the call to `content` would
76033 // wipe out the pending value change.
76034 window.setTimeout(function() {
76037 list.selectAll('li:last-child input.key').node().focus();
76043 rawTagEditor.state = function(_) {
76044 if (!arguments.length) return _state;
76046 return rawTagEditor;
76050 rawTagEditor.preset = function(_) {
76051 if (!arguments.length) return _preset;
76053 if (_preset.isFallback()) {
76055 _updatePreference = false;
76057 _expanded = undefined;
76058 _updatePreference = true;
76060 return rawTagEditor;
76064 rawTagEditor.tags = function(_) {
76065 if (!arguments.length) return _tags;
76067 return rawTagEditor;
76071 rawTagEditor.entityID = function(_) {
76072 if (!arguments.length) return _entityID;
76074 return rawTagEditor;
76078 rawTagEditor.expanded = function(_) {
76079 if (!arguments.length) return _expanded;
76081 _updatePreference = false;
76082 return rawTagEditor;
76086 rawTagEditor.readOnlyTags = function(_) {
76087 if (!arguments.length) return _readOnlyTags;
76089 return rawTagEditor;
76093 return utilRebind(rawTagEditor, dispatch$$1, 'on');
76097 var readOnlyTags = [
76098 /^changesets_count$/,
76106 // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
76107 // from https://stackoverflow.com/a/25575009
76108 var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
76111 function uiCommit(context) {
76112 var dispatch$$1 = dispatch('cancel', 'save');
76116 var changesetEditor = uiChangesetEditor(context)
76117 .on('change', changeTags);
76118 var rawTagEditor = uiRawTagEditor(context)
76119 .on('change', changeTags);
76120 var commitChanges = uiCommitChanges(context);
76121 var commitWarnings = uiCommitWarnings(context);
76124 function commit(selection$$1) {
76125 _selection = selection$$1;
76127 var osm = context.connection();
76130 // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
76131 var commentDate = +context.storage('commentDate') || 0;
76132 var currDate = Date.now();
76133 var cutoff = 2 * 86400 * 1000; // 2 days
76134 if (commentDate > currDate || currDate - commentDate > cutoff) {
76135 context.storage('comment', null);
76136 context.storage('hashtags', null);
76137 context.storage('source', null);
76141 if (!_changeset$1) {
76142 var detected = utilDetect();
76144 comment: context.storage('comment') || '',
76145 created_by: ('iD ' + context.version).substr(0, 255),
76146 host: detected.host.substr(0, 255),
76147 locale: detected.locale.substr(0, 255)
76150 // call findHashtags initially - this will remove stored
76151 // hashtags if any hashtags are found in the comment - #4304
76152 findHashtags(tags, true);
76154 var hashtags = context.storage('hashtags');
76156 tags.hashtags = hashtags;
76159 // iD 2.8.1 could write a literal 'undefined' here.. see #5021
76160 // (old source values expire after 2 days, so 'undefined' checks can go away in v2.9)
76161 var source = context.storage('source');
76162 if (source && source !== 'undefined') {
76163 tags.source = source;
76164 } else if (source === 'undefined') {
76165 context.storage('source', null);
76168 _changeset$1 = new osmChangeset({ tags: tags });
76171 tags = clone(_changeset$1.tags);
76172 tags.imagery_used = context.history().imageryUsed().join(';').substr(0, 255);
76173 _changeset$1 = _changeset$1.update({ tags: tags });
76175 var header = selection$$1.selectAll('.header')
76180 .attr('class', 'header fillL')
76182 .text(t('commit.title'));
76184 var body = selection$$1.selectAll('.body')
76187 body = body.enter()
76189 .attr('class', 'body')
76193 // Changeset Section
76194 var changesetSection = body.selectAll('.changeset-editor')
76197 changesetSection = changesetSection.enter()
76199 .attr('class', 'modal-section changeset-editor')
76200 .merge(changesetSection);
76203 .call(changesetEditor
76204 .changesetID(_changeset$1.id)
76210 body.call(commitWarnings);
76213 // Upload Explanation
76214 var saveSection = body.selectAll('.save-section')
76217 saveSection = saveSection.enter()
76219 .attr('class','modal-section save-section fillL cf')
76220 .merge(saveSection);
76222 var prose = saveSection.selectAll('.commit-info')
76225 prose = prose.enter()
76227 .attr('class', 'commit-info')
76228 .text(t('commit.upload_explanation'))
76231 osm.userDetails(function(err, user) {
76234 var userLink = select(document.createElement('div'));
76236 _userDetails = user;
76238 if (user.image_url) {
76241 .attr('src', user.image_url)
76242 .attr('class', 'icon pre-text user-icon');
76247 .attr('class', 'user-info')
76248 .text(user.display_name)
76249 .attr('href', osm.userURL(user.display_name))
76250 .attr('tabindex', -1)
76251 .attr('target', '_blank');
76254 .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
76259 var requestReview = saveSection.selectAll('.request-review')
76263 var requestReviewEnter = requestReview.enter()
76265 .attr('class', 'request-review');
76267 var labelEnter = requestReviewEnter
76269 .attr('for', 'commit-input-request-review');
76273 .attr('type', 'checkbox')
76274 .attr('id', 'commit-input-request-review');
76278 .text(t('commit.request_review'));
76281 requestReview = requestReview
76282 .merge(requestReviewEnter);
76284 var requestReviewInput = requestReview.selectAll('input')
76285 .property('checked', isReviewRequested(_changeset$1.tags))
76286 .on('change', toggleRequestReview);
76290 var buttonSection = saveSection.selectAll('.buttons')
76294 var buttonEnter = buttonSection.enter()
76296 .attr('class', 'buttons fillL cf');
76300 .attr('class', 'secondary-action button cancel-button')
76302 .attr('class', 'label')
76303 .text(t('commit.cancel'));
76307 .attr('class', 'action button save-button')
76309 .attr('class', 'label')
76310 .text(t('commit.save'));
76313 buttonSection = buttonSection
76314 .merge(buttonEnter);
76316 buttonSection.selectAll('.cancel-button')
76317 .on('click.cancel', function() {
76318 var selectedID = commitChanges.entityID();
76319 dispatch$$1.call('cancel', this, selectedID);
76322 buttonSection.selectAll('.save-button')
76323 .attr('disabled', function() {
76324 var n = select('#preset-input-comment').node();
76325 return (n && n.value.length) ? null : true;
76327 .on('click.save', function() {
76328 this.blur(); // avoid keeping focus on the button - #4641
76329 dispatch$$1.call('save', this, _changeset$1);
76334 var tagSection = body.selectAll('.tag-section.raw-tag-editor')
76337 tagSection = tagSection.enter()
76339 .attr('class', 'modal-section tag-section raw-tag-editor')
76340 .merge(tagSection);
76342 var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
76345 .expanded(expanded)
76346 .readOnlyTags(readOnlyTags)
76347 .tags(clone(_changeset$1.tags))
76352 body.call(commitChanges);
76355 function toggleRequestReview() {
76356 var rr = requestReviewInput.property('checked');
76357 updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
76359 var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
76362 .expanded(expanded)
76363 .readOnlyTags(readOnlyTags)
76364 .tags(clone(_changeset$1.tags))
76370 function changeTags(changed, onInput) {
76371 if (changed.hasOwnProperty('comment')) {
76372 if (changed.comment === undefined) {
76373 changed.comment = '';
76376 context.storage('comment', changed.comment);
76377 context.storage('commentDate', Date.now());
76380 if (changed.hasOwnProperty('source')) {
76381 if (changed.source === undefined) {
76382 context.storage('source', null);
76383 } else if (!onInput) {
76384 context.storage('source', changed.source);
76385 context.storage('commentDate', Date.now());
76389 updateChangeset(changed, onInput);
76392 _selection.call(commit);
76397 function findHashtags(tags, commentOnly) {
76398 var inComment = commentTags();
76399 var inHashTags = hashTags();
76401 if (inComment !== null) { // when hashtags are detected in comment...
76402 context.storage('hashtags', null); // always remove stored hashtags - #4304
76403 if (commentOnly) { inHashTags = null; } // optionally override hashtags field
76405 return unionBy(inComment, inHashTags, function (s) {
76406 return s.toLowerCase();
76409 // Extract hashtags from `comment`
76410 function commentTags() {
76411 return tags.comment
76412 .replace(/http\S*/g, '') // drop anything that looks like a URL - #4289
76413 .match(hashtagRegex);
76416 // Extract and clean hashtags from `hashtags`
76417 function hashTags() {
76418 var t$$1 = tags.hashtags || '';
76421 .map(function (s) {
76422 if (s[0] !== '#') { s = '#' + s; } // prepend '#'
76423 var matched = s.match(hashtagRegex);
76424 return matched && matched[0];
76425 }).filter(Boolean); // exclude falsey
76430 function isReviewRequested(tags) {
76431 var rr = tags.review_requested;
76432 if (rr === undefined) return false;
76433 rr = rr.trim().toLowerCase();
76434 return !(rr === '' || rr === 'no');
76438 function updateChangeset(changed, onInput) {
76439 var tags = clone(_changeset$1.tags);
76441 forEach(changed, function(v, k) {
76442 k = k.trim().substr(0, 255);
76443 if (readOnlyTags.indexOf(k) !== -1) return;
76445 if (k !== '' && v !== undefined) {
76449 tags[k] = v.trim().substr(0, 255);
76457 // when changing the comment, override hashtags with any found in comment.
76458 var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
76459 var arr = findHashtags(tags, commentOnly);
76461 tags.hashtags = arr.join(';').substr(0, 255);
76462 context.storage('hashtags', tags.hashtags);
76464 delete tags.hashtags;
76465 context.storage('hashtags', null);
76469 // always update userdetails, just in case user reauthenticates as someone else
76470 if (_userDetails && _userDetails.changesets_count !== undefined) {
76471 var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1; // #4283
76472 tags.changesets_count = String(changesetsCount);
76474 // first 100 edits - new user
76475 if (changesetsCount <= 100) {
76477 s = context.storage('walkthrough_completed');
76479 tags['ideditor:walkthrough_completed'] = s;
76482 s = context.storage('walkthrough_progress');
76484 tags['ideditor:walkthrough_progress'] = s;
76487 s = context.storage('walkthrough_started');
76489 tags['ideditor:walkthrough_started'] = s;
76493 delete tags.changesets_count;
76496 if (!isEqual(_changeset$1.tags, tags)) {
76497 _changeset$1 = _changeset$1.update({ tags: tags });
76502 commit.reset = function() {
76503 _changeset$1 = null;
76507 return utilRebind(commit, dispatch$$1, 'on');
76510 function uiConflicts(context) {
76511 var dispatch$$1 = dispatch('cancel', 'save');
76512 var keybinding = d3keybinding('conflicts');
76517 function keybindingOn() {
76519 .call(keybinding.on('⎋', cancel, true));
76522 function keybindingOff() {
76524 .call(keybinding.off);
76527 function tryAgain() {
76529 dispatch$$1.call('save');
76532 function cancel() {
76534 dispatch$$1.call('cancel');
76538 function conflicts(selection$$1) {
76541 var headerEnter = selection$$1.selectAll('.header')
76545 .attr('class', 'header fillL');
76549 .attr('class', 'fr')
76550 .on('click', cancel)
76551 .call(svgIcon('#iD-icon-close'));
76555 .text(t('save.conflict.header'));
76557 var bodyEnter = selection$$1.selectAll('.body')
76561 .attr('class', 'body fillL');
76563 var conflictsHelpEnter = bodyEnter
76565 .attr('class', 'conflicts-help')
76566 .text(t('save.conflict.help'));
76569 // Download changes link
76570 var detected = utilDetect();
76571 var changeset = new osmChangeset();
76573 delete changeset.id; // Export without changeset_id
76575 var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
76576 var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
76577 var fileName = 'changes.osc';
76579 var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
76581 .attr('class', 'download-changes');
76583 if (detected.download) { // All except IE11 and Edge
76584 linkEnter // download the data as a file
76585 .attr('href', window.URL.createObjectURL(blob))
76586 .attr('download', fileName);
76588 } else { // IE11 and Edge
76589 linkEnter // open data uri in a new tab
76590 .attr('target', '_blank')
76591 .on('click.download', function() {
76592 navigator.msSaveBlob(blob, fileName);
76597 .call(svgIcon('#iD-icon-load', 'inline'))
76599 .text(t('save.conflict.download_changes'));
76604 .attr('class', 'conflict-container fillL3')
76605 .call(showConflict, 0);
76609 .attr('class', 'conflicts-done')
76610 .attr('opacity', 0)
76611 .style('display', 'none')
76612 .text(t('save.conflict.done'));
76614 var buttonsEnter = bodyEnter
76616 .attr('class','buttons col12 joined conflicts-buttons');
76620 .attr('disabled', _conflictList.length > 1)
76621 .attr('class', 'action conflicts-button col6')
76622 .text(t('save.title'))
76623 .on('click.try_again', tryAgain);
76627 .attr('class', 'secondary-action conflicts-button col6')
76628 .text(t('confirm.cancel'))
76629 .on('click.cancel', cancel);
76633 function showConflict(selection$$1, index) {
76634 index = utilWrap(index, _conflictList.length);
76636 var parent = select(selection$$1.node().parentNode);
76638 // enable save button if this is the last conflict being reviewed..
76639 if (index === _conflictList.length - 1) {
76640 window.setTimeout(function() {
76641 parent.select('.conflicts-button')
76642 .attr('disabled', null);
76644 parent.select('.conflicts-done')
76646 .attr('opacity', 1)
76647 .style('display', 'block');
76651 var conflict = selection$$1
76652 .selectAll('.conflict')
76653 .data([_conflictList[index]]);
76658 var conflictEnter = conflict.enter()
76660 .attr('class', 'conflict');
76664 .attr('class', 'conflict-count')
76665 .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
76669 .attr('class', 'conflict-description')
76671 .text(function(d) { return d.name; })
76672 .on('click', function(d) {
76673 event.preventDefault();
76674 zoomToEntity(d.id);
76677 var details = conflictEnter
76679 .attr('class', 'conflict-detail-container');
76683 .attr('class', 'conflict-detail-list')
76685 .data(function(d) { return d.details || []; })
76688 .attr('class', 'conflict-detail-item')
76689 .html(function(d) { return d; });
76693 .attr('class', 'conflict-choices')
76698 .attr('class', 'conflict-nav-buttons joined cf')
76699 .selectAll('button')
76700 .data(['previous', 'next'])
76703 .text(function(d) { return t('save.conflict.' + d); })
76704 .attr('class', 'conflict-nav-button action col6')
76705 .attr('disabled', function(d, i) {
76706 return (i === 0 && index === 0) ||
76707 (i === 1 && index === _conflictList.length - 1) || null;
76709 .on('click', function(d, i) {
76710 event.preventDefault();
76712 var container = parent.selectAll('.conflict-container');
76713 var sign = (i === 0 ? -1 : 1);
76716 .selectAll('.conflict')
76720 .call(showConflict, index + sign);
76726 function addChoices(selection$$1) {
76727 var choices = selection$$1
76729 .attr('class', 'layer-list')
76731 .data(function(d) { return d.choices || []; });
76734 var choicesEnter = choices.enter()
76736 .attr('class', 'layer');
76738 var labelEnter = choicesEnter
76743 .attr('type', 'radio')
76744 .attr('name', function(d) { return d.id; })
76745 .on('change', function(d, i) {
76746 var ul = this.parentNode.parentNode.parentNode;
76747 ul.__data__.chosen = i;
76753 .text(function(d) { return d.text; });
76758 .each(function(d, i) {
76759 var ul = this.parentNode;
76760 if (ul.__data__.chosen === i) {
76767 function choose(ul, datum) {
76768 if (event) event.preventDefault();
76772 .classed('active', function(d) { return d === datum; })
76773 .selectAll('input')
76774 .property('checked', function(d) { return d === datum; });
76776 var extent = geoExtent$$1();
76779 entity = context.graph().hasEntity(datum.id);
76780 if (entity) extent._extend(entity.extent(context.graph()));
76784 entity = context.graph().hasEntity(datum.id);
76785 if (entity) extent._extend(entity.extent(context.graph()));
76787 zoomToEntity(datum.id, extent);
76791 function zoomToEntity(id, extent) {
76792 context.surface().selectAll('.hover')
76793 .classed('hover', false);
76795 var entity = context.graph().hasEntity(id);
76798 context.map().trimmedExtent(extent);
76800 context.map().zoomTo(entity);
76802 context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
76803 .classed('hover', true);
76808 // The conflict list should be an array of objects like:
76811 // name: entityName(local),
76812 // details: merge.conflicts(),
76815 // choice(id, keepMine, forceLocal),
76816 // choice(id, keepTheirs, forceRemote)
76819 conflicts.conflictList = function(_) {
76820 if (!arguments.length) return _conflictList;
76826 conflicts.origChanges = function(_) {
76827 if (!arguments.length) return _origChanges;
76833 return utilRebind(conflicts, dispatch$$1, 'on');
76836 function uiDataEditor$$1(context) {
76837 var dataHeader = uiDataHeader();
76838 var rawTagEditor = uiRawTagEditor(context);
76842 function dataEditor(selection) {
76843 var header = selection.selectAll('.header')
76846 var headerEnter = header.enter()
76848 .attr('class', 'header fillL');
76852 .attr('class', 'fr data-editor-close')
76853 .on('click', function() {
76854 context.enter(modeBrowse(context));
76856 .call(svgIcon('#iD-icon-close'));
76860 .text(t('map_data.title'));
76863 var body = selection.selectAll('.body')
76866 body = body.enter()
76868 .attr('class', 'body')
76871 var editor = body.selectAll('.data-editor')
76876 .attr('class', 'modal-section data-editor')
76878 .call(dataHeader.datum(_datum));
76880 var rte = body.selectAll('.raw-tag-editor')
76885 .attr('class', 'inspector-border raw-tag-editor inspector-inner data-editor')
76889 .readOnlyTags([/./])
76890 .tags((_datum && _datum.properties) || {})
76896 dataEditor.datum = function(val) {
76897 if (!arguments.length) return _datum;
76906 function uiDataHeader() {
76910 function dataHeader(selection) {
76911 var header = selection.selectAll('.data-header')
76913 (_datum ? [_datum] : []),
76914 function(d) { return d.__featurehash__; }
76920 var headerEnter = header.enter()
76922 .attr('class', 'data-header');
76924 var iconEnter = headerEnter
76926 .attr('class', 'data-header-icon');
76930 .attr('class', 'preset-icon-28')
76931 .call(svgIcon('#iD-icon-data', 'note-fill'));
76935 .attr('class', 'data-header-label')
76936 .text(t('map_data.layers.custom.title'));
76940 dataHeader.datum = function(val) {
76941 if (!arguments.length) return _datum;
76950 function uiEditMenu(context, operations) {
76952 var center = [0, 0];
76953 var offset = [0, 0];
76956 var p = 8; // top padding
76957 var m = 4; // top margin
76958 var h = 15; // height of icon
76959 var vpBottomMargin = 45; // viewport bottom margin
76960 var vpSideMargin = 35; // viewport side margin
76961 var buttonWidth = 44;
76962 var buttonHeight = (2 * p + h);
76963 var menuWidth = buttonWidth;
76964 var menuHeight = (2 * m) + operations.length * buttonHeight;
76965 var menuSideMargin = 10;
76966 var tooltipWidth = 200;
76967 var tooltipHeight = 200; // a reasonable guess, real height depends on tooltip contents
76970 var editMenu = function (selection$$1) {
76971 if (!operations.length) return;
76973 selection$$1.node().parentNode.focus();
76975 var isRTL = textDirection === 'rtl';
76976 var viewport = context.surfaceRect();
76978 if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
76979 // menu is going left-to-right and near right viewport edge, go left instead
76981 } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
76982 // menu is going right-to-left and near left viewport edge, go right instead
76986 offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
76988 if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
76989 // menu is near bottom viewport edge, shift upwards
76990 offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
76993 var origin = [ center[0] + offset[0], center[1] + offset[1] ];
76995 menu = selection$$1
76997 .attr('class', 'edit-menu')
76998 .attr('transform', 'translate(' + origin + ')')
76999 .attr('opacity', 0);
77003 .attr('opacity', 1);
77007 .attr('class', 'edit-menu-background')
77011 .attr('width', menuWidth)
77012 .attr('height', menuHeight)
77013 .attr('stroke-linecap', 'round');
77016 var button = menu.selectAll('.edit-menu-item')
77020 .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
77021 .classed('disabled', function (d) { return d.disabled(); })
77022 .attr('transform', function (d, i) {
77023 return 'translate(' + geoVecFloor([
77025 m + i * buttonHeight
77026 ]).join(',') + ')';
77032 .attr('width', buttonWidth)
77033 .attr('height', buttonHeight)
77034 .on('click', click)
77035 .on('mousedown', mousedown)
77036 .on('mouseover', mouseover)
77037 .on('mouseout', mouseout);
77041 .attr('width', '20')
77042 .attr('height', '20')
77043 .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
77044 .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
77046 tooltip = select(document.body)
77048 .attr('class', 'tooltip-inner edit-menu-tooltip');
77051 function click(operation) {
77052 event.stopPropagation();
77053 if (operation.disabled()) return;
77058 function mousedown() {
77059 event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
77062 function mouseover(d, i) {
77066 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
77068 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
77071 if (tipX + tooltipWidth > viewport.right) {
77072 // tip is going left-to-right and near right viewport edge, go left instead
77073 tipX = viewport.left + origin[0] - 4 - tooltipWidth;
77074 } else if (tipX < viewport.left) {
77075 // tip is going right-to-left and near left viewport edge, go right instead
77076 tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
77079 tipY = viewport.top + origin[1] + (i * buttonHeight);
77080 if (tipY + tooltipHeight > viewport.bottom) {
77081 // tip is near bottom viewport edge, shift upwards
77082 tipY -= tipY + tooltipHeight - viewport.bottom;
77086 .style('left', tipX + 'px')
77087 .style('top', tipY + 'px')
77088 .style('display', 'block')
77089 .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
77092 function mouseout() {
77093 tooltip.style('display', 'none');
77098 editMenu.close = function () {
77101 .style('pointer-events', 'none')
77103 .attr('opacity', 0)
77113 editMenu.center = function (_) {
77114 if (!arguments.length) return center;
77123 function uiPresetIcon() {
77124 var preset, geometry;
77127 function presetIcon(selection$$1) {
77128 selection$$1.each(render);
77132 function getIcon(p, geom) {
77135 else if (geom === 'line')
77136 return 'iD-other-line';
77137 else if (geom === 'vertex')
77138 return p.isFallback() ? '' : 'temaki-vertex';
77140 return 'maki-marker-stroked';
77144 function render() {
77145 var selection$$1 = select(this);
77146 var p = preset.apply(this, arguments);
77147 var geom = geometry.apply(this, arguments);
77148 var picon = getIcon(p, geom);
77149 var isMaki = /^maki-/.test(picon);
77150 var isTemaki = /^temaki-/.test(picon);
77151 var isFa = /^fa[srb]-/.test(picon);
77152 var isPOI = isMaki || isTemaki || isFa;
77153 var isFramed = (geom === 'area' || geom === 'vertex');
77156 function tag_classes(p) {
77158 for (var i in p.tags) {
77160 if (p.tags[i] !== '*') {
77161 s += ' tag-' + i + '-' + p.tags[i];
77168 var fill = selection$$1.selectAll('.preset-icon-fill')
77171 fill = fill.enter()
77176 .attr('class', function() {
77177 return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
77181 var areaFrame = selection$$1.selectAll('.preset-icon-frame')
77182 .data((geom === 'area') ? [0] : []);
77187 areaFrame = areaFrame.enter()
77189 .attr('class', 'preset-icon-frame')
77190 .call(svgIcon('#iD-preset-icon-frame'));
77193 var icon = selection$$1.selectAll('.preset-icon')
77196 icon = icon.enter()
77198 .attr('class', 'preset-icon')
77203 .attr('class', 'preset-icon preset-icon-' +
77204 (isPOI ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
77207 icon.selectAll('svg')
77208 .attr('class', function() {
77209 return 'icon ' + picon + (isPOI ? '' : tag_classes(p));
77212 icon.selectAll('use')
77213 .attr('href', '#' + picon + (isMaki ? '-15' : ''));
77217 presetIcon.preset = function(_) {
77218 if (!arguments.length) return preset;
77219 preset = utilFunctor(_);
77224 presetIcon.geometry = function(_) {
77225 if (!arguments.length) return geometry;
77226 geometry = utilFunctor(_);
77233 function uiRawMemberEditor(context) {
77234 var taginfo = services.taginfo,
77238 function selectMember(d) {
77239 event.preventDefault();
77240 context.enter(modeSelect(context, [d.id]));
77244 function changeRole(d) {
77245 var role = select(this).property('value');
77246 var member = { id: d.id, type: d.type, role: role };
77248 actionChangeMember(d.relation.id, member, d.index),
77249 t('operations.change_role.annotation')
77254 function deleteMember(d) {
77256 actionDeleteMember(d.relation.id, d.index),
77257 t('operations.delete_member.annotation')
77260 if (!context.hasEntity(d.relation.id)) {
77261 context.enter(modeBrowse(context));
77266 function rawMemberEditor(selection$$1) {
77267 var entity = context.entity(_entityID),
77270 entity.members.slice(0, 1000).forEach(function(member, index) {
77277 member: context.hasEntity(member.id)
77281 var gt = entity.members.length > 1000 ? '>' : '';
77282 selection$$1.call(uiDisclosure(context, 'raw_member_editor', true)
77283 .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
77285 .updatePreference(false)
77286 .on('toggled', function(expanded) {
77287 if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
77293 function content(wrap) {
77294 var list = wrap.selectAll('.member-list')
77297 list = list.enter()
77299 .attr('class', 'member-list')
77303 var items = list.selectAll('li')
77304 .data(memberships, function(d) {
77305 return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
77306 (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
77313 var enter = items.enter()
77315 .attr('class', 'member-row form-field')
77316 .classed('member-incomplete', function(d) { return !d.member; });
77319 .each(function(d) {
77321 var label = select(this).append('label')
77322 .attr('class', 'form-label')
77325 .on('click', selectMember);
77327 label.append('span')
77328 .attr('class', 'member-entity-type')
77329 .text(function(d) {
77330 var matched = context.presets().match(d.member, context.graph());
77331 return (matched && matched.name()) || utilDisplayType(d.member.id);
77334 label.append('span')
77335 .attr('class', 'member-entity-name')
77336 .text(function(d) { return utilDisplayName(d.member); });
77339 select(this).append('label')
77340 .attr('class', 'form-label')
77341 .text(t('inspector.incomplete', { id: d.id }));
77347 .attr('class', 'member-role')
77348 .property('type', 'text')
77349 .attr('maxlength', 255)
77350 .attr('placeholder', t('inspector.role'))
77352 .property('value', function(d) { return d.role; })
77353 .on('change', changeRole);
77357 .attr('tabindex', -1)
77358 .attr('class', 'remove button-input-action member-delete minor')
77359 .on('click', deleteMember)
77360 .call(svgIcon('#iD-operation-delete'));
77363 enter.each(bindTypeahead);
77367 function bindTypeahead(d) {
77368 var row = select(this),
77369 role = row.selectAll('input.member-role');
77371 function sort(value, data) {
77372 var sameletter = [],
77374 for (var i = 0; i < data.length; i++) {
77375 if (data[i].value.substring(0, value.length) === value) {
77376 sameletter.push(data[i]);
77378 other.push(data[i]);
77381 return sameletter.concat(other);
77384 role.call(d3combobox()
77385 .container(context.container())
77386 .fetcher(function(role, callback) {
77387 var rtype = entity.tags.type;
77390 rtype: rtype || '',
77391 geometry: context.geometry(d.member.id),
77393 }, function(err, data) {
77394 if (!err) callback(sort(role, data));
77400 function unbind() {
77401 var row = select(this);
77403 row.selectAll('input.member-role')
77404 .call(d3combobox.off);
77410 rawMemberEditor.entityID = function(_) {
77411 if (!arguments.length) return _entityID;
77413 return rawMemberEditor;
77417 return rawMemberEditor;
77420 function uiRawMembershipEditor(context) {
77421 var taginfo = services.taginfo,
77426 function selectRelation(d) {
77427 event.preventDefault();
77428 context.enter(modeSelect(context, [d.relation.id]));
77432 function changeRole(d) {
77433 var role = select(this).property('value');
77435 actionChangeMember(d.relation.id, assignIn({}, d.member, { role: role }), d.index),
77436 t('operations.change_role.annotation')
77441 function addMembership(d, role) {
77442 _showBlank = false;
77444 var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
77448 actionAddMember(d.relation.id, member),
77449 t('operations.add_member.annotation')
77453 var relation = osmRelation();
77455 actionAddEntity(relation),
77456 actionAddMember(relation.id, member),
77457 t('operations.add.annotation.relation')
77460 context.enter(modeSelect(context, [relation.id]));
77465 function deleteMembership(d) {
77467 actionDeleteMember(d.relation.id, d.index),
77468 t('operations.delete_member.annotation')
77473 function relations(q) {
77474 var newRelation = { relation: null, value: t('inspector.new_relation') };
77476 var graph = context.graph();
77478 context.intersects(context.extent()).forEach(function(entity) {
77479 if (entity.type !== 'relation' || entity.id === _entityID)
77482 var matched = context.presets().match(entity, graph),
77483 presetName = (matched && matched.name()) || t('inspector.relation'),
77484 entityName = utilDisplayName(entity) || '';
77486 var value = presetName + ' ' + entityName;
77487 if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1)
77490 result.push({ relation: entity, value: value });
77493 result.sort(function(a, b) {
77494 return osmRelation.creationOrder(a.relation, b.relation);
77497 // Dedupe identical names by appending relation id - see #2891
77498 var dupeGroups = filter(
77499 groupBy(result, 'value'),
77500 function(v) { return v.length > 1; }
77503 dupeGroups.forEach(function(group) {
77504 group.forEach(function(obj) {
77505 obj.value += ' ' + obj.relation.id;
77509 forEach(result, function(obj) {
77510 obj.title = obj.value;
77513 result.unshift(newRelation);
77518 function rawMembershipEditor(selection$$1) {
77519 var entity = context.entity(_entityID),
77520 parents = context.graph().parentRelations(entity),
77523 parents.slice(0, 1000).forEach(function(relation) {
77524 relation.members.forEach(function(member, index) {
77525 if (member.id === entity.id) {
77526 memberships.push({ relation: relation, member: member, index: index });
77531 var gt = parents.length > 1000 ? '>' : '';
77532 selection$$1.call(uiDisclosure(context, 'raw_membership_editor', true)
77533 .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
77535 .updatePreference(false)
77536 .on('toggled', function(expanded) {
77537 if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
77543 function content(wrap) {
77544 var list = wrap.selectAll('.member-list')
77547 list = list.enter()
77549 .attr('class', 'member-list')
77553 var items = list.selectAll('li.member-row-normal')
77554 .data(memberships, function(d) {
77555 return osmEntity$$1.key(d.relation) + ',' + d.index;
77562 var enter = items.enter()
77564 .attr('class', 'member-row member-row-normal form-field');
77568 .attr('class', 'form-label')
77571 .on('click', selectRelation);
77575 .attr('class', 'member-entity-type')
77576 .text(function(d) {
77577 var matched = context.presets().match(d.relation, context.graph());
77578 return (matched && matched.name()) || t('inspector.relation');
77583 .attr('class', 'member-entity-name')
77584 .text(function(d) { return utilDisplayName(d.relation); });
77588 .attr('class', 'member-role')
77589 .property('type', 'text')
77590 .attr('maxlength', 255)
77591 .attr('placeholder', t('inspector.role'))
77593 .property('value', function(d) { return d.member.role; })
77594 .on('change', changeRole);
77598 .attr('tabindex', -1)
77599 .attr('class', 'remove button-input-action member-delete minor')
77600 .on('click', deleteMembership)
77601 .call(svgIcon('#iD-operation-delete'));
77604 enter.each(bindTypeahead);
77608 var newrow = list.selectAll('.member-row-new')
77609 .data(_showBlank ? [0] : []);
77614 enter = newrow.enter()
77616 .attr('class', 'member-row member-row-new form-field');
77620 .attr('type', 'text')
77621 .attr('class', 'member-entity-input')
77626 .attr('class', 'member-role')
77627 .property('type', 'text')
77628 .attr('maxlength', 255)
77629 .attr('placeholder', t('inspector.role'))
77631 .on('change', changeRole);
77635 .attr('tabindex', -1)
77636 .attr('class', 'remove button-input-action member-delete minor')
77637 .on('click', deleteMembership)
77638 .call(svgIcon('#iD-operation-delete'));
77643 newrow.selectAll('.member-entity-input')
77645 .container(context.container())
77647 .fetcher(function(value, callback) { callback(relations(value)); })
77648 .on('accept', onAccept)
77652 var addrel = wrap.selectAll('.add-relation')
77655 addrel = addrel.enter()
77657 .attr('class', 'add-relation')
77661 .call(svgIcon('#iD-icon-plus', 'light'))
77662 .on('click', function() {
77665 list.selectAll('.member-entity-input').node().focus();
77669 function onAccept(d) {
77670 var role = list.selectAll('.member-row-new .member-role').property('value');
77671 addMembership(d, role);
77675 function bindTypeahead(d) {
77676 var row = select(this),
77677 role = row.selectAll('input.member-role');
77679 function sort(value, data) {
77680 var sameletter = [],
77682 for (var i = 0; i < data.length; i++) {
77683 if (data[i].value.substring(0, value.length) === value) {
77684 sameletter.push(data[i]);
77686 other.push(data[i]);
77689 return sameletter.concat(other);
77692 role.call(d3combobox()
77693 .container(context.container())
77694 .fetcher(function(role, callback) {
77695 var rtype = d.relation.tags.type;
77698 rtype: rtype || '',
77699 geometry: context.geometry(_entityID),
77701 }, function(err, data) {
77702 if (!err) callback(sort(role, data));
77708 function unbind() {
77709 var row = select(this);
77711 row.selectAll('input.member-role')
77712 .call(d3combobox.off);
77718 rawMembershipEditor.entityID = function(_) {
77719 if (!arguments.length) return _entityID;
77721 return rawMembershipEditor;
77725 return rawMembershipEditor;
77728 function uiPresetEditor(context) {
77729 var dispatch$$1 = dispatch('change');
77730 var formFields = uiFormFields(context);
77738 function presetEditor(selection$$1) {
77739 selection$$1.call(uiDisclosure(context, 'preset_fields', true)
77740 .title(t('inspector.all_fields'))
77746 function render(selection$$1) {
77748 var entity = context.entity(_entityID);
77749 var geometry = context.geometry(_entityID);
77750 var presets = context.presets();
77754 _preset.fields.forEach(function(field) {
77755 if (field.matchGeometry(geometry)) {
77757 uiField(context, field, entity)
77762 if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
77764 uiField(context, presets.field('restrictions'), entity)
77768 presets.universal().forEach(function(field) {
77769 if (_preset.fields.indexOf(field) === -1) {
77771 uiField(context, field, entity, { show: false })
77776 _fieldsArr.forEach(function(field) {
77778 .on('change', function(t$$1, onInput) {
77779 dispatch$$1.call('change', field, t$$1, onInput);
77784 _fieldsArr.forEach(function(field) {
77792 .call(formFields.fieldsArr(_fieldsArr), 'inspector-inner fillL3');
77795 selection$$1.selectAll('.wrap-form-field input')
77796 .on('keydown', function() {
77797 // if user presses enter, and combobox is not active, accept edits..
77798 if (event.keyCode === 13 && select('.combobox').empty()) {
77799 context.enter(modeBrowse(context));
77805 presetEditor.preset = function(val) {
77806 if (!arguments.length) return _preset;
77807 if (_preset && _preset.id === val.id) return presetEditor;
77810 return presetEditor;
77814 presetEditor.state = function(val) {
77815 if (!arguments.length) return _state;
77817 return presetEditor;
77821 presetEditor.tags = function(val) {
77822 if (!arguments.length) return _tags;
77824 // Don't reset _fieldsArr here.
77825 return presetEditor;
77829 presetEditor.entityID = function(val) {
77830 if (!arguments.length) return _entityID;
77831 if (_entityID === val) return presetEditor;
77834 return presetEditor;
77838 return utilRebind(presetEditor, dispatch$$1, 'on');
77841 function uiEntityEditor(context) {
77842 var dispatch$$1 = dispatch('choose');
77843 var _state = 'select';
77844 var _coalesceChanges = false;
77845 var _modified = false;
77851 var presetEditor = uiPresetEditor(context)
77852 .on('change', changeTags);
77853 var rawTagEditor = uiRawTagEditor(context)
77854 .on('change', changeTags);
77857 function entityEditor(selection$$1) {
77858 var entity = context.entity(_entityID);
77859 var tags = clone(entity.tags);
77862 var header = selection$$1.selectAll('.header')
77866 var enter = header.enter()
77868 .attr('class', 'header fillL cf');
77872 .attr('class', 'fl preset-reset preset-choose')
77873 .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
77877 .attr('class', 'fr preset-close')
77878 .on('click', function() { context.enter(modeBrowse(context)); })
77879 .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
77883 .text(t('inspector.edit'));
77889 header.selectAll('.preset-reset')
77890 .on('click', function() {
77891 dispatch$$1.call('choose', this, _activePreset);
77896 var body = selection$$1.selectAll('.inspector-body')
77900 enter = body.enter()
77902 .attr('class', 'inspector-body');
77906 .attr('class', 'preset-list-item inspector-inner')
77908 .attr('class', 'preset-list-button-wrap')
77910 .attr('class', 'preset-list-button preset-reset')
77911 .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
77913 .attr('class', 'label');
77917 .attr('class', 'inspector-border preset-editor');
77921 .attr('class', 'inspector-border raw-tag-editor inspector-inner');
77925 .attr('class', 'inspector-border raw-member-editor inspector-inner');
77929 .attr('class', 'raw-membership-editor inspector-inner');
77933 .attr('type', 'text')
77934 .attr('class', 'key-trap');
77941 if (_tagReference) {
77942 body.selectAll('.preset-list-button-wrap')
77943 .call(_tagReference.button);
77945 body.selectAll('.preset-list-item')
77946 .call(_tagReference.body);
77949 body.selectAll('.preset-reset')
77950 .on('click', function() {
77951 dispatch$$1.call('choose', this, _activePreset);
77954 body.select('.preset-list-item button')
77955 .call(uiPresetIcon()
77956 .geometry(context.geometry(_entityID))
77957 .preset(_activePreset)
77960 body.select('.preset-list-item .label')
77961 .text(_activePreset.name());
77963 body.select('.preset-editor')
77965 .preset(_activePreset)
77966 .entityID(_entityID)
77971 body.select('.raw-tag-editor')
77973 .preset(_activePreset)
77974 .entityID(_entityID)
77979 if (entity.type === 'relation') {
77980 body.select('.raw-member-editor')
77981 .style('display', 'block')
77982 .call(uiRawMemberEditor(context)
77983 .entityID(_entityID)
77986 body.select('.raw-member-editor')
77987 .style('display', 'none');
77990 body.select('.raw-membership-editor')
77991 .call(uiRawMembershipEditor(context)
77992 .entityID(_entityID)
77995 body.select('.key-trap')
77996 .on('keydown.key-trap', function() {
77997 // On tabbing, send focus back to the first field on the inspector-body
77998 // (probably the `name` field) #4159
77999 if (event.keyCode === 9 && !event.shiftKey) {
78000 event.preventDefault();
78001 body.select('input').node().focus();
78006 .on('change.entity-editor', historyChanged);
78009 function historyChanged() {
78010 if (_state === 'hide') return;
78012 var entity = context.hasEntity(_entityID);
78013 var graph = context.graph();
78014 if (!entity) return;
78016 var match = context.presets().match(entity, graph);
78017 var activePreset = entityEditor.preset();
78018 var weakPreset = activePreset && isEmpty(activePreset.addTags);
78020 // A "weak" preset doesn't set any tags. (e.g. "Address")
78021 // Don't replace a weak preset with a fallback preset (e.g. "Point")
78022 if (!(weakPreset && match.isFallback())) {
78023 entityEditor.preset(match);
78025 entityEditor.modified(_base !== graph);
78026 entityEditor(selection$$1);
78031 // Tag changes that fire on input can all get coalesced into a single
78032 // history operation when the user leaves the field. #2342
78033 function changeTags(changed, onInput) {
78034 var entity = context.entity(_entityID);
78035 var annotation = t('operations.change_tags.annotation');
78036 var tags = clone(entity.tags);
78038 for (var k in changed) {
78040 var v = changed[k];
78041 if (v !== undefined || tags.hasOwnProperty(k)) {
78047 tags = utilCleanTags(tags);
78050 if (!isEqual(entity.tags, tags)) {
78051 if (_coalesceChanges) {
78052 context.overwrite(actionChangeTags(_entityID, tags), annotation);
78054 context.perform(actionChangeTags(_entityID, tags), annotation);
78055 _coalesceChanges = !!onInput;
78061 entityEditor.modified = function(_) {
78062 if (!arguments.length) return _modified;
78064 d3_selectAll('button.preset-close use')
78065 .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
78066 return entityEditor;
78070 entityEditor.state = function(_) {
78071 if (!arguments.length) return _state;
78073 return entityEditor;
78077 entityEditor.entityID = function(_) {
78078 if (!arguments.length) return _entityID;
78080 _base = context.graph();
78081 _coalesceChanges = false;
78083 var presetMatch = context.presets().match(context.entity(_entityID), _base);
78085 return entityEditor
78086 .preset(presetMatch)
78091 entityEditor.preset = function(_) {
78092 if (!arguments.length) return _activePreset;
78093 if (_ !== _activePreset) {
78095 _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
78098 return entityEditor;
78102 return utilRebind(entityEditor, dispatch$$1, 'on');
78105 var pair_1 = pair$1;
78107 function search(x, dims, r) {
78108 if (!dims) dims = 'NSEW';
78109 if (typeof x !== 'string') return { val: null, regex: r };
78111 r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
78114 if (!m) return { val: null, regex: r };
78116 var dim = m[1] || m[5];
78117 if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
78120 val: (((m[2]) ? parseFloat(m[2]) : 0) +
78121 ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
78122 ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
78123 ((dim === 'S' || dim === 'W') ? -1 : 1),
78130 function pair$1(x, dims) {
78132 var one = search(x, dims);
78133 if (one.val === null) return null;
78134 var two = search(x, dims, one.regex);
78135 if (two.val === null) return null;
78136 // null if one/two are not contiguous.
78137 if (one.raw + two.raw !== x) return null;
78139 return swapdim(one.val, two.val, one.dim);
78141 return [one.val, two.val];
78145 function swapdim(a, b, dim) {
78146 if (dim === 'N' || dim === 'S') return [a, b];
78147 if (dim === 'W' || dim === 'E') return [b, a];
78150 function uiFeatureList(context) {
78151 var keybinding = d3keybinding('uiFeatureList');
78152 var _geocodeResults;
78155 function featureList(selection$$1) {
78156 var header = selection$$1
78158 .attr('class', 'header fillL cf');
78162 .text(t('inspector.feature_list'));
78164 var searchWrap = selection$$1
78166 .attr('class', 'search-header');
78168 var search = searchWrap
78170 .attr('placeholder', t('inspector.search'))
78171 .attr('type', 'search')
78173 .on('keypress', keypress)
78174 .on('keydown', keydown)
78175 .on('input', inputevent);
78178 .call(svgIcon('#iD-icon-search', 'pre-text'));
78180 var listWrap = selection$$1
78182 .attr('class', 'inspector-body');
78184 var list = listWrap
78186 .attr('class', 'feature-list cf');
78189 .on('exit.feature-list', clearSearch);
78191 .on('drawn.feature-list', mapDrawn);
78194 .on(uiCmd('⌘F'), focusSearch);
78200 function focusSearch() {
78201 var mode = context.mode() && context.mode().id;
78202 if (mode !== 'browse') return;
78204 event.preventDefault();
78205 search.node().focus();
78209 function keydown() {
78210 if (event.keyCode === 27) { // escape
78211 search.node().blur();
78216 function keypress() {
78217 var q = search.property('value'),
78218 items = list.selectAll('.feature-list-item');
78219 if (event.keyCode === 13 && q.length && items.size()) { // return
78220 click(items.datum());
78225 function inputevent() {
78226 _geocodeResults = undefined;
78231 function clearSearch() {
78232 search.property('value', '');
78237 function mapDrawn(e) {
78244 function features() {
78247 var graph = context.graph();
78248 var q = search.property('value').toLowerCase();
78250 if (!q) return result;
78252 var idMatch = q.match(/^([nwr])([0-9]+)$/);
78257 geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
78258 type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
78263 var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
78265 if (locationMatch) {
78266 var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
78270 type: t('inspector.location'),
78271 name: dmsCoordinatePair([loc[1], loc[0]]),
78276 function addEntity(entity) {
78277 if (entity.id in entities || result.length > 200)
78280 entities[entity.id] = true;
78282 var name = utilDisplayName(entity) || '';
78283 if (name.toLowerCase().indexOf(q) >= 0) {
78284 var matched = context.presets().match(entity, graph);
78285 var type = (matched && matched.name()) || utilDisplayType(entity.id);
78290 geometry: context.geometry(entity.id),
78296 graph.parentRelations(entity).forEach(function(parent) {
78301 var visible = context.surface().selectAll('.point, .line, .area').nodes();
78302 for (var i = 0; i < visible.length && result.length <= 200; i++) {
78303 var datum = visible[i].__data__;
78304 var entity = datum && datum.properties && datum.properties.entity;
78305 if (entity) { addEntity(entity); }
78308 (_geocodeResults || []).forEach(function(d) {
78309 if (d.osm_type && d.osm_id) { // some results may be missing these - #1890
78311 // Make a temporary osmEntity so we can preset match
78312 // and better localize the search result - #4725
78313 var id = osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id);
78315 tags[d.class] = d.type;
78317 var attrs = { id: id, type: d.osm_type, tags: tags };
78318 if (d.osm_type === 'way') { // for ways, add some fake closed nodes
78319 attrs.nodes = ['a','a']; // so that geometry area is possible
78322 var tempEntity = osmEntity$$1(attrs);
78323 var tempGraph = coreGraph$$1([tempEntity]);
78324 var matched = context.presets().match(tempEntity, tempGraph);
78325 var type = (matched && matched.name()) || utilDisplayType(id);
78329 geometry: tempEntity.geometry(tempGraph),
78331 name: d.display_name,
78332 extent: new geoExtent$$1(
78333 [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
78334 [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
78343 function drawList() {
78344 var value = search.property('value');
78345 var results = features();
78347 list.classed('filtered', value.length);
78349 var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
78351 var resultsIndicator = list.selectAll('.no-results-item')
78355 .property('disabled', true)
78356 .attr('class', 'no-results-item')
78357 .call(svgIcon('#iD-icon-alert', 'pre-text'));
78359 resultsIndicator.append('span')
78360 .attr('class', 'entity-name');
78362 list.selectAll('.no-results-item .entity-name')
78363 .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
78365 if (services.geocoder) {
78366 list.selectAll('.geocode-item')
78370 .attr('class', 'geocode-item')
78371 .on('click', geocoderSearch)
78373 .attr('class', 'label')
78375 .attr('class', 'entity-name')
78376 .text(t('geocoder.search'));
78379 list.selectAll('.no-results-item')
78380 .style('display', (value.length && !results.length) ? 'block' : 'none');
78382 list.selectAll('.geocode-item')
78383 .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
78385 list.selectAll('.feature-list-item')
78389 var items = list.selectAll('.feature-list-item')
78390 .data(results, function(d) { return d.id; });
78392 var enter = items.enter()
78393 .insert('button', '.geocode-item')
78394 .attr('class', 'feature-list-item')
78395 .on('mouseover', mouseover)
78396 .on('mouseout', mouseout)
78397 .on('click', click);
78401 .attr('class', 'label');
78404 .each(function(d) {
78406 .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
78411 .attr('class', 'entity-type')
78412 .text(function(d) { return d.type; });
78416 .attr('class', 'entity-name')
78417 .text(function(d) { return d.name; });
78420 .style('opacity', 0)
78422 .style('opacity', 1);
78431 function mouseover(d) {
78432 if (d.id === -1) return;
78434 context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
78435 .classed('hover', true);
78439 function mouseout() {
78440 context.surface().selectAll('.hover')
78441 .classed('hover', false);
78445 function click(d) {
78446 event.preventDefault();
78448 context.map().centerZoom([d.location[1], d.location[0]], 19);
78450 else if (d.entity) {
78451 if (d.entity.type === 'node') {
78452 context.map().center(d.entity.loc);
78453 } else if (d.entity.type === 'way') {
78454 var center = context.projection(context.map().center());
78455 var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
78456 context.map().center(edge.loc);
78458 context.enter(modeSelect(context, [d.entity.id]));
78460 context.zoomToEntity(d.id);
78465 function geocoderSearch() {
78466 services.geocoder.search(search.property('value'), function (err, resp) {
78467 _geocodeResults = resp || [];
78474 return featureList;
78480 function uiFlash() {
78481 var _duration = 2000;
78482 var _iconName = '#iD-icon-no';
78483 var _iconClass = 'disabled';
78490 _flashTimer.stop();
78493 select('#footer-wrap')
78494 .attr('class', 'footer-hide');
78495 select('#flash-wrap')
78496 .attr('class', 'footer-show');
78498 var content = select('#flash-wrap').selectAll('.flash-content')
78502 var contentEnter = content.enter()
78504 .attr('class', 'flash-content');
78506 var iconEnter = contentEnter
78508 .attr('class', 'flash-icon')
78510 .attr('transform', 'translate(10,10)');
78518 .attr('transform', 'translate(-7,-7)')
78519 .attr('width', '14')
78520 .attr('height', '14');
78524 .attr('class', 'flash-text');
78529 .merge(contentEnter);
78532 .selectAll('.flash-icon')
78533 .attr('class', 'flash-icon ' + (_iconClass || ''));
78536 .selectAll('.flash-icon use')
78537 .attr('xlink:href', _iconName);
78540 .selectAll('.flash-text')
78541 .attr('class', 'flash-text ' + (_textClass || ''))
78545 _flashTimer = timeout$1(function() {
78546 _flashTimer = null;
78547 select('#footer-wrap')
78548 .attr('class', 'footer-show');
78549 select('#flash-wrap')
78550 .attr('class', 'footer-hide');
78557 flash.duration = function(_) {
78558 if (!arguments.length) return _duration;
78563 flash.text = function(_) {
78564 if (!arguments.length) return _text;
78569 flash.textClass = function(_) {
78570 if (!arguments.length) return _textClass;
78575 flash.iconName = function(_) {
78576 if (!arguments.length) return _iconName;
78581 flash.iconClass = function(_) {
78582 if (!arguments.length) return _iconClass;
78590 function uiPresetList(context) {
78591 var dispatch$$1 = dispatch('choose'),
78597 function presetList(selection$$1) {
78598 var entity = context.entity(id),
78599 geometry = context.geometry(id);
78601 // Treat entities on addr:interpolation lines as points, not vertices (#3241)
78602 if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
78603 geometry = 'point';
78606 var presets = context.presets().matchGeometry(geometry);
78608 selection$$1.html('');
78610 var messagewrap = selection$$1
78612 .attr('class', 'header fillL cf');
78614 var message = messagewrap
78616 .text(t('inspector.choose'));
78618 if (context.entity(id).isUsed(context.graph())) {
78621 .attr('class', 'preset-choose')
78622 .on('click', function() { dispatch$$1.call('choose', this, currentPreset); })
78623 .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
78627 .attr('class', 'close')
78628 .on('click', function() {
78629 context.enter(modeBrowse(context));
78631 .call(svgIcon('#iD-icon-close'));
78634 function keydown() {
78635 // hack to let delete shortcut work when search is autofocused
78636 if (search.property('value').length === 0 &&
78637 (event.keyCode === d3keybinding.keyCodes['⌫'] ||
78638 event.keyCode === d3keybinding.keyCodes['⌦'])) {
78639 event.preventDefault();
78640 event.stopPropagation();
78641 operationDelete([id], context)();
78642 } else if (search.property('value').length === 0 &&
78643 (event.ctrlKey || event.metaKey) &&
78644 event.keyCode === d3keybinding.keyCodes.z) {
78645 event.preventDefault();
78646 event.stopPropagation();
78648 } else if (!event.ctrlKey && !event.metaKey) {
78649 select(this).on('keydown', null);
78653 function keypress() {
78655 var value = search.property('value');
78656 if (event.keyCode === 13 && value.length) {
78657 list.selectAll('.preset-list-item:first-child').datum().choose();
78661 function inputevent() {
78662 var value = search.property('value');
78663 list.classed('filtered', value.length);
78664 if (value.length) {
78665 var results = presets.search(value, geometry);
78666 message.text(t('inspector.results', {
78667 n: results.collection.length,
78670 list.call(drawList, results);
78672 list.call(drawList, context.presets().defaults(geometry, 36));
78673 message.text(t('inspector.choose'));
78677 var searchWrap = selection$$1
78679 .attr('class', 'search-header');
78681 var search = searchWrap
78683 .attr('class', 'preset-search-input')
78684 .attr('placeholder', t('inspector.search'))
78685 .attr('type', 'search')
78687 .on('keydown', keydown)
78688 .on('keypress', keypress)
78689 .on('input', inputevent);
78692 .call(svgIcon('#iD-icon-search', 'pre-text'));
78695 search.node().focus();
78698 var listWrap = selection$$1
78700 .attr('class', 'inspector-body');
78702 var list = listWrap
78704 .attr('class', 'preset-list fillL cf')
78705 .call(drawList, context.presets().defaults(geometry, 36));
78709 function drawList(list, presets) {
78710 var collection = presets.collection.map(function(preset) {
78711 return preset.members ? CategoryItem(preset) : PresetItem(preset);
78714 var items = list.selectAll('.preset-list-item')
78715 .data(collection, function(d) { return d.preset.id; });
78724 .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
78725 .classed('current', function(item) { return item.preset === currentPreset; })
78726 .each(function(item) { select(this).call(item); })
78727 .style('opacity', 0)
78729 .style('opacity', 1);
78733 function CategoryItem(preset) {
78734 var box, sublist, shown = false;
78736 function item(selection$$1) {
78737 var wrap = selection$$1.append('div')
78738 .attr('class', 'preset-list-button-wrap category col12');
78742 .attr('class', 'preset-list-button')
78743 .classed('expanded', false)
78744 .call(uiPresetIcon()
78745 .geometry(context.geometry(id))
78747 .on('click', function() {
78748 var isExpanded = select(this).classed('expanded');
78749 var iconName = isExpanded ?
78750 (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
78752 .classed('expanded', !isExpanded);
78753 select(this).selectAll('div.label svg.icon use')
78754 .attr('href', iconName);
78760 .attr('class', 'label');
78763 .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
78765 .html(function() { return preset.name() + '…'; });
78767 box = selection$$1.append('div')
78768 .attr('class', 'subgrid col12')
78769 .style('max-height', '0px')
78770 .style('opacity', 0);
78773 .attr('class', 'arrow');
78775 sublist = box.append('div')
78776 .attr('class', 'preset-list fillL3 cf fl');
78780 item.choose = function() {
78781 if (!box || !sublist) return;
78787 .style('opacity', '0')
78788 .style('max-height', '0px')
78789 .style('padding-bottom', '0px');
78792 sublist.call(drawList, preset.members);
78795 .style('opacity', '1')
78796 .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
78797 .style('padding-bottom', '20px');
78801 item.preset = preset;
78807 function PresetItem(preset) {
78808 function item(selection$$1) {
78809 var wrap = selection$$1.append('div')
78810 .attr('class', 'preset-list-button-wrap col12');
78812 wrap.append('button')
78813 .attr('class', 'preset-list-button')
78814 .call(uiPresetIcon()
78815 .geometry(context.geometry(id))
78817 .on('click', item.choose)
78819 .attr('class', 'label')
78820 .text(preset.name());
78822 wrap.call(item.reference.button);
78823 selection$$1.call(item.reference.body);
78826 item.choose = function() {
78827 context.presets().choose(preset);
78830 actionChangePreset(id, currentPreset, preset),
78831 t('operations.change_tags.annotation')
78834 dispatch$$1.call('choose', this, preset);
78837 item.help = function() {
78838 event.stopPropagation();
78839 item.reference.toggle();
78842 item.preset = preset;
78843 item.reference = uiTagReference(preset.reference(context.geometry(id)), context);
78849 presetList.autofocus = function(_) {
78850 if (!arguments.length) return autofocus;
78856 presetList.entityID = function(_) {
78857 if (!arguments.length) return id;
78859 presetList.preset(context.presets().match(context.entity(id), context.graph()));
78864 presetList.preset = function(_) {
78865 if (!arguments.length) return currentPreset;
78871 return utilRebind(presetList, dispatch$$1, 'on');
78874 function uiViewOnOSM(context) {
78875 var _what; // an osmEntity or osmNote
78878 function viewOnOSM(selection) {
78880 if (_what instanceof osmEntity$$1) {
78881 url = context.connection().entityURL(_what);
78882 } else if (_what instanceof osmNote) {
78883 url = context.connection().noteURL(_what);
78886 var data = ((!_what || _what.isNew()) ? [] : [_what]);
78887 var link = selection.selectAll('.view-on-osm')
78888 .data(data, function(d) { return d.id; });
78895 var linkEnter = link.enter()
78897 .attr('class', 'view-on-osm')
78898 .attr('target', '_blank')
78900 .call(svgIcon('#iD-icon-out-link', 'inline'));
78904 .text(t('inspector.view_on_osm'));
78908 viewOnOSM.what = function(_) {
78909 if (!arguments.length) return _what;
78917 function uiInspector(context) {
78918 var presetList = uiPresetList(context);
78919 var entityEditor = uiEntityEditor(context);
78920 var _state = 'select';
78922 var _newFeature = false;
78925 function inspector(selection$$1) {
78927 .entityID(_entityID)
78928 .autofocus(_newFeature)
78929 .on('choose', setPreset);
78933 .entityID(_entityID)
78934 .on('choose', showList);
78936 var wrap = selection$$1.selectAll('.panewrap')
78939 var enter = wrap.enter()
78941 .attr('class', 'panewrap');
78945 .attr('class', 'preset-list-pane pane');
78949 .attr('class', 'entity-editor-pane pane');
78951 wrap = wrap.merge(enter);
78952 var presetPane = wrap.selectAll('.preset-list-pane');
78953 var editorPane = wrap.selectAll('.entity-editor-pane');
78955 var graph = context.graph();
78956 var entity = context.entity(_entityID);
78958 var showEditor = _state === 'hover' ||
78959 entity.isUsed(graph) ||
78960 entity.isHighwayIntersection(graph);
78963 wrap.style('right', '0%');
78964 editorPane.call(entityEditor);
78966 wrap.style('right', '-100%');
78967 presetPane.call(presetList);
78970 var footer = selection$$1.selectAll('.footer')
78973 footer = footer.enter()
78975 .attr('class', 'footer')
78979 .call(uiViewOnOSM(context)
78980 .what(context.hasEntity(_entityID))
78984 function showList(preset) {
78986 .styleTween('right', function() { return interpolate('0%', '-100%'); });
78989 .call(presetList.preset(preset).autofocus(true));
78993 function setPreset(preset) {
78995 .styleTween('right', function() { return interpolate('-100%', '0%'); });
78998 .call(entityEditor.preset(preset));
79003 inspector.state = function(_) {
79004 if (!arguments.length) return _state;
79006 entityEditor.state(_state);
79008 // remove any old field help overlay that might have gotten attached to the inspector
79009 d3_selectAll('.field-help-body').remove();
79015 inspector.entityID = function(_) {
79016 if (!arguments.length) return _entityID;
79022 inspector.newFeature = function(_) {
79023 if (!arguments.length) return _newFeature;
79032 function uiLasso(context) {
79033 var group, polygon;
79035 lasso.coordinates = [];
79037 function lasso(selection$$1) {
79038 context.container()
79039 .classed('lasso', true);
79041 group = selection$$1
79043 .attr('class', 'lasso hide');
79047 .attr('class', 'lasso-path');
79050 .call(uiToggle(true));
79056 polygon.data([lasso.coordinates])
79057 .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
79062 lasso.extent = function () {
79063 return lasso.coordinates.reduce(function(extent, point$$1) {
79064 return extent.extend(geoExtent$$1(point$$1));
79065 }, geoExtent$$1());
79069 lasso.p = function(_) {
79070 if (!arguments.length) return lasso;
79071 lasso.coordinates.push(_);
79077 lasso.close = function() {
79079 group.call(uiToggle(false, function() {
79080 select(this).remove();
79083 context.container().classed('lasso', false);
79090 function uiNoteComments() {
79094 function noteComments(selection$$1) {
79095 if (_note.isNew()) return; // don't draw .comments-container
79097 var comments = selection$$1.selectAll('.comments-container')
79100 comments = comments.enter()
79102 .attr('class', 'comments-container')
79105 var commentEnter = comments.selectAll('.comment')
79106 .data(_note.comments)
79109 .attr('class', 'comment');
79113 .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
79114 .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
79116 var mainEnter = commentEnter
79118 .attr('class', 'comment-main');
79120 var metadataEnter = mainEnter
79122 .attr('class', 'comment-metadata');
79126 .attr('class', 'comment-author')
79127 .each(function(d) {
79128 var selection$$1 = select(this);
79129 var osm = services.osm;
79130 if (osm && d.user) {
79131 selection$$1 = selection$$1
79133 .attr('class', 'comment-author-link')
79134 .attr('href', osm.userURL(d.user))
79135 .attr('tabindex', -1)
79136 .attr('target', '_blank');
79139 .text(function(d) { return d.user || t('note.anonymous'); });
79144 .attr('class', 'comment-date')
79145 .text(function(d) {
79146 return t('note.status.' + d.action, { when: localeDateString(d.date) });
79151 .attr('class', 'comment-text')
79152 .html(function(d) { return d.html; });
79155 .call(replaceAvatars);
79159 function replaceAvatars(selection$$1) {
79160 var osm = services.osm;
79163 var uids = {}; // gather uids in the comment thread
79164 _note.comments.forEach(function(d) {
79165 if (d.uid) uids[d.uid] = true;
79168 Object.keys(uids).forEach(function(uid) {
79169 osm.loadUser(uid, function(err, user) {
79170 if (!user || !user.image_url) return;
79172 selection$$1.selectAll('.comment-avatar.user-' + uid)
79175 .attr('class', 'icon comment-avatar-icon')
79176 .attr('src', user.image_url)
79177 .attr('alt', user.display_name);
79183 function localeDateString(s) {
79184 if (!s) return null;
79185 var detected = utilDetect();
79186 var options = { day: 'numeric', month: 'short', year: 'numeric' };
79187 s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
79188 var d = new Date(s);
79189 if (isNaN(d.getTime())) return null;
79190 return d.toLocaleDateString(detected.locale, options);
79194 noteComments.note = function(_) {
79195 if (!arguments.length) return _note;
79197 return noteComments;
79201 return noteComments;
79204 function uiNoteEditor$$1(context) {
79205 var dispatch$$1 = dispatch('change');
79206 var noteComments = uiNoteComments();
79207 var noteHeader = uiNoteHeader();
79209 // var formFields = uiFormFields(context);
79215 function noteEditor(selection$$1) {
79216 var header = selection$$1.selectAll('.header')
79219 var headerEnter = header.enter()
79221 .attr('class', 'header fillL');
79225 .attr('class', 'fr note-editor-close')
79226 .on('click', function() {
79227 context.enter(modeBrowse(context));
79229 .call(svgIcon('#iD-icon-close'));
79233 .text(t('note.title'));
79236 var body = selection$$1.selectAll('.body')
79239 body = body.enter()
79241 .attr('class', 'body')
79244 var editor = body.selectAll('.note-editor')
79249 .attr('class', 'modal-section note-editor')
79251 .call(noteHeader.note(_note))
79252 .call(noteComments.note(_note))
79253 .call(noteSaveSection);
79256 var footer = selection$$1.selectAll('.footer')
79261 .attr('class', 'footer')
79263 .call(uiViewOnOSM(context).what(_note))
79264 .call(uiNoteReport(context).note(_note));
79267 // rerender the note editor on any auth change
79268 var osm = services.osm;
79270 osm.on('change.note-save', function() {
79271 selection$$1.call(noteEditor);
79277 function noteSaveSection(selection$$1) {
79278 var isSelected = (_note && _note.id === context.selectedNoteID());
79279 var noteSave = selection$$1.selectAll('.note-save')
79280 .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
79287 var noteSaveEnter = noteSave.enter()
79289 .attr('class', 'note-save save-section cf');
79291 // // if new note, show categories to pick from
79292 // if (_note.isNew()) {
79293 // var presets = context.presets();
79295 // // NOTE: this key isn't a age and therefore there is no documentation (yet)
79297 // uiField(context, presets.field('category'), null, { show: true, revert: false }),
79300 // _fieldsArr.forEach(function(field) {
79302 // .on('change', changeCategory);
79307 // .attr('class', 'note-category')
79308 // .call(formFields.fieldsArr(_fieldsArr));
79311 // function changeCategory() {
79312 // // NOTE: perhaps there is a better way to get value
79313 // var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
79315 // // store the unsaved category with the note itself
79316 // _note = _note.update({ newCategory: val });
79317 // var osm = services.osm;
79319 // osm.replaceNote(_note); // update note cache
79322 // .call(noteSaveButtons);
79327 .attr('class', '.note-save-header')
79329 return _note.isNew() ? t('note.newDescription') : t('note.newComment');
79333 .append('textarea')
79334 .attr('id', 'new-comment-input')
79335 .attr('placeholder', t('note.inputPlaceholder'))
79336 .attr('maxlength', 1000)
79337 .property('value', function(d) { return d.newComment; })
79339 .on('keydown.note-input', keydown)
79340 .on('input.note-input', changeInput)
79341 .on('blur.note-input', changeInput);
79344 noteSave = noteSaveEnter
79347 .call(noteSaveButtons);
79350 // fast submit if user presses cmd+enter
79351 function keydown() {
79352 if (!(event.keyCode === 13 && event.metaKey)) return;
79354 var osm = services.osm;
79357 var hasAuth = osm.authenticated();
79358 if (!hasAuth) return;
79360 if (!_note.newComment) return;
79362 event.preventDefault();
79365 .on('keydown.note-input', null);
79367 // focus on button and submit
79368 window.setTimeout(function() {
79369 if (_note.isNew()) {
79370 noteSave.selectAll('.save-button').node().focus();
79373 noteSave.selectAll('.comment-button').node().focus();
79374 clickComment(_note);
79380 function changeInput() {
79381 var input = select(this);
79382 var val = input.property('value').trim() || undefined;
79384 // store the unsaved comment with the note itself
79385 _note = _note.update({ newComment: val });
79387 var osm = services.osm;
79389 osm.replaceNote(_note); // update note cache
79393 .call(noteSaveButtons);
79398 function userDetails(selection$$1) {
79399 var detailSection = selection$$1.selectAll('.detail-section')
79402 detailSection = detailSection.enter()
79404 .attr('class', 'detail-section')
79405 .merge(detailSection);
79407 var osm = services.osm;
79410 // Add warning if user is not logged in
79411 var hasAuth = osm.authenticated();
79412 var authWarning = detailSection.selectAll('.auth-warning')
79413 .data(hasAuth ? [] : [0]);
79418 .style('opacity', 0)
79421 var authEnter = authWarning.enter()
79422 .insert('div', '.tag-reference-body')
79423 .attr('class', 'field-warning auth-warning')
79424 .style('opacity', 0);
79427 .call(svgIcon('#iD-icon-alert', 'inline'));
79431 .text(t('note.login'));
79435 .attr('target', '_blank')
79436 .call(svgIcon('#iD-icon-out-link', 'inline'))
79439 .on('click.note-login', function() {
79440 event.preventDefault();
79441 osm.authenticate();
79447 .style('opacity', 1);
79450 var prose = detailSection.selectAll('.note-save-prose')
79451 .data(hasAuth ? [0] : []);
79456 prose = prose.enter()
79458 .attr('class', 'note-save-prose')
79459 .text(t('note.upload_explanation'))
79462 osm.userDetails(function(err, user) {
79465 var userLink = select(document.createElement('div'));
79467 if (user.image_url) {
79470 .attr('src', user.image_url)
79471 .attr('class', 'icon pre-text user-icon');
79476 .attr('class', 'user-info')
79477 .text(user.display_name)
79478 .attr('href', osm.userURL(user.display_name))
79479 .attr('tabindex', -1)
79480 .attr('target', '_blank');
79483 .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
79488 function noteSaveButtons(selection$$1) {
79489 var osm = services.osm;
79490 var hasAuth = osm && osm.authenticated();
79492 var isSelected = (_note && _note.id === context.selectedNoteID());
79493 var buttonSection = selection$$1.selectAll('.buttons')
79494 .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
79497 buttonSection.exit()
79501 var buttonEnter = buttonSection.enter()
79503 .attr('class', 'buttons');
79505 if (_note.isNew()) {
79508 .attr('class', 'button cancel-button secondary-action')
79509 .text(t('confirm.cancel'));
79513 .attr('class', 'button save-button action')
79514 .text(t('note.save'));
79519 .attr('class', 'button status-button action');
79523 .attr('class', 'button comment-button action')
79524 .text(t('note.comment'));
79529 buttonSection = buttonSection
79530 .merge(buttonEnter);
79532 buttonSection.select('.cancel-button') // select and propagate data
79533 .on('click.cancel', clickCancel);
79535 buttonSection.select('.save-button') // select and propagate data
79536 .attr('disabled', isSaveDisabled)
79537 .on('click.save', clickSave);
79539 buttonSection.select('.status-button') // select and propagate data
79540 .attr('disabled', (hasAuth ? null : true))
79541 .text(function(d) {
79542 var action = (d.status === 'open' ? 'close' : 'open');
79543 var andComment = (d.newComment ? '_comment' : '');
79544 return t('note.' + action + andComment);
79546 .on('click.status', clickStatus);
79548 buttonSection.select('.comment-button') // select and propagate data
79549 .attr('disabled', isSaveDisabled)
79550 .on('click.comment', clickComment);
79553 function isSaveDisabled(d) {
79554 return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
79560 function clickCancel(d) {
79561 this.blur(); // avoid keeping focus on the button - #4641
79562 var osm = services.osm;
79566 context.enter(modeBrowse(context));
79567 dispatch$$1.call('change');
79571 function clickSave(d) {
79572 this.blur(); // avoid keeping focus on the button - #4641
79573 var osm = services.osm;
79575 osm.postNoteCreate(d, function(err, note) {
79576 dispatch$$1.call('change', note);
79582 function clickStatus(d) {
79583 this.blur(); // avoid keeping focus on the button - #4641
79584 var osm = services.osm;
79586 var setStatus = (d.status === 'open' ? 'closed' : 'open');
79587 osm.postNoteUpdate(d, setStatus, function(err, note) {
79588 dispatch$$1.call('change', note);
79593 function clickComment(d) {
79594 this.blur(); // avoid keeping focus on the button - #4641
79595 var osm = services.osm;
79597 osm.postNoteUpdate(d, d.status, function(err, note) {
79598 dispatch$$1.call('change', note);
79604 noteEditor.note = function(_) {
79605 if (!arguments.length) return _note;
79611 return utilRebind(noteEditor, dispatch$$1, 'on');
79614 function uiNoteHeader() {
79618 function noteHeader(selection) {
79619 var header = selection.selectAll('.note-header')
79621 (_note ? [_note] : []),
79622 function(d) { return d.status + d.id; }
79628 var headerEnter = header.enter()
79630 .attr('class', 'note-header');
79632 var iconEnter = headerEnter
79634 .attr('class', function(d) { return 'note-header-icon ' + d.status; })
79635 .classed('new', function(d) { return d.id < 0; });
79639 .attr('class', 'preset-icon-28')
79640 .call(svgIcon('#iD-icon-note', 'note-fill'));
79642 iconEnter.each(function(d) {
79643 var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
79646 .attr('class', 'note-icon-annotation')
79647 .call(svgIcon(statusIcon, 'note-annotation'));
79652 .attr('class', 'note-header-label')
79653 .text(function(d) {
79654 if (_note.isNew()) { return t('note.new'); }
79655 return t('note.note') + ' ' + d.id + ' ' +
79656 (d.status === 'closed' ? t('note.closed') : '');
79661 noteHeader.note = function(_) {
79662 if (!arguments.length) return _note;
79671 function uiNoteReport() {
79673 var url = 'https://www.openstreetmap.org/reports/new?reportable_id=';
79675 function noteReport(selection) {
79677 if (!(_note instanceof osmNote)) return;
79679 url += _note.id + '&reportable_type=Note';
79681 var data = ((!_note || _note.isNew()) ? [] : [_note]);
79682 var link = selection.selectAll('.note-report')
79683 .data(data, function(d) { return d.id; });
79690 var linkEnter = link.enter()
79692 .attr('class', 'note-report')
79693 .attr('target', '_blank')
79695 .call(svgIcon('#iD-icon-out-link', 'inline'));
79699 .text(t('note.report'));
79703 noteReport.note = function(_) {
79704 if (!arguments.length) return _note;
79712 function uiRadialMenu(context, operations) {
79714 var center = [0, 0];
79718 var radialMenu = function(selection$$1) {
79719 if (!operations.length) return;
79721 selection$$1.node().parentNode.focus();
79723 function click(operation) {
79724 event.stopPropagation();
79725 if (operation.disabled()) return;
79727 radialMenu.close();
79730 menu = selection$$1
79732 .attr('class', 'radial-menu')
79733 .attr('transform', 'translate(' + center + ')')
79734 .attr('opacity', 0);
79738 .attr('opacity', 1);
79741 var a = Math.PI / 4;
79742 var a0 = -Math.PI / 4;
79743 var a1 = a0 + (operations.length - 1) * a;
79747 .attr('class', 'radial-menu-background')
79748 .attr('d', 'M' + r * Math.sin(a0) + ',' +
79750 ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
79751 (r * Math.sin(a1) + 1e-3) + ',' +
79752 (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
79753 .attr('stroke-width', 50)
79754 .attr('stroke-linecap', 'round');
79756 var button = menu.selectAll()
79760 .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
79761 .classed('disabled', function(d) { return d.disabled(); })
79762 .attr('transform', function(d, i) {
79763 return 'translate(' + geoVecFloor([
79764 r * Math.sin(a0 + i * a),
79765 r * Math.cos(a0 + i * a)]).join(',') + ')';
79771 .on('click', click)
79772 .on('mousedown', mousedown)
79773 .on('mouseover', mouseover)
79774 .on('mouseout', mouseout);
79778 .attr('transform', 'translate(-10,-10)')
79779 .attr('width', '20')
79780 .attr('height', '20')
79781 .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
79783 tooltip = select(document.body)
79785 .attr('class', 'tooltip-inner radial-menu-tooltip');
79787 function mousedown() {
79788 event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
79791 function mouseover(d, i) {
79792 var rect = context.surfaceRect();
79793 var angle = a0 + i * a;
79794 var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
79795 var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
79796 var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
79797 var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
79800 .style('top', null)
79801 .style('left', null)
79802 .style('bottom', null)
79803 .style('right', null)
79804 .style('display', 'block')
79805 .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
79809 .style('right', right)
79810 .style('top', top);
79811 } else if (i >= 4) {
79813 .style('left', left)
79814 .style('bottom', bottom);
79817 .style('left', left)
79818 .style('top', top);
79822 function mouseout() {
79823 tooltip.style('display', 'none');
79828 radialMenu.close = function() {
79831 .style('pointer-events', 'none')
79833 .attr('opacity', 0)
79843 radialMenu.center = function(_) {
79844 if (!arguments.length) return center;
79853 function uiSelectionList(context, selectedIDs) {
79855 function selectEntity(entity) {
79856 context.enter(modeSelect(context, [entity.id]));
79860 function deselectEntity(entity) {
79861 event.stopPropagation();
79862 var index = selectedIDs.indexOf(entity.id);
79864 selectedIDs.splice(index, 1);
79866 context.enter(modeSelect(context, selectedIDs));
79870 function selectionList(selection$$1) {
79871 selection$$1.classed('selection-list-pane', true);
79873 var header = selection$$1
79875 .attr('class', 'header fillL cf');
79879 .text(t('inspector.multiselect'));
79881 var listWrap = selection$$1
79883 .attr('class', 'inspector-body');
79885 var list = listWrap
79887 .attr('class', 'feature-list cf');
79889 context.history().on('change.selection-list', drawList);
79893 function drawList() {
79894 var entities = selectedIDs
79895 .map(function(id) { return context.hasEntity(id); })
79896 .filter(function(entity) { return entity; });
79898 var items = list.selectAll('.feature-list-item')
79899 .data(entities, osmEntity$$1.key);
79905 var enter = items.enter()
79907 .attr('class', 'feature-list-item')
79908 .on('click', selectEntity);
79912 .attr('class', 'label');
79916 .attr('class', 'close')
79917 .on('click', deselectEntity)
79918 .call(svgIcon('#iD-icon-close'));
79922 .attr('class', 'entity-geom-icon')
79923 .call(svgIcon('', 'pre-text'));
79927 .attr('class', 'entity-type');
79931 .attr('class', 'entity-name');
79934 items = items.merge(enter);
79936 items.selectAll('.entity-geom-icon use')
79937 .attr('href', function() {
79938 var entity = this.parentNode.parentNode.__data__;
79939 return '#iD-icon-' + context.geometry(entity.id);
79942 items.selectAll('.entity-type')
79943 .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
79945 items.selectAll('.entity-name')
79946 .text(function(entity) { return utilDisplayName(entity); });
79950 return selectionList;
79953 function uiSourceSwitch(context) {
79958 event.preventDefault();
79960 var osm = context.connection();
79963 if (context.inIntro()) return;
79965 if (context.history().hasChanges() &&
79966 !window.confirm(t('source_switch.lose_changes'))) return;
79968 var isLive = select(this)
79972 context.enter(modeBrowse(context));
79973 context.history().clearSaved(); // remove saved history
79974 context.flush(); // remove stored data
79977 .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
79978 .classed('live', isLive);
79980 osm.switch(isLive ? keys[0] : keys[1]); // switch connection (warning: dispatches 'change' event)
79983 var sourceSwitch = function(selection$$1) {
79987 .text(t('source_switch.live'))
79988 .classed('live', true)
79989 .attr('tabindex', -1)
79990 .on('click', click);
79994 sourceSwitch.keys = function(_) {
79995 if (!arguments.length) return keys;
79997 return sourceSwitch;
80001 return sourceSwitch;
80004 function uiSuccess$$1(context) {
80007 // All else being equal, rank more "social" communities higher
80008 // (anything not in this list receives no adjustment)
80009 var COMMUNITYRANK = {
80019 var detected = utilDetect();
80020 var dispatch$$1 = dispatch('cancel');
80025 // string-to-date parsing in JavaScript is weird
80026 function parseEventDate(when) {
80029 var raw = when.trim();
80032 if (!/Z$/.test(raw)) { // if no trailing 'Z', add one
80033 raw += 'Z'; // this forces date to be parsed as a UTC date
80036 var parsed = new Date(raw);
80037 return new Date(parsed.toUTCString().substr(0, 25)); // convert to local timezone
80041 function success(selection$$1) {
80042 var header = selection$$1
80044 .attr('class', 'header fillL');
80048 .attr('class', 'fr')
80049 .on('click', function() { dispatch$$1.call('cancel'); })
80050 .call(svgIcon('#iD-icon-close'));
80054 .text(t('success.just_edited'));
80056 var body = selection$$1
80058 .attr('class', 'body save-success fillL');
80062 .attr('class', 'save-summary');
80066 .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
80070 .text(t('success.help_html'))
80072 .attr('class', 'link-out')
80073 .attr('target', '_blank')
80074 .attr('tabindex', -1)
80075 .attr('href', t('success.help_link_url'))
80076 .call(svgIcon('#iD-icon-out-link', 'inline'))
80078 .text(t('success.help_link_text'));
80080 var osm = context.connection();
80083 var changesetURL = osm.changesetURL(_changeset.id);
80085 var table = summary
80087 .attr('class', 'summary-table');
80091 .attr('class', 'summary-row');
80095 .attr('class', 'cell-icon summary-icon')
80097 .attr('target', '_blank')
80098 .attr('href', changesetURL)
80100 .attr('class', 'logo-small')
80102 .attr('xlink:href', '#iD-logo-osm');
80104 var summaryDetail = row
80106 .attr('class', 'cell-detail summary-detail');
80110 .attr('class', 'cell-detail summary-view-on-osm')
80111 .attr('target', '_blank')
80112 .attr('href', changesetURL)
80113 .text(t('success.view_on_osm'));
80117 .text(t('success.changeset_id', { changeset_id: _changeset.id }));
80120 // Gather community polygon IDs intersecting the map..
80121 var matchFeatures = data.community.query(context.map().center(), true) || [];
80122 var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
80124 // Gather community resources that are either global or match a polygon.
80125 var matchResources = filter(data.community.resources, function(v) {
80126 return !v.featureId || matchIDs.indexOf(v.featureId) !== -1;
80129 if (matchResources.length) {
80130 // sort by size ascending, then by community rank
80131 matchResources.sort(function(a, b) {
80132 var aSize = Infinity;
80133 var bSize = Infinity;
80134 var aRank = COMMUNITYRANK[a.type] || 0;
80135 var bRank = COMMUNITYRANK[b.type] || 0;
80138 aSize = data.community.features[a.featureId].properties.area;
80141 bSize = data.community.features[b.featureId].properties.area;
80144 return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
80148 .call(showCommunityLinks, matchResources);
80153 function showCommunityLinks(selection$$1, matchResources) {
80154 var communityLinks = selection$$1
80156 .attr('class', 'save-communityLinks');
80160 .text(t('success.like_osm'));
80162 var table = communityLinks
80164 .attr('class', 'community-table');
80166 var row = table.selectAll('.community-row')
80167 .data(matchResources);
80169 var rowEnter = row.enter()
80171 .attr('class', 'community-row');
80175 .attr('class', 'cell-icon community-icon')
80177 .attr('target', '_blank')
80178 .attr('href', function(d) { return d.url; })
80180 .attr('class', 'logo-small')
80182 .attr('xlink:href', function(d) { return '#community-' + d.type; });
80184 var communityDetail = rowEnter
80186 .attr('class', 'cell-detail community-detail');
80189 .each(showCommunityDetails);
80193 .attr('class', 'community-missing')
80194 .text(t('success.missing'))
80196 .attr('class', 'link-out')
80197 .attr('target', '_blank')
80198 .attr('tabindex', -1)
80199 .call(svgIcon('#iD-icon-out-link', 'inline'))
80200 .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
80202 .text(t('success.tell_us'));
80206 function showCommunityDetails(d) {
80207 var selection$$1 = select(this);
80208 var communityID = d.id;
80209 var replacements = {
80210 url: linkify(d.url),
80211 signupUrl: linkify(d.signupUrl || d.url)
80216 .attr('class', 'community-name')
80218 .attr('target', '_blank')
80219 .attr('href', d.url)
80220 .text(t('community.' + d.id + '.name'));
80222 var descriptionHTML = t('community.' + d.id + '.description', replacements);
80224 if (d.type === 'reddit') { // linkify subreddits #4997
80225 descriptionHTML = descriptionHTML
80226 .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
80231 .attr('class', 'community-description')
80232 .html(descriptionHTML);
80234 if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
80237 .call(uiDisclosure(context, 'community-more-' + d.id, false)
80239 .updatePreference(false)
80240 .title(t('success.more'))
80245 var nextEvents = (d.events || [])
80246 .map(function(event$$1) {
80247 event$$1.date = parseEventDate(event$$1.when);
80250 .filter(function(event$$1) { // date is valid and future (or today)
80251 var t$$1 = event$$1.date.getTime();
80252 var now = (new Date()).setHours(0,0,0,0);
80253 return !isNaN(t$$1) && t$$1 >= now;
80255 .sort(function(a, b) { // sort by date ascending
80256 return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
80258 .slice(0, MAXEVENTS); // limit number of events shown
80260 if (nextEvents.length) {
80263 .call(uiDisclosure(context, 'community-events-' + d.id, false)
80265 .updatePreference(false)
80266 .title(t('success.events'))
80267 .content(showNextEvents)
80269 .select('.hide-toggle')
80271 .attr('class', 'badge-text')
80272 .text(nextEvents.length);
80276 function showMore(selection$$1) {
80277 var more = selection$$1
80279 .attr('class', 'community-more');
80281 if (d.extendedDescription) {
80284 .attr('class', 'community-extended-description')
80285 .html(t('community.' + d.id + '.extendedDescription', replacements));
80288 if (d.languageCodes && d.languageCodes.length) {
80291 .attr('class', 'community-languages')
80292 .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
80297 function showNextEvents(selection$$1) {
80298 var events = selection$$1
80300 .attr('class', 'community-events');
80302 var item = events.selectAll('.community-event')
80305 var itemEnter = item.enter()
80307 .attr('class', 'community-event');
80311 .attr('class', 'community-event-name')
80313 .attr('target', '_blank')
80314 .attr('href', function(d) { return d.url; })
80315 .text(function(d) {
80317 if (d.i18n && d.id) {
80318 name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
80325 .attr('class', 'community-event-when')
80326 .text(function(d) {
80328 weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
80330 if (d.date.getHours() || d.date.getMinutes()) { // include time if it has one
80331 options.hour = 'numeric';
80332 options.minute = 'numeric';
80334 return d.date.toLocaleString(detected.locale, options);
80339 .attr('class', 'community-event-where')
80340 .text(function(d) {
80341 var where = d.where;
80342 if (d.i18n && d.id) {
80343 where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
80350 .attr('class', 'community-event-description')
80351 .text(function(d) {
80352 var description = d.description;
80353 if (d.i18n && d.id) {
80354 description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
80356 return description;
80361 function linkify(url, text) {
80362 text = text || url;
80363 return '<a target="_blank" href="' + url + '">' + text + '</a>';
80368 success.changeset = function(_) {
80369 if (!arguments.length) return _changeset;
80375 success.location = function(_) {
80376 if (!arguments.length) return _location;
80382 return utilRebind(success, dispatch$$1, 'on');
80385 function coreHistory(context) {
80386 var imageryUsed = ['Bing'];
80387 var dispatch$$1 = dispatch('change', 'undone', 'redone');
80388 var lock = utilSessionMutex('lock');
80389 var duration = 150;
80390 var _checkpoints = {};
80396 // internal _act, accepts list of actions and eased time
80397 function _act(actions, t) {
80398 actions = Array.prototype.slice.call(actions);
80401 if (!isFunction(actions[actions.length - 1])) {
80402 annotation = actions.pop();
80405 _stack[_index].transform = context.projection.transform();
80406 _stack[_index].selectedIDs = context.selectedIDs();
80408 var graph = _stack[_index].graph;
80409 for (var i = 0; i < actions.length; i++) {
80410 graph = actions[i](graph, t);
80415 annotation: annotation,
80416 imageryUsed: imageryUsed
80421 // internal _perform with eased time
80422 function _perform(args, t) {
80423 var previous = _stack[_index].graph;
80424 _stack = _stack.slice(0, _index + 1);
80425 _stack.push(_act(args, t));
80427 return change(previous);
80431 // internal _replace with eased time
80432 function _replace(args, t) {
80433 var previous = _stack[_index].graph;
80434 // assert(_index == _stack.length - 1)
80435 _stack[_index] = _act(args, t);
80436 return change(previous);
80440 // internal _overwrite with eased time
80441 function _overwrite(args, t) {
80442 var previous = _stack[_index].graph;
80447 _stack = _stack.slice(0, _index + 1);
80448 _stack.push(_act(args, t));
80450 return change(previous);
80454 // determine diffrence and dispatch a change event
80455 function change(previous) {
80456 var difference$$1 = coreDifference(previous, history.graph());
80457 dispatch$$1.call('change', this, difference$$1);
80458 return difference$$1;
80462 // iD uses namespaced keys so multiple installations do not conflict
80463 function getKey(n) {
80464 return 'iD_' + window.location.origin + '_' + n;
80470 graph: function() {
80471 return _stack[_index].graph;
80476 return _stack[0].graph;
80480 merge: function(entities, extent) {
80481 _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
80482 _tree.rebase(entities, false);
80484 dispatch$$1.call('change', this, undefined, extent);
80488 perform: function() {
80489 // complete any transition already in progress
80490 select(document).interrupt('history.perform');
80492 var transitionable = false;
80493 var action0 = arguments[0];
80495 if (arguments.length === 1 ||
80496 arguments.length === 2 && !isFunction(arguments[1])) {
80497 transitionable = !!action0.transitionable;
80500 if (transitionable) {
80501 var origArguments = arguments;
80503 .transition('history.perform')
80504 .duration(duration)
80506 .tween('history.tween', function() {
80507 return function(t) {
80508 if (t < 1) _overwrite([action0], t);
80511 .on('start', function() {
80512 _perform([action0], 0);
80514 .on('end interrupt', function() {
80515 _overwrite(origArguments, 1);
80519 return _perform(arguments);
80524 replace: function() {
80525 select(document).interrupt('history.perform');
80526 return _replace(arguments, 1);
80530 // Same as calling pop and then perform
80531 overwrite: function() {
80532 select(document).interrupt('history.perform');
80533 return _overwrite(arguments, 1);
80538 select(document).interrupt('history.perform');
80540 var previous = _stack[_index].graph;
80541 if (isNaN(+n) || +n < 0) {
80544 while (n-- > 0 && _index > 0) {
80548 return change(previous);
80552 // Back to the previous annotated state or _index = 0.
80554 select(document).interrupt('history.perform');
80556 var previous = _stack[_index].graph;
80557 while (_index > 0) {
80559 if (_stack[_index].annotation) break;
80562 dispatch$$1.call('undone', this, _stack[_index]);
80563 return change(previous);
80567 // Forward to the next annotated state.
80569 select(document).interrupt('history.perform');
80571 var previous = _stack[_index].graph;
80572 var tryIndex = _index;
80573 while (tryIndex < _stack.length - 1) {
80575 if (_stack[tryIndex].annotation) {
80577 dispatch$$1.call('redone', this, _stack[_index]);
80582 return change(previous);
80586 undoAnnotation: function() {
80589 if (_stack[i].annotation) return _stack[i].annotation;
80595 redoAnnotation: function() {
80596 var i = _index + 1;
80597 while (i <= _stack.length - 1) {
80598 if (_stack[i].annotation) return _stack[i].annotation;
80604 intersects: function(extent) {
80605 return _tree.intersects(extent, _stack[_index].graph);
80609 difference: function() {
80610 var base = _stack[0].graph;
80611 var head = _stack[_index].graph;
80612 return coreDifference(base, head);
80616 changes: function(action) {
80617 var base = _stack[0].graph;
80618 var head = _stack[_index].graph;
80621 head = action(head);
80624 var difference$$1 = coreDifference(base, head);
80627 modified: difference$$1.modified(),
80628 created: difference$$1.created(),
80629 deleted: difference$$1.deleted()
80634 validate: function(changes) {
80636 map$3(Validations, function(fn) { return fn()(changes, _stack[_index].graph); })
80641 hasChanges: function() {
80642 return this.difference().length() > 0;
80646 imageryUsed: function(sources) {
80648 imageryUsed = sources;
80651 var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
80652 return without(uniq(flatten(arr)), 'Custom');
80657 // save the current history state
80658 checkpoint: function(key) {
80659 _checkpoints[key] = {
80660 stack: cloneDeep(_stack),
80667 // restore history state to a given checkpoint or reset completely
80668 reset: function(key) {
80669 if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
80670 _stack = cloneDeep(_checkpoints[key].stack);
80671 _index = _checkpoints[key].index;
80673 _stack = [{graph: coreGraph$$1()}];
80675 _tree = coreTree(_stack[0].graph);
80678 dispatch$$1.call('change');
80683 toIntroGraph: function() {
80684 var nextId = { n: 0, r: 0, w: 0 };
80686 var graph = this.graph();
80687 var baseEntities = {};
80689 // clone base entities..
80690 forEach(graph.base().entities, function(entity) {
80691 var copy = cloneDeepWith(entity, customizer);
80692 baseEntities[copy.id] = copy;
80695 // replace base entities with head entities..
80696 forEach(graph.entities, function(entity, id) {
80698 var copy = cloneDeepWith(entity, customizer);
80699 baseEntities[copy.id] = copy;
80701 delete baseEntities[id];
80705 // swap temporary for permanent ids..
80706 forEach(baseEntities, function(entity) {
80707 if (Array.isArray(entity.nodes)) {
80708 entity.nodes = entity.nodes.map(function(node) {
80709 return permIds[node] || node;
80712 if (Array.isArray(entity.members)) {
80713 entity.members = entity.members.map(function(member) {
80714 member.id = permIds[member.id] || member.id;
80720 return JSON.stringify({ dataIntroGraph: baseEntities });
80723 function customizer(src) {
80724 var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
80725 if (isEmpty(copy.tags)) {
80729 if (Array.isArray(copy.loc)) {
80730 copy.loc[0] = +copy.loc[0].toFixed(6);
80731 copy.loc[1] = +copy.loc[1].toFixed(6);
80734 var match = src.id.match(/([nrw])-\d*/); // temporary id
80735 if (match !== null) {
80736 var nrw = match[1], permId;
80737 do { permId = nrw + (++nextId[nrw]); }
80738 while (baseEntities.hasOwnProperty(permId));
80740 copy.id = permIds[src.id] = permId;
80747 toJSON: function() {
80748 if (!this.hasChanges()) return;
80750 var allEntities = {};
80751 var baseEntities = {};
80752 var base = _stack[0];
80754 var s = _stack.map(function(i) {
80755 var modified = [], deleted = [];
80757 forEach(i.graph.entities, function(entity, id) {
80759 var key = osmEntity$$1.key(entity);
80760 allEntities[key] = entity;
80761 modified.push(key);
80766 // make sure that the originals of changed or deleted entities get merged
80767 // into the base of the _stack after restoring the data from JSON.
80768 if (id in base.graph.entities) {
80769 baseEntities[id] = base.graph.entities[id];
80771 // get originals of parent entities too
80772 forEach(base.graph._parentWays[id], function(parentId) {
80773 if (parentId in base.graph.entities) {
80774 baseEntities[parentId] = base.graph.entities[parentId];
80781 if (modified.length) x.modified = modified;
80782 if (deleted.length) x.deleted = deleted;
80783 if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
80784 if (i.annotation) x.annotation = i.annotation;
80789 return JSON.stringify({
80791 entities: values$1(allEntities),
80792 baseEntities: values$1(baseEntities),
80794 nextIDs: osmEntity$$1.id.next,
80800 fromJSON: function(json, loadChildNodes) {
80801 var h = JSON.parse(json);
80802 var loadComplete = true;
80804 osmEntity$$1.id.next = h.nextIDs;
80807 if (h.version === 2 || h.version === 3) {
80808 var allEntities = {};
80810 h.entities.forEach(function(entity) {
80811 allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
80814 if (h.version === 3) {
80815 // This merges originals for changed entities into the base of
80816 // the _stack even if the current _stack doesn't have them (for
80817 // example when iD has been restarted in a different region)
80818 var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
80819 _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
80820 _tree.rebase(baseEntities, true);
80822 // When we restore a modified way, we also need to fetch any missing
80823 // childnodes that would normally have been downloaded with it.. #2142
80824 if (loadChildNodes) {
80825 var osm = context.connection();
80826 var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
80827 var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
80829 if (!isEmpty(missing) && osm) {
80830 loadComplete = false;
80831 context.redrawEnable(false);
80833 var loading = uiLoading(context).blocking(true);
80834 context.container().call(loading);
80836 var childNodesLoaded = function(err, result) {
80838 var visible = groupBy(result.data, 'visible');
80839 if (!isEmpty(visible.true)) {
80840 missing = difference(missing, map$3(visible.true, 'id'));
80841 _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
80842 _tree.rebase(visible.true, true);
80845 // fetch older versions of nodes that were deleted..
80846 forEach(visible.false, function(entity) {
80847 osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
80851 if (err || isEmpty(missing)) {
80853 context.redrawEnable(true);
80854 dispatch$$1.call('change');
80858 osm.loadMultiple(missing, childNodesLoaded);
80863 _stack = h.stack.map(function(d) {
80864 var entities = {}, entity;
80867 d.modified.forEach(function(key) {
80868 entity = allEntities[key];
80869 entities[entity.id] = entity;
80874 d.deleted.forEach(function(id) {
80875 entities[id] = undefined;
80880 graph: coreGraph$$1(_stack[0].graph).load(entities),
80881 annotation: d.annotation,
80882 imageryUsed: d.imageryUsed
80886 } else { // original version
80887 _stack = h.stack.map(function(d) {
80890 for (var i in d.entities) {
80891 var entity = d.entities[i];
80892 entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
80895 d.graph = coreGraph$$1(_stack[0].graph).load(entities);
80900 if (loadComplete) {
80901 dispatch$$1.call('change');
80909 if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
80914 clearSaved: function() {
80915 context.debouncedSave.cancel();
80916 if (lock.locked()) context.storage(getKey('saved_history'), null);
80922 return lock.lock();
80926 unlock: function() {
80931 // is iD not open in another window and it detects that
80932 // there's a history stored in localStorage that's recoverable?
80933 restorableChanges: function() {
80934 return lock.locked() && !!context.storage(getKey('saved_history'));
80938 // load history from a version stored in localStorage
80939 restore: function() {
80940 if (!lock.locked()) return;
80942 var json = context.storage(getKey('saved_history'));
80943 if (json) history.fromJSON(json, true);
80954 return utilRebind(history, dispatch$$1, 'on');
80957 /** Used to store function metadata. */
80958 var metaMap = WeakMap && new WeakMap;
80961 * The base implementation of `setData` without support for hot loop shorting.
80964 * @param {Function} func The function to associate metadata with.
80965 * @param {*} data The metadata.
80966 * @returns {Function} Returns `func`.
80968 var baseSetData = !metaMap ? identity$8 : function(func, data) {
80969 metaMap.set(func, data);
80974 * Creates a function that produces an instance of `Ctor` regardless of
80975 * whether it was invoked as part of a `new` expression or by `call` or `apply`.
80978 * @param {Function} Ctor The constructor to wrap.
80979 * @returns {Function} Returns the new wrapped function.
80981 function createCtor(Ctor) {
80982 return function() {
80983 // Use a `switch` statement to work with class constructors. See
80984 // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
80985 // for more details.
80986 var args = arguments;
80987 switch (args.length) {
80988 case 0: return new Ctor;
80989 case 1: return new Ctor(args[0]);
80990 case 2: return new Ctor(args[0], args[1]);
80991 case 3: return new Ctor(args[0], args[1], args[2]);
80992 case 4: return new Ctor(args[0], args[1], args[2], args[3]);
80993 case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
80994 case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
80995 case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
80997 var thisBinding = baseCreate(Ctor.prototype),
80998 result = Ctor.apply(thisBinding, args);
81000 // Mimic the constructor's `return` behavior.
81001 // See https://es5.github.io/#x13.2.2 for more details.
81002 return isObject(result) ? result : thisBinding;
81006 /** Used to compose bitmasks for function metadata. */
81007 var WRAP_BIND_FLAG = 1;
81010 * Creates a function that wraps `func` to invoke it with the optional `this`
81011 * binding of `thisArg`.
81014 * @param {Function} func The function to wrap.
81015 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81016 * @param {*} [thisArg] The `this` binding of `func`.
81017 * @returns {Function} Returns the new wrapped function.
81019 function createBind(func, bitmask, thisArg) {
81020 var isBind = bitmask & WRAP_BIND_FLAG,
81021 Ctor = createCtor(func);
81023 function wrapper() {
81024 var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
81025 return fn.apply(isBind ? thisArg : this, arguments);
81030 /* Built-in method references for those with the same name as other `lodash` methods. */
81031 var nativeMax$5 = Math.max;
81034 * Creates an array that is the composition of partially applied arguments,
81035 * placeholders, and provided arguments into a single array of arguments.
81038 * @param {Array} args The provided arguments.
81039 * @param {Array} partials The arguments to prepend to those provided.
81040 * @param {Array} holders The `partials` placeholder indexes.
81041 * @params {boolean} [isCurried] Specify composing for a curried function.
81042 * @returns {Array} Returns the new array of composed arguments.
81044 function composeArgs(args, partials, holders, isCurried) {
81045 var argsIndex = -1,
81046 argsLength = args.length,
81047 holdersLength = holders.length,
81049 leftLength = partials.length,
81050 rangeLength = nativeMax$5(argsLength - holdersLength, 0),
81051 result = Array(leftLength + rangeLength),
81052 isUncurried = !isCurried;
81054 while (++leftIndex < leftLength) {
81055 result[leftIndex] = partials[leftIndex];
81057 while (++argsIndex < holdersLength) {
81058 if (isUncurried || argsIndex < argsLength) {
81059 result[holders[argsIndex]] = args[argsIndex];
81062 while (rangeLength--) {
81063 result[leftIndex++] = args[argsIndex++];
81068 /* Built-in method references for those with the same name as other `lodash` methods. */
81069 var nativeMax$6 = Math.max;
81072 * This function is like `composeArgs` except that the arguments composition
81073 * is tailored for `_.partialRight`.
81076 * @param {Array} args The provided arguments.
81077 * @param {Array} partials The arguments to append to those provided.
81078 * @param {Array} holders The `partials` placeholder indexes.
81079 * @params {boolean} [isCurried] Specify composing for a curried function.
81080 * @returns {Array} Returns the new array of composed arguments.
81082 function composeArgsRight(args, partials, holders, isCurried) {
81083 var argsIndex = -1,
81084 argsLength = args.length,
81086 holdersLength = holders.length,
81088 rightLength = partials.length,
81089 rangeLength = nativeMax$6(argsLength - holdersLength, 0),
81090 result = Array(rangeLength + rightLength),
81091 isUncurried = !isCurried;
81093 while (++argsIndex < rangeLength) {
81094 result[argsIndex] = args[argsIndex];
81096 var offset = argsIndex;
81097 while (++rightIndex < rightLength) {
81098 result[offset + rightIndex] = partials[rightIndex];
81100 while (++holdersIndex < holdersLength) {
81101 if (isUncurried || argsIndex < argsLength) {
81102 result[offset + holders[holdersIndex]] = args[argsIndex++];
81109 * Gets the number of `placeholder` occurrences in `array`.
81112 * @param {Array} array The array to inspect.
81113 * @param {*} placeholder The placeholder to search for.
81114 * @returns {number} Returns the placeholder count.
81116 function countHolders(array, placeholder) {
81117 var length = array.length,
81121 if (array[length] === placeholder) {
81129 * The function whose prototype chain sequence wrappers inherit from.
81133 function baseLodash() {
81134 // No operation performed.
81137 /** Used as references for the maximum length and index of an array. */
81138 var MAX_ARRAY_LENGTH = 4294967295;
81141 * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
81145 * @param {*} value The value to wrap.
81147 function LazyWrapper(value) {
81148 this.__wrapped__ = value;
81149 this.__actions__ = [];
81151 this.__filtered__ = false;
81152 this.__iteratees__ = [];
81153 this.__takeCount__ = MAX_ARRAY_LENGTH;
81154 this.__views__ = [];
81157 // Ensure `LazyWrapper` is an instance of `baseLodash`.
81158 LazyWrapper.prototype = baseCreate(baseLodash.prototype);
81159 LazyWrapper.prototype.constructor = LazyWrapper;
81162 * Gets metadata for `func`.
81165 * @param {Function} func The function to query.
81166 * @returns {*} Returns the metadata for `func`.
81168 var getData = !metaMap ? noop$3 : function(func) {
81169 return metaMap.get(func);
81172 /** Used to lookup unminified function names. */
81173 var realNames = {};
81175 /** Used for built-in method references. */
81176 var objectProto$k = Object.prototype;
81178 /** Used to check objects for own properties. */
81179 var hasOwnProperty$h = objectProto$k.hasOwnProperty;
81182 * Gets the name of `func`.
81185 * @param {Function} func The function to query.
81186 * @returns {string} Returns the function name.
81188 function getFuncName(func) {
81189 var result = (func.name + ''),
81190 array = realNames[result],
81191 length = hasOwnProperty$h.call(realNames, result) ? array.length : 0;
81194 var data = array[length],
81195 otherFunc = data.func;
81196 if (otherFunc == null || otherFunc == func) {
81204 * The base constructor for creating `lodash` wrapper objects.
81207 * @param {*} value The value to wrap.
81208 * @param {boolean} [chainAll] Enable explicit method chain sequences.
81210 function LodashWrapper(value, chainAll) {
81211 this.__wrapped__ = value;
81212 this.__actions__ = [];
81213 this.__chain__ = !!chainAll;
81214 this.__index__ = 0;
81215 this.__values__ = undefined;
81218 LodashWrapper.prototype = baseCreate(baseLodash.prototype);
81219 LodashWrapper.prototype.constructor = LodashWrapper;
81222 * Creates a clone of `wrapper`.
81225 * @param {Object} wrapper The wrapper to clone.
81226 * @returns {Object} Returns the cloned wrapper.
81228 function wrapperClone(wrapper) {
81229 if (wrapper instanceof LazyWrapper) {
81230 return wrapper.clone();
81232 var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
81233 result.__actions__ = copyArray(wrapper.__actions__);
81234 result.__index__ = wrapper.__index__;
81235 result.__values__ = wrapper.__values__;
81239 /** Used for built-in method references. */
81240 var objectProto$l = Object.prototype;
81242 /** Used to check objects for own properties. */
81243 var hasOwnProperty$i = objectProto$l.hasOwnProperty;
81246 * Creates a `lodash` object which wraps `value` to enable implicit method
81247 * chain sequences. Methods that operate on and return arrays, collections,
81248 * and functions can be chained together. Methods that retrieve a single value
81249 * or may return a primitive value will automatically end the chain sequence
81250 * and return the unwrapped value. Otherwise, the value must be unwrapped
81253 * Explicit chain sequences, which must be unwrapped with `_#value`, may be
81254 * enabled using `_.chain`.
81256 * The execution of chained methods is lazy, that is, it's deferred until
81257 * `_#value` is implicitly or explicitly called.
81259 * Lazy evaluation allows several methods to support shortcut fusion.
81260 * Shortcut fusion is an optimization to merge iteratee calls; this avoids
81261 * the creation of intermediate arrays and can greatly reduce the number of
81262 * iteratee executions. Sections of a chain sequence qualify for shortcut
81263 * fusion if the section is applied to an array and iteratees accept only
81264 * one argument. The heuristic for whether a section qualifies for shortcut
81265 * fusion is subject to change.
81267 * Chaining is supported in custom builds as long as the `_#value` method is
81268 * directly or indirectly included in the build.
81270 * In addition to lodash methods, wrappers have `Array` and `String` methods.
81272 * The wrapper `Array` methods are:
81273 * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
81275 * The wrapper `String` methods are:
81276 * `replace` and `split`
81278 * The wrapper methods that support shortcut fusion are:
81279 * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
81280 * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
81281 * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
81283 * The chainable wrapper methods are:
81284 * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
81285 * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
81286 * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
81287 * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
81288 * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
81289 * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
81290 * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
81291 * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
81292 * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
81293 * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
81294 * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
81295 * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
81296 * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
81297 * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
81298 * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
81299 * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
81300 * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
81301 * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
81302 * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
81303 * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
81304 * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
81305 * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
81306 * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
81307 * `zipObject`, `zipObjectDeep`, and `zipWith`
81309 * The wrapper methods that are **not** chainable by default are:
81310 * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
81311 * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
81312 * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
81313 * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
81314 * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
81315 * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
81316 * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
81317 * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
81318 * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
81319 * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
81320 * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
81321 * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
81322 * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
81323 * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
81324 * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
81325 * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
81326 * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
81327 * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
81328 * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
81329 * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
81330 * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
81331 * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
81332 * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
81333 * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
81334 * `upperFirst`, `value`, and `words`
81339 * @param {*} value The value to wrap in a `lodash` instance.
81340 * @returns {Object} Returns the new `lodash` wrapper instance.
81343 * function square(n) {
81347 * var wrapped = _([1, 2, 3]);
81349 * // Returns an unwrapped value.
81350 * wrapped.reduce(_.add);
81353 * // Returns a wrapped value.
81354 * var squares = wrapped.map(square);
81356 * _.isArray(squares);
81359 * _.isArray(squares.value());
81362 function lodash(value) {
81363 if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
81364 if (value instanceof LodashWrapper) {
81367 if (hasOwnProperty$i.call(value, '__wrapped__')) {
81368 return wrapperClone(value);
81371 return new LodashWrapper(value);
81374 // Ensure wrappers are instances of `baseLodash`.
81375 lodash.prototype = baseLodash.prototype;
81376 lodash.prototype.constructor = lodash;
81379 * Checks if `func` has a lazy counterpart.
81382 * @param {Function} func The function to check.
81383 * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
81386 function isLaziable(func) {
81387 var funcName = getFuncName(func),
81388 other = lodash[funcName];
81390 if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
81393 if (func === other) {
81396 var data = getData(other);
81397 return !!data && func === data[0];
81401 * Sets metadata for `func`.
81403 * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
81404 * period of time, it will trip its breaker and transition to an identity
81405 * function to avoid garbage collection pauses in V8. See
81406 * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
81407 * for more details.
81410 * @param {Function} func The function to associate metadata with.
81411 * @param {*} data The metadata.
81412 * @returns {Function} Returns `func`.
81414 var setData = shortOut(baseSetData);
81416 /** Used to match wrap detail comments. */
81417 var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
81418 reSplitDetails = /,? & /;
81421 * Extracts wrapper details from the `source` body comment.
81424 * @param {string} source The source to inspect.
81425 * @returns {Array} Returns the wrapper details.
81427 function getWrapDetails(source) {
81428 var match = source.match(reWrapDetails);
81429 return match ? match[1].split(reSplitDetails) : [];
81432 /** Used to match wrap detail comments. */
81433 var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
81436 * Inserts wrapper `details` in a comment at the top of the `source` body.
81439 * @param {string} source The source to modify.
81440 * @returns {Array} details The details to insert.
81441 * @returns {string} Returns the modified source.
81443 function insertWrapDetails(source, details) {
81444 var length = details.length;
81448 var lastIndex = length - 1;
81449 details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
81450 details = details.join(length > 2 ? ', ' : ' ');
81451 return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
81454 /** Used to compose bitmasks for function metadata. */
81455 var WRAP_BIND_FLAG$1 = 1,
81456 WRAP_BIND_KEY_FLAG = 2,
81457 WRAP_CURRY_FLAG = 8,
81458 WRAP_CURRY_RIGHT_FLAG = 16,
81459 WRAP_PARTIAL_FLAG = 32,
81460 WRAP_PARTIAL_RIGHT_FLAG = 64,
81461 WRAP_ARY_FLAG = 128,
81462 WRAP_REARG_FLAG = 256,
81463 WRAP_FLIP_FLAG = 512;
81465 /** Used to associate wrap methods with their bit flags. */
81467 ['ary', WRAP_ARY_FLAG],
81468 ['bind', WRAP_BIND_FLAG$1],
81469 ['bindKey', WRAP_BIND_KEY_FLAG],
81470 ['curry', WRAP_CURRY_FLAG],
81471 ['curryRight', WRAP_CURRY_RIGHT_FLAG],
81472 ['flip', WRAP_FLIP_FLAG],
81473 ['partial', WRAP_PARTIAL_FLAG],
81474 ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
81475 ['rearg', WRAP_REARG_FLAG]
81479 * Updates wrapper `details` based on `bitmask` flags.
81482 * @returns {Array} details The details to modify.
81483 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81484 * @returns {Array} Returns `details`.
81486 function updateWrapDetails(details, bitmask) {
81487 arrayEach(wrapFlags, function(pair) {
81488 var value = '_.' + pair[0];
81489 if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
81490 details.push(value);
81493 return details.sort();
81497 * Sets the `toString` method of `wrapper` to mimic the source of `reference`
81498 * with wrapper details in a comment at the top of the source body.
81501 * @param {Function} wrapper The function to modify.
81502 * @param {Function} reference The reference function.
81503 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81504 * @returns {Function} Returns `wrapper`.
81506 function setWrapToString(wrapper, reference, bitmask) {
81507 var source = (reference + '');
81508 return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
81511 /** Used to compose bitmasks for function metadata. */
81512 var WRAP_BIND_FLAG$2 = 1,
81513 WRAP_BIND_KEY_FLAG$1 = 2,
81514 WRAP_CURRY_BOUND_FLAG = 4,
81515 WRAP_CURRY_FLAG$1 = 8,
81516 WRAP_PARTIAL_FLAG$1 = 32,
81517 WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
81520 * Creates a function that wraps `func` to continue currying.
81523 * @param {Function} func The function to wrap.
81524 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81525 * @param {Function} wrapFunc The function to create the `func` wrapper.
81526 * @param {*} placeholder The placeholder value.
81527 * @param {*} [thisArg] The `this` binding of `func`.
81528 * @param {Array} [partials] The arguments to prepend to those provided to
81529 * the new function.
81530 * @param {Array} [holders] The `partials` placeholder indexes.
81531 * @param {Array} [argPos] The argument positions of the new function.
81532 * @param {number} [ary] The arity cap of `func`.
81533 * @param {number} [arity] The arity of `func`.
81534 * @returns {Function} Returns the new wrapped function.
81536 function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
81537 var isCurry = bitmask & WRAP_CURRY_FLAG$1,
81538 newHolders = isCurry ? holders : undefined,
81539 newHoldersRight = isCurry ? undefined : holders,
81540 newPartials = isCurry ? partials : undefined,
81541 newPartialsRight = isCurry ? undefined : partials;
81543 bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
81544 bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
81546 if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
81547 bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
81550 func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
81551 newHoldersRight, argPos, ary, arity
81554 var result = wrapFunc.apply(undefined, newData);
81555 if (isLaziable(func)) {
81556 setData(result, newData);
81558 result.placeholder = placeholder;
81559 return setWrapToString(result, func, bitmask);
81563 * Gets the argument placeholder value for `func`.
81566 * @param {Function} func The function to inspect.
81567 * @returns {*} Returns the placeholder value.
81569 function getHolder(func) {
81571 return object.placeholder;
81574 /* Built-in method references for those with the same name as other `lodash` methods. */
81575 var nativeMin$2 = Math.min;
81578 * Reorder `array` according to the specified indexes where the element at
81579 * the first index is assigned as the first element, the element at
81580 * the second index is assigned as the second element, and so on.
81583 * @param {Array} array The array to reorder.
81584 * @param {Array} indexes The arranged array indexes.
81585 * @returns {Array} Returns `array`.
81587 function reorder(array, indexes) {
81588 var arrLength = array.length,
81589 length = nativeMin$2(indexes.length, arrLength),
81590 oldArray = copyArray(array);
81593 var index = indexes[length];
81594 array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
81599 /** Used as the internal argument placeholder. */
81600 var PLACEHOLDER = '__lodash_placeholder__';
81603 * Replaces all `placeholder` elements in `array` with an internal placeholder
81604 * and returns an array of their indexes.
81607 * @param {Array} array The array to modify.
81608 * @param {*} placeholder The placeholder to replace.
81609 * @returns {Array} Returns the new array of placeholder indexes.
81611 function replaceHolders(array, placeholder) {
81613 length = array.length,
81617 while (++index < length) {
81618 var value = array[index];
81619 if (value === placeholder || value === PLACEHOLDER) {
81620 array[index] = PLACEHOLDER;
81621 result[resIndex++] = index;
81627 /** Used to compose bitmasks for function metadata. */
81628 var WRAP_BIND_FLAG$3 = 1,
81629 WRAP_BIND_KEY_FLAG$2 = 2,
81630 WRAP_CURRY_FLAG$2 = 8,
81631 WRAP_CURRY_RIGHT_FLAG$1 = 16,
81632 WRAP_ARY_FLAG$1 = 128,
81633 WRAP_FLIP_FLAG$1 = 512;
81636 * Creates a function that wraps `func` to invoke it with optional `this`
81637 * binding of `thisArg`, partial application, and currying.
81640 * @param {Function|string} func The function or method name to wrap.
81641 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81642 * @param {*} [thisArg] The `this` binding of `func`.
81643 * @param {Array} [partials] The arguments to prepend to those provided to
81644 * the new function.
81645 * @param {Array} [holders] The `partials` placeholder indexes.
81646 * @param {Array} [partialsRight] The arguments to append to those provided
81647 * to the new function.
81648 * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
81649 * @param {Array} [argPos] The argument positions of the new function.
81650 * @param {number} [ary] The arity cap of `func`.
81651 * @param {number} [arity] The arity of `func`.
81652 * @returns {Function} Returns the new wrapped function.
81654 function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
81655 var isAry = bitmask & WRAP_ARY_FLAG$1,
81656 isBind = bitmask & WRAP_BIND_FLAG$3,
81657 isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
81658 isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
81659 isFlip = bitmask & WRAP_FLIP_FLAG$1,
81660 Ctor = isBindKey ? undefined : createCtor(func);
81662 function wrapper() {
81663 var length = arguments.length,
81664 args = Array(length),
81668 args[index] = arguments[index];
81671 var placeholder = getHolder(wrapper),
81672 holdersCount = countHolders(args, placeholder);
81675 args = composeArgs(args, partials, holders, isCurried);
81677 if (partialsRight) {
81678 args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
81680 length -= holdersCount;
81681 if (isCurried && length < arity) {
81682 var newHolders = replaceHolders(args, placeholder);
81683 return createRecurry(
81684 func, bitmask, createHybrid, wrapper.placeholder, thisArg,
81685 args, newHolders, argPos, ary, arity - length
81688 var thisBinding = isBind ? thisArg : this,
81689 fn = isBindKey ? thisBinding[func] : func;
81691 length = args.length;
81693 args = reorder(args, argPos);
81694 } else if (isFlip && length > 1) {
81697 if (isAry && ary < length) {
81700 if (this && this !== root$2 && this instanceof wrapper) {
81701 fn = Ctor || createCtor(fn);
81703 return fn.apply(thisBinding, args);
81709 * Creates a function that wraps `func` to enable currying.
81712 * @param {Function} func The function to wrap.
81713 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81714 * @param {number} arity The arity of `func`.
81715 * @returns {Function} Returns the new wrapped function.
81717 function createCurry(func, bitmask, arity) {
81718 var Ctor = createCtor(func);
81720 function wrapper() {
81721 var length = arguments.length,
81722 args = Array(length),
81724 placeholder = getHolder(wrapper);
81727 args[index] = arguments[index];
81729 var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
81731 : replaceHolders(args, placeholder);
81733 length -= holders.length;
81734 if (length < arity) {
81735 return createRecurry(
81736 func, bitmask, createHybrid, wrapper.placeholder, undefined,
81737 args, holders, undefined, undefined, arity - length);
81739 var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
81740 return apply(fn, this, args);
81745 /** Used to compose bitmasks for function metadata. */
81746 var WRAP_BIND_FLAG$4 = 1;
81749 * Creates a function that wraps `func` to invoke it with the `this` binding
81750 * of `thisArg` and `partials` prepended to the arguments it receives.
81753 * @param {Function} func The function to wrap.
81754 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
81755 * @param {*} thisArg The `this` binding of `func`.
81756 * @param {Array} partials The arguments to prepend to those provided to
81757 * the new function.
81758 * @returns {Function} Returns the new wrapped function.
81760 function createPartial(func, bitmask, thisArg, partials) {
81761 var isBind = bitmask & WRAP_BIND_FLAG$4,
81762 Ctor = createCtor(func);
81764 function wrapper() {
81765 var argsIndex = -1,
81766 argsLength = arguments.length,
81768 leftLength = partials.length,
81769 args = Array(leftLength + argsLength),
81770 fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
81772 while (++leftIndex < leftLength) {
81773 args[leftIndex] = partials[leftIndex];
81775 while (argsLength--) {
81776 args[leftIndex++] = arguments[++argsIndex];
81778 return apply(fn, isBind ? thisArg : this, args);
81783 /** Used as the internal argument placeholder. */
81784 var PLACEHOLDER$1 = '__lodash_placeholder__';
81786 /** Used to compose bitmasks for function metadata. */
81787 var WRAP_BIND_FLAG$5 = 1,
81788 WRAP_BIND_KEY_FLAG$3 = 2,
81789 WRAP_CURRY_BOUND_FLAG$1 = 4,
81790 WRAP_CURRY_FLAG$3 = 8,
81791 WRAP_ARY_FLAG$2 = 128,
81792 WRAP_REARG_FLAG$1 = 256;
81794 /* Built-in method references for those with the same name as other `lodash` methods. */
81795 var nativeMin$3 = Math.min;
81798 * Merges the function metadata of `source` into `data`.
81800 * Merging metadata reduces the number of wrappers used to invoke a function.
81801 * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
81802 * may be applied regardless of execution order. Methods like `_.ary` and
81803 * `_.rearg` modify function arguments, making the order in which they are
81804 * executed important, preventing the merging of metadata. However, we make
81805 * an exception for a safe combined case where curried functions have `_.ary`
81806 * and or `_.rearg` applied.
81809 * @param {Array} data The destination metadata.
81810 * @param {Array} source The source metadata.
81811 * @returns {Array} Returns `data`.
81813 function mergeData(data, source) {
81814 var bitmask = data[1],
81815 srcBitmask = source[1],
81816 newBitmask = bitmask | srcBitmask,
81817 isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
81820 ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
81821 ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
81822 ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
81824 // Exit early if metadata can't be merged.
81825 if (!(isCommon || isCombo)) {
81828 // Use source `thisArg` if available.
81829 if (srcBitmask & WRAP_BIND_FLAG$5) {
81830 data[2] = source[2];
81831 // Set when currying a bound function.
81832 newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
81834 // Compose partial arguments.
81835 var value = source[3];
81837 var partials = data[3];
81838 data[3] = partials ? composeArgs(partials, value, source[4]) : value;
81839 data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
81841 // Compose partial right arguments.
81844 partials = data[5];
81845 data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
81846 data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
81848 // Use source `argPos` if available.
81853 // Use source `ary` if it's smaller.
81854 if (srcBitmask & WRAP_ARY_FLAG$2) {
81855 data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
81857 // Use source `arity` if one is not provided.
81858 if (data[9] == null) {
81859 data[9] = source[9];
81861 // Use source `func` and merge bitmasks.
81862 data[0] = source[0];
81863 data[1] = newBitmask;
81868 /** Error message constants. */
81869 var FUNC_ERROR_TEXT$4 = 'Expected a function';
81871 /** Used to compose bitmasks for function metadata. */
81872 var WRAP_BIND_FLAG$6 = 1,
81873 WRAP_BIND_KEY_FLAG$4 = 2,
81874 WRAP_CURRY_FLAG$4 = 8,
81875 WRAP_CURRY_RIGHT_FLAG$2 = 16,
81876 WRAP_PARTIAL_FLAG$2 = 32,
81877 WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
81879 /* Built-in method references for those with the same name as other `lodash` methods. */
81880 var nativeMax$7 = Math.max;
81883 * Creates a function that either curries or invokes `func` with optional
81884 * `this` binding and partially applied arguments.
81887 * @param {Function|string} func The function or method name to wrap.
81888 * @param {number} bitmask The bitmask flags.
81891 * 4 - `_.curry` or `_.curryRight` of a bound function
81893 * 16 - `_.curryRight`
81895 * 64 - `_.partialRight`
81899 * @param {*} [thisArg] The `this` binding of `func`.
81900 * @param {Array} [partials] The arguments to be partially applied.
81901 * @param {Array} [holders] The `partials` placeholder indexes.
81902 * @param {Array} [argPos] The argument positions of the new function.
81903 * @param {number} [ary] The arity cap of `func`.
81904 * @param {number} [arity] The arity of `func`.
81905 * @returns {Function} Returns the new wrapped function.
81907 function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
81908 var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
81909 if (!isBindKey && typeof func != 'function') {
81910 throw new TypeError(FUNC_ERROR_TEXT$4);
81912 var length = partials ? partials.length : 0;
81914 bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
81915 partials = holders = undefined;
81917 ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
81918 arity = arity === undefined ? arity : toInteger(arity);
81919 length -= holders ? holders.length : 0;
81921 if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
81922 var partialsRight = partials,
81923 holdersRight = holders;
81925 partials = holders = undefined;
81927 var data = isBindKey ? undefined : getData(func);
81930 func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
81935 mergeData(newData, data);
81938 bitmask = newData[1];
81939 thisArg = newData[2];
81940 partials = newData[3];
81941 holders = newData[4];
81942 arity = newData[9] = newData[9] === undefined
81943 ? (isBindKey ? 0 : func.length)
81944 : nativeMax$7(newData[9] - length, 0);
81946 if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
81947 bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
81949 if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
81950 var result = createBind(func, bitmask, thisArg);
81951 } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
81952 result = createCurry(func, bitmask, arity);
81953 } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
81954 result = createPartial(func, bitmask, thisArg, partials);
81956 result = createHybrid.apply(undefined, newData);
81958 var setter = data ? baseSetData : setData;
81959 return setWrapToString(setter(result, newData), func, bitmask);
81962 /** Used to compose bitmasks for function metadata. */
81963 var WRAP_BIND_FLAG$7 = 1,
81964 WRAP_PARTIAL_FLAG$3 = 32;
81967 * Creates a function that invokes `func` with the `this` binding of `thisArg`
81968 * and `partials` prepended to the arguments it receives.
81970 * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
81971 * may be used as a placeholder for partially applied arguments.
81973 * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
81974 * property of bound functions.
81979 * @category Function
81980 * @param {Function} func The function to bind.
81981 * @param {*} thisArg The `this` binding of `func`.
81982 * @param {...*} [partials] The arguments to be partially applied.
81983 * @returns {Function} Returns the new bound function.
81986 * function greet(greeting, punctuation) {
81987 * return greeting + ' ' + this.user + punctuation;
81990 * var object = { 'user': 'fred' };
81992 * var bound = _.bind(greet, object, 'hi');
81996 * // Bound with placeholders.
81997 * var bound = _.bind(greet, object, _, '!');
82001 var bind$2 = baseRest(function(func, thisArg, partials) {
82002 var bitmask = WRAP_BIND_FLAG$7;
82003 if (partials.length) {
82004 var holders = replaceHolders(partials, getHolder(bind$2));
82005 bitmask |= WRAP_PARTIAL_FLAG$3;
82007 return createWrap(func, bitmask, thisArg, partials, holders);
82010 // Assign default placeholders.
82011 bind$2.placeholder = {};
82013 function presetCollection(collection) {
82014 var maxSearchResults = 50,
82015 maxSuggestionResults = 10;
82019 collection: collection,
82022 item: function(id) {
82023 return find$1(this.collection, function(d) {
82024 return d.id === id;
82029 matchGeometry: function(geometry) {
82030 return presetCollection(this.collection.filter(function(d) {
82031 return d.matchGeometry(geometry);
82036 search: function(value, geometry) {
82037 if (!value) return this;
82039 function leading(a) {
82040 var index = a.indexOf(value);
82041 return index === 0 || a[index - 1] === ' ';
82044 function suggestionName(name) {
82045 var nameArray = name.split(' - ');
82046 if (nameArray.length > 1) {
82047 name = nameArray.slice(0, nameArray.length - 1).join(' - ');
82049 return name.toLowerCase();
82053 value = value.toLowerCase();
82055 var searchable = filter(this.collection, function(a) {
82056 return a.searchable !== false && a.suggestion !== true;
82058 suggestions = filter(this.collection, function(a) {
82059 return a.suggestion === true;
82063 // matches value to preset.name
82064 var leading_name = filter(searchable, function(a) {
82065 return leading(a.name().toLowerCase());
82066 }).sort(function(a, b) {
82067 var aCompare = a.name().toLowerCase(),
82068 bCompare = b.name().toLowerCase(),
82071 // priority if search string matches preset name exactly - #4325
82072 if (value === aCompare) return -1;
82073 if (value === bCompare) return 1;
82075 // priority for higher matchScore
82076 i = b.originalScore - a.originalScore;
82077 if (i !== 0) return i;
82079 // priority if search string appears earlier in preset name
82080 i = aCompare.indexOf(value) - bCompare.indexOf(value);
82081 if (i !== 0) return i;
82083 // priority for shorter preset names
82084 return a.name().length - b.name().length;
82087 // matches value to preset.terms values
82088 var leading_terms = filter(searchable, function(a) {
82089 return some(a.terms() || [], leading);
82092 // matches value to preset.tags values
82093 var leading_tag_values = filter(searchable, function(a) {
82094 return some(without(values$1(a.tags || {}), '*'), leading);
82098 // finds close matches to value in preset.name
82099 var similar_name = searchable.map(function(a) {
82102 dist: utilEditDistance(value, a.name())
82104 }).filter(function(a) {
82105 return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
82106 }).sort(function(a, b) {
82107 return a.dist - b.dist;
82108 }).map(function(a) {
82112 // finds close matches to value in preset.terms
82113 var similar_terms = filter(searchable, function(a) {
82114 return some(a.terms() || [], function(b) {
82115 return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
82119 var leading_suggestions = filter(suggestions, function(a) {
82120 return leading(suggestionName(a.name()));
82121 }).sort(function(a, b) {
82122 a = suggestionName(a.name());
82123 b = suggestionName(b.name());
82124 var i = a.indexOf(value) - b.indexOf(value);
82125 if (i === 0) return a.length - b.length;
82129 var similar_suggestions = suggestions.map(function(a) {
82132 dist: utilEditDistance(value, suggestionName(a.name()))
82134 }).filter(function(a) {
82135 return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
82136 }).sort(function(a, b) {
82137 return a.dist - b.dist;
82138 }).map(function(a) {
82142 var other = presets.item(geometry);
82144 var results = leading_name.concat(
82146 leading_tag_values,
82147 leading_suggestions.slice(0, maxSuggestionResults + 5),
82150 similar_suggestions.slice(0, maxSuggestionResults)
82151 ).slice(0, maxSearchResults - 1);
82153 return presetCollection(uniq(results.concat(other)));
82161 function presetCategory(id, category, all) {
82162 category = clone(category);
82167 category.members = presetCollection(category.members.map(function(id) {
82168 return all.item(id);
82172 category.matchGeometry = function(geometry) {
82173 return category.geometry.indexOf(geometry) >= 0;
82177 category.matchScore = function() {
82182 category.name = function() {
82183 return t('presets.categories.' + id + '.name', {'default': id});
82187 category.terms = function() {
82195 function presetField(id, field) {
82196 field = clone(field);
82200 // for use in classes, element ids, css selectors
82201 field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
82203 field.matchGeometry = function(geometry) {
82204 return !field.geometry || field.geometry === geometry;
82208 field.t = function(scope, options) {
82209 return t('presets.fields.' + id + '.' + scope, options);
82213 field.label = function() {
82214 return field.t('label', {'default': id});
82218 var placeholder = field.placeholder;
82219 field.placeholder = function() {
82220 return field.t('placeholder', {'default': placeholder});
82227 function presetPreset(id, preset, fields) {
82228 preset = clone(preset);
82231 preset.fields = (preset.fields || []).map(getFields);
82232 preset.geometry = (preset.geometry || []);
82235 function getFields(f) {
82240 preset.matchGeometry = function(geometry) {
82241 return preset.geometry.indexOf(geometry) >= 0;
82245 preset.originalScore = preset.matchScore || 1;
82248 preset.matchScore = function(entity) {
82249 var tags = preset.tags,
82252 for (var t$$1 in tags) {
82253 if (entity.tags[t$$1] === tags[t$$1]) {
82254 score += preset.originalScore;
82255 } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
82256 score += preset.originalScore / 2;
82266 preset.t = function(scope, options) {
82267 return t('presets.presets.' + id + '.' + scope, options);
82271 var origName = preset.name || '';
82272 preset.name = function() {
82273 if (preset.suggestion) {
82274 id = id.split('/');
82275 id = id[0] + '/' + id[1];
82276 return origName + ' - ' + t('presets.presets.' + id + '.name');
82278 return preset.t('name', { 'default': origName });
82281 var origTerms = (preset.terms || []).join();
82282 preset.terms = function() {
82283 return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
82287 preset.isFallback = function() {
82288 var tagCount = Object.keys(preset.tags).length;
82289 return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
82293 var reference = preset.reference || {};
82294 preset.reference = function(geometry) {
82295 var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
82296 value = reference.value || preset.tags[key];
82298 if (geometry === 'relation' && key === 'type') {
82299 if (value in preset.tags) {
82301 value = preset.tags[key];
82303 return { rtype: value };
82307 if (value === '*') {
82308 return { key: key };
82310 return { key: key, value: value };
82315 var removeTags = preset.removeTags || preset.tags || {};
82316 preset.removeTags = function(tags, geometry) {
82317 tags = omit(tags, keys$1(removeTags));
82319 for (var f in preset.fields) {
82320 var field = preset.fields[f];
82321 if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
82322 delete tags[field.key];
82331 var applyTags = preset.addTags || preset.tags || {};
82332 preset.applyTags = function(tags, geometry) {
82335 tags = clone(tags);
82337 for (k in applyTags) {
82338 if (applyTags[k] === '*') {
82341 tags[k] = applyTags[k];
82345 // Add area=yes if necessary.
82346 // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
82347 // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
82348 // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
82349 if (!applyTags.hasOwnProperty('area')) {
82351 if (geometry === 'area') {
82352 var needsAreaTag = true;
82353 if (preset.geometry.indexOf('line') === -1) {
82354 for (k in applyTags) {
82355 if (k in areaKeys) {
82356 needsAreaTag = false;
82361 if (needsAreaTag) {
82367 for (var f in preset.fields) {
82368 var field = preset.fields[f];
82369 if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
82370 tags[field.key] = field.default;
82381 function presetIndex() {
82382 // a presetCollection with methods for
82383 // loading new data and returning defaults
82385 var all = presetCollection([]);
82386 var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
82388 var _universal = [];
82389 var _recent = presetCollection([]);
82391 // Index of presets by (geometry, tag key).
82400 all.match = function(entity, resolver) {
82401 var geometry = entity.geometry(resolver);
82404 // Treat entities on addr:interpolation lines as points, not vertices - #3241
82405 if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
82406 geometry = 'point';
82409 var geometryMatches = _index[geometry];
82413 for (var k in entity.tags) {
82414 // If any part of an address is present,
82415 // allow fallback to "Address" preset - #4353
82416 if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
82417 address = geometryMatches['addr:*'][0];
82420 var keyMatches = geometryMatches[k];
82421 if (!keyMatches) continue;
82423 for (var i = 0; i < keyMatches.length; i++) {
82424 var score = keyMatches[i].matchScore(entity);
82425 if (score > best) {
82427 match = keyMatches[i];
82432 if (address && (!match || match.isFallback())) {
82436 return match || all.item(geometry);
82440 // Because of the open nature of tagging, iD will never have a complete
82441 // list of tags used in OSM, so we want it to have logic like "assume
82442 // that a closed way with an amenity tag is an area, unless the amenity
82443 // is one of these specific types". This function computes a structure
82444 // that allows testing of such conditions, based on the presets designated
82445 // as as supporting (or not supporting) the area geometry.
82447 // The returned object L is a whitelist/blacklist of tags. A closed way
82448 // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
82449 // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
82450 // and the subkeys form the blacklist.
82451 all.areaKeys = function() {
82453 var ignore = ['barrier', 'highway', 'footway', 'railway', 'type']; // probably a line..
82454 var presets = reject(all.collection, 'suggestion');
82457 presets.forEach(function(d) {
82458 for (var key in d.tags) break;
82460 if (ignore.indexOf(key) !== -1) return;
82462 if (d.geometry.indexOf('area') !== -1) { // probably an area..
82463 areaKeys[key] = areaKeys[key] || {};
82468 presets.forEach(function(d) {
82469 for (var key in d.tags) break;
82471 if (ignore.indexOf(key) !== -1) return;
82473 var value = d.tags[key];
82474 if (key in areaKeys && // probably an area...
82475 d.geometry.indexOf('line') !== -1 && // but sometimes a line
82477 areaKeys[key][value] = true;
82485 all.init = function() {
82486 var d = data.presets;
82488 all.collection = [];
82489 _recent.collection = [];
82492 _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
82495 forEach(d.fields, function(d, id) {
82496 _fields[id] = presetField(id, d);
82498 _universal.push(_fields[id]);
82504 forEach(d.presets, function(d, id) {
82505 all.collection.push(presetPreset(id, d, _fields));
82509 if (d.categories) {
82510 forEach(d.categories, function(d, id) {
82511 all.collection.push(presetCategory(id, d, all));
82516 var getItem = bind$2(all.item, all);
82518 area: presetCollection(d.defaults.area.map(getItem)),
82519 line: presetCollection(d.defaults.line.map(getItem)),
82520 point: presetCollection(d.defaults.point.map(getItem)),
82521 vertex: presetCollection(d.defaults.vertex.map(getItem)),
82522 relation: presetCollection(d.defaults.relation.map(getItem))
82526 for (var i = 0; i < all.collection.length; i++) {
82527 var preset = all.collection[i];
82528 var geometry = preset.geometry;
82530 for (var j = 0; j < geometry.length; j++) {
82531 var g = _index[geometry[j]];
82532 for (var k in preset.tags) {
82533 (g[k] = g[k] || []).push(preset);
82541 all.field = function(id) {
82542 return _fields[id];
82545 all.universal = function() {
82549 all.defaults = function(geometry, n) {
82550 var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
82551 var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
82552 return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
82555 all.choose = function(preset) {
82556 _recent = presetCollection(uniq([preset].concat(_recent.collection)));
82565 function setAreaKeys(value) {
82570 function coreContext() {
82572 context.version = '2.11.1';
82574 // create a special translation that contains the keys in place of the strings
82575 var tkeys = cloneDeep(en);
82578 function traverser(v, k, obj) {
82581 forOwn(v, traverser);
82582 } else if (isString(v)) {
82583 obj[k] = parents.join('.');
82588 forOwn(tkeys, traverser);
82589 addTranslation('_tkeys_', tkeys);
82591 addTranslation('en', en);
82594 var dispatch$$1 = dispatch('enter', 'exit', 'change');
82596 // https://github.com/openstreetmap/iD/issues/772
82597 // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
82599 try { storage = localStorage; } catch (e) {} // eslint-disable-line no-empty
82600 storage = storage || (function() {
82603 getItem: function(k) { return s[k]; },
82604 setItem: function(k, v) { s[k] = v; },
82605 removeItem: function(k) { delete s[k]; }
82609 context.storage = function(k, v) {
82611 if (arguments.length === 1) return storage.getItem(k);
82612 else if (v === null) storage.removeItem(k);
82613 else storage.setItem(k, v);
82615 // localstorage quota exceeded
82616 /* eslint-disable no-console */
82617 if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
82618 /* eslint-enable no-console */
82623 /* Straight accessors. Avoid using these if you can. */
82624 var ui, connection, history;
82625 context.ui = function() { return ui; };
82626 context.connection = function() { return connection; };
82627 context.history = function() { return history; };
82631 context.preauth = function(options) {
82633 connection.switch(options);
82638 context.loadTiles = utilCallWhenIdle(function(projection, callback) {
82640 function done(err, result) {
82641 if (connection.getConnectionId() !== cid) {
82642 if (callback) callback({ message: 'Connection Switched', status: -1 });
82645 if (!err) history.merge(result.data, result.extent);
82646 if (callback) callback(err, result);
82648 if (connection && context.editable()) {
82649 cid = connection.getConnectionId();
82650 connection.loadTiles(projection, done);
82654 context.loadEntity = function(entityID, callback) {
82656 function done(err, result) {
82657 if (connection.getConnectionId() !== cid) {
82658 if (callback) callback({ message: 'Connection Switched', status: -1 });
82661 if (!err) history.merge(result.data, result.extent);
82662 if (callback) callback(err, result);
82665 cid = connection.getConnectionId();
82666 connection.loadEntity(entityID, done);
82670 context.zoomToEntity = function(entityID, zoomTo) {
82671 if (zoomTo !== false) {
82672 this.loadEntity(entityID, function(err, result) {
82674 var entity = find$1(result.data, function(e) { return e.id === entityID; });
82675 if (entity) { map.zoomTo(entity); }
82679 map.on('drawn.zoomToEntity', function() {
82680 if (!context.hasEntity(entityID)) return;
82681 map.on('drawn.zoomToEntity', null);
82682 context.on('enter.zoomToEntity', null);
82683 context.enter(modeSelect(context, [entityID]));
82686 context.on('enter.zoomToEntity', function() {
82687 if (mode.id !== 'browse') {
82688 map.on('drawn.zoomToEntity', null);
82689 context.on('enter.zoomToEntity', null);
82694 var minEditableZoom = 16;
82695 context.minEditableZoom = function(_) {
82696 if (!arguments.length) return minEditableZoom;
82697 minEditableZoom = _;
82699 connection.tileZoom(_);
82706 var inIntro = false;
82707 context.inIntro = function(_) {
82708 if (!arguments.length) return inIntro;
82713 context.save = function() {
82714 // no history save, no message onbeforeunload
82715 if (inIntro || select('.modal').size()) return;
82718 if (mode && mode.id === 'save') {
82721 // Attempt to prevent user from creating duplicate changes - see #5200
82722 if (services.osm && services.osm.isChangesetInflight()) {
82723 history.clearSaved();
82728 canSave = context.selectedIDs().every(function(id) {
82729 var entity = context.hasEntity(id);
82730 return entity && !entity.isDegenerate();
82737 if (history.hasChanges()) {
82738 return t('save.unsaved_changes');
82744 context.hasEntity = function(id) {
82745 return history.graph().hasEntity(id);
82747 context.entity = function(id) {
82748 return history.graph().entity(id);
82750 context.childNodes = function(way) {
82751 return history.graph().childNodes(way);
82753 context.geometry = function(id) {
82754 return context.entity(id).geometry(history.graph());
82760 context.mode = function() {
82763 context.enter = function(newMode) {
82766 dispatch$$1.call('exit', this, mode);
82771 dispatch$$1.call('enter', this, mode);
82774 context.selectedIDs = function() {
82775 if (mode && mode.selectedIDs) {
82776 return mode.selectedIDs();
82782 context.activeID = function() {
82783 return mode && mode.activeID && mode.activeID();
82786 var _selectedNoteID;
82787 context.selectedNoteID = function(noteID) {
82788 if (!arguments.length) return _selectedNoteID;
82789 _selectedNoteID = noteID;
82795 context.install = function(behavior) {
82796 context.surface().call(behavior);
82798 context.uninstall = function(behavior) {
82799 context.surface().call(behavior.off);
82804 var copyIDs = [], copyGraph;
82805 context.copyGraph = function() { return copyGraph; };
82806 context.copyIDs = function(_) {
82807 if (!arguments.length) return copyIDs;
82809 copyGraph = history.graph();
82816 context.background = function() { return background; };
82821 context.features = function() { return features; };
82822 context.hasHiddenConnections = function(id) {
82823 var graph = history.graph(),
82824 entity = graph.entity(id);
82825 return features.hasHiddenConnections(entity, graph);
82831 context.presets = function() { return presets; };
82836 context.map = function() { return map; };
82837 context.layers = function() { return map.layers; };
82838 context.surface = function() { return map.surface; };
82839 context.editable = function() { return map.editable(); };
82840 context.surfaceRect = function() {
82841 return map.surface.node().getBoundingClientRect();
82847 tile: false, // tile boundaries
82848 collision: false, // label collision bounding boxes
82849 imagery: false, // imagery bounding polygons
82850 community: false, // community bounding polygons
82851 imperial: false, // imperial (not metric) bounding polygons
82852 driveLeft: false, // driveLeft bounding polygons
82853 target: false // touch targets
82855 context.debugFlags = function() {
82858 context.setDebug = function(flag, val) {
82859 if (arguments.length === 1) val = true;
82860 debugFlags[flag] = val;
82861 dispatch$$1.call('change');
82864 context.getDebug = function(flag) {
82865 return flag && debugFlags[flag];
82870 var container = select(document.body);
82871 context.container = function(_) {
82872 if (!arguments.length) return container;
82874 container.classed('id-container', true);
82878 context.embed = function(_) {
82879 if (!arguments.length) return embed;
82886 var assetPath = '';
82887 context.assetPath = function(_) {
82888 if (!arguments.length) return assetPath;
82894 context.assetMap = function(_) {
82895 if (!arguments.length) return assetMap;
82900 context.asset = function(_) {
82901 var filename = assetPath + _;
82902 return assetMap[filename] || filename;
82905 context.imagePath = function(_) {
82906 return context.asset('img/' + _);
82911 // `locale` variable contains a "requested locale".
82912 // It won't become the `currentLocale` until after loadLocale() is called.
82913 var locale, localePath;
82915 context.locale = function(loc, path) {
82916 if (!arguments.length) return currentLocale;
82922 context.loadLocale = function(callback) {
82923 if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
82924 localePath = localePath || context.asset('locales/' + locale + '.json');
82925 d3_json(localePath, function(err, result) {
82927 addTranslation(locale, result[locale]);
82947 /* reset (aka flush) */
82948 context.reset = context.flush = function() {
82949 context.debouncedSave.cancel();
82950 forEach(services, function(service) {
82951 if (service && typeof service.reset === 'function') {
82952 service.reset(context);
82963 context.projection = geoRawMercator();
82964 context.curtainProjection = geoRawMercator();
82966 locale = utilDetect().locale;
82967 if (locale && !dataLocales.hasOwnProperty(locale)) {
82968 locale = locale.split('-')[0];
82971 history = coreHistory(context);
82972 context.graph = history.graph;
82973 context.changes = history.changes;
82974 context.intersects = history.intersects;
82976 // Debounce save, since it's a synchronous localStorage write,
82977 // and history changes can happen frequently (e.g. when dragging).
82978 context.debouncedSave = debounce(context.save, 350);
82979 function withDebouncedSave(fn) {
82980 return function() {
82981 var result = fn.apply(history, arguments);
82982 context.debouncedSave();
82987 context.perform = withDebouncedSave(history.perform);
82988 context.replace = withDebouncedSave(history.replace);
82989 context.pop = withDebouncedSave(history.pop);
82990 context.overwrite = withDebouncedSave(history.overwrite);
82991 context.undo = withDebouncedSave(history.undo);
82992 context.redo = withDebouncedSave(history.redo);
82994 ui = uiInit(context);
82996 connection = services.osm;
82997 background = rendererBackground(context);
82998 features = rendererFeatures(context);
82999 presets = presetIndex();
83001 map = rendererMap(context);
83002 context.mouse = map.mouse;
83003 context.extent = map.extent;
83004 context.pan = map.pan;
83005 context.zoomIn = map.zoomIn;
83006 context.zoomOut = map.zoomOut;
83007 context.zoomInFurther = map.zoomInFurther;
83008 context.zoomOutFurther = map.zoomOutFurther;
83009 context.redrawEnable = map.redrawEnable;
83011 forEach(services, function(service) {
83012 if (service && typeof service.init === 'function') {
83013 service.init(context);
83020 areaKeys = presets.areaKeys();
83023 return utilRebind(context, dispatch$$1, 'on');
83026 function osmWay() {
83027 if (!(this instanceof osmWay)) {
83028 return (new osmWay()).initialize(arguments);
83029 } else if (arguments.length) {
83030 this.initialize(arguments);
83035 osmEntity$$1.way = osmWay;
83037 osmWay.prototype = Object.create(osmEntity$$1.prototype);
83040 assignIn(osmWay.prototype, {
83045 copy: function(resolver, copies) {
83046 if (copies[this.id]) return copies[this.id];
83048 var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
83050 var nodes = this.nodes.map(function(id) {
83051 return resolver.entity(id).copy(resolver, copies).id;
83054 copy = copy.update({ nodes: nodes });
83055 copies[this.id] = copy;
83061 extent: function(resolver) {
83062 return resolver.transient(this, 'extent', function() {
83063 var extent = geoExtent$$1();
83064 for (var i = 0; i < this.nodes.length; i++) {
83065 var node = resolver.hasEntity(this.nodes[i]);
83067 extent._extend(node.extent());
83075 first: function() {
83076 return this.nodes[0];
83081 return this.nodes[this.nodes.length - 1];
83085 contains: function(node) {
83086 return this.nodes.indexOf(node) >= 0;
83090 affix: function(node) {
83091 if (this.nodes[0] === node) return 'prefix';
83092 if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
83096 layer: function() {
83097 // explicit layer tag, clamp between -10, 10..
83098 if (isFinite(this.tags.layer)) {
83099 return Math.max(-10, Math.min(+(this.tags.layer), 10));
83102 // implied layer tag..
83103 if (this.tags.covered === 'yes') return -1;
83104 if (this.tags.location === 'overground') return 1;
83105 if (this.tags.location === 'underground') return -1;
83106 if (this.tags.location === 'underwater') return -10;
83108 if (this.tags.power === 'line') return 10;
83109 if (this.tags.power === 'minor_line') return 10;
83110 if (this.tags.aerialway) return 10;
83111 if (this.tags.bridge) return 1;
83112 if (this.tags.cutting) return -1;
83113 if (this.tags.tunnel) return -1;
83114 if (this.tags.waterway) return -1;
83115 if (this.tags.man_made === 'pipeline') return -10;
83116 if (this.tags.boundary) return -10;
83121 isOneWay: function() {
83122 // explicit oneway tag..
83127 'reversible': true,
83128 'alternating': true,
83132 if (values[this.tags.oneway] !== undefined) {
83133 return values[this.tags.oneway];
83136 // implied oneway tag..
83137 for (var key in this.tags) {
83138 if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
83145 lanes: function() {
83146 return osmLanes(this);
83150 isClosed: function() {
83151 return this.nodes.length > 1 && this.first() === this.last();
83155 isConvex: function(resolver) {
83156 if (!this.isClosed() || this.isDegenerate()) return null;
83158 var nodes = uniq(resolver.childNodes(this));
83159 var coords = map$3(nodes, 'loc');
83163 for (var i = 0; i < coords.length; i++) {
83164 var o = coords[(i+1) % coords.length];
83166 var b = coords[(i+2) % coords.length];
83167 var res = geoVecCross(a, b, o);
83169 curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
83172 } else if (prev && curr !== prev) {
83181 isArea: function() {
83182 // `highway` and `railway` are typically linear features, but there
83183 // are a few exceptions that should be treated as areas, even in the
83184 // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
83199 if (this.tags.area === 'yes')
83201 if (!this.isClosed() || this.tags.area === 'no')
83203 for (var key in this.tags) {
83204 if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
83207 if (key in lineKeys && this.tags[key] in lineKeys[key]) {
83215 isDegenerate: function() {
83216 return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
83220 areAdjacent: function(n1, n2) {
83221 for (var i = 0; i < this.nodes.length; i++) {
83222 if (this.nodes[i] === n1) {
83223 if (this.nodes[i - 1] === n2) return true;
83224 if (this.nodes[i + 1] === n2) return true;
83231 geometry: function(graph) {
83232 return graph.transient(this, 'geometry', function() {
83233 return this.isArea() ? 'area' : 'line';
83238 // If this way is not closed, append the beginning node to the end of the nodelist to close it.
83239 close: function() {
83240 if (this.isClosed() || !this.nodes.length) return this;
83242 var nodes = this.nodes.slice();
83243 nodes = nodes.filter(noRepeatNodes);
83244 nodes.push(nodes[0]);
83245 return this.update({ nodes: nodes });
83249 // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
83250 unclose: function() {
83251 if (!this.isClosed()) return this;
83253 var nodes = this.nodes.slice();
83254 var connector = this.first();
83255 var i = nodes.length - 1;
83257 // remove trailing connectors..
83258 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
83259 nodes.splice(i, 1);
83260 i = nodes.length - 1;
83263 nodes = nodes.filter(noRepeatNodes);
83264 return this.update({ nodes: nodes });
83268 // Adds a node (id) in front of the node which is currently at position index.
83269 // If index is undefined, the node will be added to the end of the way for linear ways,
83270 // or just before the final connecting node for circular ways.
83271 // Consecutive duplicates are eliminated including existing ones.
83272 // Circularity is always preserved when adding a node.
83273 addNode: function(id, index) {
83274 var nodes = this.nodes.slice();
83275 var isClosed = this.isClosed();
83276 var max = isClosed ? nodes.length - 1 : nodes.length;
83278 if (index === undefined) {
83282 if (index < 0 || index > max) {
83283 throw new RangeError('index ' + index + ' out of range 0..' + max);
83286 // If this is a closed way, remove all connector nodes except the first one
83287 // (there may be duplicates) and adjust index if necessary..
83289 var connector = this.first();
83291 // leading connectors..
83293 while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
83294 nodes.splice(i, 1);
83295 if (index > i) index--;
83298 // trailing connectors..
83299 i = nodes.length - 1;
83300 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
83301 nodes.splice(i, 1);
83302 if (index > i) index--;
83303 i = nodes.length - 1;
83307 nodes.splice(index, 0, id);
83308 nodes = nodes.filter(noRepeatNodes);
83310 // If the way was closed before, append a connector node to keep it closed..
83311 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
83312 nodes.push(nodes[0]);
83315 return this.update({ nodes: nodes });
83319 // Replaces the node which is currently at position index with the given node (id).
83320 // Consecutive duplicates are eliminated including existing ones.
83321 // Circularity is preserved when updating a node.
83322 updateNode: function(id, index) {
83323 var nodes = this.nodes.slice();
83324 var isClosed = this.isClosed();
83325 var max = nodes.length - 1;
83327 if (index === undefined || index < 0 || index > max) {
83328 throw new RangeError('index ' + index + ' out of range 0..' + max);
83331 // If this is a closed way, remove all connector nodes except the first one
83332 // (there may be duplicates) and adjust index if necessary..
83334 var connector = this.first();
83336 // leading connectors..
83338 while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
83339 nodes.splice(i, 1);
83340 if (index > i) index--;
83343 // trailing connectors..
83344 i = nodes.length - 1;
83345 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
83346 nodes.splice(i, 1);
83347 if (index === i) index = 0; // update leading connector instead
83348 i = nodes.length - 1;
83352 nodes.splice(index, 1, id);
83353 nodes = nodes.filter(noRepeatNodes);
83355 // If the way was closed before, append a connector node to keep it closed..
83356 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
83357 nodes.push(nodes[0]);
83360 return this.update({nodes: nodes});
83364 // Replaces each occurrence of node id needle with replacement.
83365 // Consecutive duplicates are eliminated including existing ones.
83366 // Circularity is preserved.
83367 replaceNode: function(needleID, replacementID) {
83368 var nodes = this.nodes.slice();
83369 var isClosed = this.isClosed();
83371 for (var i = 0; i < nodes.length; i++) {
83372 if (nodes[i] === needleID) {
83373 nodes[i] = replacementID;
83377 nodes = nodes.filter(noRepeatNodes);
83379 // If the way was closed before, append a connector node to keep it closed..
83380 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
83381 nodes.push(nodes[0]);
83384 return this.update({nodes: nodes});
83388 // Removes each occurrence of node id.
83389 // Consecutive duplicates are eliminated including existing ones.
83390 // Circularity is preserved.
83391 removeNode: function(id) {
83392 var nodes = this.nodes.slice();
83393 var isClosed = this.isClosed();
83396 .filter(function(node) { return node !== id; })
83397 .filter(noRepeatNodes);
83399 // If the way was closed before, append a connector node to keep it closed..
83400 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
83401 nodes.push(nodes[0]);
83404 return this.update({nodes: nodes});
83408 asJXON: function(changeset_id) {
83411 '@id': this.osmId(),
83412 '@version': this.version || 0,
83413 nd: map$3(this.nodes, function(id) {
83414 return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
83416 tag: map$3(this.tags, function(v, k) {
83417 return { keyAttributes: { k: k, v: v } };
83421 if (changeset_id) {
83422 r.way['@changeset'] = changeset_id;
83428 asGeoJSON: function(resolver) {
83429 return resolver.transient(this, 'GeoJSON', function() {
83430 var coordinates = map$3(resolver.childNodes(this), 'loc');
83431 if (this.isArea() && this.isClosed()) {
83434 coordinates: [coordinates]
83438 type: 'LineString',
83439 coordinates: coordinates
83446 area: function(resolver) {
83447 return resolver.transient(this, 'area', function() {
83448 var nodes = resolver.childNodes(this);
83452 coordinates: [map$3(nodes, 'loc')]
83455 if (!this.isClosed() && nodes.length) {
83456 json.coordinates[0].push(nodes[0].loc);
83459 var area = d3_geoArea(json);
83461 // Heuristic for detecting counterclockwise winding order. Assumes
83462 // that OpenStreetMap polygons are not hemisphere-spanning.
83463 if (area > 2 * Math.PI) {
83464 json.coordinates[0] = json.coordinates[0].reverse();
83465 area = d3_geoArea(json);
83468 return isNaN(area) ? 0 : area;
83474 // Filter function to eliminate consecutive duplicates.
83475 function noRepeatNodes(node, i, arr) {
83476 return i === 0 || node !== arr[i - 1];
83479 // For fixing up rendering of multipolygons with tags on the outer member.
83480 // https://github.com/openstreetmap/iD/issues/613
83481 function osmIsSimpleMultipolygonOuterMember(entity, graph) {
83482 if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
83485 var parents = graph.parentRelations(entity);
83486 if (parents.length !== 1)
83489 var parent = parents[0];
83490 if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
83493 var members = parent.members, member;
83494 for (var i = 0; i < members.length; i++) {
83495 member = members[i];
83496 if (member.id === entity.id && member.role && member.role !== 'outer')
83497 return false; // Not outer member
83498 if (member.id !== entity.id && (!member.role || member.role === 'outer'))
83499 return false; // Not a simple multipolygon
83506 function osmSimpleMultipolygonOuterMember(entity, graph) {
83507 if (entity.type !== 'way')
83510 var parents = graph.parentRelations(entity);
83511 if (parents.length !== 1)
83514 var parent = parents[0];
83515 if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
83518 var members = parent.members, member, outerMember;
83519 for (var i = 0; i < members.length; i++) {
83520 member = members[i];
83521 if (!member.role || member.role === 'outer') {
83523 return false; // Not a simple multipolygon
83524 outerMember = member;
83531 var outerEntity = graph.hasEntity(outerMember.id);
83532 if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
83535 return outerEntity;
83539 // Join `toJoin` array into sequences of connecting ways.
83541 // Segments which share identical start/end nodes will, as much as possible,
83542 // be connected with each other.
83544 // The return value is a nested array. Each constituent array contains elements
83545 // of `toJoin` which have been determined to connect.
83547 // Each consitituent array also has a `nodes` property whose value is an
83548 // ordered array of member nodes, with appropriate order reversal and
83549 // start/end coordinate de-duplication.
83551 // Members of `toJoin` must have, at minimum, `type` and `id` properties.
83552 // Thus either an array of `osmWay`s or a relation member array may be used.
83554 // If an member is an `osmWay`, its tags and childnodes may be reversed via
83555 // `actionReverse` in the output.
83557 // The returned sequences array also has an `actions` array property, containing
83558 // any reversal actions that should be applied to the graph, should the calling
83559 // code attempt to actually join the given ways.
83561 // Incomplete members (those for which `graph.hasEntity(element.id)` returns
83562 // false) and non-way members are ignored.
83564 function osmJoinWays(toJoin, graph) {
83565 function resolve(member) {
83566 return graph.childNodes(graph.entity(member.id));
83569 function reverse(item) {
83570 var action = actionReverse(item.id, { reverseOneway: true });
83571 sequences.actions.push(action);
83572 return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
83575 // make a copy containing only the items to join
83576 toJoin = toJoin.filter(function(member) {
83577 return member.type === 'way' && graph.hasEntity(member.id);
83580 // Are the things we are joining relation members or `osmWays`?
83581 // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
83583 var joinAsMembers = true;
83584 for (i = 0; i < toJoin.length; i++) {
83585 if (toJoin[i] instanceof osmWay) {
83586 joinAsMembers = false;
83591 var sequences = [];
83592 sequences.actions = [];
83594 while (toJoin.length) {
83595 // start a new sequence
83596 var item = toJoin.shift();
83597 var currWays = [item];
83598 var currNodes = resolve(item).slice();
83599 var doneSequence = false;
83602 while (toJoin.length && !doneSequence) {
83603 var start = currNodes[0];
83604 var end = currNodes[currNodes.length - 1];
83608 // Find the next way/member to join.
83609 for (i = 0; i < toJoin.length; i++) {
83611 nodes = resolve(item);
83613 // (for member ordering only, not way ordering - see #4872)
83614 // Strongly prefer to generate a forward path that preserves the order
83615 // of the members array. For multipolygons and most relations, member
83616 // order does not matter - but for routes, it does. (see #4589)
83617 // If we started this sequence backwards (i.e. next member way attaches to
83618 // the start node and not the end node), reverse the initial way before continuing.
83619 if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
83620 (nodes[nodes.length - 1] === start || nodes[0] === start)
83622 currWays[0] = reverse(currWays[0]);
83623 currNodes.reverse();
83624 start = currNodes[0];
83625 end = currNodes[currNodes.length - 1];
83628 if (nodes[0] === end) {
83629 fn = currNodes.push; // join to end
83630 nodes = nodes.slice(1);
83632 } else if (nodes[nodes.length - 1] === end) {
83633 fn = currNodes.push; // join to end
83634 nodes = nodes.slice(0, -1).reverse();
83635 item = reverse(item);
83637 } else if (nodes[nodes.length - 1] === start) {
83638 fn = currNodes.unshift; // join to beginning
83639 nodes = nodes.slice(0, -1);
83641 } else if (nodes[0] === start) {
83642 fn = currNodes.unshift; // join to beginning
83643 nodes = nodes.slice(1).reverse();
83644 item = reverse(item);
83651 if (!nodes) { // couldn't find a joinable way/member
83652 doneSequence = true;
83656 fn.apply(currWays, [item]);
83657 fn.apply(currNodes, nodes);
83659 toJoin.splice(i, 1);
83662 currWays.nodes = currNodes;
83663 sequences.push(currWays);
83669 function osmRelation() {
83670 if (!(this instanceof osmRelation)) {
83671 return (new osmRelation()).initialize(arguments);
83672 } else if (arguments.length) {
83673 this.initialize(arguments);
83678 osmEntity$$1.relation = osmRelation;
83680 osmRelation.prototype = Object.create(osmEntity$$1.prototype);
83683 osmRelation.creationOrder = function(a, b) {
83684 var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
83685 var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
83687 if (aId < 0 || bId < 0) return aId - bId;
83692 assignIn(osmRelation.prototype, {
83697 copy: function(resolver, copies) {
83698 if (copies[this.id]) return copies[this.id];
83700 var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
83702 var members = this.members.map(function(member) {
83703 return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
83706 copy = copy.update({members: members});
83707 copies[this.id] = copy;
83713 extent: function(resolver, memo) {
83714 return resolver.transient(this, 'extent', function() {
83715 if (memo && memo[this.id]) return geoExtent$$1();
83717 memo[this.id] = true;
83719 var extent = geoExtent$$1();
83720 for (var i = 0; i < this.members.length; i++) {
83721 var member = resolver.hasEntity(this.members[i].id);
83723 extent._extend(member.extent(resolver, memo));
83731 geometry: function(graph) {
83732 return graph.transient(this, 'geometry', function() {
83733 return this.isMultipolygon() ? 'area' : 'relation';
83738 isDegenerate: function() {
83739 return this.members.length === 0;
83743 // Return an array of members, each extended with an 'index' property whose value
83744 // is the member index.
83745 indexedMembers: function() {
83746 var result = new Array(this.members.length);
83747 for (var i = 0; i < this.members.length; i++) {
83748 result[i] = assignIn({}, this.members[i], {index: i});
83754 // Return the first member with the given role. A copy of the member object
83755 // is returned, extended with an 'index' property whose value is the member index.
83756 memberByRole: function(role) {
83757 for (var i = 0; i < this.members.length; i++) {
83758 if (this.members[i].role === role) {
83759 return assignIn({}, this.members[i], {index: i});
83764 // Same as memberByRole, but returns all members with the given role
83765 membersByRole: function(role) {
83767 for (var i = 0; i < this.members.length; i++) {
83768 if (this.members[i].role === role) {
83769 result.push(assignIn({}, this.members[i], {index: i}));
83775 // Return the first member with the given id. A copy of the member object
83776 // is returned, extended with an 'index' property whose value is the member index.
83777 memberById: function(id) {
83778 for (var i = 0; i < this.members.length; i++) {
83779 if (this.members[i].id === id) {
83780 return assignIn({}, this.members[i], {index: i});
83786 // Return the first member with the given id and role. A copy of the member object
83787 // is returned, extended with an 'index' property whose value is the member index.
83788 memberByIdAndRole: function(id, role) {
83789 for (var i = 0; i < this.members.length; i++) {
83790 if (this.members[i].id === id && this.members[i].role === role) {
83791 return assignIn({}, this.members[i], {index: i});
83797 addMember: function(member, index) {
83798 var members = this.members.slice();
83799 members.splice(index === undefined ? members.length : index, 0, member);
83800 return this.update({members: members});
83804 updateMember: function(member, index) {
83805 var members = this.members.slice();
83806 members.splice(index, 1, assignIn({}, members[index], member));
83807 return this.update({members: members});
83811 removeMember: function(index) {
83812 var members = this.members.slice();
83813 members.splice(index, 1);
83814 return this.update({members: members});
83818 removeMembersWithID: function(id) {
83819 var members = reject(this.members, function(m) { return m.id === id; });
83820 return this.update({members: members});
83824 // Wherever a member appears with id `needle.id`, replace it with a member
83825 // with id `replacement.id`, type `replacement.type`, and the original role,
83826 // By default, adding a duplicate member (by id and role) is prevented.
83827 // Return an updated relation.
83828 replaceMember: function(needle, replacement, keepDuplicates) {
83829 if (!this.memberById(needle.id))
83834 for (var i = 0; i < this.members.length; i++) {
83835 var member = this.members[i];
83836 if (member.id !== needle.id) {
83837 members.push(member);
83838 } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
83839 members.push({id: replacement.id, type: replacement.type, role: member.role});
83843 return this.update({members: members});
83847 asJXON: function(changeset_id) {
83850 '@id': this.osmId(),
83851 '@version': this.version || 0,
83852 member: map$3(this.members, function(member) {
83857 ref: osmEntity$$1.id.toOSM(member.id)
83861 tag: map$3(this.tags, function(v, k) {
83862 return { keyAttributes: { k: k, v: v } };
83866 if (changeset_id) r.relation['@changeset'] = changeset_id;
83871 asGeoJSON: function(resolver) {
83872 return resolver.transient(this, 'GeoJSON', function () {
83873 if (this.isMultipolygon()) {
83875 type: 'MultiPolygon',
83876 coordinates: this.multipolygon(resolver)
83880 type: 'FeatureCollection',
83881 properties: this.tags,
83882 features: this.members.map(function (member) {
83883 return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
83891 area: function(resolver) {
83892 return resolver.transient(this, 'area', function() {
83893 return d3_geoArea(this.asGeoJSON(resolver));
83898 isMultipolygon: function() {
83899 return this.tags.type === 'multipolygon';
83903 isComplete: function(resolver) {
83904 for (var i = 0; i < this.members.length; i++) {
83905 if (!resolver.hasEntity(this.members[i].id)) {
83913 isRestriction: function() {
83914 return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
83918 isValidRestriction: function() {
83919 if (!this.isRestriction()) return false;
83921 var froms = this.members.filter(function(m) { return m.role === 'from'; });
83922 var vias = this.members.filter(function(m) { return m.role === 'via'; });
83923 var tos = this.members.filter(function(m) { return m.role === 'to'; });
83925 if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
83926 if (froms.some(function(m) { return m.type !== 'way'; })) return false;
83928 if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
83929 if (tos.some(function(m) { return m.type !== 'way'; })) return false;
83931 if (vias.length === 0) return false;
83932 if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
83938 // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
83939 // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
83941 // This corresponds to the structure needed for rendering a multipolygon path using a
83942 // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
83944 // In the case of invalid geometries, this function will still return a result which
83945 // includes the nodes of all way members, but some Nds may be unclosed and some inner
83946 // rings not matched with the intended outer ring.
83948 multipolygon: function(resolver) {
83949 var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
83950 var inners = this.members.filter(function(m) { return 'inner' === m.role; });
83952 outers = osmJoinWays(outers, resolver);
83953 inners = osmJoinWays(inners, resolver);
83955 outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
83956 inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
83958 var result = outers.map(function(o) {
83959 // Heuristic for detecting counterclockwise winding order. Assumes
83960 // that OpenStreetMap polygons are not hemisphere-spanning.
83961 return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
83964 function findOuter(inner) {
83967 for (o = 0; o < outers.length; o++) {
83969 if (geoPolygonContainsPolygon(outer, inner))
83973 for (o = 0; o < outers.length; o++) {
83975 if (geoPolygonIntersectsPolygon(outer, inner, false))
83980 for (var i = 0; i < inners.length; i++) {
83981 var inner = inners[i];
83983 if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
83984 inner = inner.reverse();
83987 var o = findOuter(inners[i]);
83988 if (o !== undefined)
83989 result[o].push(inners[i]);
83991 result.push([inners[i]]); // Invalid geometry
83998 function osmTurn(turn) {
83999 if (!(this instanceof osmTurn)) {
84000 return new osmTurn(turn);
84002 assignIn(this, turn);
84006 function osmIntersection(graph, startVertexId, maxDistance) {
84007 maxDistance = maxDistance || 30; // in meters
84008 var vgraph = coreGraph$$1(); // virtual graph
84012 function memberOfRestriction(entity) {
84013 return graph.parentRelations(entity)
84014 .some(function(r) { return r.isRestriction(); });
84017 function isRoad(way) {
84018 if (way.isArea() || way.isDegenerate()) return false;
84021 'motorway_link': true,
84023 'trunk_link': true,
84025 'primary_link': true,
84027 'secondary_link': true,
84029 'tertiary_link': true,
84030 'residential': true,
84031 'unclassified': true,
84032 'living_street': true,
84037 return roads[way.tags.highway];
84041 var startNode = graph.entity(startVertexId);
84042 var checkVertices = [startNode];
84045 var vertexIds = [];
84055 // `actions` will store whatever actions must be performed to satisfy
84056 // preconditions for adding a turn restriction to this intersection.
84057 // - Remove any existing degenerate turn restrictions (missing from/to, etc)
84058 // - Reverse oneways so that they are drawn in the forward direction
84059 // - Split ways on key vertices
84063 // STEP 1: walk the graph outwards from starting vertex to search
84064 // for more key vertices and ways to include in the intersection..
84066 while (checkVertices.length) {
84067 vertex = checkVertices.pop();
84069 // check this vertex for parent ways that are roads
84070 checkWays = graph.parentWays(vertex);
84071 var hasWays = false;
84072 for (i = 0; i < checkWays.length; i++) {
84073 way = checkWays[i];
84074 if (!isRoad(way) && !memberOfRestriction(way)) continue;
84076 ways.push(way); // it's a road, or it's already in a turn restriction
84079 // check the way's children for more key vertices
84080 nodes = uniq(graph.childNodes(way));
84081 for (j = 0; j < nodes.length; j++) {
84083 if (node === vertex) continue; // same thing
84084 if (vertices.indexOf(node) !== -1) continue; // seen it already
84085 if (node.loc && startNode.loc &&
84086 geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue; // too far from start
84088 // a key vertex will have parents that are also roads
84089 var hasParents = false;
84090 parents = graph.parentWays(node);
84091 for (k = 0; k < parents.length; k++) {
84092 parent = parents[k];
84093 if (parent === way) continue; // same thing
84094 if (ways.indexOf(parent) !== -1) continue; // seen it already
84095 if (!isRoad(parent)) continue; // not a road
84101 checkVertices.push(node);
84107 vertices.push(vertex);
84111 vertices = uniq(vertices);
84115 // STEP 2: Build a virtual graph containing only the entities in the intersection..
84116 // Everything done after this step should act on the virtual graph
84117 // Any actions that must be performed later to the main graph go in `actions` array
84118 ways.forEach(function(way) {
84119 graph.childNodes(way).forEach(function(node) {
84120 vgraph = vgraph.replace(node);
84123 vgraph = vgraph.replace(way);
84125 graph.parentRelations(way).forEach(function(relation) {
84126 if (relation.isRestriction()) {
84127 if (relation.isValidRestriction(graph)) {
84128 vgraph = vgraph.replace(relation);
84129 } else if (relation.isComplete(graph)) {
84130 actions.push(actionDeleteRelation(relation.id));
84137 // STEP 3: Force all oneways to be drawn in the forward direction
84138 ways.forEach(function(w) {
84139 var way = vgraph.entity(w.id);
84140 if (way.tags.oneway === '-1') {
84141 var action = actionReverse(way.id, { reverseOneway: true });
84142 actions.push(action);
84143 vgraph = action(vgraph);
84148 // STEP 4: Split ways on key vertices
84149 var origCount = osmEntity$$1.id.next.way;
84150 vertices.forEach(function(v) {
84151 // This is an odd way to do it, but we need to find all the ways that
84152 // will be split here, then split them one at a time to ensure that these
84153 // actions can be replayed on the main graph exactly in the same order.
84154 // (It is unintuitive, but the order of ways returned from graph.parentWays()
84155 // is arbitrary, depending on how the main graph and vgraph were built)
84156 var splitAll = actionSplit(v.id);
84157 if (!splitAll.disabled(vgraph)) {
84158 splitAll.ways(vgraph).forEach(function(way) {
84159 var splitOne = actionSplit(v.id).limitWays([way.id]);
84160 actions.push(splitOne);
84161 vgraph = splitOne(vgraph);
84166 // In here is where we should also split the intersection at nearby junction.
84167 // for https://github.com/mapbox/iD-internal/issues/31
84168 // nearbyVertices.forEach(function(v) {
84171 // Reasons why we reset the way id count here:
84172 // 1. Continuity with way ids created by the splits so that we can replay
84173 // these actions later if the user decides to create a turn restriction
84174 // 2. Avoids churning way ids just by hovering over a vertex
84175 // and displaying the turn restriction editor
84176 osmEntity$$1.id.next.way = origCount;
84179 // STEP 5: Update arrays to point to vgraph entities
84180 vertexIds = vertices.map(function(v) { return v.id; });
84184 vertexIds.forEach(function(id) {
84185 var vertex = vgraph.entity(id);
84186 var parents = vgraph.parentWays(vertex);
84187 vertices.push(vertex);
84188 ways = ways.concat(parents);
84191 vertices = uniq(vertices);
84194 vertexIds = vertices.map(function(v) { return v.id; });
84195 wayIds = ways.map(function(w) { return w.id; });
84198 // STEP 6: Update the ways with some metadata that will be useful for
84199 // walking the intersection graph later and rendering turn arrows.
84201 function withMetadata(way, vertexIds) {
84202 var __oneWay = way.isOneWay();
84204 // which affixes are key vertices?
84205 var __first = (vertexIds.indexOf(way.first()) !== -1);
84206 var __last = (vertexIds.indexOf(way.last()) !== -1);
84208 // what roles is this way eligible for?
84209 var __via = (__first && __last);
84210 var __from = ((__first && !__oneWay) || __last);
84211 var __to = (__first || (__last && !__oneWay));
84213 return way.update({
84224 wayIds.forEach(function(id) {
84225 var way = withMetadata(vgraph.entity(id), vertexIds);
84226 vgraph = vgraph.replace(way);
84231 // STEP 7: Simplify - This is an iterative process where we:
84232 // 1. Find trivial vertices with only 2 parents
84233 // 2. trim off the leaf way from those vertices and remove from vgraph
84236 var removeWayIds = [];
84237 var removeVertexIds = [];
84241 checkVertices = vertexIds.slice();
84243 for (i = 0; i < checkVertices.length; i++) {
84244 var vertexId = checkVertices[i];
84245 vertex = vgraph.hasEntity(vertexId);
84248 if (vertexIds.indexOf(vertexId) !== -1) {
84249 vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
84251 removeVertexIds.push(vertexId);
84255 parents = vgraph.parentWays(vertex);
84256 if (parents.length < 3) {
84257 if (vertexIds.indexOf(vertexId) !== -1) {
84258 vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
84262 if (parents.length === 2) { // vertex with 2 parents is trivial
84263 var a = parents[0];
84264 var b = parents[1];
84265 var aIsLeaf = a && !a.__via;
84266 var bIsLeaf = b && !b.__via;
84267 var leaf, survivor;
84269 if (aIsLeaf && !bIsLeaf) {
84272 } else if (!aIsLeaf && bIsLeaf) {
84277 if (leaf && survivor) {
84278 survivor = withMetadata(survivor, vertexIds); // update survivor way
84279 vgraph = vgraph.replace(survivor).remove(leaf); // update graph
84280 removeWayIds.push(leaf.id);
84285 parents = vgraph.parentWays(vertex);
84287 if (parents.length < 2) { // vertex is no longer a key vertex
84288 if (vertexIds.indexOf(vertexId) !== -1) {
84289 vertexIds.splice(vertexIds.indexOf(vertexId), 1); // stop checking this one
84291 removeVertexIds.push(vertexId);
84295 if (parents.length < 1) { // vertex is no longer attached to anything
84296 vgraph = vgraph.remove(vertex);
84300 } while (keepGoing);
84303 vertices = vertices
84304 .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
84305 .map(function(vertex) { return vgraph.entity(vertex.id); });
84307 .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
84308 .map(function(way) { return vgraph.entity(way.id); });
84311 // OK! Here is our intersection..
84312 var intersection = {
84315 vertices: vertices,
84321 // Get all the valid turns through this intersection given a starting way id.
84322 // This operates on the virtual graph for everything.
84324 // Basically, walk through all possible paths from starting way,
84325 // honoring the existing turn restrictions as we go (watch out for loops!)
84327 // For each path found, generate and return a `osmTurn` datastructure.
84329 intersection.turns = function(fromWayId, maxViaWay) {
84330 if (!fromWayId) return [];
84331 if (!maxViaWay) maxViaWay = 0;
84333 var vgraph = intersection.graph;
84334 var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
84336 var start = vgraph.entity(fromWayId);
84337 if (!start || !(start.__from || start.__via)) return [];
84339 // maxViaWay=0 from-*-to (0 vias)
84340 // maxViaWay=1 from-*-via-*-to (1 via max)
84341 // maxViaWay=2 from-*-via-*-via-*-to (2 vias max)
84342 var maxPathLength = (maxViaWay * 2) + 3;
84349 // traverse the intersection graph and find all the valid paths
84350 function step(entity, currPath, currRestrictions, matchedRestriction) {
84351 currPath = clone(currPath || []);
84352 if (currPath.length >= maxPathLength) return;
84353 currPath.push(entity.id);
84354 currRestrictions = clone(currRestrictions || []);
84357 if (entity.type === 'node') {
84358 var parents = vgraph.parentWays(entity);
84361 // which ways can we step into?
84362 for (i = 0; i < parents.length; i++) {
84363 var way = parents[i];
84365 // if next way is a oneway incoming to this vertex, skip
84366 if (way.__oneWay && way.nodes[0] !== entity.id) continue;
84368 // if we have seen it before (allowing for an initial u-turn), skip
84369 if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
84371 // Check all "current" restrictions (where we've already walked the `FROM`)
84372 var restrict = undefined;
84373 for (j = 0; j < currRestrictions.length; j++) {
84374 var restriction = currRestrictions[j];
84375 var f = restriction.memberByRole('from');
84376 var v = restriction.membersByRole('via');
84377 var t = restriction.memberByRole('to');
84378 var isOnly = /^only_/.test(restriction.tags.restriction);
84380 // Does the current path match this turn restriction?
84381 var matchesFrom = (f.id === fromWayId);
84382 var matchesViaTo = false;
84383 var isAlongOnlyPath = false;
84385 if (t.id === way.id) { // match TO
84387 if (v.length === 1 && v[0].type === 'node') { // match VIA node
84388 matchesViaTo = (v[0].id === entity.id && (
84389 (matchesFrom && currPath.length === 2) ||
84390 (!matchesFrom && currPath.length > 2)
84393 } else { // match all VIA ways
84395 for (k = 2; k < currPath.length; k +=2 ) { // k = 2 skips FROM
84396 pathVias.push(currPath[k]); // (path goes way-node-way...)
84398 var restrictionVias = [];
84399 for (k = 0; k < v.length; k++) {
84400 if (v[k].type === 'way') {
84401 restrictionVias.push(v[k].id);
84404 var diff = difference(pathVias, restrictionVias);
84405 matchesViaTo = !diff.length;
84408 } else if (isOnly) {
84409 for (k = 0; k < v.length; k++) {
84410 // way doesn't match TO, but is one of the via ways along the path of an "only"
84411 if (v[k].type === 'way' && v[k].id === way.id) {
84412 isAlongOnlyPath = true;
84418 if (matchesViaTo) {
84420 restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
84422 restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
84424 } else { // indirect - caused by a different nearby restriction
84425 if (isAlongOnlyPath) {
84426 restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
84427 } else if (isOnly) {
84428 restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
84432 // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
84433 if (restrict && restrict.direct)
84437 nextWays.push({ way: way, restrict: restrict });
84440 nextWays.forEach(function(nextWay) {
84441 step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
84445 } else { // entity.type === 'way'
84446 if (currPath.length >= 3) { // this is a "complete" path..
84447 var turnPath = clone(currPath);
84449 // an indirect restriction - only include the partial path (starting at FROM)
84450 if (matchedRestriction && matchedRestriction.direct === false) {
84451 for (i = 0; i < turnPath.length; i++) {
84452 if (turnPath[i] === matchedRestriction.from) {
84453 turnPath = turnPath.slice(i);
84459 var turn = pathToTurn(turnPath);
84461 if (matchedRestriction) {
84462 turn.restrictionID = matchedRestriction.id;
84463 turn.no = matchedRestriction.no;
84464 turn.only = matchedRestriction.only;
84465 turn.direct = matchedRestriction.direct;
84467 turns.push(osmTurn(turn));
84470 if (currPath[0] === currPath[2]) return; // if we made a u-turn - stop here
84473 if (matchedRestriction && matchedRestriction.end) return; // don't advance any further
84475 // which nodes can we step into?
84476 var n1 = vgraph.entity(entity.first());
84477 var n2 = vgraph.entity(entity.last());
84478 var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
84479 var nextNodes = [];
84481 if (currPath.length > 1) {
84482 if (dist > maxDistance) return; // the next node is too far
84483 if (!entity.__via) return; // this way is a leaf / can't be a via
84486 if (!entity.__oneWay && // bidirectional..
84487 keyVertexIds.indexOf(n1.id) !== -1 && // key vertex..
84488 currPath.indexOf(n1.id) === -1) { // haven't seen it yet..
84489 nextNodes.push(n1); // can advance to first node
84491 if (keyVertexIds.indexOf(n2.id) !== -1 && // key vertex..
84492 currPath.indexOf(n2.id) === -1) { // haven't seen it yet..
84493 nextNodes.push(n2); // can advance to last node
84496 nextNodes.forEach(function(nextNode) {
84497 // gather restrictions FROM this way
84498 var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
84499 if (!r.isRestriction()) return false;
84501 var f = r.memberByRole('from');
84502 if (!f || f.id !== entity.id) return false;
84504 var isOnly = /^only_/.test(r.tags.restriction);
84505 if (!isOnly) return true;
84507 // `only_` restrictions only matter along the direction of the VIA - #4849
84508 var isOnlyVia = false;
84509 var v = r.membersByRole('via');
84510 if (v.length === 1 && v[0].type === 'node') { // via node
84511 isOnlyVia = (v[0].id === nextNode.id);
84512 } else { // via way(s)
84513 for (var i = 0; i < v.length; i++) {
84514 if (v[i].type !== 'way') continue;
84515 var viaWay = vgraph.entity(v[i].id);
84516 if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
84525 step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
84531 // assumes path is alternating way-node-way of odd length
84532 function pathToTurn(path) {
84533 if (path.length < 3) return;
84534 var fromWayId, fromNodeId, fromVertexId;
84535 var toWayId, toNodeId, toVertexId;
84536 var viaWayIds, viaNodeId, isUturn;
84538 fromWayId = path[0];
84539 toWayId = path[path.length - 1];
84541 if (path.length === 3 && fromWayId === toWayId) { // u turn
84542 var way = vgraph.entity(fromWayId);
84543 if (way.__oneWay) return null;
84546 viaNodeId = fromVertexId = toVertexId = path[1];
84547 fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
84551 fromVertexId = path[1];
84552 fromNodeId = adjacentNode(fromWayId, fromVertexId);
84553 toVertexId = path[path.length - 2];
84554 toNodeId = adjacentNode(toWayId, toVertexId);
84556 if (path.length === 3) {
84557 viaNodeId = path[1];
84559 viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
84560 viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1); // remove first, last
84565 key: path.join('_'),
84567 from: { node: fromNodeId, way: fromWayId, vertex: fromVertexId },
84568 via: { node: viaNodeId, ways: viaWayIds },
84569 to: { node: toNodeId, way: toWayId, vertex: toVertexId },
84574 function adjacentNode(wayId, affixId) {
84575 var nodes = vgraph.entity(wayId).nodes;
84576 return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
84582 return intersection;
84586 function osmInferRestriction(graph, turn, projection) {
84587 var fromWay = graph.entity(turn.from.way);
84588 var fromNode = graph.entity(turn.from.node);
84589 var fromVertex = graph.entity(turn.from.vertex);
84590 var toWay = graph.entity(turn.to.way);
84591 var toNode = graph.entity(turn.to.node);
84592 var toVertex = graph.entity(turn.to.vertex);
84594 var fromOneWay = (fromWay.tags.oneway === 'yes');
84595 var toOneWay = (toWay.tags.oneway === 'yes');
84596 var angle = (geoAngle(fromVertex, fromNode, projection) -
84597 geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
84602 if (fromNode === toNode)
84603 return 'no_u_turn';
84604 if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
84605 return 'no_u_turn'; // wider tolerance for u-turn if both ways are oneway
84606 if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
84607 return 'no_u_turn'; // even wider tolerance for u-turn if there is a via way (from !== to)
84609 return 'no_right_turn';
84611 return 'no_left_turn';
84613 return 'no_straight_on';
84616 function actionAddMember(relationId, member, memberIndex, insertPair) {
84618 return function action(graph) {
84619 var relation = graph.entity(relationId);
84621 // There are some special rules for Public Transport v2 routes.
84622 var isPTv2 = /stop|platform/.test(member.role);
84624 if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
84625 // Try to perform sensible inserts based on how the ways join together
84626 graph = addWayMember(relation, graph);
84628 // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
84629 // Stops and Platforms for PTv2 should be ordered first.
84630 // hack: We do not currently have the ability to place them in the exactly correct order.
84631 if (isPTv2 && isNaN(memberIndex)) {
84635 graph = graph.replace(relation.addMember(member, memberIndex));
84642 // Add a way member into the relation "wherever it makes sense".
84643 // In this situation we were not supplied a memberIndex.
84644 function addWayMember(relation, graph) {
84645 var groups, tempWay, item, i, j, k;
84647 // remove PTv2 stops and platforms before doing anything.
84648 var PTv2members = [];
84650 for (i = 0; i < relation.members.length; i++) {
84651 var m = relation.members[i];
84652 if (/stop|platform/.test(m.role)) {
84653 PTv2members.push(m);
84658 relation = relation.update({ members: members });
84662 // We're adding a member that must stay paired with an existing member.
84663 // (This feature is used by `actionSplit`)
84665 // This is tricky because the members may exist multiple times in the
84666 // member list, and with different A-B/B-A ordering and different roles.
84667 // (e.g. a bus route that loops out and back - #4589).
84669 // Replace the existing member with a temporary way,
84670 // so that `osmJoinWays` can treat the pair like a single way.
84671 tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
84672 graph = graph.replace(tempWay);
84673 var tempMember = { id: tempWay.id, type: 'way', role: member.role };
84674 var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
84675 groups = groupBy(tempRelation.members, function(m) { return m.type; });
84676 groups.way = groups.way || [];
84679 // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
84680 groups = groupBy(relation.members, function(m) { return m.type; });
84681 groups.way = groups.way || [];
84682 groups.way.push(member);
84685 members = withIndex(groups.way);
84686 var joined = osmJoinWays(members, graph);
84688 // `joined` might not contain all of the way members,
84689 // But will contain only the completed (downloaded) members
84690 for (i = 0; i < joined.length; i++) {
84691 var segment = joined[i];
84692 var nodes = segment.nodes.slice();
84693 var startIndex = segment[0].index;
84695 // j = array index in `members` where this segment starts
84696 for (j = 0; j < members.length; j++) {
84697 if (members[j].index === startIndex) {
84702 // k = each member in segment
84703 for (k = 0; k < segment.length; k++) {
84705 var way = graph.entity(item.id);
84707 // If this is a paired item, generate members in correct order and role
84708 if (tempWay && item.id === tempWay.id) {
84709 if (nodes[0].id === insertPair.nodes[0]) {
84711 { id: insertPair.originalID, type: 'way', role: item.role },
84712 { id: insertPair.insertedID, type: 'way', role: item.role }
84716 { id: insertPair.insertedID, type: 'way', role: item.role },
84717 { id: insertPair.originalID, type: 'way', role: item.role }
84722 // reorder `members` if necessary
84724 if (j+k >= members.length || item.index !== members[j+k].index) {
84725 moveMember(members, item.index, j+k);
84729 nodes.splice(0, way.nodes.length - 1);
84734 graph = graph.remove(tempWay);
84737 // Final pass: skip dead items, split pairs, remove index properties
84738 var wayMembers = [];
84739 for (i = 0; i < members.length; i++) {
84741 if (item.index === -1) continue;
84744 wayMembers.push(item.pair[0]);
84745 wayMembers.push(item.pair[1]);
84747 wayMembers.push(omit(item, 'index'));
84751 // Put stops and platforms first, then nodes, ways, relations
84752 // This is recommended for Public Transport v2 routes:
84753 // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
84754 var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
84756 return graph.replace(relation.update({members: newMembers}));
84759 // `moveMember()` changes the `members` array in place by splicing
84760 // the item with `.index = findIndex` to where it belongs,
84761 // and marking the old position as "dead" with `.index = -1`
84765 // members 0 1 2 3 4 5 6 7 8 9 keep 5 in j+k
84769 // members 0 1 2 3 4 5 6 7 8 9 move 4 to j+k
84770 // members 0 1 2 3 x 5 4 6 7 8 9 moved
84774 // members 0 1 2 3 x 5 4 6 7 8 9 move 7 to j+k
84775 // members 0 1 2 3 x 5 4 7 6 x 8 9 moved
84779 // members 0 1 2 3 x 5 4 7 6 x 8 9 keep 6 in j+k
84781 function moveMember(arr, findIndex, toIndex) {
84782 for (var i = 0; i < arr.length; i++) {
84783 if (arr[i].index === findIndex) {
84788 var item = clone(arr[i]);
84789 arr[i].index = -1; // mark as dead
84790 item.index = toIndex;
84791 arr.splice(toIndex, 0, item);
84795 // This is the same as `Relation.indexedMembers`,
84796 // Except we don't want to index all the members, only the ways
84797 function withIndex(arr) {
84798 var result = new Array(arr.length);
84799 for (var i = 0; i < arr.length; i++) {
84800 result[i] = arr[i];
84801 result[i].index = i;
84809 function actionAddMidpoint(midpoint, node) {
84810 return function(graph) {
84811 graph = graph.replace(node.move(midpoint.loc));
84813 var parents = intersection(
84814 graph.parentWays(graph.entity(midpoint.edge[0])),
84815 graph.parentWays(graph.entity(midpoint.edge[1])));
84817 parents.forEach(function(way) {
84818 for (var i = 0; i < way.nodes.length - 1; i++) {
84819 if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
84820 graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
84822 // Add only one midpoint on doubled-back segments,
84823 // turning them into self-intersections.
84833 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
84834 function actionAddVertex(wayId, nodeId, index) {
84835 return function(graph) {
84836 return graph.replace(graph.entity(wayId).addNode(nodeId, index));
84840 function actionChangeMember(relationId, member, memberIndex) {
84841 return function(graph) {
84842 return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
84846 function actionChangePreset(entityId, oldPreset, newPreset) {
84847 return function(graph) {
84848 var entity = graph.entity(entityId),
84849 geometry = entity.geometry(graph),
84850 tags = entity.tags;
84852 if (oldPreset) tags = oldPreset.removeTags(tags, geometry);
84853 if (newPreset) tags = newPreset.applyTags(tags, geometry);
84855 return graph.replace(entity.update({tags: tags}));
84859 function actionChangeTags(entityId, tags) {
84860 return function(graph) {
84861 var entity = graph.entity(entityId);
84862 return graph.replace(entity.update({tags: tags}));
84866 function actionCircularize(wayId, projection, maxAngle) {
84867 maxAngle = (maxAngle || 20) * Math.PI / 180;
84870 var action = function(graph, t) {
84871 if (t === null || !isFinite(t)) t = 1;
84872 t = Math.min(Math.max(+t, 0), 1);
84874 var way = graph.entity(wayId),
84877 graph.childNodes(way).forEach(function(node) {
84878 if (!origNodes[node.id]) origNodes[node.id] = node;
84881 if (!way.isConvex(graph)) {
84882 graph = action.makeConvex(graph);
84885 var nodes = uniq(graph.childNodes(way)),
84886 keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
84887 points = nodes.map(function(n) { return projection(n.loc); }),
84888 keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
84889 centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
84890 radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
84891 sign = d3_polygonArea(points) > 0 ? 1 : -1,
84894 // we need atleast two key nodes for the algorithm to work
84895 if (!keyNodes.length) {
84896 keyNodes = [nodes[0]];
84897 keyPoints = [points[0]];
84900 if (keyNodes.length === 1) {
84901 var index = nodes.indexOf(keyNodes[0]),
84902 oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
84904 keyNodes.push(nodes[oppositeIndex]);
84905 keyPoints.push(points[oppositeIndex]);
84908 // key points and nodes are those connected to the ways,
84909 // they are projected onto the circle, inbetween nodes are moved
84910 // to constant intervals between key nodes, extra inbetween nodes are
84911 // added if necessary.
84912 for (var i = 0; i < keyPoints.length; i++) {
84913 var nextKeyNodeIndex = (i + 1) % keyNodes.length,
84914 startNode = keyNodes[i],
84915 endNode = keyNodes[nextKeyNodeIndex],
84916 startNodeIndex = nodes.indexOf(startNode),
84917 endNodeIndex = nodes.indexOf(endNode),
84918 numberNewPoints = -1,
84919 indexRange = endNodeIndex - startNodeIndex,
84921 inBetweenNodes = [],
84922 startAngle, endAngle, totalAngle, eachAngle,
84923 angle, loc, node, origNode, j;
84925 if (indexRange < 0) {
84926 indexRange += nodes.length;
84929 // position this key node
84930 var distance = geoVecLength(centroid, keyPoints[i]);
84931 if (distance === 0) { distance = 1e-4; }
84933 centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
84934 centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
84936 loc = projection.invert(keyPoints[i]);
84937 node = keyNodes[i];
84938 origNode = origNodes[node.id];
84939 node = node.move(geoVecInterp(origNode.loc, loc, t));
84940 graph = graph.replace(node);
84942 // figure out the between delta angle we want to match to
84943 startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
84944 endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
84945 totalAngle = endAngle - startAngle;
84947 // detects looping around -pi/pi
84948 if (totalAngle * sign > 0) {
84949 totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
84954 eachAngle = totalAngle / (indexRange + numberNewPoints);
84955 } while (Math.abs(eachAngle) > maxAngle);
84958 // move existing nodes
84959 for (j = 1; j < indexRange; j++) {
84960 angle = startAngle + j * eachAngle;
84961 loc = projection.invert([
84962 centroid[0] + Math.cos(angle) * radius,
84963 centroid[1] + Math.sin(angle) * radius
84966 node = nodes[(j + startNodeIndex) % nodes.length];
84967 origNode = origNodes[node.id];
84968 nearNodes[node.id] = angle;
84970 node = node.move(geoVecInterp(origNode.loc, loc, t));
84971 graph = graph.replace(node);
84974 // add new inbetween nodes if necessary
84975 for (j = 0; j < numberNewPoints; j++) {
84976 angle = startAngle + (indexRange + j) * eachAngle;
84977 loc = projection.invert([
84978 centroid[0] + Math.cos(angle) * radius,
84979 centroid[1] + Math.sin(angle) * radius
84982 // choose a nearnode to use as the original
84983 var min$$1 = Infinity;
84984 for (var nodeId in nearNodes) {
84985 var nearAngle = nearNodes[nodeId],
84986 dist = Math.abs(nearAngle - angle);
84987 if (dist < min$$1) {
84989 origNode = origNodes[nodeId];
84993 node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
84994 graph = graph.replace(node);
84996 nodes.splice(endNodeIndex + j, 0, node);
84997 inBetweenNodes.push(node.id);
85000 // Check for other ways that share these keyNodes..
85001 // If keyNodes are adjacent in both ways,
85002 // we can add inBetween nodes to that shared way too..
85003 if (indexRange === 1 && inBetweenNodes.length) {
85004 var startIndex1 = way.nodes.lastIndexOf(startNode.id),
85005 endIndex1 = way.nodes.lastIndexOf(endNode.id),
85006 wayDirection1 = (endIndex1 - startIndex1);
85007 if (wayDirection1 < -1) { wayDirection1 = 1; }
85009 /* eslint-disable no-loop-func */
85010 forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
85011 if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
85012 var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
85013 endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
85014 wayDirection2 = (endIndex2 - startIndex2),
85015 insertAt = endIndex2;
85016 if (wayDirection2 < -1) { wayDirection2 = 1; }
85018 if (wayDirection1 !== wayDirection2) {
85019 inBetweenNodes.reverse();
85020 insertAt = startIndex2;
85022 for (j = 0; j < inBetweenNodes.length; j++) {
85023 sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
85025 graph = graph.replace(sharedWay);
85028 /* eslint-enable no-loop-func */
85033 // update the way to have all the new nodes
85034 ids = nodes.map(function(n) { return n.id; });
85037 way = way.update({nodes: ids});
85038 graph = graph.replace(way);
85044 action.makeConvex = function(graph) {
85045 var way = graph.entity(wayId),
85046 nodes = uniq(graph.childNodes(way)),
85047 points = nodes.map(function(n) { return projection(n.loc); }),
85048 sign = d3_polygonArea(points) > 0 ? 1 : -1,
85049 hull = d3_polygonHull(points);
85051 // D3 convex hulls go counterclockwise..
85057 for (var i = 0; i < hull.length - 1; i++) {
85058 var startIndex = points.indexOf(hull[i]),
85059 endIndex = points.indexOf(hull[i+1]),
85060 indexRange = (endIndex - startIndex);
85062 if (indexRange < 0) {
85063 indexRange += nodes.length;
85066 // move interior nodes to the surface of the convex hull..
85067 for (var j = 1; j < indexRange; j++) {
85068 var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
85069 node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
85070 graph = graph.replace(node);
85077 action.disabled = function(graph) {
85078 if (!graph.entity(wayId).isClosed())
85079 return 'not_closed';
85083 action.transitionable = true;
85089 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
85090 function actionDeleteWay(wayId) {
85093 function canDeleteNode(node, graph) {
85094 return !graph.parentWays(node).length &&
85095 !graph.parentRelations(node).length &&
85096 !node.hasInterestingTags();
85100 var action = function(graph) {
85101 var way = graph.entity(wayId);
85103 graph.parentRelations(way)
85104 .forEach(function(parent) {
85105 parent = parent.removeMembersWithID(wayId);
85106 graph = graph.replace(parent);
85108 if (parent.isDegenerate()) {
85109 graph = actionDeleteRelation(parent.id)(graph);
85113 uniq(way.nodes).forEach(function(nodeId) {
85114 graph = graph.replace(way.removeNode(nodeId));
85116 var node = graph.entity(nodeId);
85117 if (canDeleteNode(node, graph)) {
85118 graph = graph.remove(node);
85122 return graph.remove(way);
85129 function actionDeleteMultiple(ids) {
85131 way: actionDeleteWay,
85132 node: actionDeleteNode,
85133 relation: actionDeleteRelation
85137 var action = function(graph) {
85138 ids.forEach(function(id) {
85139 if (graph.hasEntity(id)) { // It may have been deleted aready.
85140 graph = actions[graph.entity(id).type](id)(graph);
85151 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
85152 function actionDeleteRelation(relationId) {
85155 function canDeleteEntity(entity, graph) {
85156 return !graph.parentWays(entity).length &&
85157 !graph.parentRelations(entity).length &&
85158 !entity.hasInterestingTags();
85162 var action = function(graph) {
85163 var relation = graph.entity(relationId);
85165 graph.parentRelations(relation)
85166 .forEach(function(parent) {
85167 parent = parent.removeMembersWithID(relationId);
85168 graph = graph.replace(parent);
85170 if (parent.isDegenerate()) {
85171 graph = actionDeleteRelation(parent.id)(graph);
85175 uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
85176 graph = graph.replace(relation.removeMembersWithID(memberId));
85178 var entity = graph.entity(memberId);
85179 if (canDeleteEntity(entity, graph)) {
85180 graph = actionDeleteMultiple([memberId])(graph);
85184 return graph.remove(relation);
85191 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
85192 function actionDeleteNode(nodeId) {
85193 var action = function(graph) {
85194 var node = graph.entity(nodeId);
85196 graph.parentWays(node)
85197 .forEach(function(parent) {
85198 parent = parent.removeNode(nodeId);
85199 graph = graph.replace(parent);
85201 if (parent.isDegenerate()) {
85202 graph = actionDeleteWay(parent.id)(graph);
85206 graph.parentRelations(node)
85207 .forEach(function(parent) {
85208 parent = parent.removeMembersWithID(nodeId);
85209 graph = graph.replace(parent);
85211 if (parent.isDegenerate()) {
85212 graph = actionDeleteRelation(parent.id)(graph);
85216 return graph.remove(node);
85223 // Connect the ways at the given nodes.
85225 // First choose a node to be the survivor, with preference given
85226 // to an existing (not new) node.
85228 // Tags and relation memberships of of non-surviving nodes are merged
85229 // to the survivor.
85231 // This is the inverse of `iD.actionDisconnect`.
85234 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
85235 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
85237 function actionConnect(nodeIDs) {
85238 var action = function(graph) {
85244 // Choose a survivor node, prefer an existing (not new) node - #4974
85245 for (i = 0; i < nodeIDs.length; i++) {
85246 survivor = graph.entity(nodeIDs[i]);
85247 if (survivor.version) break; // found one
85250 // Replace all non-surviving nodes with the survivor and merge tags.
85251 for (i = 0; i < nodeIDs.length; i++) {
85252 node = graph.entity(nodeIDs[i]);
85253 if (node.id === survivor.id) continue;
85255 parents = graph.parentWays(node);
85256 for (j = 0; j < parents.length; j++) {
85257 if (!parents[j].areAdjacent(node.id, survivor.id)) {
85258 graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
85262 parents = graph.parentRelations(node);
85263 for (j = 0; j < parents.length; j++) {
85264 graph = graph.replace(parents[j].replaceMember(node, survivor));
85267 survivor = survivor.mergeTags(node.tags);
85268 graph = actionDeleteNode(node.id)(graph);
85271 graph = graph.replace(survivor);
85277 action.disabled = function(graph) {
85279 var restrictionIDs = [];
85282 var relations, relation, role;
85285 // Choose a survivor node, prefer an existing (not new) node - #4974
85286 for (i = 0; i < nodeIDs.length; i++) {
85287 survivor = graph.entity(nodeIDs[i]);
85288 if (survivor.version) break; // found one
85291 // 1. disable if the nodes being connected have conflicting relation roles
85292 for (i = 0; i < nodeIDs.length; i++) {
85293 node = graph.entity(nodeIDs[i]);
85294 relations = graph.parentRelations(node);
85296 for (j = 0; j < relations.length; j++) {
85297 relation = relations[j];
85298 role = relation.memberById(node.id).role || '';
85300 // if this node is a via node in a restriction, remember for later
85301 if (relation.isValidRestriction()) {
85302 restrictionIDs.push(relation.id);
85305 if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
85308 seen[relation.id] = role;
85313 // gather restrictions for parent ways
85314 for (i = 0; i < nodeIDs.length; i++) {
85315 node = graph.entity(nodeIDs[i]);
85317 var parents = graph.parentWays(node);
85318 for (j = 0; j < parents.length; j++) {
85319 var parent = parents[j];
85320 relations = graph.parentRelations(parent);
85322 for (k = 0; k < relations.length; k++) {
85323 relation = relations[k];
85324 if (relation.isValidRestriction()) {
85325 restrictionIDs.push(relation.id);
85332 // test restrictions
85333 restrictionIDs = uniq(restrictionIDs);
85334 for (i = 0; i < restrictionIDs.length; i++) {
85335 relation = graph.entity(restrictionIDs[i]);
85336 if (!relation.isComplete(graph)) continue;
85338 var memberWays = relation.members
85339 .filter(function(m) { return m.type === 'way'; })
85340 .map(function(m) { return graph.entity(m.id); });
85342 memberWays = uniq(memberWays);
85343 var f = relation.memberByRole('from');
85344 var t = relation.memberByRole('to');
85345 var isUturn = (f.id === t.id);
85347 // 2a. disable if connection would damage a restriction
85348 // (a key node is a node at the junction of ways)
85349 var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
85350 for (j = 0; j < relation.members.length; j++) {
85351 collectNodes(relation.members[j], nodes);
85354 nodes.keyfrom = uniq(nodes.keyfrom.filter(hasDuplicates));
85355 nodes.keyto = uniq(nodes.keyto.filter(hasDuplicates));
85357 var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
85358 nodes.from = nodes.from.filter(filter);
85359 nodes.via = nodes.via.filter(filter);
85360 nodes.to = nodes.to.filter(filter);
85362 var connectFrom = false;
85363 var connectVia = false;
85364 var connectTo = false;
85365 var connectKeyFrom = false;
85366 var connectKeyTo = false;
85368 for (j = 0; j < nodeIDs.length; j++) {
85369 var n = nodeIDs[j];
85370 if (nodes.from.indexOf(n) !== -1) { connectFrom = true; }
85371 if (nodes.via.indexOf(n) !== -1) { connectVia = true; }
85372 if (nodes.to.indexOf(n) !== -1) { connectTo = true; }
85373 if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
85374 if (nodes.keyto.indexOf(n) !== -1) { connectKeyTo = true; }
85376 if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
85377 if (connectFrom && connectVia) { return 'restriction'; }
85378 if (connectTo && connectVia) { return 'restriction'; }
85380 // connecting to a key node -
85381 // if both nodes are on a member way (i.e. part of the turn restriction),
85382 // the connecting node must be adjacent to the key node.
85383 if (connectKeyFrom || connectKeyTo) {
85384 if (nodeIDs.length !== 2) { return 'restriction'; }
85388 for (j = 0; j < memberWays.length; j++) {
85389 way = memberWays[j];
85390 if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
85391 if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
85394 if (n0 && n1) { // both nodes are part of the restriction
85396 for (j = 0; j < memberWays.length; j++) {
85397 way = memberWays[j];
85398 if (way.areAdjacent(n0, n1)) {
85404 return 'restriction';
85409 // 2b. disable if nodes being connected will destroy a member way in a restriction
85410 // (to test, make a copy and try actually connecting the nodes)
85411 for (j = 0; j < memberWays.length; j++) {
85412 way = memberWays[j].update({}); // make copy
85413 for (k = 0; k < nodeIDs.length; k++) {
85414 if (nodeIDs[k] === survivor.id) continue;
85416 if (way.areAdjacent(nodeIDs[k], survivor.id)) {
85417 way = way.removeNode(nodeIDs[k]);
85419 way = way.replaceNode(nodeIDs[k], survivor.id);
85422 if (way.isDegenerate()) {
85423 return 'restriction';
85431 // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
85432 function hasDuplicates(n, i, arr) {
85433 return arr.indexOf(n) !== arr.lastIndexOf(n);
85436 function keyNodeFilter(froms, tos) {
85437 return function(n) {
85438 return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
85442 function collectNodes(member, collection) {
85443 var entity = graph.hasEntity(member.id);
85444 if (!entity) return;
85446 var role = member.role || '';
85447 if (!collection[role]) {
85448 collection[role] = [];
85451 if (member.type === 'node') {
85452 collection[role].push(member.id);
85453 if (role === 'via') {
85454 collection.keyfrom.push(member.id);
85455 collection.keyto.push(member.id);
85458 } else if (member.type === 'way') {
85459 collection[role].push.apply(collection[role], entity.nodes);
85460 if (role === 'from' || role === 'via') {
85461 collection.keyfrom.push(entity.first());
85462 collection.keyfrom.push(entity.last());
85464 if (role === 'to' || role === 'via') {
85465 collection.keyto.push(entity.first());
85466 collection.keyto.push(entity.last());
85476 function actionCopyEntities(ids, fromGraph) {
85480 var action = function(graph) {
85481 ids.forEach(function(id) {
85482 fromGraph.entity(id).copy(fromGraph, copies);
85485 for (var id in copies) {
85486 graph = graph.replace(copies[id]);
85493 action.copies = function() {
85501 function actionDeleteMember(relationId, memberIndex) {
85502 return function(graph) {
85503 var relation = graph.entity(relationId)
85504 .removeMember(memberIndex);
85506 graph = graph.replace(relation);
85508 if (relation.isDegenerate())
85509 graph = actionDeleteRelation(relation.id)(graph);
85515 function actionDeprecateTags(entityId) {
85517 return function(graph) {
85518 var entity = graph.entity(entityId),
85519 newtags = clone(entity.tags),
85523 // This handles dataDeprecated tags with a single condition
85524 for (var i = 0; i < dataDeprecated.length; i++) {
85526 rule = dataDeprecated[i];
85527 var match = toPairs(rule.old)[0],
85528 replacements = rule.replace ? toPairs(rule.replace) : null;
85530 if (entity.tags[match[0]] && match[1] === '*') {
85532 var value = entity.tags[match[0]];
85533 if (replacements && !newtags[replacements[0][0]]) {
85534 newtags[replacements[0][0]] = value;
85536 delete newtags[match[0]];
85539 } else if (entity.tags[match[0]] === match[1]) {
85540 newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
85546 return graph.replace(entity.update({tags: newtags}));
85553 function actionDiscardTags(difference) {
85555 return function(graph) {
85556 function discardTags(entity) {
85558 var keys = Object.keys(entity.tags);
85559 var discarded = false;
85561 for (var i = 0; i < keys.length; i++) {
85563 if (dataDiscarded[k] || !entity.tags[k]) {
85566 tags[k] = entity.tags[k];
85571 graph = graph.replace(entity.update({ tags: tags }));
85575 difference.modified().forEach(discardTags);
85576 difference.created().forEach(discardTags);
85582 // Disconect the ways at the given node.
85584 // Optionally, disconnect only the given ways.
85586 // For testing convenience, accepts an ID to assign to the (first) new node.
85587 // Normally, this will be undefined and the way will automatically
85588 // be assigned a new ID.
85590 // This is the inverse of `iD.actionConnect`.
85593 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
85594 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
85596 function actionDisconnect(nodeId, newNodeId) {
85600 var action = function(graph) {
85601 var node = graph.entity(nodeId);
85602 var connections = action.connections(graph);
85604 connections.forEach(function(connection) {
85605 var way = graph.entity(connection.wayID);
85606 var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
85608 graph = graph.replace(newNode);
85609 if (connection.index === 0 && way.isArea()) {
85610 // replace shared node with shared node..
85611 graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
85612 } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
85613 // replace closing node with new new node..
85614 graph = graph.replace(way.unclose().addNode(newNode.id));
85616 // replace shared node with multiple new nodes..
85617 graph = graph.replace(way.updateNode(newNode.id, connection.index));
85625 action.connections = function(graph) {
85626 var candidates = [];
85627 var keeping = false;
85628 var parentWays = graph.parentWays(graph.entity(nodeId));
85630 parentWays.forEach(function(way) {
85631 if (wayIds && wayIds.indexOf(way.id) === -1) {
85635 if (way.isArea() && (way.nodes[0] === nodeId)) {
85636 candidates.push({ wayID: way.id, index: 0 });
85638 way.nodes.forEach(function(waynode, index) {
85639 if (waynode === nodeId) {
85640 candidates.push({ wayID: way.id, index: index });
85646 return keeping ? candidates : candidates.slice(1);
85650 action.disabled = function(graph) {
85651 var connections = action.connections(graph);
85652 if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
85653 return 'not_connected';
85655 var parentWays = graph.parentWays(graph.entity(nodeId));
85656 var seenRelationIds = {};
85657 var sharedRelation;
85659 parentWays.forEach(function(way) {
85660 if (wayIds && wayIds.indexOf(way.id) === -1)
85663 var relations = graph.parentRelations(way);
85664 relations.forEach(function(relation) {
85665 if (relation.id in seenRelationIds) {
85666 sharedRelation = relation;
85668 seenRelationIds[relation.id] = true;
85673 if (sharedRelation)
85678 action.limitWays = function(_) {
85679 if (!arguments.length) return wayIds;
85688 // Join ways at the end node they share.
85690 // This is the inverse of `iD.actionSplit`.
85693 // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
85694 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
85696 function actionJoin(ids) {
85698 function groupEntitiesByGeometry(graph) {
85699 var entities = ids.map(function(id) { return graph.entity(id); });
85700 return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
85704 var action = function(graph) {
85705 var ways = ids.map(graph.entity, graph);
85706 var survivorID = ways[0].id;
85708 // Prefer to keep an existing way.
85709 for (var i = 0; i < ways.length; i++) {
85710 if (!ways[i].isNew()) {
85711 survivorID = ways[i].id;
85716 var sequences = osmJoinWays(ways, graph);
85717 var joined = sequences[0];
85719 // We might need to reverse some of these ways before joining them. #4688
85720 // `joined.actions` property will contain any actions we need to apply.
85721 graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
85723 var survivor = graph.entity(survivorID);
85724 survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
85725 graph = graph.replace(survivor);
85727 joined.forEach(function(way) {
85728 if (way.id === survivorID) return;
85730 graph.parentRelations(way).forEach(function(parent) {
85731 graph = graph.replace(parent.replaceMember(way, survivor));
85734 survivor = survivor.mergeTags(way.tags);
85736 graph = graph.replace(survivor);
85737 graph = actionDeleteWay(way.id)(graph);
85744 action.disabled = function(graph) {
85745 var geometries = groupEntitiesByGeometry(graph);
85746 if (ids.length < 2 || ids.length !== geometries.line.length)
85747 return 'not_eligible';
85749 var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
85750 if (joined.length > 1)
85751 return 'not_adjacent';
85753 var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
85756 var conflicting = false;
85758 joined[0].forEach(function(way) {
85759 var parents = graph.parentRelations(way);
85760 parents.forEach(function(parent) {
85761 if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
85765 for (var k in way.tags) {
85766 if (!(k in tags)) {
85767 tags[k] = way.tags[k];
85768 } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
85769 conflicting = true;
85775 return 'restriction';
85778 return 'conflicting_tags';
85785 function actionMerge(ids) {
85787 function groupEntitiesByGeometry(graph) {
85788 var entities = ids.map(function(id) { return graph.entity(id); });
85789 return assignIn({point: [], area: [], line: [], relation: []},
85790 groupBy(entities, function(entity) { return entity.geometry(graph); }));
85794 var action = function(graph) {
85795 var geometries = groupEntitiesByGeometry(graph),
85796 target = geometries.area[0] || geometries.line[0],
85797 points = geometries.point;
85799 points.forEach(function(point) {
85800 target = target.mergeTags(point.tags);
85801 graph = graph.replace(target);
85803 graph.parentRelations(point).forEach(function(parent) {
85804 graph = graph.replace(parent.replaceMember(point, target));
85807 var nodes = uniq(graph.childNodes(target)),
85808 removeNode = point;
85810 for (var i = 0; i < nodes.length; i++) {
85811 var node = nodes[i];
85812 if (graph.parentWays(node).length > 1 ||
85813 graph.parentRelations(node).length ||
85814 node.hasInterestingTags()) {
85818 // Found an uninteresting child node on the target way.
85819 // Move orig point into its place to preserve point's history. #3683
85820 graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
85821 target = target.replaceNode(node.id, point.id);
85822 graph = graph.replace(target);
85827 graph = graph.remove(removeNode);
85834 action.disabled = function(graph) {
85835 var geometries = groupEntitiesByGeometry(graph);
85836 if (geometries.point.length === 0 ||
85837 (geometries.area.length + geometries.line.length) !== 1 ||
85838 geometries.relation.length !== 0)
85839 return 'not_eligible';
85846 // `actionMergeNodes` is just a combination of:
85848 // 1. move all the nodes to a common location
85849 // 2. `actionConnect` them
85851 function actionMergeNodes(nodeIDs) {
85853 // If there is a single "interesting" node, use that as the location.
85854 // Otherwise return the average location of all the nodes.
85855 function chooseLoc(graph) {
85856 if (!nodeIDs.length) return null;
85858 var interestingCount = 0;
85859 var interestingLoc;
85861 for (var i = 0; i < nodeIDs.length; i++) {
85862 var node = graph.entity(nodeIDs[i]);
85863 if (node.hasInterestingTags()) {
85864 interestingLoc = (++interestingCount === 1) ? node.loc : null;
85866 sum = geoVecAdd(sum, node.loc);
85869 return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
85873 var action = function(graph) {
85874 if (nodeIDs.length < 2) return graph;
85875 var toLoc = chooseLoc(graph);
85877 for (var i = 0; i < nodeIDs.length; i++) {
85878 var node = graph.entity(nodeIDs[i]);
85879 graph = graph.replace(node.move(toLoc));
85882 return actionConnect(nodeIDs)(graph);
85886 action.disabled = function(graph) {
85887 if (nodeIDs.length < 2) return 'not_eligible';
85889 for (var i = 0; i < nodeIDs.length; i++) {
85890 var entity = graph.entity(nodeIDs[i]);
85891 if (entity.type !== 'node') return 'not_eligible';
85894 return actionConnect(nodeIDs).disabled(graph);
85900 function actionMergePolygon(ids, newRelationId) {
85902 function groupEntities(graph) {
85903 var entities = ids.map(function (id) { return graph.entity(id); });
85908 }, groupBy(entities, function(entity) {
85909 if (entity.type === 'way' && entity.isClosed()) {
85910 return 'closedWay';
85911 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
85912 return 'multipolygon';
85920 var action = function(graph) {
85921 var entities = groupEntities(graph);
85923 // An array representing all the polygons that are part of the multipolygon.
85925 // Each element is itself an array of objects with an id property, and has a
85926 // locs property which is an array of the locations forming the polygon.
85927 var polygons = entities.multipolygon.reduce(function(polygons, m) {
85928 return polygons.concat(osmJoinWays(m.members, graph));
85929 }, []).concat(entities.closedWay.map(function(d) {
85930 var member = [{id: d.id}];
85931 member.nodes = graph.childNodes(d);
85935 // contained is an array of arrays of boolean values,
85936 // where contained[j][k] is true iff the jth way is
85937 // contained by the kth way.
85938 var contained = polygons.map(function(w, i) {
85939 return polygons.map(function(d, n) {
85940 if (i === n) return null;
85941 return geoPolygonContainsPolygon(
85942 map$3(d.nodes, 'loc'),
85943 map$3(w.nodes, 'loc'));
85947 // Sort all polygons as either outer or inner ways
85951 while (polygons.length) {
85952 extractUncontained(polygons);
85953 polygons = polygons.filter(isContained);
85954 contained = contained.filter(isContained).map(filterContained);
85957 function isContained(d, i) {
85958 return some(contained[i]);
85961 function filterContained(d) {
85962 return d.filter(isContained);
85965 function extractUncontained(polygons) {
85966 polygons.forEach(function(d, i) {
85967 if (!isContained(d, i)) {
85968 d.forEach(function(member) {
85972 role: outer ? 'outer' : 'inner'
85980 // Move all tags to one relation
85981 var relation = entities.multipolygon[0] ||
85982 osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
85984 entities.multipolygon.slice(1).forEach(function(m) {
85985 relation = relation.mergeTags(m.tags);
85986 graph = graph.remove(m);
85989 entities.closedWay.forEach(function(way) {
85990 function isThisOuter(m) {
85991 return m.id === way.id && m.role !== 'inner';
85993 if (members.some(isThisOuter)) {
85994 relation = relation.mergeTags(way.tags);
85995 graph = graph.replace(way.update({ tags: {} }));
85999 return graph.replace(relation.update({
86001 tags: omit(relation.tags, 'area')
86006 action.disabled = function(graph) {
86007 var entities = groupEntities(graph);
86008 if (entities.other.length > 0 ||
86009 entities.closedWay.length + entities.multipolygon.length < 2)
86010 return 'not_eligible';
86011 if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
86012 return 'incomplete_relation';
86019 // Text diff algorithm following Hunt and McIlroy 1976.
86020 // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
86021 // comparison, Bell Telephone Laboratories CSTR #41 (1976)
86022 // http://www.cs.dartmouth.edu/~doug/
86024 // Expects two arrays of strings.
86025 function LCS(file1, file2) {
86026 var equivalenceClasses;
86031 var c, i, j, jX, r, s;
86033 equivalenceClasses = {};
86034 for (j = 0; j < file2.length; j++) {
86036 if (equivalenceClasses[line]) {
86037 equivalenceClasses[line].push(j);
86039 equivalenceClasses[line] = [j];
86044 { file1index: -1, file2index: -1, chain: null }
86047 for (i = 0; i < file1.length; i++) {
86049 file2indices = equivalenceClasses[line] || [];
86054 for (jX = 0; jX < file2indices.length; jX++) {
86055 j = file2indices[jX];
86057 for (s = r; s < candidates.length; s++) {
86058 if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
86063 if (s < candidates.length) {
86064 newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
86065 if (r === candidates.length) {
86066 candidates.push(c);
86072 if (r === candidates.length) {
86073 break; // no point in examining further (j)s
86081 // At this point, we know the LCS: it's in the reverse of the
86082 // linked-list through .chain of candidates[candidates.length - 1].
86084 return candidates[candidates.length - 1];
86088 // We apply the LCS to give a simple representation of the
86089 // offsets and lengths of mismatched chunks in the input
86090 // files. This is used by diff3MergeIndices below.
86091 function diffIndices(file1, file2) {
86093 var tail1 = file1.length;
86094 var tail2 = file2.length;
86096 for (var candidate = LCS(file1, file2);
86097 candidate !== null;
86098 candidate = candidate.chain)
86100 var mismatchLength1 = tail1 - candidate.file1index - 1;
86101 var mismatchLength2 = tail2 - candidate.file2index - 1;
86102 tail1 = candidate.file1index;
86103 tail2 = candidate.file2index;
86105 if (mismatchLength1 || mismatchLength2) {
86107 file1: [tail1 + 1, mismatchLength1],
86108 file2: [tail2 + 1, mismatchLength2]
86118 // Given three files, A, O, and B, where both A and B are
86119 // independently derived from O, returns a fairly complicated
86120 // internal representation of merge decisions it's taken. The
86121 // interested reader may wish to consult
86123 // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
86124 // 'A Formal Investigation of ' In Arvind and Prasad,
86125 // editors, Foundations of Software Technology and Theoretical
86126 // Computer Science (FSTTCS), December 2007.
86128 // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
86129 function diff3MergeIndices(a, o, b) {
86131 var m1 = diffIndices(o, a);
86132 var m2 = diffIndices(o, b);
86135 function addHunk(h, side) {
86136 hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
86138 for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
86139 for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
86140 hunks.sort(function (x, y) { return x[0] - y[0]; });
86143 var commonOffset = 0;
86144 function copyCommon(targetOffset) {
86145 if (targetOffset > commonOffset) {
86146 result.push([1, commonOffset, targetOffset - commonOffset]);
86147 commonOffset = targetOffset;
86151 for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
86152 var firstHunkIndex = hunkIndex;
86153 var hunk = hunks[hunkIndex];
86154 var regionLhs = hunk[0];
86155 var regionRhs = regionLhs + hunk[2];
86156 while (hunkIndex < hunks.length - 1) {
86157 var maybeOverlapping = hunks[hunkIndex + 1];
86158 var maybeLhs = maybeOverlapping[0];
86159 if (maybeLhs > regionRhs) {
86162 regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
86166 copyCommon(regionLhs);
86167 if (firstHunkIndex === hunkIndex) {
86168 // The 'overlap' was only one hunk long, meaning that
86169 // there's no conflict here. Either a and o were the
86170 // same, or b and o were the same.
86172 result.push([hunk[1], hunk[3], hunk[4]]);
86175 // A proper conflict. Determine the extents of the
86176 // regions involved from a, o and b. Effectively merge
86177 // all the hunks on the left into one giant hunk, and
86178 // do the same for the right; then, correct for skew
86179 // in the regions of o that each side changed, and
86180 // report appropriate spans for the three sides.
86182 0: [a.length, -1, o.length, -1],
86183 2: [b.length, -1, o.length, -1]
86185 for (i = firstHunkIndex; i <= hunkIndex; i++) {
86187 var side = hunk[1];
86188 var r = regions[side];
86189 var oLhs = hunk[0];
86190 var oRhs = oLhs + hunk[2];
86191 var abLhs = hunk[3];
86192 var abRhs = abLhs + hunk[4];
86193 r[0] = Math.min(abLhs, r[0]);
86194 r[1] = Math.max(abRhs, r[1]);
86195 r[2] = Math.min(oLhs, r[2]);
86196 r[3] = Math.max(oRhs, r[3]);
86198 var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
86199 var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
86200 var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
86201 var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
86204 regionLhs, regionRhs - regionLhs,
86205 bLhs, bRhs - bLhs]);
86207 commonOffset = regionRhs;
86210 copyCommon(o.length);
86215 // Applies the output of diff3MergeIndices to actually
86216 // construct the merged file; the returned result alternates
86217 // between 'ok' and 'conflict' blocks.
86218 function diff3Merge(a, o, b, excludeFalseConflicts) {
86220 var files = [a, o, b];
86221 var indices = diff3MergeIndices(a, o, b);
86224 function flushOk() {
86225 if (okLines.length) {
86226 result.push({ok: okLines});
86230 function pushOk(xs) {
86231 for (var j = 0; j < xs.length; j++) {
86232 okLines.push(xs[j]);
86236 function isTrueConflict(rec) {
86237 if (rec[2] !== rec[6]) return true;
86240 for (var j = 0; j < rec[2]; j++) {
86241 if (a[j + aoff] !== b[j + boff]) {
86248 for (var i = 0; i < indices.length; i++) {
86249 var x = indices[i];
86252 if (excludeFalseConflicts && !isTrueConflict(x)) {
86253 pushOk(files[0].slice(x[1], x[1] + x[2]));
86258 a: a.slice(x[1], x[1] + x[2]),
86260 o: o.slice(x[3], x[3] + x[4]),
86262 b: b.slice(x[5], x[5] + x[6]),
86268 pushOk(files[side].slice(x[1], x[1] + x[2]));
86276 function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
86277 var _option = 'safe'; // 'safe', 'force_local', 'force_remote'
86278 var _conflicts = [];
86282 return isFunction(formatUser) ? formatUser(d) : d;
86286 function mergeLocation(remote, target) {
86287 function pointEqual(a, b) {
86288 var epsilon = 1e-6;
86289 return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
86292 if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
86295 if (_option === 'force_remote') {
86296 return target.update({loc: remote.loc});
86299 _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
86304 function mergeNodes(base, remote, target) {
86305 if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
86308 if (_option === 'force_remote') {
86309 return target.update({nodes: remote.nodes});
86312 var ccount = _conflicts.length;
86313 var o = base.nodes || [];
86314 var a = target.nodes || [];
86315 var b = remote.nodes || [];
86317 var hunks = diff3Merge(a, o, b, true);
86319 for (var i = 0; i < hunks.length; i++) {
86320 var hunk = hunks[i];
86322 nodes.push.apply(nodes, hunk.ok);
86324 // for all conflicts, we can assume c.a !== c.b
86325 // because `diff3Merge` called with `true` option to exclude false conflicts..
86326 var c = hunk.conflict;
86327 if (isEqual(c.o, c.a)) { // only changed remotely
86328 nodes.push.apply(nodes, c.b);
86329 } else if (isEqual(c.o, c.b)) { // only changed locally
86330 nodes.push.apply(nodes, c.a);
86331 } else { // changed both locally and remotely
86332 _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
86338 return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
86342 function mergeChildren(targetWay, children, updates, graph) {
86343 function isUsed(node, targetWay) {
86344 var parentWays = map$3(graph.parentWays(node), 'id');
86345 return node.hasInterestingTags() ||
86346 without(parentWays, targetWay.id).length > 0 ||
86347 graph.parentRelations(node).length > 0;
86350 var ccount = _conflicts.length;
86352 for (var i = 0; i < children.length; i++) {
86353 var id = children[i];
86354 var node = graph.hasEntity(id);
86356 // remove unused childNodes..
86357 if (targetWay.nodes.indexOf(id) === -1) {
86358 if (node && !isUsed(node, targetWay)) {
86359 updates.removeIds.push(id);
86364 // restore used childNodes..
86365 var local = localGraph.hasEntity(id);
86366 var remote = remoteGraph.hasEntity(id);
86369 if (_option === 'force_remote' && remote && remote.visible) {
86370 updates.replacements.push(remote);
86372 } else if (_option === 'force_local' && local) {
86373 target = osmEntity$$1(local);
86375 target = target.update({ version: remote.version });
86377 updates.replacements.push(target);
86379 } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
86380 target = osmEntity$$1(local, { version: remote.version });
86381 if (remote.visible) {
86382 target = mergeLocation(remote, target);
86384 _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
86387 if (_conflicts.length !== ccount) break;
86388 updates.replacements.push(target);
86396 function updateChildren(updates, graph) {
86397 for (var i = 0; i < updates.replacements.length; i++) {
86398 graph = graph.replace(updates.replacements[i]);
86400 if (updates.removeIds.length) {
86401 graph = actionDeleteMultiple(updates.removeIds)(graph);
86407 function mergeMembers(remote, target) {
86408 if (_option === 'force_local' || isEqual(target.members, remote.members)) {
86411 if (_option === 'force_remote') {
86412 return target.update({members: remote.members});
86415 _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
86420 function mergeTags(base, remote, target) {
86421 function ignoreKey(k) {
86422 return dataDiscarded[k];
86425 if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
86428 if (_option === 'force_remote') {
86429 return target.update({tags: remote.tags});
86432 var ccount = _conflicts.length;
86433 var o = base.tags || {};
86434 var a = target.tags || {};
86435 var b = remote.tags || {};
86436 var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
86437 var tags = clone(a);
86438 var changed = false;
86440 for (var i = 0; i < keys.length; i++) {
86443 if (o[k] !== b[k] && a[k] !== b[k]) { // changed remotely..
86444 if (o[k] !== a[k]) { // changed locally..
86445 _conflicts.push(t('merge_remote_changes.conflict.tags',
86446 { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
86448 } else { // unchanged locally, accept remote change..
86449 if (b.hasOwnProperty(k)) {
86459 return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
86463 // `graph.base()` is the common ancestor of the two graphs.
86464 // `localGraph` contains user's edits up to saving
86465 // `remoteGraph` contains remote edits to modified nodes
86466 // `graph` must be a descendent of `localGraph` and may include
86467 // some conflict resolution actions performed on it.
86469 // --- ... --- `localGraph` -- ... -- `graph`
86471 // `graph.base()` --- ... --- `remoteGraph`
86473 var action = function(graph) {
86474 var updates = { replacements: [], removeIds: [] };
86475 var base = graph.base().entities[id];
86476 var local = localGraph.entity(id);
86477 var remote = remoteGraph.entity(id);
86478 var target = osmEntity$$1(local, { version: remote.version });
86481 if (!remote.visible) {
86482 if (_option === 'force_remote') {
86483 return actionDeleteMultiple([id])(graph);
86485 } else if (_option === 'force_local') {
86486 if (target.type === 'way') {
86487 target = mergeChildren(target, uniq(local.nodes), updates, graph);
86488 graph = updateChildren(updates, graph);
86490 return graph.replace(target);
86493 _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
86494 return graph; // do nothing
86499 if (target.type === 'node') {
86500 target = mergeLocation(remote, target);
86502 } else if (target.type === 'way') {
86503 // pull in any child nodes that may not be present locally..
86504 graph.rebase(remoteGraph.childNodes(remote), [graph], false);
86505 target = mergeNodes(base, remote, target);
86506 target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
86508 } else if (target.type === 'relation') {
86509 target = mergeMembers(remote, target);
86512 target = mergeTags(base, remote, target);
86514 if (!_conflicts.length) {
86515 graph = updateChildren(updates, graph).replace(target);
86522 action.withOption = function(opt) {
86528 action.conflicts = function() {
86536 // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
86537 // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
86538 function actionMove(moveIds, tryDelta, projection, cache) {
86539 var _delta = tryDelta;
86541 function setupCache(graph) {
86542 function canMove(nodeId) {
86543 // Allow movement of any node that is in the selectedIDs list..
86544 if (moveIds.indexOf(nodeId) !== -1) return true;
86546 // Allow movement of a vertex where 2 ways meet..
86547 var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
86548 if (parents.length < 3) return true;
86550 // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
86551 var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
86552 if (!parentsMoving) delete cache.moving[nodeId];
86554 return parentsMoving;
86557 function cacheEntities(ids) {
86558 for (var i = 0; i < ids.length; i++) {
86560 if (cache.moving[id]) continue;
86561 cache.moving[id] = true;
86563 var entity = graph.hasEntity(id);
86564 if (!entity) continue;
86566 if (entity.type === 'node') {
86567 cache.nodes.push(id);
86568 cache.startLoc[id] = entity.loc;
86569 } else if (entity.type === 'way') {
86570 cache.ways.push(id);
86571 cacheEntities(entity.nodes);
86573 cacheEntities(entity.members.map(function(member) {
86580 function cacheIntersections(ids) {
86581 function isEndpoint(way, id) {
86582 return !way.isClosed() && !!way.affix(id);
86585 for (var i = 0; i < ids.length; i++) {
86588 // consider only intersections with 1 moved and 1 unmoved way.
86589 var childNodes = graph.childNodes(graph.entity(id));
86590 for (var j = 0; j < childNodes.length; j++) {
86591 var node = childNodes[j];
86592 var parents = graph.parentWays(node);
86593 if (parents.length !== 2) continue;
86595 var moved = graph.entity(id);
86596 var unmoved = null;
86597 for (var k = 0; k < parents.length; k++) {
86598 var way = parents[k];
86599 if (!cache.moving[way.id]) {
86604 if (!unmoved) continue;
86606 // exclude ways that are overly connected..
86607 if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
86608 if (moved.isArea() || unmoved.isArea()) continue;
86610 cache.intersections.push({
86613 unmovedId: unmoved.id,
86614 movedIsEP: isEndpoint(moved, node.id),
86615 unmovedIsEP: isEndpoint(unmoved, node.id)
86627 cache.intersections = [];
86628 cache.replacedVertex = {};
86629 cache.startLoc = {};
86633 cacheEntities(moveIds);
86634 cacheIntersections(cache.ways);
86635 cache.nodes = filter(cache.nodes, canMove);
86642 // Place a vertex where the moved vertex used to be, to preserve way shape..
86651 // * node '*' added to preserve shape
86653 // / b ---- e way `b,e` moved here:
86658 function replaceMovedVertex(nodeId, wayId, graph, delta) {
86659 var way = graph.entity(wayId);
86660 var moved = graph.entity(nodeId);
86661 var movedIndex = way.nodes.indexOf(nodeId);
86662 var len, prevIndex, nextIndex;
86664 if (way.isClosed()) {
86665 len = way.nodes.length - 1;
86666 prevIndex = (movedIndex + len - 1) % len;
86667 nextIndex = (movedIndex + len + 1) % len;
86669 len = way.nodes.length;
86670 prevIndex = movedIndex - 1;
86671 nextIndex = movedIndex + 1;
86674 var prev = graph.hasEntity(way.nodes[prevIndex]);
86675 var next = graph.hasEntity(way.nodes[nextIndex]);
86677 // Don't add orig vertex at endpoint..
86678 if (!prev || !next) return graph;
86680 var key = wayId + '_' + nodeId;
86681 var orig = cache.replacedVertex[key];
86684 cache.replacedVertex[key] = orig;
86685 cache.startLoc[orig.id] = cache.startLoc[nodeId];
86690 start = projection(cache.startLoc[nodeId]);
86691 end = projection.invert(geoVecAdd(start, delta));
86693 end = cache.startLoc[nodeId];
86695 orig = orig.move(end);
86697 var angle = Math.abs(geoAngle(orig, prev, projection) -
86698 geoAngle(orig, next, projection)) * 180 / Math.PI;
86700 // Don't add orig vertex if it would just make a straight line..
86701 if (angle > 175 && angle < 185) return graph;
86703 // moving forward or backward along way?
86704 var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
86705 var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
86706 var d1 = geoPathLength(p1);
86707 var d2 = geoPathLength(p2);
86708 var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
86710 // moving around closed loop?
86711 if (way.isClosed() && insertAt === 0) insertAt = len;
86713 way = way.addNode(orig.id, insertAt);
86714 return graph.replace(orig).replace(way);
86718 // Remove duplicate vertex that might have been added by
86719 // replaceMovedVertex. This is done after the unzorro checks.
86720 function removeDuplicateVertices(wayId, graph) {
86721 var way = graph.entity(wayId);
86722 var epsilon = 1e-6;
86725 function isInteresting(node, graph) {
86726 return graph.parentWays(node).length > 1 ||
86727 graph.parentRelations(node).length ||
86728 node.hasInterestingTags();
86731 for (var i = 0; i < way.nodes.length; i++) {
86732 curr = graph.entity(way.nodes[i]);
86734 if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
86735 if (!isInteresting(prev, graph)) {
86736 way = way.removeNode(prev.id);
86737 graph = graph.replace(way).remove(prev);
86738 } else if (!isInteresting(curr, graph)) {
86739 way = way.removeNode(curr.id);
86740 graph = graph.replace(way).remove(curr);
86751 // Reorder nodes around intersections that have moved..
86753 // Start: way1.nodes: b,e (moving)
86754 // a - b - c ----- d way2.nodes: a,b,c,d (static)
86756 // e isEP1: true, isEP2, false
86758 // way1 `b,e` moved here:
86759 // a ----- c = b - d
86763 // reorder nodes way1.nodes: b,e
86764 // a ----- c - b - d way2.nodes: a,c,b,d
86768 function unZorroIntersection(intersection$$1, graph) {
86769 var vertex = graph.entity(intersection$$1.nodeId);
86770 var way1 = graph.entity(intersection$$1.movedId);
86771 var way2 = graph.entity(intersection$$1.unmovedId);
86772 var isEP1 = intersection$$1.movedIsEP;
86773 var isEP2 = intersection$$1.unmovedIsEP;
86775 // don't move the vertex if it is the endpoint of both ways.
86776 if (isEP1 && isEP2) return graph;
86778 var nodes1 = without(graph.childNodes(way1), vertex);
86779 var nodes2 = without(graph.childNodes(way2), vertex);
86781 if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
86782 if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
86784 var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
86785 var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
86788 // snap vertex to nearest edge (or some point between them)..
86789 if (!isEP1 && !isEP2) {
86790 var epsilon = 1e-6, maxIter = 10;
86791 for (var i = 0; i < maxIter; i++) {
86792 loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
86793 edge1 = geoChooseEdge(nodes1, projection(loc), projection);
86794 edge2 = geoChooseEdge(nodes2, projection(loc), projection);
86795 if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
86797 } else if (!isEP1) {
86803 graph = graph.replace(vertex.move(loc));
86805 // if zorro happened, reorder nodes..
86806 if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
86807 way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
86808 graph = graph.replace(way1);
86810 if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
86811 way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
86812 graph = graph.replace(way2);
86819 function cleanupIntersections(graph) {
86820 for (var i = 0; i < cache.intersections.length; i++) {
86821 var obj = cache.intersections[i];
86822 graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
86823 graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
86824 graph = unZorroIntersection(obj, graph);
86825 graph = removeDuplicateVertices(obj.movedId, graph);
86826 graph = removeDuplicateVertices(obj.unmovedId, graph);
86833 // check if moving way endpoint can cross an unmoved way, if so limit delta..
86834 function limitDelta(graph) {
86835 function moveNode(loc) {
86836 return geoVecAdd(projection(loc), _delta);
86839 for (var i = 0; i < cache.intersections.length; i++) {
86840 var obj = cache.intersections[i];
86842 // Don't limit movement if this is vertex joins 2 endpoints..
86843 if (obj.movedIsEP && obj.unmovedIsEP) continue;
86844 // Don't limit movement if this vertex is not an endpoint anyway..
86845 if (!obj.movedIsEP) continue;
86847 var node = graph.entity(obj.nodeId);
86848 var start = projection(node.loc);
86849 var end = geoVecAdd(start, _delta);
86850 var movedNodes = graph.childNodes(graph.entity(obj.movedId));
86851 var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
86852 var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
86853 var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
86854 var hits = geoPathIntersections(movedPath, unmovedPath);
86856 for (var j = 0; i < hits.length; i++) {
86857 if (isEqual(hits[j], end)) continue;
86858 var edge = geoChooseEdge(unmovedNodes, end, projection);
86859 _delta = geoVecSubtract(projection(edge.loc), start);
86865 var action = function(graph) {
86866 if (_delta[0] === 0 && _delta[1] === 0) return graph;
86870 if (cache.intersections.length) {
86874 for (var i = 0; i < cache.nodes.length; i++) {
86875 var node = graph.entity(cache.nodes[i]);
86876 var start = projection(node.loc);
86877 var end = geoVecAdd(start, _delta);
86878 graph = graph.replace(node.move(projection.invert(end)));
86881 if (cache.intersections.length) {
86882 graph = cleanupIntersections(graph);
86889 action.delta = function() {
86897 function actionMoveNode(nodeID, toLoc) {
86899 var action = function(graph, t) {
86900 if (t === null || !isFinite(t)) t = 1;
86901 t = Math.min(Math.max(+t, 0), 1);
86903 var node = graph.entity(nodeID);
86904 return graph.replace(
86905 node.move(geoVecInterp(node.loc, toLoc, t))
86909 action.transitionable = true;
86914 function actionNoop() {
86915 return function(graph) {
86921 * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
86923 function actionOrthogonalize(wayId, projection) {
86924 var threshold = 12, // degrees within right or straight to alter
86925 lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
86926 upperThreshold = Math.cos(threshold * Math.PI / 180);
86929 var action = function(graph, t) {
86930 if (t === null || !isFinite(t)) t = 1;
86931 t = Math.min(Math.max(+t, 0), 1);
86933 var way = graph.entity(wayId),
86934 nodes = graph.childNodes(way),
86935 points = uniq(nodes).map(function(n) { return projection(n.loc); }),
86936 corner = {i: 0, dotp: 1},
86938 node, loc, score, motions, i, j;
86940 if (points.length === 3) { // move only one vertex for right triangle
86941 for (i = 0; i < 1000; i++) {
86942 motions = points.map(calcMotion);
86943 points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
86944 score = corner.dotp;
86945 if (score < epsilon) {
86950 node = graph.entity(nodes[corner.i].id);
86951 loc = projection.invert(points[corner.i]);
86952 graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
86956 originalPoints = clone(points);
86959 for (i = 0; i < 1000; i++) {
86960 motions = points.map(calcMotion);
86961 for (j = 0; j < motions.length; j++) {
86962 points[j] = addPoints(points[j],motions[j]);
86964 var newScore = squareness(points);
86965 if (newScore < score) {
86966 best = clone(points);
86969 if (score < epsilon) {
86976 for (i = 0; i < points.length; i++) {
86977 // only move the points that actually moved
86978 if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
86979 loc = projection.invert(points[i]);
86980 node = graph.entity(nodes[i].id);
86981 graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
86985 // remove empty nodes on straight sections
86986 for (i = 0; t === 1 && i < points.length; i++) {
86987 node = graph.entity(nodes[i].id);
86989 if (graph.parentWays(node).length > 1 ||
86990 graph.parentRelations(node).length ||
86991 node.hasInterestingTags()) {
86995 var dotp = normalizedDotProduct(i, points);
86996 if (dotp < -1 + epsilon) {
86997 graph = actionDeleteNode(node.id)(graph);
87005 function calcMotion(b, i, array) {
87006 var a = array[(i - 1 + array.length) % array.length],
87007 c = array[(i + 1) % array.length],
87008 p = subtractPoints(a, b),
87009 q = subtractPoints(c, b),
87012 scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
87013 p = normalizePoint(p, 1.0);
87014 q = normalizePoint(q, 1.0);
87016 dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
87018 // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
87019 if (array.length > 3) {
87020 if (dotp < -0.707106781186547) {
87023 } else if (dotp && Math.abs(dotp) < corner.dotp) {
87025 corner.dotp = Math.abs(dotp);
87028 return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
87033 function squareness(points) {
87034 return points.reduce(function(sum, val, i, array) {
87035 var dotp = normalizedDotProduct(i, array);
87037 dotp = filterDotProduct(dotp);
87038 return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
87043 function normalizedDotProduct(i, points) {
87044 var a = points[(i - 1 + points.length) % points.length],
87046 c = points[(i + 1) % points.length],
87047 p = subtractPoints(a, b),
87048 q = subtractPoints(c, b);
87050 p = normalizePoint(p, 1.0);
87051 q = normalizePoint(q, 1.0);
87053 return p[0] * q[0] + p[1] * q[1];
87057 function subtractPoints(a, b) {
87058 return [a[0] - b[0], a[1] - b[1]];
87062 function addPoints(a, b) {
87063 return [a[0] + b[0], a[1] + b[1]];
87067 function normalizePoint(point, scale) {
87068 var vector = [0, 0];
87069 var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
87070 if (length !== 0) {
87071 vector[0] = point[0] / length;
87072 vector[1] = point[1] / length;
87075 vector[0] *= scale;
87076 vector[1] *= scale;
87082 function filterDotProduct(dotp) {
87083 if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
87091 action.disabled = function(graph) {
87092 var way = graph.entity(wayId),
87093 nodes = graph.childNodes(way),
87094 points = uniq(nodes).map(function(n) { return projection(n.loc); });
87096 if (squareness(points)) {
87100 return 'not_squarish';
87104 action.transitionable = true;
87110 // `actionRestrictTurn` creates a turn restriction relation.
87112 // `turn` must be an `osmTurn` object
87113 // see osm/intersection.js, pathToTurn()
87115 // This specifies a restriction of type `restriction` when traveling from
87116 // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
87117 // (The action does not check that these entities form a valid intersection.)
87119 // From, to, and via ways should be split before calling this action.
87120 // (old versions of the code would split the ways here, but we no longer do it)
87122 // For testing convenience, accepts a restrictionID to assign to the new
87123 // relation. Normally, this will be undefined and the relation will
87124 // automatically be assigned a new ID.
87126 function actionRestrictTurn(turn, restrictionType, restrictionID) {
87128 return function(graph) {
87129 var fromWay = graph.entity(turn.from.way);
87130 var toWay = graph.entity(turn.to.way);
87131 var viaNode = turn.via.node && graph.entity(turn.via.node);
87132 var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
87135 members.push({ id: fromWay.id, type: 'way', role: 'from' });
87138 members.push({ id: viaNode.id, type: 'node', role: 'via' });
87139 } else if (viaWays) {
87140 viaWays.forEach(function(viaWay) {
87141 members.push({ id: viaWay.id, type: 'way', role: 'via' });
87145 members.push({ id: toWay.id, type: 'way', role: 'to' });
87147 return graph.replace(osmRelation({
87150 type: 'restriction',
87151 restriction: restrictionType
87158 function actionRevert(id) {
87159 var action = function(graph) {
87160 var entity = graph.hasEntity(id),
87161 base = graph.base().entities[id];
87163 if (entity && !base) { // entity will be removed..
87164 if (entity.type === 'node') {
87165 graph.parentWays(entity)
87166 .forEach(function(parent) {
87167 parent = parent.removeNode(id);
87168 graph = graph.replace(parent);
87170 if (parent.isDegenerate()) {
87171 graph = actionDeleteWay(parent.id)(graph);
87176 graph.parentRelations(entity)
87177 .forEach(function(parent) {
87178 parent = parent.removeMembersWithID(id);
87179 graph = graph.replace(parent);
87181 if (parent.isDegenerate()) {
87182 graph = actionDeleteRelation(parent.id)(graph);
87187 return graph.revert(id);
87193 function actionRotate(rotateIds, pivot, angle, projection) {
87195 var action = function(graph) {
87196 return graph.update(function(graph) {
87197 utilGetAllNodes(rotateIds, graph).forEach(function(node) {
87198 var point = geoRotate([projection(node.loc)], angle, pivot)[0];
87199 graph = graph.replace(node.move(projection.invert(point)));
87207 /* Built-in method references for those with the same name as other `lodash` methods. */
87208 var nativeMax$8 = Math.max;
87211 * Gets the index at which the first occurrence of `value` is found in `array`
87212 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
87213 * for equality comparisons. If `fromIndex` is negative, it's used as the
87214 * offset from the end of `array`.
87220 * @param {Array} array The array to inspect.
87221 * @param {*} value The value to search for.
87222 * @param {number} [fromIndex=0] The index to search from.
87223 * @returns {number} Returns the index of the matched value, else `-1`.
87226 * _.indexOf([1, 2, 1, 2], 2);
87229 * // Search from the `fromIndex`.
87230 * _.indexOf([1, 2, 1, 2], 2, 2);
87233 function indexOf(array, value, fromIndex) {
87234 var length = array == null ? 0 : array.length;
87238 var index = fromIndex == null ? 0 : toInteger(fromIndex);
87240 index = nativeMax$8(length + index, 0);
87242 return baseIndexOf(array, value, index);
87245 // Split a way at the given node.
87247 // Optionally, split only the given ways, if multiple ways share
87250 // This is the inverse of `iD.actionJoin`.
87252 // For testing convenience, accepts an ID to assign to the new way.
87253 // Normally, this will be undefined and the way will automatically
87254 // be assigned a new ID.
87257 // https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
87259 function actionSplit(nodeId, newWayIds) {
87262 // If the way is closed, we need to search for a partner node
87263 // to split the way at.
87265 // The following looks for a node that is both far away from
87266 // the initial node in terms of way segment length and nearby
87267 // in terms of beeline-distance. This assures that areas get
87268 // split on the most "natural" points (independent of the number
87270 // For example: bone-shaped areas get split across their waist
87271 // line, circles across the diameter.
87272 function splitArea(nodes, idxA, graph) {
87273 var lengths = new Array(nodes.length);
87279 function wrap(index) {
87280 return utilWrap(index, nodes.length);
87283 function dist(nA, nB) {
87284 var locA = graph.entity(nA).loc;
87285 var locB = graph.entity(nB).loc;
87286 var epsilon = 1e-6;
87287 return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
87290 // calculate lengths
87292 for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
87293 length += dist(nodes[i], nodes[wrap(i-1)]);
87294 lengths[i] = length;
87298 for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
87299 length += dist(nodes[i], nodes[wrap(i+1)]);
87300 if (length < lengths[i])
87301 lengths[i] = length;
87304 // determine best opposite node to split
87305 for (i = 0; i < nodes.length; i++) {
87306 var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
87317 function split(graph, wayA, newWayId) {
87318 var wayB = osmWay({id: newWayId, tags: wayA.tags}); // `wayB` is the NEW way
87319 var origNodes = wayA.nodes.slice();
87322 var isArea = wayA.isArea();
87323 var isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
87325 if (wayA.isClosed()) {
87326 var nodes = wayA.nodes.slice(0, -1);
87327 var idxA = indexOf(nodes, nodeId);
87328 var idxB = splitArea(nodes, idxA, graph);
87331 nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
87332 nodesB = nodes.slice(idxB, idxA + 1);
87334 nodesA = nodes.slice(idxA, idxB + 1);
87335 nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
87338 var idx = indexOf(wayA.nodes, nodeId, 1);
87339 nodesA = wayA.nodes.slice(0, idx + 1);
87340 nodesB = wayA.nodes.slice(idx);
87343 wayA = wayA.update({nodes: nodesA});
87344 wayB = wayB.update({nodes: nodesB});
87346 graph = graph.replace(wayA);
87347 graph = graph.replace(wayB);
87349 graph.parentRelations(wayA).forEach(function(relation) {
87352 // Turn restrictions - make sure:
87353 // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
87354 // (whichever one is connected to the VIA node/ways)
87355 // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
87356 if (relation.isRestriction()) {
87357 var f = relation.memberByRole('from');
87358 var v = relation.membersByRole('via');
87359 var t = relation.memberByRole('to');
87362 // 1. split a FROM/TO
87363 if (f.id === wayA.id || t.id === wayA.id) {
87365 if (v.length === 1 && v[0].type === 'node') { // check via node
87366 keepB = wayB.contains(v[0].id);
87367 } else { // check via way(s)
87368 for (i = 0; i < v.length; i++) {
87369 if (v[i].type === 'way') {
87370 var wayVia = graph.hasEntity(v[i].id);
87371 if (wayVia && intersection(wayB.nodes, wayVia.nodes).length) {
87380 relation = relation.replaceMember(wayA, wayB);
87381 graph = graph.replace(relation);
87386 for (i = 0; i < v.length; i++) {
87387 if (v[i].type === 'way' && v[i].id === wayA.id) {
87393 graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
87399 // All other relations (Routes, Multipolygons, etc):
87400 // 1. Both `wayA` and `wayB` remain in the relation
87401 // 2. But must be inserted as a pair (see `actionAddMember` for details)
87403 if (relation === isOuter) {
87404 graph = graph.replace(relation.mergeTags(wayA.tags));
87405 graph = graph.replace(wayA.update({tags: {}}));
87406 graph = graph.replace(wayB.update({tags: {}}));
87412 role: relation.memberById(wayA.id).role
87416 originalID: wayA.id,
87417 insertedID: wayB.id,
87421 graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
87425 if (!isOuter && isArea) {
87426 var multipolygon = osmRelation({
87427 tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
87429 {id: wayA.id, role: 'outer', type: 'way'},
87430 {id: wayB.id, role: 'outer', type: 'way'}
87434 graph = graph.replace(multipolygon);
87435 graph = graph.replace(wayA.update({tags: {}}));
87436 graph = graph.replace(wayB.update({tags: {}}));
87443 var action = function(graph) {
87444 var candidates = action.ways(graph);
87445 for (var i = 0; i < candidates.length; i++) {
87446 graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
87452 action.ways = function(graph) {
87453 var node = graph.entity(nodeId);
87454 var parents = graph.parentWays(node);
87455 var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
87457 return parents.filter(function(parent) {
87458 if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
87461 if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
87464 if (parent.isClosed()) {
87468 for (var i = 1; i < parent.nodes.length - 1; i++) {
87469 if (parent.nodes[i] === nodeId) {
87479 action.disabled = function(graph) {
87480 var candidates = action.ways(graph);
87481 if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
87482 return 'not_eligible';
87486 action.limitWays = function(_) {
87487 if (!arguments.length) return _wayIDs;
87497 * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
87499 function actionStraighten(wayId, projection) {
87501 function positionAlongWay(n, s, e) {
87502 return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
87503 (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
87507 var action = function(graph, t) {
87508 if (t === null || !isFinite(t)) t = 1;
87509 t = Math.min(Math.max(+t, 0), 1);
87511 var way = graph.entity(wayId),
87512 nodes = graph.childNodes(way),
87513 points = nodes.map(function(n) { return projection(n.loc); }),
87514 startPoint = points[0],
87515 endPoint = points[points.length-1],
87519 for (i = 1; i < points.length-1; i++) {
87520 var node = nodes[i],
87523 if (t < 1 || graph.parentWays(node).length > 1 ||
87524 graph.parentRelations(node).length ||
87525 node.hasInterestingTags()) {
87527 var u = positionAlongWay(point, startPoint, endPoint),
87529 startPoint[0] + u * (endPoint[0] - startPoint[0]),
87530 startPoint[1] + u * (endPoint[1] - startPoint[1])
87532 loc2 = projection.invert(p);
87534 graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
87538 if (toDelete.indexOf(node) === -1) {
87539 toDelete.push(node);
87544 for (i = 0; i < toDelete.length; i++) {
87545 graph = actionDeleteNode(toDelete[i].id)(graph);
87552 action.disabled = function(graph) {
87553 // check way isn't too bendy
87554 var way = graph.entity(wayId),
87555 nodes = graph.childNodes(way),
87556 points = nodes.map(function(n) { return projection(n.loc); }),
87557 startPoint = points[0],
87558 endPoint = points[points.length-1],
87559 threshold = 0.2 * geoVecLength(startPoint, endPoint),
87562 if (threshold === 0) {
87563 return 'too_bendy';
87566 for (i = 1; i < points.length-1; i++) {
87567 var point = points[i],
87568 u = positionAlongWay(point, startPoint, endPoint),
87569 p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
87570 p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
87571 dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
87573 // to bendy if point is off by 20% of total start/end distance in projected space
87574 if (isNaN(dist) || dist > threshold) {
87575 return 'too_bendy';
87581 action.transitionable = true;
87587 // `actionUnrestrictTurn` deletes a turn restriction relation.
87589 // `turn` must be an `osmTurn` object with a `restrictionID` property.
87590 // see osm/intersection.js, pathToTurn()
87592 function actionUnrestrictTurn(turn) {
87593 return function(graph) {
87594 return actionDeleteRelation(turn.restrictionID)(graph);
87598 /* Reflect the given area around its axis of symmetry */
87599 function actionReflect(reflectIds, projection) {
87600 var useLongAxis = true;
87603 // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
87604 // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
87605 function getSmallestSurroundingRectangle(graph, nodes) {
87606 var points = nodes.map(function(n) { return projection(n.loc); }),
87607 hull = d3_polygonHull(points),
87608 centroid = d3_polygonCentroid(hull),
87609 minArea = Infinity,
87614 for (var i = 0; i <= hull.length - 1; i++) {
87615 var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
87616 angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
87617 poly = geoRotate(hull, -angle, centroid),
87618 extent = poly.reduce(function(extent, point) {
87619 return extent.extend(geoExtent$$1(point));
87620 }, geoExtent$$1()),
87621 area = extent.area();
87623 if (area < minArea) {
87625 ssrExtent = extent;
87632 poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
87638 var action = function(graph, t) {
87639 if (t === null || !isFinite(t)) t = 1;
87640 t = Math.min(Math.max(+t, 0), 1);
87642 var nodes = utilGetAllNodes(reflectIds, graph),
87643 ssr = getSmallestSurroundingRectangle(graph, nodes);
87645 // Choose line pq = axis of symmetry.
87646 // The shape's surrounding rectangle has 2 axes of symmetry.
87647 // Reflect across the longer axis by default.
87648 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
87649 q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
87650 p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
87651 q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
87654 var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
87655 if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
87663 // reflect c across pq
87664 // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
87665 var dx = q[0] - p[0];
87666 var dy = q[1] - p[1];
87667 var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
87668 var b = 2 * dx * dy / (dx * dx + dy * dy);
87669 for (var i = 0; i < nodes.length; i++) {
87670 var node = nodes[i];
87671 var c = projection(node.loc);
87673 a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
87674 b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
87676 var loc2 = projection.invert(c2);
87677 node = node.move(geoVecInterp(node.loc, loc2, t));
87678 graph = graph.replace(node);
87685 action.useLongAxis = function(_) {
87686 if (!arguments.length) return useLongAxis;
87692 action.transitionable = true;
87698 function actionDetachNode(nodeID) {
87700 var action = function(graph) {
87701 var node = graph.entity(nodeID);
87703 // Create a new node to replace the one we will detach
87704 var replacement = osmNode({ loc: node.loc });
87705 graph = graph.replace(replacement);
87707 // Process each way in turn, updating the graph as we go
87708 graph = graph.parentWays(node)
87709 .reduce(function(accGraph, parentWay) {
87710 return accGraph.replace(parentWay.replaceNode(nodeID, replacement.id));
87713 // Process any relations too
87714 return graph.parentRelations(node)
87715 .reduce(function(accGraph, parentRel) {
87716 return accGraph.replace(parentRel.replaceMember(node, replacement));
87721 action.disabled = function(graph) {
87722 var node = graph.entity(nodeID);
87723 var parentRels = graph.parentRelations(node);
87725 for (var i = 0; i < parentRels.length; i++) {
87726 var relation = parentRels[i];
87727 if (!relation.isValidRestriction()) continue;
87729 for (var j = 0; j < relation.members.length; j++) {
87730 var m = relation.members[j];
87731 if (m.id === nodeID && (m.role === 'via' || m.role === 'location_hint')) {
87732 return 'restriction';
87746 var index$6 = /*#__PURE__*/Object.freeze({
87747 d3combobox: d3combobox,
87748 d3keybinding: d3keybinding
87751 var Connection = services.osm;
87755 var iD = /*#__PURE__*/Object.freeze({
87756 Connection: Connection,
87760 Context: coreContext,
87761 setAreaKeys: setAreaKeys,
87762 Difference: coreDifference,
87763 Graph: coreGraph$$1,
87764 History: coreHistory,
87766 geoCross: geoVecCross,
87767 geoInterp: geoVecInterp,
87768 geoRoundCoordinates: geoVecFloor,
87769 geoEuclideanDistance: geoVecLength,
87770 Entity: osmEntity$$1,
87772 Relation: osmRelation,
87774 BackgroundSource: rendererBackgroundSource,
87775 Background: rendererBackground,
87776 Features: rendererFeatures,
87778 TileLayer: rendererTileLayer,
87779 Detect: utilDetect,
87780 uiPreset: uiPresetEditor,
87781 actionAddEntity: actionAddEntity,
87782 actionAddMember: actionAddMember,
87783 actionAddMidpoint: actionAddMidpoint,
87784 actionAddVertex: actionAddVertex,
87785 actionChangeMember: actionChangeMember,
87786 actionChangePreset: actionChangePreset,
87787 actionChangeTags: actionChangeTags,
87788 actionCircularize: actionCircularize,
87789 actionConnect: actionConnect,
87790 actionCopyEntities: actionCopyEntities,
87791 actionDeleteMember: actionDeleteMember,
87792 actionDeleteMultiple: actionDeleteMultiple,
87793 actionDeleteNode: actionDeleteNode,
87794 actionDeleteRelation: actionDeleteRelation,
87795 actionDeleteWay: actionDeleteWay,
87796 actionDeprecateTags: actionDeprecateTags,
87797 actionDiscardTags: actionDiscardTags,
87798 actionDisconnect: actionDisconnect,
87799 actionJoin: actionJoin,
87800 actionMerge: actionMerge,
87801 actionMergeNodes: actionMergeNodes,
87802 actionMergePolygon: actionMergePolygon,
87803 actionMergeRemoteChanges: actionMergeRemoteChanges,
87804 actionMove: actionMove,
87805 actionMoveNode: actionMoveNode,
87806 actionNoop: actionNoop,
87807 actionOrthogonalize: actionOrthogonalize,
87808 actionRestrictTurn: actionRestrictTurn,
87809 actionReverse: actionReverse,
87810 actionRevert: actionRevert,
87811 actionRotate: actionRotate,
87812 actionSplit: actionSplit,
87813 actionStraighten: actionStraighten,
87814 actionUnrestrictTurn: actionUnrestrictTurn,
87815 actionReflect: actionReflect,
87816 actionDetachNode: actionDetachNode,
87817 behaviorAddWay: behaviorAddWay,
87818 behaviorBreathe: behaviorBreathe,
87819 behaviorCopy: behaviorCopy,
87820 behaviorDrag: behaviorDrag,
87821 behaviorDrawWay: behaviorDrawWay,
87822 behaviorDraw: behaviorDraw,
87823 behaviorEdit: behaviorEdit,
87824 behaviorHash: behaviorHash,
87825 behaviorHover: behaviorHover,
87826 behaviorLasso: behaviorLasso,
87827 behaviorOperation: behaviorOperation,
87828 behaviorPaste: behaviorPaste,
87829 behaviorSelect: behaviorSelect,
87830 behaviorTail: behaviorTail,
87831 coreContext: coreContext,
87832 coreDifference: coreDifference,
87833 coreGraph: coreGraph$$1,
87834 coreHistory: coreHistory,
87835 coreTree: coreTree,
87837 dataWikipedia: wikipedia$2,
87838 dataSuggestions: dataSuggestions,
87839 dataAddressFormats: dataAddressFormats,
87840 dataDeprecated: dataDeprecated,
87841 dataDiscarded: dataDiscarded,
87842 dataLocales: dataLocales,
87843 dataPhoneFormats: dataPhoneFormats,
87844 dataShortcuts: dataShortcuts,
87845 dataImperial: dataImperial,
87846 dataDriveLeft: dataDriveLeft,
87848 geoExtent: geoExtent$$1,
87849 geoLatToMeters: geoLatToMeters,
87850 geoLonToMeters: geoLonToMeters,
87851 geoMetersToLat: geoMetersToLat,
87852 geoMetersToLon: geoMetersToLon,
87853 geoMetersToOffset: geoMetersToOffset,
87854 geoOffsetToMeters: geoOffsetToMeters,
87855 geoScaleToZoom: geoScaleToZoom,
87856 geoSphericalDistance: geoSphericalDistance,
87857 geoZoomToScale: geoZoomToScale,
87858 geoAngle: geoAngle,
87859 geoChooseEdge: geoChooseEdge,
87860 geoEdgeEqual: geoEdgeEqual,
87861 geoHasLineIntersections: geoHasLineIntersections,
87862 geoHasSelfIntersections: geoHasSelfIntersections,
87863 geoRotate: geoRotate,
87864 geoLineIntersection: geoLineIntersection,
87865 geoPathHasIntersections: geoPathHasIntersections,
87866 geoPathIntersections: geoPathIntersections,
87867 geoPathLength: geoPathLength,
87868 geoPointInPolygon: geoPointInPolygon,
87869 geoPolygonContainsPolygon: geoPolygonContainsPolygon,
87870 geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
87871 geoViewportEdge: geoViewportEdge,
87872 geoRawMercator: geoRawMercator,
87873 geoVecAdd: geoVecAdd,
87874 geoVecAngle: geoVecAngle,
87875 geoVecCross: geoVecCross,
87876 geoVecDot: geoVecDot,
87877 geoVecEqual: geoVecEqual,
87878 geoVecFloor: geoVecFloor,
87879 geoVecInterp: geoVecInterp,
87880 geoVecLength: geoVecLength,
87881 geoVecSubtract: geoVecSubtract,
87882 geoVecScale: geoVecScale,
87883 modeAddArea: modeAddArea$$1,
87884 modeAddLine: modeAddLine$$1,
87885 modeAddPoint: modeAddPoint$$1,
87886 modeAddNote: modeAddNote$$1,
87887 modeBrowse: modeBrowse,
87888 modeDragNode: modeDragNode$$1,
87889 modeDragNote: modeDragNote$$1,
87890 modeDrawArea: modeDrawArea,
87891 modeDrawLine: modeDrawLine,
87892 modeMove: modeMove$$1,
87893 modeRotate: modeRotate$$1,
87894 modeSave: modeSave$$1,
87895 modeSelect: modeSelect,
87896 modeSelectData: modeSelectData$$1,
87897 modeSelectNote: modeSelectNote$$1,
87898 operationCircularize: operationCircularize,
87899 operationContinue: operationContinue,
87900 operationDelete: operationDelete,
87901 operationDisconnect: operationDisconnect,
87902 operationMerge: operationMerge,
87903 operationMove: operationMove,
87904 operationOrthogonalize: operationOrthogonalize,
87905 operationReflectShort: operationReflectShort,
87906 operationReflectLong: operationReflectLong,
87907 operationReverse: operationReverse,
87908 operationRotate: operationRotate,
87909 operationSplit: operationSplit,
87910 operationStraighten: operationStraighten,
87911 operationDetachNode: operationDetachNode,
87912 osmChangeset: osmChangeset,
87913 osmEntity: osmEntity$$1,
87916 osmRelation: osmRelation,
87918 osmIntersection: osmIntersection,
87920 osmInferRestriction: osmInferRestriction,
87921 osmLanes: osmLanes,
87922 osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
87923 osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
87924 osmJoinWays: osmJoinWays,
87925 osmOneWayTags: osmOneWayTags,
87926 osmPavedTags: osmPavedTags,
87927 osmIsInterestingTag: osmIsInterestingTag,
87928 presetCategory: presetCategory,
87929 presetCollection: presetCollection,
87930 presetField: presetField,
87931 presetPreset: presetPreset,
87932 presetIndex: presetIndex,
87933 rendererBackgroundSource: rendererBackgroundSource,
87934 rendererBackground: rendererBackground,
87935 rendererFeatures: rendererFeatures,
87936 rendererMap: rendererMap,
87937 rendererTileLayer: rendererTileLayer,
87938 services: services,
87939 serviceMapillary: serviceMapillary,
87940 serviceNominatim: serviceNominatim,
87941 serviceOpenstreetcam: serviceOpenstreetcam,
87942 serviceOsm: serviceOsm,
87943 serviceStreetside: serviceStreetside,
87944 serviceTaginfo: serviceTaginfo,
87945 serviceVectorTile: serviceVectorTile,
87946 serviceWikidata: serviceWikidata,
87947 serviceWikipedia: serviceWikipedia,
87948 svgAreas: svgAreas$$1,
87949 svgData: svgData$$1,
87950 svgDebug: svgDebug$$1,
87953 svgLabels: svgLabels,
87954 svgLayers: svgLayers,
87955 svgLines: svgLines$$1,
87956 svgMapillaryImages: svgMapillaryImages$$1,
87957 svgMapillarySigns: svgMapillarySigns$$1,
87958 svgMidpoints: svgMidpoints$$1,
87959 svgNotes: svgNotes$$1,
87960 svgOneWaySegments: svgOneWaySegments,
87961 svgOpenstreetcamImages: svgOpenstreetcamImages$$1,
87963 svgPassiveVertex: svgPassiveVertex,
87965 svgPointTransform: svgPointTransform,
87966 svgPoints: svgPoints$$1,
87967 svgRelationMemberTags: svgRelationMemberTags,
87968 svgSegmentWay: svgSegmentWay,
87969 svgStreetside: svgStreetside$$1,
87970 svgTagClasses: svgTagClasses,
87971 svgTurns: svgTurns,
87972 svgVertices: svgVertices$$1,
87973 uiFields: uiFields,
87974 uiFieldDefaultCheck: uiFieldCheck,
87975 uiFieldOnewayCheck: uiFieldCheck,
87976 uiFieldCheck: uiFieldCheck,
87977 uiFieldMultiCombo: uiFieldCombo,
87978 uiFieldNetworkCombo: uiFieldCombo,
87979 uiFieldSemiCombo: uiFieldCombo,
87980 uiFieldTypeCombo: uiFieldCombo,
87981 uiFieldCombo: uiFieldCombo,
87982 uiFieldUrl: uiFieldText,
87983 uiFieldNumber: uiFieldText,
87984 uiFieldTel: uiFieldText,
87985 uiFieldEmail: uiFieldText,
87986 uiFieldText: uiFieldText,
87987 uiFieldAccess: uiFieldAccess,
87988 uiFieldAddress: uiFieldAddress,
87989 uiFieldCycleway: uiFieldCycleway,
87990 uiFieldLanes: uiFieldLanes,
87991 uiFieldLocalized: uiFieldLocalized,
87992 uiFieldMaxspeed: uiFieldMaxspeed,
87993 uiFieldStructureRadio: uiFieldRadio,
87994 uiFieldRadio: uiFieldRadio,
87995 uiFieldRestrictions: uiFieldRestrictions,
87996 uiFieldTextarea: uiFieldTextarea,
87997 uiFieldWikipedia: uiFieldWikipedia,
87999 uiInfoPanels: uiInfoPanels,
88000 uiPanelBackground: uiPanelBackground,
88001 uiPanelHistory: uiPanelHistory,
88002 uiPanelLocation: uiPanelLocation,
88003 uiPanelMeasurement: uiPanelMeasurement,
88004 uiSettingsCustomBackground: uiSettingsCustomBackground,
88005 uiSettingsCustomData: uiSettingsCustomData,
88007 uiAccount: uiAccount,
88008 uiAttribution: uiAttribution,
88009 uiBackground: uiBackground,
88010 uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
88011 uiBackgroundOffset: uiBackgroundOffset,
88012 uiChangesetEditor: uiChangesetEditor,
88014 uiCommit: uiCommit,
88015 uiCommitChanges: uiCommitChanges,
88016 uiCommitWarnings: uiCommitWarnings,
88017 uiConfirm: uiConfirm,
88018 uiConflicts: uiConflicts,
88019 uiContributors: uiContributors,
88020 uiCurtain: uiCurtain,
88021 uiDataEditor: uiDataEditor$$1,
88022 uiDataHeader: uiDataHeader,
88023 uiDisclosure: uiDisclosure,
88024 uiEditMenu: uiEditMenu,
88025 uiEntityEditor: uiEntityEditor,
88026 uiFeatureInfo: uiFeatureInfo,
88027 uiFeatureList: uiFeatureList,
88029 uiFieldHelp: uiFieldHelp,
88031 uiFormFields: uiFormFields,
88032 uiFullScreen: uiFullScreen,
88033 uiGeolocate: uiGeolocate,
88036 uiInspector: uiInspector,
88038 uiLoading: uiLoading,
88039 uiMapData: uiMapData,
88040 uiMapInMap: uiMapInMap,
88043 uiNotice: uiNotice,
88044 uiNoteComments: uiNoteComments,
88045 uiNoteEditor: uiNoteEditor$$1,
88046 uiNoteHeader: uiNoteHeader,
88047 uiNoteReport: uiNoteReport,
88048 uiPresetEditor: uiPresetEditor,
88049 uiPresetIcon: uiPresetIcon,
88050 uiPresetList: uiPresetList,
88051 uiRadialMenu: uiRadialMenu,
88052 uiRawMemberEditor: uiRawMemberEditor,
88053 uiRawMembershipEditor: uiRawMembershipEditor,
88054 uiRawTagEditor: uiRawTagEditor,
88055 uiRestore: uiRestore,
88058 uiSelectionList: uiSelectionList,
88059 uiSidebar: uiSidebar$$1,
88060 uiSourceSwitch: uiSourceSwitch,
88061 uiSpinner: uiSpinner,
88062 uiSplash: uiSplash,
88063 uiStatus: uiStatus,
88064 uiSuccess: uiSuccess$$1,
88065 uiTagReference: uiTagReference,
88066 uiToggle: uiToggle,
88067 uiTooltipHtml: uiTooltipHtml,
88068 uiUndoRedo: uiUndoRedo,
88069 uiVersion: uiVersion,
88070 uiViewOnOSM: uiViewOnOSM,
88072 utilAsyncMap: utilAsyncMap,
88073 utilCallWhenIdle: utilCallWhenIdle,
88074 utilCleanTags: utilCleanTags,
88075 utilDisplayName: utilDisplayName,
88076 utilDisplayNameForPath: utilDisplayNameForPath,
88077 utilDisplayType: utilDisplayType,
88078 utilEditDistance: utilEditDistance,
88079 utilEntitySelector: utilEntitySelector,
88080 utilEntityOrMemberSelector: utilEntityOrMemberSelector,
88081 utilFastMouse: utilFastMouse,
88082 utilFunctor: utilFunctor,
88083 utilGetAllNodes: utilGetAllNodes,
88084 utilGetPrototypeOf: utilGetPrototypeOf,
88085 utilGetSetValue: utilGetSetValue,
88086 utilHashcode: utilHashcode,
88087 utilIdleWorker: utilIdleWorker,
88088 utilNoAuto: utilNoAuto,
88089 utilPrefixCSSProperty: utilPrefixCSSProperty,
88090 utilPrefixDOMProperty: utilPrefixDOMProperty,
88091 utilQsString: utilQsString,
88092 utilRebind: utilRebind,
88093 utilSetTransform: utilSetTransform,
88094 utilSessionMutex: utilSessionMutex,
88095 utilStringQs: utilStringQs,
88096 utilSuggestNames: utilSuggestNames,
88097 utilTagText: utilTagText,
88098 utilTiler: utilTiler,
88099 utilTriggerEvent: utilTriggerEvent,
88100 utilWrap: utilWrap,
88101 d3combobox: d3combobox,
88102 d3keybinding: d3keybinding,
88103 validationDeprecatedTag: validationDeprecatedTag,
88104 validationDisconnectedHighway: validationDisconnectedHighway,
88105 validationManyDeletions: validationManyDeletions,
88106 validationMissingTag: validationMissingTag,
88107 validationOldMultipolygon: validationOldMultipolygon,
88108 validationTagSuggestsArea: validationTagSuggestsArea
88114 //# sourceMappingURL=iD.js.map